Thread: [PyOpenGL-Users] setting OpenGL.ERROR_CHECKING to False has strange consequence on function loading
Brought to you by:
mcfletch
From: rndblnch <rnd...@gm...> - 2014-02-18 20:44:39
|
hello again, while moving some code to core profile, i found a strange interaction between the OpenGL.ERROR_CHECKING flag and the function loading mechanism. the following program (MacOSX specific for the glut core profile flag) prints True if error checking is enabled and prints False otherwise. import OpenGL #OpenGL.ERROR_CHECKING = False from OpenGL.GLUT import * def reshape(width, height): pass def display(): glutSwapBuffers() glutInit([]) glutInitDisplayMode(GLUT_RGBA|GLUT_3_2_CORE_PROFILE) glutCreateWindow(b"test") glutReshapeFunc(reshape) glutDisplayFunc(display) from OpenGL.GL import glGenVertexArrays print bool(glGenVertexArrays) i am currently investigating the difference in the code paths taken, but i must admit that i am a bit confused... renaud |
From: Mike C. F. <mcf...@vr...> - 2014-02-19 17:13:15
|
On 02/18/2014 03:44 PM, rndblnch wrote: > hello again, > > while moving some code to core profile, i found a strange interaction > between the OpenGL.ERROR_CHECKING flag and the function loading mechanism. > the following program (MacOSX specific for the glut core profile flag) > prints True if error checking is enabled and prints False otherwise. I haven't been able to duplicate it here (i.e. it always returns true on a Linux amd box). My guess is that we are seeing an error from earlier in the process startup being interpreted as "function doesn't exist" when loading that function, but I can't see *how* that would occur, as the actual code to get the entry point shouldn't care about OpenGL errors. Sorry to not be much help here, Mike -- ________________________________________________ Mike C. Fletcher Designer, VR Plumber, Coder http://www.vrplumber.com http://blog.vrplumber.com |
From: rndblnch <rnd...@gm...> - 2014-02-21 10:05:21
|
Mike C. Fletcher <mcfletch <at> vrplumber.com> writes: > > On 02/18/2014 03:44 PM, rndblnch wrote: > > hello again, > > > > while moving some code to core profile, i found a strange interaction > > between the OpenGL.ERROR_CHECKING flag and the function loading mechanism. > > the following program (MacOSX specific for the glut core profile flag) > > prints True if error checking is enabled and prints False otherwise. > I haven't been able to duplicate it here (i.e. it always returns true on > a Linux amd box). My guess is that we are seeing an error from earlier > in the process startup being interpreted as "function doesn't exist" > when loading that function, but I can't see *how* that would occur, as > the actual code to get the entry point shouldn't care about OpenGL errors. yes, it looks like it is Mac OS X specific. i think i begin to understand where it comes from. in OpenGL.GL.VERSION.GL_3_0, the version of the functions imported by: from OpenGL.raw.GL.VERSION.GL_3_0 import * (line 15) can be replaced by later imports from ARB, e.g.: from OpenGL.GL.ARB.vertex_array_object import * (line 28) but on the mac, this specific extension is not present, apple provides instead the GL_APPLE_vertex_array_object extension. what i do not understand however, is how the error checking interact with those import (i.e. why setting error checking makes the ARB import find a valid glGenVertexArrays function and why it becomes invalid when error checking is disabled). renaud > > Sorry to not be much help here, > Mike > |
From: rndblnch <rnd...@gm...> - 2014-02-21 15:14:46
|
rndblnch <rndblnch <at> gmail.com> writes: > what i do not understand however, is how the error checking interact with > those import (i.e. why setting error checking makes the ARB import find a > valid glGenVertexArrays function and why it becomes invalid when error > checking is disabled). ok, i think i have made progress in my understanding of the problem. regarding extension loading, there is one place where the OpenGL.ERROR_CHECKING flag changes the code path taken, it is in OpenGL/extensions.py, line 163: the glGetString call will fail silently on OpenGL 3+ if error checking is not enabled, while it will raise an exception if error checking is enabled. in this later case, the alternate code path provided in the except clause will correctly fetch the extensions. maybe a fix would be to explicitly check for error after the glGetString call? renaud |
From: rndblnch <rnd...@gm...> - 2014-02-21 15:23:57
|
rndblnch <rndblnch <at> gmail.com> writes: > ok, i think i have made progress in my understanding of the problem. > regarding extension loading, there is one place where the > OpenGL.ERROR_CHECKING flag changes the code path taken, it is in > OpenGL/extensions.py, line 163: the glGetString call will fail silently on > OpenGL 3+ if error checking is not enabled, while it will raise an exception > if error checking is enabled. > in this later case, the alternate code path provided in the except clause > will correctly fetch the extensions. > > maybe a fix would be to explicitly check for error after the glGetString call? looks like this was it, the following patch fixes the problem for me: === modified file 'OpenGL/extensions.py' --- OpenGL/extensions.py 2014-01-30 20:32:21 +0000 +++ OpenGL/extensions.py 2014-02-21 15:21:36 +0000 @@ -156,11 +156,13 @@ if not platform.PLATFORM.CurrentContextIsValid(): return False from OpenGL.raw.GL._types import GLint - from OpenGL.raw.GL.VERSION.GL_1_1 import glGetString + from OpenGL.raw.GL.VERSION.GL_1_1 import glGetString, glGetError from OpenGL.raw.GL.VERSION.GL_1_1 import GL_EXTENSIONS from OpenGL import error try: extensions = glGetString( GL_EXTENSIONS ) + if glGetError(): + raise error.GLError() if extensions: extensions = extensions.split() else: renaud |
From: Mike C. F. <mcf...@vr...> - 2014-02-21 15:37:24
|
On 02/21/2014 10:23 AM, rndblnch wrote: > === modified file 'OpenGL/extensions.py' > --- OpenGL/extensions.py 2014-01-30 20:32:21 +0000 > +++ OpenGL/extensions.py 2014-02-21 15:21:36 +0000 > @@ -156,11 +156,13 @@ > if not platform.PLATFORM.CurrentContextIsValid(): > return False > from OpenGL.raw.GL._types import GLint > - from OpenGL.raw.GL.VERSION.GL_1_1 import glGetString > + from OpenGL.raw.GL.VERSION.GL_1_1 import glGetString, glGetError > from OpenGL.raw.GL.VERSION.GL_1_1 import GL_EXTENSIONS > from OpenGL import error > try: > extensions = glGetString( GL_EXTENSIONS ) > + if glGetError(): > + raise error.GLError() > if extensions: > extensions = extensions.split() > else: Patch is applied to bzr head and should appear in beta-2. Thanks, Mike -- ________________________________________________ Mike C. Fletcher Designer, VR Plumber, Coder http://www.vrplumber.com http://blog.vrplumber.com |