The version returned by Window::GetSettings() is now the actual version of the context

This commit is contained in:
Laurent Gomila 2011-05-04 22:35:15 +02:00
parent 6eac4256f3
commit 49c0208b2e
7 changed files with 47 additions and 85 deletions

View File

@ -102,7 +102,7 @@ namespace sf
namespace priv namespace priv
{ {
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
void GlContext::Initialize() void GlContext::GlobalInit()
{ {
// Create the shared context // Create the shared context
sharedContext = new ContextType(NULL); sharedContext = new ContextType(NULL);
@ -115,7 +115,7 @@ void GlContext::Initialize()
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
void GlContext::Cleanup() void GlContext::GlobalCleanup()
{ {
// Destroy the shared context // Destroy the shared context
delete sharedContext; delete sharedContext;
@ -141,7 +141,10 @@ void GlContext::EnsureContext()
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
GlContext* GlContext::New() GlContext* GlContext::New()
{ {
return new ContextType(sharedContext); GlContext* context = new ContextType(sharedContext);
context->Initialize();
return context;
} }
@ -153,10 +156,7 @@ GlContext* GlContext::New(const ContextSettings& settings, const WindowImpl* own
// Create the context // Create the context
GlContext* context = new ContextType(sharedContext, settings, owner, bitsPerPixel); GlContext* context = new ContextType(sharedContext, settings, owner, bitsPerPixel);
context->Initialize();
// Enable antialiasing if needed
if (context->GetSettings().AntialiasingLevel > 0)
glEnable(GL_MULTISAMPLE_ARB);
return context; return context;
} }
@ -170,10 +170,7 @@ GlContext* GlContext::New(const ContextSettings& settings, unsigned int width, u
// Create the context // Create the context
GlContext* context = new ContextType(sharedContext, settings, width, height); GlContext* context = new ContextType(sharedContext, settings, width, height);
context->Initialize();
// Enable antialiasing if needed
if (context->GetSettings().AntialiasingLevel > 0)
glEnable(GL_MULTISAMPLE_ARB);
return context; return context;
} }
@ -253,6 +250,33 @@ int GlContext::EvaluateFormat(unsigned int bitsPerPixel, const ContextSettings&
std::abs(static_cast<int>(settings.AntialiasingLevel - antialiasing)); std::abs(static_cast<int>(settings.AntialiasingLevel - antialiasing));
} }
////////////////////////////////////////////////////////////
void GlContext::Initialize()
{
// Activate the context
SetActive(true);
// Retrieve the context version number
const GLubyte* version = glGetString(GL_VERSION);
if (version)
{
// The beginning of the returned string is "major.minor" (this is standard)
mySettings.MajorVersion = version[0] - '0';
mySettings.MinorVersion = version[2] - '0';
}
else
{
// Can't get the version number, assume 2.0
mySettings.MajorVersion = 2;
mySettings.MinorVersion = 0;
}
// Enable antialiasing if needed
if (mySettings.AntialiasingLevel > 0)
glEnable(GL_MULTISAMPLE_ARB);
}
} // namespace priv } // namespace priv
} // namespace sf } // namespace sf

View File

@ -57,7 +57,7 @@ public :
/// can be called only once. /// can be called only once.
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
static void Initialize(); static void GlobalInit();
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Perform the global cleanup /// \brief Perform the global cleanup
@ -69,7 +69,7 @@ public :
/// can be called only once. /// can be called only once.
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
static void Cleanup(); static void GlobalCleanup();
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Ensures that an OpenGL context is active in the current thread /// \brief Ensures that an OpenGL context is active in the current thread
@ -217,6 +217,14 @@ protected :
// Member data // Member data
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
ContextSettings mySettings; ///< Creation settings of the context ContextSettings mySettings; ///< Creation settings of the context
private:
////////////////////////////////////////////////////////////
/// \brief Perform various initializations after the context construction
///
////////////////////////////////////////////////////////////
void Initialize();
}; };
} // namespace priv } // namespace priv

View File

@ -54,7 +54,7 @@ GlResource::GlResource()
// If this is the very first resource, trigger the global context initialization // If this is the very first resource, trigger the global context initialization
if (count == 0) if (count == 0)
priv::GlContext::Initialize(); priv::GlContext::GlobalInit();
// Increment the resources counter // Increment the resources counter
count++; count++;
@ -76,7 +76,7 @@ GlResource::~GlResource()
// If there's no more resource alive, we can trigger the global context cleanup // If there's no more resource alive, we can trigger the global context cleanup
if (count == 0) if (count == 0)
priv::GlContext::Cleanup(); priv::GlContext::GlobalCleanup();
} }

View File

