mirror of
https://github.com/scratchfoundation/bgfx.git
synced 2024-11-25 09:08:22 -05:00
GL: Cache current GL context. Issue #262.
This commit is contained in:
parent
a57634cd09
commit
7279a31768
6 changed files with 60 additions and 36 deletions
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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:");
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue