GL: Cache current GL context. Issue #262.

This commit is contained in:
Branimir Karadžić 2015-02-17 11:50:31 -08:00
parent a57634cd09
commit 7279a31768
6 changed files with 60 additions and 36 deletions

View file

@ -254,6 +254,7 @@ EGL_IMPORT
success = eglMakeCurrent(m_display, m_surface, m_surface, m_context); success = eglMakeCurrent(m_display, m_surface, m_surface, m_context);
BGFX_FATAL(success, Fatal::UnableToInitialize, "Failed to set context."); BGFX_FATAL(success, Fatal::UnableToInitialize, "Failed to set context.");
m_current = NULL;
eglSwapInterval(m_display, 0); eglSwapInterval(m_display, 0);
@ -311,27 +312,32 @@ EGL_IMPORT
void GlContext::swap(SwapChainGL* _swapChain) void GlContext::swap(SwapChainGL* _swapChain)
{ {
makeCurrent(_swapChain);
if (NULL == _swapChain) if (NULL == _swapChain)
{ {
eglMakeCurrent(m_display, m_surface, m_surface, m_context);
eglSwapBuffers(m_display, m_surface); eglSwapBuffers(m_display, m_surface);
} }
else else
{ {
_swapChain->makeCurrent();
_swapChain->swapBuffers(); _swapChain->swapBuffers();
} }
} }
void GlContext::makeCurrent(SwapChainGL* _swapChain) void GlContext::makeCurrent(SwapChainGL* _swapChain)
{ {
if (NULL == _swapChain) if (m_current != _swapChain)
{ {
eglMakeCurrent(m_display, m_surface, m_surface, m_context); m_current = _swapChain;
}
else if (NULL == _swapChain)
{ {
_swapChain->makeCurrent(); eglMakeCurrent(m_display, m_surface, m_surface, m_context);
}
else
{
_swapChain->makeCurrent();
}
} }
} }

View file

@ -17,7 +17,8 @@ namespace bgfx
struct GlContext struct GlContext
{ {
GlContext() GlContext()
: m_context(NULL) : m_current(NULL)
, m_context(NULL)
, m_display(NULL) , m_display(NULL)
, m_surface(NULL) , m_surface(NULL)
{ {
@ -41,6 +42,7 @@ namespace bgfx
} }
void* m_eglLibrary; void* m_eglLibrary;
SwapChainGL* m_current;
EGLConfig m_config; EGLConfig m_config;
EGLContext m_context; EGLContext m_context;
EGLDisplay m_display; EGLDisplay m_display;

View file

@ -175,6 +175,7 @@ namespace bgfx
import(); import();
glXMakeCurrent( (::Display*)g_bgfxX11Display, (::Window)g_bgfxX11Window, m_context); glXMakeCurrent( (::Display*)g_bgfxX11Display, (::Window)g_bgfxX11Window, m_context);
m_current = NULL;
glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)glXGetProcAddress( (const GLubyte*)"glXSwapIntervalEXT"); glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)glXGetProcAddress( (const GLubyte*)"glXSwapIntervalEXT");
if (NULL != glXSwapIntervalEXT) if (NULL != glXSwapIntervalEXT)
@ -248,27 +249,32 @@ namespace bgfx
void GlContext::swap(SwapChainGL* _swapChain) void GlContext::swap(SwapChainGL* _swapChain)
{ {
makeCurrent(_swapChain);
if (NULL == _swapChain) if (NULL == _swapChain)
{ {
glXMakeCurrent( (::Display*)g_bgfxX11Display, (::Window)g_bgfxX11Window, m_context);
glXSwapBuffers( (::Display*)g_bgfxX11Display, (::Window)g_bgfxX11Window); glXSwapBuffers( (::Display*)g_bgfxX11Display, (::Window)g_bgfxX11Window);
} }
else else
{ {
_swapChain->makeCurrent();
_swapChain->swapBuffers(); _swapChain->swapBuffers();
} }
} }
void GlContext::makeCurrent(SwapChainGL* _swapChain) void GlContext::makeCurrent(SwapChainGL* _swapChain)
{ {
if (NULL == _swapChain) if (m_current != _swapChain)
{ {
glXMakeCurrent( (::Display*)g_bgfxX11Display, (::Window)g_bgfxX11Window, m_context); m_current = _swapChain;
}
else if (NULL == _swapChain)
{ {
_swapChain->makeCurrent(); glXMakeCurrent( (::Display*)g_bgfxX11Display, (::Window)g_bgfxX11Window, m_context);
}
else
{
_swapChain->makeCurrent();
}
} }
} }

