예제 #1
0
        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))
예제 #2
0
    def __init__(self, alpha=False):
        display = display_get_default()
        screen = display.get_default_screen()
        bpc = 8
        attrs = c_attrs({
            GLX.GLX_RGBA: True,
            GLX.GLX_RED_SIZE: bpc,
            GLX.GLX_GREEN_SIZE: bpc,
            GLX.GLX_BLUE_SIZE: bpc,
            GLX.GLX_ALPHA_SIZE: int(alpha) * bpc,
            GLX.GLX_DOUBLEBUFFER: int(DOUBLE_BUFFERED),
        })
        self.props = {}
        self.xdisplay = get_xdisplay()
        xvinfo = GLX.glXChooseVisual(self.xdisplay, screen.get_number(), attrs)

        def getconfig(attrib):
            value = c_int()
            r = GLX.glXGetConfig(self.xdisplay, xvinfo, attrib, byref(value))
            assert r == 0, "glXGetConfig returned %i" % r
            return value.value

        assert getconfig(
            GLX.GLX_USE_GL), "OpenGL is not supported by this visual!"
        major = c_int()
        minor = c_int()
        assert GLX.glXQueryVersion(self.xdisplay, byref(major), byref(minor))
        log("found GLX version %i.%i", major.value, minor.value)
        self.props["GLX"] = (major.value, minor.value)
        self.bit_depth = getconfig(GLX.GLX_RED_SIZE) + getconfig(
            GLX.GLX_GREEN_SIZE) + getconfig(GLX.GLX_BLUE_SIZE) + getconfig(
                GLX.GLX_ALPHA_SIZE)
        self.props["depth"] = self.bit_depth
        self.props["has-depth-buffer"] = getconfig(GLX.GLX_DEPTH_SIZE) > 0
        self.props["has-stencil-buffer"] = getconfig(GLX.GLX_STENCIL_SIZE) > 0
        self.props["has-alpha"] = getconfig(GLX.GLX_ALPHA_SIZE) > 0
        for attrib, name in {
                GLX.GLX_ACCUM_RED_SIZE: "accum-red-size",
                GLX.GLX_ACCUM_GREEN_SIZE: "accum-green-size",
                GLX.GLX_ACCUM_BLUE_SIZE: "accum-blue-size",
                GLX.GLX_ACCUM_ALPHA_SIZE: "accum-alpha-size",
                GLX.GLX_RED_SIZE: "red-size",
                GLX.GLX_GREEN_SIZE: "green-size",
                GLX.GLX_BLUE_SIZE: "blue-size",
                GLX.GLX_ALPHA_SIZE: "alpha-size",
                GLX.GLX_DEPTH_SIZE: "depth-size",
                GLX.GLX_STENCIL_SIZE: "stencil-size",
                GLX.GLX_BUFFER_SIZE: "buffer-size",
                GLX.GLX_AUX_BUFFERS: "aux-buffers",
                GLX.GLX_DOUBLEBUFFER: "double-buffered",
                GLX.GLX_LEVEL: "level",
                GLX.GLX_STEREO: "stereo",
                GLX.GLX_RGBA: "rgba",
        }.items():
            v = getconfig(attrib)
            if name in ("stereo", "double-buffered", "rgba"):
                v = bool(v)
            self.props[name] = v
        #attribute names matching gtkgl:
        display_mode = []
        if getconfig(GLX.GLX_RGBA):
            #this particular context may not have alpha channel support...
            #but if we have RGBA then it's almost guaranteed that we can do ALPHA
            display_mode.append("ALPHA")
        if getconfig(GLX.GLX_DOUBLEBUFFER):
            display_mode.append("DOUBLE")
        else:
            display_mode.append("SINGLE")
        self.props["display_mode"] = display_mode
        self.context = GLX.glXCreateContext(self.xdisplay, xvinfo, None, True)
        self.props["direct"] = bool(
            GLX.glXIsDirect(self.xdisplay, self.context))
        self.props["vendor"] = glGetString(GL_VENDOR)
        self.props["renderer"] = glGetString(GL_RENDERER)
        log("GLXContext(%s) context=%s, props=%s", alpha, self.context,
            self.props)