@ -60,9 +60,6 @@ myOwnsWindow(true)
// Create the context // Create the context
CreateContext(shared, VideoMode::GetDesktopMode().BitsPerPixel, ContextSettings()); CreateContext(shared, VideoMode::GetDesktopMode().BitsPerPixel, ContextSettings());
// Activate the context
SetActive(true);
} }
@ -81,9 +78,6 @@ myOwnsWindow(false)
// Create the context // Create the context
if (myWindow) if (myWindow)
CreateContext(shared, bitsPerPixel, settings); CreateContext(shared, bitsPerPixel, settings);
// Activate the context
SetActive(true);
} }
@ -110,9 +104,6 @@ myOwnsWindow(true)
// Create the context // Create the context
CreateContext(shared, VideoMode::GetDesktopMode().BitsPerPixel, settings); CreateContext(shared, VideoMode::GetDesktopMode().BitsPerPixel, settings);
// Activate the context
SetActive(true);
} }

View File

@ -150,13 +150,6 @@ private:
unsigned int bitsPerPixel, unsigned int bitsPerPixel,
const ContextSettings& settings); const ContextSettings& settings);
////////////////////////////////////////////////////////////
/// \brief Finish updating our settings
/// \note The context must be active in order to get the OpenGL version.
///
////////////////////////////////////////////////////////////
void UpdateOpenGLVersion();
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
// Member data // Member data
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////

View File

@ -57,12 +57,6 @@ SFContext::SFContext(SFContext* shared)
// Create the context // Create the context
CreateContext(shared, VideoMode::GetDesktopMode().BitsPerPixel, ContextSettings(0, 0, 0)); CreateContext(shared, VideoMode::GetDesktopMode().BitsPerPixel, ContextSettings(0, 0, 0));
// Activate the context
SetActive(true);
// Finish updating settings.
UpdateOpenGLVersion();
} }
@ -79,12 +73,6 @@ SFContext::SFContext(SFContext* shared, const ContextSettings& settings,
// Apply context. // Apply context.
WindowImplCocoa const * ownerCocoa = static_cast<WindowImplCocoa const *>(owner); WindowImplCocoa const * ownerCocoa = static_cast<WindowImplCocoa const *>(owner);
ownerCocoa->ApplyContext(myContext); ownerCocoa->ApplyContext(myContext);
// Activate the context
SetActive(true);
// Finish updating settings.
UpdateOpenGLVersion();
} }
@ -109,12 +97,6 @@ SFContext::SFContext(SFContext* shared, const ContextSettings& settings,
[myWindow setContentView:myView]; [myWindow setContentView:myView];
[myView setOpenGLContext:myContext]; [myView setOpenGLContext:myContext];
[myContext setView:myView]; [myContext setView:myView];
// Activate the context
SetActive(true);
// Finish updating settings.
UpdateOpenGLVersion();
} }
@ -224,33 +206,6 @@ void SFContext::CreateContext(SFContext* shared,
mySettings = settings; mySettings = settings;
} }
////////////////////////////////////////////////////////////
void SFContext::UpdateOpenGLVersion()
{
// Update the OpenGL version in the settings.
// NB : the context muste be active to get its version.
GLubyte const* versionString = glGetString(GL_VERSION);
if (versionString == 0) {
// (Warning) Couldn't get the OpenGL version of the context.
// This happens sometimes (but not always) when creating the first
// context for no apparent reason.
// We assume we can get at least a 2.0 valid context.
mySettings.MajorVersion = 2;
mySettings.MinorVersion = 0;
} else {
// versionString looks like "2.1 NVIDIA-1.6.26".
mySettings.MajorVersion = versionString[0];
mySettings.MinorVersion = versionString[2];
}
}
} // namespace priv } // namespace priv
} // namespace sf } // namespace sf

View File

@ -56,9 +56,6 @@ myOwnsWindow (true)
// Create the context // Create the context
if (myDeviceContext) if (myDeviceContext)
CreateContext(shared, VideoMode::GetDesktopMode().BitsPerPixel, ContextSettings()); CreateContext(shared, VideoMode::GetDesktopMode().BitsPerPixel, ContextSettings());
// Activate the context
SetActive(true);
} }
@ -76,9 +73,6 @@ myOwnsWindow (false)
// Create the context // Create the context
if (myDeviceContext) if (myDeviceContext)
CreateContext(shared, bitsPerPixel, settings); CreateContext(shared, bitsPerPixel, settings);
// Activate the context
SetActive(true);
} }
@ -102,9 +96,6 @@ myOwnsWindow (true)
// Create the context // Create the context
if (myDeviceContext) if (myDeviceContext)
CreateContext(shared, VideoMode::GetDesktopMode().BitsPerPixel, settings); CreateContext(shared, VideoMode::GetDesktopMode().BitsPerPixel, settings);
// Activate the context
SetActive(true);
} }