View file

@ -18,7 +18,8 @@ namespace bgfx
struct GlContext struct GlContext
{ {
GlContext() GlContext()
: m_context(0) : m_current(NULL)
, m_context(0)
, m_visualInfo(NULL) , m_visualInfo(NULL)
{ {
} }
@ -40,6 +41,7 @@ namespace bgfx
return 0 != m_context; return 0 != m_context;
} }
SwapChainGL* m_current;
GLXContext m_context; GLXContext m_context;
XVisualInfo* m_visualInfo; XVisualInfo* m_visualInfo;
}; };

View file

@ -259,6 +259,7 @@ namespace bgfx
int result = wglMakeCurrent(m_hdc, m_context); int result = wglMakeCurrent(m_hdc, m_context);
BGFX_FATAL(0 != result, Fatal::UnableToInitialize, "wglMakeCurrent failed!"); BGFX_FATAL(0 != result, Fatal::UnableToInitialize, "wglMakeCurrent failed!");
m_current = NULL;
if (NULL != wglSwapIntervalEXT) if (NULL != wglSwapIntervalEXT)
{ {
@ -316,37 +317,42 @@ namespace bgfx
BX_DELETE(g_allocator, _swapChain); BX_DELETE(g_allocator, _swapChain);
} }
void GlContext::makeCurrent(SwapChainGL* _swapChain)
{
if (NULL == _swapChain)
{
wglMakeCurrent(m_hdc, m_context);
GLenum err = glGetError();
BX_WARN(0 == err, "wglMakeCurrent failed with GL error: 0x%04x.", err); BX_UNUSED(err);
}
else
{
_swapChain->makeCurrent();
}
}
void GlContext::swap(SwapChainGL* _swapChain) void GlContext::swap(SwapChainGL* _swapChain)
{ {
makeCurrent(_swapChain);
if (NULL == _swapChain) if (NULL == _swapChain)
{ {
if (NULL != g_bgfxHwnd) if (NULL != g_bgfxHwnd)
{ {
wglMakeCurrent(m_hdc, m_context);
SwapBuffers(m_hdc); SwapBuffers(m_hdc);
} }
} }
else else
{ {
_swapChain->makeCurrent();
_swapChain->swapBuffers(); _swapChain->swapBuffers();
} }
} }
void GlContext::makeCurrent(SwapChainGL* _swapChain)
{
if (m_current != _swapChain)
{
m_current = _swapChain;
if (NULL == _swapChain)
{
wglMakeCurrent(m_hdc, m_context);
GLenum err = glGetError();
BX_WARN(0 == err, "wglMakeCurrent failed with GL error: 0x%04x.", err); BX_UNUSED(err);
}
else
{
_swapChain->makeCurrent();
}
}
}
void GlContext::import() void GlContext::import()
{ {
BX_TRACE("Import:"); BX_TRACE("Import:");

View file

@ -61,7 +61,8 @@ typedef void (APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum z
struct GlContext struct GlContext
{ {
GlContext() GlContext()
: m_opengl32dll(NULL) : m_current(NULL)
, m_opengl32dll(NULL)
, m_context(NULL) , m_context(NULL)
, m_hdc(NULL) , m_hdc(NULL)
{ {
@ -87,6 +88,7 @@ typedef void (APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum z
int32_t m_contextAttrs[9]; int32_t m_contextAttrs[9];
int m_pixelFormat; int m_pixelFormat;
PIXELFORMATDESCRIPTOR m_pfd; PIXELFORMATDESCRIPTOR m_pfd;
SwapChainGL* m_current;
void* m_opengl32dll; void* m_opengl32dll;
HGLRC m_context; HGLRC m_context;
HDC m_hdc; HDC m_hdc;