예제 #3
0
    def __init__(self, alpha=False):
        self.props = {}
        self.xdisplay = None
        self.context = None
        self.bit_depth = 0
        from gi.repository import Gdk
        display = Gdk.Display.get_default()
        if not display:
            log.warn("Warning: GLXContext: no default display")
            return
        screen = display.get_default_screen()
        bpc = 8
        pyattrs = {
            GLX.GLX_RGBA: None,
            GLX.GLX_RED_SIZE: bpc,
            GLX.GLX_GREEN_SIZE: bpc,
            GLX.GLX_BLUE_SIZE: bpc,
        }
        if alpha:
            pyattrs[GLX.GLX_ALPHA_SIZE] = int(alpha) * bpc
        if DOUBLE_BUFFERED:
            pyattrs[GLX.GLX_DOUBLEBUFFER] = None
        attrs = c_attrs(pyattrs)
        self.xdisplay = get_xdisplay()
        xvinfo = GLX.glXChooseVisual(self.xdisplay, screen.get_number(), attrs)

        def getconfig(attrib):
            value = c_int()
            r = GLX.glXGetConfig(self.xdisplay, xvinfo, attrib, byref(value))
            assert r == 0, "glXGetConfig returned %i" % r
            return value.value

        assert getconfig(
            GLX.GLX_USE_GL), "OpenGL is not supported by this visual!"
        major = c_int()
        minor = c_int()
        assert GLX.glXQueryVersion(self.xdisplay, byref(major), byref(minor))
        log("found GLX version %i.%i", major.value, minor.value)
        self.props["GLX"] = (major.value, minor.value)
        self.bit_depth = sum(
            getconfig(x) for x in (GLX.GLX_RED_SIZE, GLX.GLX_GREEN_SIZE,
                                   GLX.GLX_BLUE_SIZE, GLX.GLX_ALPHA_SIZE))
        self.props["depth"] = self.bit_depth
        #hide those because we don't use them
        #and because they're misleading: 'has-alpha' may be False
        #even when we have RGBA support (and therefore very likely to have alpha..)
        #self.props["has-depth-buffer"] = getconfig(GLX.GLX_DEPTH_SIZE)>0
        #self.props["has-stencil-buffer"] = getconfig(GLX.GLX_STENCIL_SIZE)>0
        #self.props["has-alpha"] = getconfig(GLX.GLX_ALPHA_SIZE)>0
        for attrib, name in GLX_ATTRIBUTES.items():
            v = getconfig(attrib)
            if name in ("stereo", "double-buffered", "rgba"):
                v = bool(v)
            self.props[name] = v
        #attribute names matching gtkgl:
        display_mode = []
        if getconfig(GLX.GLX_RGBA):
            #this particular context may not have alpha channel support...
            #but if we have RGBA then it's almost guaranteed that we can do ALPHA
            display_mode.append("ALPHA")
        if getconfig(GLX.GLX_DOUBLEBUFFER):
            display_mode.append("DOUBLE")
        else:  # pragma: no cover
            display_mode.append("SINGLE")
        self.props["display_mode"] = display_mode
        self.context = GLX.glXCreateContext(self.xdisplay, xvinfo, None, True)
        self.props["direct"] = bool(
            GLX.glXIsDirect(self.xdisplay, self.context))

        def getstr(k):
            try:
                return glGetString(k)
            except Exception as e:  # pragma: no cover
                self.props["safe"] = False
                result = getattr(e, "result", None)
                if result and isinstance(result, str):
                    return result
                raise

        self.props["vendor"] = getstr(GL_VENDOR)
        self.props["renderer"] = getstr(GL_RENDERER)
        log("GLXContext(%s) context=%s, props=%s", alpha, self.context,
            self.props)
예제 #4
0
    def __init__(self, alpha=False):
        display = display_get_default()
        screen = display.get_default_screen()
        bpc = 8
        attrs = c_attrs({
            GLX.GLX_RGBA: True,
            GLX.GLX_RED_SIZE: bpc,
            GLX.GLX_GREEN_SIZE: bpc,
            GLX.GLX_BLUE_SIZE: bpc,
            GLX.GLX_ALPHA_SIZE: int(alpha) * bpc,
            GLX.GLX_DOUBLEBUFFER: int(DOUBLE_BUFFERED),
        })
        self.props = {}
        self.xdisplay = get_xdisplay()
        xvinfo = GLX.glXChooseVisual(self.xdisplay, screen.get_number(), attrs)

        def getconfig(attrib):
            value = c_int()
            r = GLX.glXGetConfig(self.xdisplay, xvinfo, attrib, byref(value))
            assert r == 0, "glXGetConfig returned %i" % r
            return value.value

        assert getconfig(
            GLX.GLX_USE_GL), "OpenGL is not supported by this visual!"
        major = c_int()
        minor = c_int()
        assert GLX.glXQueryVersion(self.xdisplay, byref(major), byref(minor))
        log("found GLX version %i.%i", major.value, minor.value)
        self.props["GLX"] = (major.value, minor.value)
        self.bit_depth = sum(
            getconfig(x) for x in (GLX.GLX_RED_SIZE, GLX.GLX_GREEN_SIZE,
                                   GLX.GLX_BLUE_SIZE, GLX.GLX_ALPHA_SIZE))
        self.props["depth"] = self.bit_depth
        self.props["has-depth-buffer"] = getconfig(GLX.GLX_DEPTH_SIZE) > 0
        self.props["has-stencil-buffer"] = getconfig(GLX.GLX_STENCIL_SIZE) > 0
        self.props["has-alpha"] = getconfig(GLX.GLX_ALPHA_SIZE) > 0
        for attrib, name in GLX_ATTRIBUTES.items():
            v = getconfig(attrib)
            if name in ("stereo", "double-buffered", "rgba"):
                v = bool(v)
            self.props[name] = v
        #attribute names matching gtkgl:
        display_mode = []
        if getconfig(GLX.GLX_RGBA):
            #this particular context may not have alpha channel support...
            #but if we have RGBA then it's almost guaranteed that we can do ALPHA
            display_mode.append("ALPHA")
        if getconfig(GLX.GLX_DOUBLEBUFFER):
            display_mode.append("DOUBLE")
        else:
            display_mode.append("SINGLE")
        self.props["display_mode"] = display_mode
        self.context = GLX.glXCreateContext(self.xdisplay, xvinfo, None, True)
        self.props["direct"] = bool(
            GLX.glXIsDirect(self.xdisplay, self.context))

        def getstr(k):
            try:
                return glGetString(k)
            except Exception as e:
                self.props["safe"] = False
                result = getattr(e, "result", None)
                if result and isinstance(result, str):
                    return result
                raise

        self.props["vendor"] = getstr(GL_VENDOR)
        self.props["renderer"] = getstr(GL_RENDERER)
        log("GLXContext(%s) context=%s, props=%s", alpha, self.context,
            self.props)