Skip to content

Instantly share code, notes, and snippets.

@smokris
Last active December 29, 2015 14:39
Show Gist options
  • Save smokris/7685817 to your computer and use it in GitHub Desktop.
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.
...
/**
* 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