from .base import Platform __all__ = ['OSMesaPlatform'] class OSMesaPlatform(Platform): """Renders into a software buffer using OSMesa. Requires special versions of OSMesa to be installed, plus PyOpenGL upgrade. """ def __init__(self, viewport_width, viewport_height): super(OSMesaPlatform, self).__init__(viewport_width, viewport_height) self._context = None self._buffer = None def init_context(self): from OpenGL import arrays from OpenGL.osmesa import ( OSMesaCreateContextAttribs, OSMESA_FORMAT, OSMESA_RGBA, OSMESA_PROFILE, OSMESA_CORE_PROFILE, OSMESA_CONTEXT_MAJOR_VERSION, OSMESA_CONTEXT_MINOR_VERSION, OSMESA_DEPTH_BITS ) attrs = arrays.GLintArray.asArray([ OSMESA_FORMAT, OSMESA_RGBA, OSMESA_DEPTH_BITS, 24, OSMESA_PROFILE, OSMESA_CORE_PROFILE, OSMESA_CONTEXT_MAJOR_VERSION, 3, OSMESA_CONTEXT_MINOR_VERSION, 3, 0 ]) self._context = OSMesaCreateContextAttribs(attrs, None) self._buffer = arrays.GLubyteArray.zeros( (self.viewport_height, self.viewport_width, 4) ) def make_current(self): from OpenGL import GL as gl from OpenGL.osmesa import OSMesaMakeCurrent assert(OSMesaMakeCurrent( self._context, self._buffer, gl.GL_UNSIGNED_BYTE, self.viewport_width, self.viewport_height )) def make_uncurrent(self): """Make the OpenGL context uncurrent. """ pass def delete_context(self): from OpenGL.osmesa import OSMesaDestroyContext OSMesaDestroyContext(self._context) self._context = None self._buffer = None def supports_framebuffers(self): return False