Last active
December 29, 2015 14:39
-
-
Save smokris/7685817 to your computer and use it in GitHub Desktop.
Check for stale bindings before throwing a GL context back into the pool.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
... | |
/** | |
* Check whether the specified attachment point @c pname is still bound. | |
* (This is defined as a macro in order to stringify the argument.) | |
*/ | |
#define VuoGlCheckBinding(pname) \ | |
{ \ | |
GLint value; \ | |
glGetIntegerv(pname, &value); \ | |
if (value) \ | |
VLog(#pname " was still active when the context was disused. (This may result in leaks.)"); \ | |
} | |
/** | |
* Throws the specified @c VuoGlContext back in the pool. | |
* | |
* @threadAny | |
*/ | |
void VuoGlContext_disuse(VuoGlContext glContext) | |
{ | |
CGLContextObj cgl_ctx = (CGLContextObj)glContext; | |
#if DEBUG | |
// Check to see whether there are any stale bindings (to help identify leaks). | |
// (Some checks are commented because they aren't available in OpenGL 2.1.) | |
VuoGlCheckBinding(GL_ARRAY_BUFFER_BINDING); | |
// VuoGlCheckBinding(GL_ATOMIC_COUNTER_BUFFER_BINDING); | |
// VuoGlCheckBinding(GL_COPY_READ_BUFFER_BINDING); | |
// VuoGlCheckBinding(GL_COPY_WRITE_BUFFER_BINDING); | |
// VuoGlCheckBinding(GL_DRAW_INDIRECT_BUFFER_BINDING); | |
// VuoGlCheckBinding(GL_DISPATCH_INDIRECT_BUFFER_BINDING); | |
VuoGlCheckBinding(GL_DRAW_FRAMEBUFFER_BINDING); | |
VuoGlCheckBinding(GL_ELEMENT_ARRAY_BUFFER_BINDING); | |
VuoGlCheckBinding(GL_FRAMEBUFFER_BINDING); | |
VuoGlCheckBinding(GL_PIXEL_PACK_BUFFER_BINDING); | |
VuoGlCheckBinding(GL_PIXEL_UNPACK_BUFFER_BINDING); | |
// VuoGlCheckBinding(GL_PROGRAM_PIPELINE_BINDING); | |
VuoGlCheckBinding(GL_READ_FRAMEBUFFER_BINDING); | |
VuoGlCheckBinding(GL_RENDERBUFFER_BINDING); | |
// VuoGlCheckBinding(GL_SAMPLER_BINDING); | |
// VuoGlCheckBinding(GL_SHADER_STORAGE_BUFFER_BINDING); | |
GLint textureUnits; | |
glGetIntegerv(GL_MAX_TEXTURE_UNITS, &textureUnits); | |
for (GLuint i=0; i<textureUnits; ++i) | |
{ | |
glActiveTexture(GL_TEXTURE0+i); | |
VuoGlCheckBinding(GL_TEXTURE_BINDING_1D); | |
VuoGlCheckBinding(GL_TEXTURE_BINDING_1D_ARRAY_EXT); | |
VuoGlCheckBinding(GL_TEXTURE_BINDING_2D); | |
VuoGlCheckBinding(GL_TEXTURE_BINDING_2D_ARRAY_EXT); | |
// VuoGlCheckBinding(GL_TEXTURE_BINDING_2D_MULTISAMPLE); | |
// VuoGlCheckBinding(GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY); | |
VuoGlCheckBinding(GL_TEXTURE_BINDING_3D); | |
// VuoGlCheckBinding(GL_TEXTURE_BINDING_BUFFER); | |
VuoGlCheckBinding(GL_TEXTURE_BINDING_CUBE_MAP); | |
VuoGlCheckBinding(GL_TEXTURE_BINDING_RECTANGLE_ARB); | |
} | |
VuoGlCheckBinding(GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT); | |
VuoGlCheckBinding(GL_UNIFORM_BUFFER_BINDING_EXT); | |
VuoGlCheckBinding(GL_VERTEX_ARRAY_BINDING_APPLE); | |
#endif | |
VuoGlContextPool *p = VuoGlContextPool::getPool(); | |
// Acquire semaphore and add the context to the pool. | |
p->disuse(cgl_ctx); | |
} | |
... |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment