def __init__(self, width=1024, height=1024, **kwargs): super(EGLRenderingContext, self).__init__(width, height, **kwargs) self.EGL = EGL self.display = EGL.eglGetDisplay(EGL.EGL_DEFAULT_DISPLAY) major = np.zeros(1, "i4") minor = np.zeros(1, "i4") EGL.eglInitialize(self.display, major, minor) num_configs = np.zeros(1, "i4") config = EGL.EGLConfig() # Now we create our necessary bits. config_attribs = np.array( [ EGL.EGL_RED_SIZE, 8, EGL.EGL_GREEN_SIZE, 8, EGL.EGL_BLUE_SIZE, 8, EGL.EGL_DEPTH_SIZE, 24, EGL.EGL_STENCIL_SIZE, 8, EGL.EGL_COLOR_BUFFER_TYPE, EGL.EGL_RGB_BUFFER, EGL.EGL_SURFACE_TYPE, EGL.EGL_PBUFFER_BIT, EGL.EGL_RENDERABLE_TYPE, EGL.EGL_OPENGL_BIT, EGL.EGL_CONFIG_CAVEAT, EGL.EGL_NONE, EGL.EGL_NONE, ], dtype="i4", ) EGL.eglChooseConfig( self.display, config_attribs, pointer(config), 1, num_configs ) pbuffer_attribs = np.array( [EGL.EGL_WIDTH, width, EGL.EGL_HEIGHT, height, EGL.EGL_NONE], dtype="i4" ) self.surface = EGL.eglCreatePbufferSurface( self.display, config, pbuffer_attribs ) EGL.eglBindAPI(EGL.EGL_OPENGL_API) self.context = EGL.eglCreateContext( self.display, config, EGL.EGL_NO_CONTEXT, None ) EGL.eglMakeCurrent(self.display, self.surface, self.surface, self.context) GL.glClearColor(0.0, 0.0, 0.0, 0.0) GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
def create_opengl_context(self, surface_size=(640, 480)): """Create offscreen OpenGL context and make it current. Users are expected to directly use EGL API in case more advanced context management is required. Args: surface_size: (width, height), size of the offscreen rendering surface. """ egl_display = egl.eglGetDisplay(egl.EGL_DEFAULT_DISPLAY) major, minor = egl.EGLint(), egl.EGLint() egl.eglInitialize(egl_display, pointer(major), pointer(minor)) config_attribs = [ egl.EGL_SURFACE_TYPE, egl.EGL_PBUFFER_BIT, egl.EGL_BLUE_SIZE, 8, egl.EGL_GREEN_SIZE, 8, egl.EGL_RED_SIZE, 8, egl.EGL_DEPTH_SIZE, 24, egl.EGL_RENDERABLE_TYPE, egl.EGL_OPENGL_BIT, egl.EGL_NONE, ] # if need MSAA https://www.khronos.org/opengl/wiki/Multisampling config_attribs = (egl.EGLint * len(config_attribs))(*config_attribs) num_configs = egl.EGLint() egl_cfg = egl.EGLConfig() egl.eglChooseConfig(egl_display, config_attribs, pointer(egl_cfg), 1, pointer(num_configs)) width, height = surface_size pbuffer_attribs = [ egl.EGL_WIDTH, width, egl.EGL_HEIGHT, height, egl.EGL_NONE, ] pbuffer_attribs = (egl.EGLint * len(pbuffer_attribs))(*pbuffer_attribs) egl_surf = egl.eglCreatePbufferSurface(egl_display, egl_cfg, pbuffer_attribs) egl.eglBindAPI(egl.EGL_OPENGL_API) egl_context = egl.eglCreateContext(egl_display, egl_cfg, egl.EGL_NO_CONTEXT, None) egl.eglMakeCurrent(egl_display, egl_surf, egl_surf, egl_context) self.display = egl_display
def __init__(self, width=640, height=480, fullscreen=False, aspect=None): self.gl = gl self.bo_next = self.bo_prev = None self.last_swap = time.time() self.frame_count = 0 self.disp = egl.eglGetPlatformDisplay(EGL_PLATFORM_SURFACELESS_MESA, egl.EGL_DEFAULT_DISPLAY, None) if not self.disp: raise Exception("Failed to get egl display") BaseDisplay.__init__(self, width, height, True, aspect) attribList = arrays.GLintArray.asArray([ egl.EGL_RENDERABLE_TYPE, egl.EGL_OPENGL_ES2_BIT, egl.EGL_SURFACE_TYPE, egl.EGL_PBUFFER_BIT, egl.EGL_RED_SIZE, 8, egl.EGL_GREEN_SIZE, 8, egl.EGL_BLUE_SIZE, 8, egl.EGL_ALPHA_SIZE, 8, egl.EGL_NONE ]) ctxAttrib = arrays.GLintArray.asArray( [egl.EGL_CONTEXT_CLIENT_VERSION, 2, egl.EGL_NONE]) surfaceAttrib = arrays.GLintArray.asArray( [egl.EGL_WIDTH, width, egl.EGL_HEIGHT, height, egl.EGL_NONE]) egl.eglInitialize(self.disp, None, None) config = egl.EGLConfig() num_configs = ctypes.c_long() egl.eglChooseConfig(self.disp, attribList, byref(config), 1, byref(num_configs)) ret = ctypes.c_int() egl.eglBindAPI(egl.EGL_OPENGL_ES_API) self.context = egl.eglCreateContext(self.disp, config, egl.EGL_NO_CONTEXT, ctxAttrib) self.surface = egl.eglCreatePbufferSurface(self.disp, config, surfaceAttrib) assert egl.eglMakeCurrent(self.disp, self.surface, self.surface, self.context) gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, 0) gl.glClearColor(0, 0, 0, 0.0) gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT) self.win_width = self.width = width self.win_height = self.height = height gl.glViewport(0, 0, self.win_width, self.win_height) self.clear_color = self.TRANSPARENT self._initialize()
def main(): _width = 256 _height = 256 # Whether hidpi is active #def on_error(error, message): # log.warning(message) #glfw.glfwSetErrorCallback(on_error) egl_display = egl.eglGetDisplay(egl.EGL_DEFAULT_DISPLAY) major, minor = egl.EGLint(), egl.EGLint() egl.eglInitialize(egl_display, pointer(major), pointer(minor)) config_attribs = [ egl.EGL_SURFACE_TYPE, egl.EGL_PBUFFER_BIT, egl.EGL_BLUE_SIZE, 8, egl.EGL_GREEN_SIZE, 8, egl.EGL_RED_SIZE, 8, egl.EGL_DEPTH_SIZE, 24, egl.EGL_RENDERABLE_TYPE, egl.EGL_OPENGL_BIT, egl.EGL_NONE ] config_attribs = (egl.EGLint * len(config_attribs))(*config_attribs) num_configs = egl.EGLint() egl_cfg = egl.EGLConfig() egl.eglChooseConfig(egl_display, config_attribs, pointer(egl_cfg), 1, pointer(num_configs)) pbuffer_attribs = [ egl.EGL_WIDTH, _width, egl.EGL_HEIGHT, _height, egl.EGL_NONE, ] pbuffer_attribs = (egl.EGLint * len(pbuffer_attribs))(*pbuffer_attribs) egl_surf = egl.eglCreatePbufferSurface(egl_display, egl_cfg, pbuffer_attribs) egl.eglBindAPI(egl.EGL_OPENGL_API) egl_context = egl.eglCreateContext(egl_display, egl_cfg, egl.EGL_NO_CONTEXT, None) egl.eglMakeCurrent(egl_display, egl_surf, egl_surf, egl_context) #print("context made current") print('Vendor: {}'.format(glGetString(GL_VENDOR).decode('utf-8'))) print('Opengl version: {}'.format(glGetString(GL_VERSION).decode('utf-8'))) print('GLSL Version: {}'.format( glGetString(GL_SHADING_LANGUAGE_VERSION).decode('utf-8'))) print('Renderer: {}'.format(glGetString(GL_RENDERER).decode('utf-8')))
def create_opengl_context(surface_size=(640, 480)): """Create offscreen OpenGL context and make it current. Users are expected to directly use EGL API in case more advanced context management is required. Args: surface_size: (width, height), size of the offscreen rendering surface. """ egl_display = create_initialized_headless_egl_display() if egl_display == egl.EGL_NO_DISPLAY: raise ImportError('Cannot initialize a headless EGL display.') major, minor = egl.EGLint(), egl.EGLint() egl.eglInitialize(egl_display, pointer(major), pointer(minor)) config_attribs = [ egl.EGL_SURFACE_TYPE, egl.EGL_PBUFFER_BIT, egl.EGL_BLUE_SIZE, 8, egl.EGL_GREEN_SIZE, 8, egl.EGL_RED_SIZE, 8, egl.EGL_DEPTH_SIZE, 24, egl.EGL_RENDERABLE_TYPE, egl.EGL_OPENGL_BIT, egl.EGL_NONE ] config_attribs = (egl.EGLint * len(config_attribs))(*config_attribs) num_configs = egl.EGLint() egl_cfg = egl.EGLConfig() egl.eglChooseConfig(egl_display, config_attribs, pointer(egl_cfg), 1, pointer(num_configs)) width, height = surface_size pbuffer_attribs = [ egl.EGL_WIDTH, width, egl.EGL_HEIGHT, height, egl.EGL_NONE, ] pbuffer_attribs = (egl.EGLint * len(pbuffer_attribs))(*pbuffer_attribs) egl_surf = egl.eglCreatePbufferSurface(egl_display, egl_cfg, pbuffer_attribs) egl.eglBindAPI(egl.EGL_OPENGL_API) egl_context = egl.eglCreateContext(egl_display, egl_cfg, egl.EGL_NO_CONTEXT, None) egl.eglMakeCurrent(egl_display, egl_surf, egl_surf, egl_context)
def get_config(self, egl_dpy, surface_type): egl_config_attribs = { egl.EGL_RED_SIZE: 8, egl.EGL_GREEN_SIZE: 8, egl.EGL_BLUE_SIZE: 8, egl.EGL_ALPHA_SIZE: 8, egl.EGL_DEPTH_SIZE: egl.EGL_DONT_CARE, egl.EGL_STENCIL_SIZE: egl.EGL_DONT_CARE, egl.EGL_RENDERABLE_TYPE: egl.EGL_OPENGL_BIT, egl.EGL_SURFACE_TYPE: surface_type, } egl_config_attribs = egl_convert_to_int_array(egl_config_attribs) egl_config = egl.EGLConfig() num_configs = egl.EGLint() if not egl.eglChooseConfig(egl_dpy, egl_config_attribs, pointer(egl_config), 1, pointer(num_configs)): return None if num_configs.value == 0: return None return egl_config
def __init__(self, width=640, height=480, fullscreen=False, aspect=None): self.gl = gl libbcm_host.bcm_host_init() display = libbcm_host.vc_dispmanx_display_open(0) mode = DISPMANX_MODEINFO_T() libbcm_host.vc_dispmanx_display_get_info(display, byref(mode)) print("Display mode: %dx%d" % (mode.width, mode.height)) self.disp = egl.eglGetDisplay(egl.EGL_DEFAULT_DISPLAY) attribList = arrays.GLintArray.asArray([ egl.EGL_RENDERABLE_TYPE, egl.EGL_OPENGL_ES2_BIT, egl.EGL_SURFACE_TYPE, egl.EGL_WINDOW_BIT, #egl.EGL_COLOR_BUFFER_TYPE, egl.EGL_RGB_BUFFER, egl.EGL_RED_SIZE, 8, egl.EGL_GREEN_SIZE, 8, egl.EGL_BLUE_SIZE, 8, egl.EGL_ALPHA_SIZE, 8, egl.EGL_NONE ]) ctxAttrib = arrays.GLintArray.asArray([ egl.EGL_CONTEXT_CLIENT_VERSION, 2, egl.EGL_NONE ]) egl.eglInitialize(self.disp, None, None) config = egl.EGLConfig() num_configs = ctypes.c_long() egl.eglChooseConfig(self.disp, attribList, byref(config), 1, byref(num_configs)) ret = ctypes.c_int() egl.eglBindAPI(egl.EGL_OPENGL_ES_API) update = libbcm_host.vc_dispmanx_update_start(0) rectDst = VC_RECT_T() rectDst.x = rectDst.y = 0 rectDst.width = mode.width rectDst.height = mode.height rectSrc = VC_RECT_T() rectSrc.x = rectDst.y = 0 rectSrc.width = mode.width << 16 rectSrc.height = mode.height << 16 alpha = VC_DISPMANX_ALPHA_T() alpha.flags = 1 << 16 # premultiplied alpha alpha.opacity = 255 alpha.mask = 0 self.nativeWindow = EGL_DISPMANX_WINDOW_T() self.nativeWindow.width = mode.width self.nativeWindow.height = mode.height layer = 0 self.nativeWindow.element = libbcm_host.vc_dispmanx_element_add( update, display, layer, byref(rectDst), 0, byref(rectSrc), 0, byref(alpha), 0, 0) libbcm_host.vc_dispmanx_update_submit_sync(update) libbcm_host.vc_dispmanx_display_close(display) self.surface = egl.eglCreateWindowSurface(self.disp, config, byref(self.nativeWindow), None) self.context = egl.eglCreateContext(self.disp, config, egl.EGL_NO_CONTEXT, ctxAttrib) assert egl.eglMakeCurrent(self.disp, self.surface, self.surface, self.context) egl.eglSwapInterval(self.disp, 1) gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, 0) for i in range(5): gl.glClearColor(0, 0, 0, 1.0) gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT) egl.eglSwapBuffers(self.disp, self.surface) self.win_width = self.width = mode.width self.win_height = self.height = mode.height gl.glViewport(0, 0, self.win_width, self.win_height) BaseDisplay.__init__(self, mode.width, mode.height, True, aspect) # Transparent layer self.clear_color = self.TRANSPARENT self._initialize()