def __exit__(self, *_args): self.valid = False if self.context: context_type = type(self.context) null_context = cast(0, context_type) log("glXMakeCurrent: NULL for xid=%#x", self.xid) GLX.glXMakeCurrent(self.xdisplay, 0, null_context)
def __init__(self, wid): """Constructor for OpenGLRenderingArea""" xlib = cdll.LoadLibrary('libX11.so') xlib.XOpenDisplay.argtypes = [c_char_p] xlib.XOpenDisplay.restype = POINTER(struct__XDisplay) self.xdisplay = xlib.XOpenDisplay((ctypes.c_char * 1)(*[0])) display = Display() attrs = [ GLX.GLX_RGBA, True, GLX.GLX_RED_SIZE, 1, GLX.GLX_GREEN_SIZE, 1, GLX.GLX_BLUE_SIZE, 1, GLX.GLX_DOUBLEBUFFER, 0, 0, 0 ] width = 200 height = 200 cattrs = (c_int * len(attrs))(*attrs) xvinfo = GLX.glXChooseVisual(self.xdisplay, display.get_default_screen(), cattrs) configs = GLX.glXChooseFBConfig(self.xdisplay, 0, None, byref(c_int())) self.context = GLX.glXCreateContext(self.xdisplay, xvinfo, None, True) self.x_window_id = GdkX11.X11Window.get_xid(wid) if not GLX.glXMakeCurrent(self.xdisplay, self.x_window_id, self.context): print("failed") GL.glViewport(0, 0, width, height) # todo self.app = None GL.glClearColor(0.24, 0.24, 0.24, 0.0) self.profiler_window = None
def reshape(self, widget, event): self.width = event.width self.height = event.height self.xwindow_id = GdkX11.X11Window.get_xid(widget.get_window()) if(not GLX.glXMakeCurrent(self.xdisplay, self.xwindow_id, self.context)): print('failed binding opengl context') glViewport(0, 0, self.width, self.height)
def set_size(self, width, height): """Change size of rendering area :param height: :param width: """ if not GLX.glXMakeCurrent(self.xdisplay, self.x_window_id, self.context): print("failed") GL.glViewport(0, 0, width, height) # todo
def __exit__(self, *_args): self.valid = False if self.context: context_type = type(self.context) null_context = cast(0, context_type) log("glXMakeCurrent: NULL for xid=%#x", self.xid) if not GLX.glXMakeCurrent(self.xdisplay, 0, null_context): log.error("Error: glXMakeCurrent NULL failed")
def activate(self): """make cairo context current for drawing""" if(not GLX.glXMakeCurrent(self.xdisplay, self.xwindow_id, self.context)): print("failed binding opengl context") #glcontext = gtk.gtkgl.widget_get_gl_context(self) #gldrawable = gtk.gtkgl.widget_get_gl_drawable(self) #return gldrawable and glcontext and gldrawable.gl_begin(glcontext) return True
def _async_init(self): # Create an SDL2 window sdl2.ext.init() if sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO) != 0: raise RuntimeError(sdl2.SDL_GetError()) self._window = sdl2.SDL_CreateWindow( self._window_title.encode(), sdl2.SDL_WINDOWPOS_UNDEFINED, sdl2.SDL_WINDOWPOS_UNDEFINED, self.width, self.height, sdl2.SDL_WINDOW_OPENGL | sdl2.SDL_WINDOW_RESIZABLE | sdl2.SDL_WINDOW_UTILITY, ) # Create an OpenGL context sdl2.video.SDL_GL_SetAttribute(sdl2.video.SDL_GL_CONTEXT_MAJOR_VERSION, self.OPENGL_VERSION[0]) sdl2.video.SDL_GL_SetAttribute(sdl2.video.SDL_GL_CONTEXT_MINOR_VERSION, self.OPENGL_VERSION[1]) sdl2.video.SDL_GL_SetAttribute( sdl2.video.SDL_GL_CONTEXT_PROFILE_MASK, sdl2.video.SDL_GL_CONTEXT_PROFILE_CORE, ) self._glcontext = sdl2.SDL_GL_CreateContext(self._window) sdl2.SDL_GL_MakeCurrent(self._window, self._glcontext) # Activate vertical synchronization sdl2.SDL_GL_SetSwapInterval(1) # Set the GLX context GLX.glXMakeCurrent(self.x11display, self.x11window, self.glx_context) # Call subclass custom initialization self.init(**self._init_kwds) # Start rendering sdl2.SDL_ShowWindow(self._window) self._timer = self._loop.create_timer(self._on_update) self._loop.set_timer(self._timer, 1, int(1000.0 / 60.0))
def render(self): """Must be called each frame""" if not GLX.glXMakeCurrent(self.xdisplay, self.x_window_id, self.context): print("failed") GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT) #todo GL.glBegin(GL.GL_TRIANGLES) GL.glIndexi(0) GL.glColor3f(1.0, 0.0, 0.0) GL.glVertex2i(0, 1) GL.glIndexi(0) GL.glColor3f(0.0, 1.0, 0.0) GL.glVertex2i(-1, -1) GL.glIndexi(0) GL.glColor3f(0.0, 0.0, 1.0) GL.glVertex2i(1, -1) GL.glEnd() self.app.render_loop() GLX.glXSwapBuffers(self.xdisplay, self.x_window_id) self.profiler_window.one_frame_passed() return True
def tkMakeCurrent(self): if self.winfo_ismapped(): GLX.glXMakeCurrent(self.__window, self._wid, self.__context)
def tkCreateContext(self): self.__window = XOpenDisplay(self.winfo_screen().encode('utf-8')) # Check glx version: major = c_int(0) minor = c_int(0) GLX.glXQueryVersion(self.__window, major, minor) print("GLX version: %d.%d" % (major.value, minor.value)) if major.value == 1 and minor.value < 3: # e.g. 1.2 and down visual = GLX.glXChooseVisual(self.__window, 0, (GL.GLint * len(att))(*att)) if not visual: _log.error("glXChooseVisual call failed") self.__context = GLX.glXCreateContext(self.__window, visual, None, GL.GL_TRUE) GLX.glXMakeCurrent(self.__window, self._wid, self.__context) return # OUT HERE FOR 1.2 and less else: # 1.3 or higher # which screen - should it be winfo_screen instead ?? XDefaultScreen = _x11lib.XDefaultScreen XDefaultScreen.argtypes = [POINTER(Display)] XDefaultScreen.restype = c_int screen = XDefaultScreen(self.__window) print("Screen is ", screen) # Look at framebuffer configs ncfg = GL.GLint(0) cfgs = GLX.glXChooseFBConfig(self.__window, screen, (GL.GLint * len(fbatt))(*fbatt), ncfg) print("Number of FBconfigs", ncfg.value) # # Try to match to the current window # ... might also be possible to set this for the frame # ... but for now we just take what Tk gave us ideal = int(self.winfo_visualid(), 16) # convert from hex best = -1 for i in range(ncfg.value): vis = GLX.glXGetVisualFromFBConfig(self.__window, cfgs[i]) if ideal == vis.contents.visualid: best = i print("Got a matching visual: index %d %d xid %s" % (best, vis.contents.visualid, hex(ideal))) if best < 0: print("oh dear - visual does not match") # Take the first in the list (should be another I guess) best = 0 # Here we insist on RGBA - but didn't check earlier self.__context = GLX.glXCreateNewContext( self.__window, cfgs[best], GLX.GLX_RGBA_TYPE, None, # share list GL.GL_TRUE) # direct print("Is Direct?: ", GLX.glXIsDirect(self.__window, self.__context)) # Not creating another window ... some tutorials do # print("wid: ",self._wid) # self._wid = GLX.glXCreateWindow( self.__window, cfgs[best], self._wid, None) # print("wid: ",self._wid) GLX.glXMakeContextCurrent(self.__window, self._wid, self._wid, self.__context) print("Done making a first context") extensions = GLX.glXQueryExtensionsString( self.__window, screen) # Here we quit - getting a modern context needs further work below return if "GLX_ARB_create_context" in extensions: # We can try to upgrade it ?? print("Trying to upgrade context") s = "glXCreateContextAttribsARB" p = GLX.glXGetProcAddress(c_char_p(s)) print(p) if not p: p = GLX.glXGetProcAddressARB( (GL.GLubyte * len(s)).from_buffer_copy(s)) print(p) if p: print(" p is true") p.restype = GLX.GLXContext p.argtypes = [ POINTER(Display), GLX.GLXFBConfig, GLX.GLXContext, c_bool, POINTER(c_int) ] arb_attrs = fbatt[:-1] + [] # GLX.GLX_CONTEXT_MAJOR_VERSION_ARB , 3 # GLX.GLX_CONTEXT_MINOR_VERSION_ARB , 1, # 0 ] # # GLX.GLX_CONTEXT_FLAGS_ARB # GLX.GLX_CONTEXT_PROFILE_MASK_ARB #] # import pdb # pdb.set_trace() self.__context = p(self.__window, cfgs[best], None, GL.GL_TRUE, (GL.GLint * len(arb_attrs))(*arb_attrs))
def __enter__(self): log("glXMakeCurrent: xid=%#x, context=%s", self.xid, self.context) with xsync: if not GLX.glXMakeCurrent(self.xdisplay, self.xid, self.context): raise Exception("glXMakeCurrent failed") self.valid = True
def __exit__(self, *_args): self.valid = False if self.context: context_type = type(self.context) null_context = cast(0, context_type) GLX.glXMakeCurrent(self.xdisplay, 0, null_context)
def __enter__(self): if not GLX.glXMakeCurrent(self.xdisplay, self.xid, self.context): raise Exception("glXMakeCurrent failed") self.valid = True