Skip to content

Commit ec2f425

Browse files
committed
Work towards newer contexts
1 parent 85afe77 commit ec2f425

File tree

1 file changed

+66
-10
lines changed

1 file changed

+66
-10
lines changed

pyopengltk.py

Lines changed: 66 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ def printContext(self):
8181
print(" GL_CONTEXT_COMPATIBILITY_PROFILE_BIT :",
8282
bool( msk & GL.GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) )
8383
except:
84-
raise
84+
print("Old context errors arose")
85+
# raise
8586

8687
def tkCreateContext( self ):
8788
# Platform dependent part
@@ -192,7 +193,7 @@ def tkSwapBuffers( self ):
192193
_x11lib = cdll.LoadLibrary(util.find_library( "X11" ) )
193194
XOpenDisplay = _x11lib.XOpenDisplay
194195
XOpenDisplay.argtypes = [c_char_p]
195-
XOpenDisplay.restype = POINTER(Display)
196+
XOpenDisplay.restype = POINTER(Display)
196197

197198
Colormap = c_void_p
198199

@@ -203,6 +204,20 @@ def tkSwapBuffers( self ):
203204
GLX.GLX_DEPTH_SIZE, 16,
204205
0,
205206
]
207+
fbatt = [ GLX.GLX_X_RENDERABLE , 1,
208+
GLX.GLX_DRAWABLE_TYPE , GLX.GLX_WINDOW_BIT,
209+
GLX.GLX_RENDER_TYPE , GLX.GLX_RGBA_BIT,
210+
GLX.GLX_RED_SIZE , 4,
211+
GLX.GLX_GREEN_SIZE , 4,
212+
GLX.GLX_BLUE_SIZE , 4,
213+
# GLX.GLX_ALPHA_SIZE , 4,
214+
GLX.GLX_DEPTH_SIZE , 16,
215+
GLX.GLX_DOUBLEBUFFER , 1,
216+
# GLX.GLX_STENCIL_SIZE , 8,
217+
# GLX.GLX_X_VISUAL_TYPE , GLX.GLX_TRUE_COLOR,
218+
# GLX.GLX_CONFIG_CAVEAT , GLX.GLX_NONE,
219+
0,
220+
]
206221

207222
# Inherits the base and fills in the 3 platform dependent functions
208223
class OpenGLFrame( baseOpenGLFrame ):
@@ -212,17 +227,58 @@ def tkCreateContext( self ):
212227
major = c_int(0)
213228
minor = c_int(0)
214229
GLX.glXQueryVersion( self.__window, major, minor )
215-
print("GLX version:",major,minor)
230+
print("GLX version:",major.value,minor.value)
216231
visual = GLX.glXChooseVisual( self.__window, 0,
217-
(GL.GLint * len(att))(* att) )
232+
(GL.GLint * len(att))(* att) )
218233
if not visual:
219234
_log.error("glXChooseVisual call failed" )
220-
self.__context = GLX.glXCreateContext(self.__window, visual,
221-
None,
222-
GL.GL_TRUE)
223-
# This generally gets a 3.0 version even if the setup is newer
224-
# ... needs ARB stuff ?
225-
GLX.glXMakeCurrent(self.__window, self._wid, self.__context)
235+
if major.value == 1 and minor.value < 3: # e.g. 1.2 and down
236+
print( visual.contents.visualid )
237+
self.__context = GLX.glXCreateContext(self.__window,
238+
visual,
239+
None,
240+
GL.GL_TRUE)
241+
else:
242+
ncfg = GL.GLint(0)
243+
XDefaultScreen = _x11lib.XDefaultScreen
244+
XDefaultScreen.argtypes = [POINTER(Display)]
245+
XOpenDisplay.restype = c_int
246+
screen = XDefaultScreen( self.__window )
247+
print("Screen is ",screen)
248+
cfgs = GLX.glXChooseFBConfig( self.__window,
249+
screen,
250+
(GL.GLint * len(fbatt))(* fbatt),
251+
ncfg )
252+
print( "Number of configs",ncfg.value )
253+
print(visual.contents.visualid)
254+
best = -1
255+
for i in range(ncfg.value):
256+
vis = GLX.glXGetVisualFromFBConfig(self.__window, cfgs[i])
257+
# print("i %d visualid %d:" %(i,vis.contents.visualid))
258+
if visual.contents.visualid == vis.contents.visualid:
259+
best = i
260+
if best >= 0:
261+
print("Got a matching visual?",best )
262+
else:
263+
print("OH dear - visual does not match?" )
264+
best=0
265+
typ = GLX.GLX_RGBA_TYPE #
266+
267+
self.__context = GLX.glXCreateNewContext(self.__window,
268+
cfgs[best],
269+
typ,
270+
None, # share list
271+
GL.GL_TRUE) # direct
272+
if not self.__context:
273+
print("Failed to create context")
274+
print("Is Direct?: ", GLX.glXIsDirect( self.__window, self.__context ))
275+
# print("wid: ",self._wid)
276+
# self._wid = GLX.glXCreateWindow( self.__window, cfgs[best], self._wid, None)
277+
# print("wid: ",self._wid)
278+
GLX.glXMakeContextCurrent( self.__window, self._wid, self._wid,
279+
self.__context )
280+
print("Done making context")
281+
226282

227283
def tkMakeCurrent( self ):
228284
if self.winfo_ismapped():

0 commit comments

Comments
 (0)