JOGL bug - using glVertex4 in a display list crashes

I am trying to use glVertex4f in a display list and it’s crashing JOGL out. If I remove the call to glVertex4f() by replacing with glVertex3f()…all is good…except that’s not what I want. I tried using glVertex4fv instead and it also crashes.

Here is the code (JOGL 1.1b12):

making_name = true, is_static = true


   if (drawCaps) {
	    if (is_static && making_name)  {// Only do this once if static
	      // Make a display list for speed
	      static_shadowcap_name = gl.glGenLists(1);
	      gl.glNewList(static_shadowcap_name, GL.GL_COMPILE);
	      
	      making_name = true;      
	      
	    } else if (is_static && !making_name) {
	      // display the list
	      
	      gl.glCallList(static_shadowcap_name);
	
	      return;
	    }
	    
	    
	    // Draw shadow caps 
	      gl.glBegin(GL.GL_TRIANGLES);
	      {
	        for (int i = 0; i < numTriangles; ++i) {
	          for (int j = 0; j < 3; ++j) {
	            Point3f vertex = vertices[indices[i * 3 + j]].position();
	
	            if (isFacingLight[i])
	              gl.glVertex3f(vertex.x, vertex.y, vertex.z);
	            else {
	              gl.glVertex4f(vertex.x - lightPosition.x, vertex.y
	                  - lightPosition.y, vertex.z - lightPosition.z, 0.0f);
	            }
	          }
	        }
	      }
	      gl.glEnd();
	
	    if (making_name)
	      gl.glEndList();
    }

Here is the stack trace:


An unexpected exception has been detected in native code outside the VM.
Unexpected Signal : EXCEPTION_ACCESS_VIOLATION (0xc0000005) occurred at PC=0x7C910E03
Function=wcsncpy+0x374
Library=C:\WINDOWS\system32\ntdll.dll

Current Java thread:
	at net.java.games.jogl.impl.windows.WindowsGLImpl.glVertex4f(Native Method)
	at com.vorax.geometry.ShadowRendererB.drawShadow(ShadowRendererB.java:391)
	at com.vorax.Renderer.display(Renderer.java:556)
	- locked <0x11496f18> (a java.lang.Object)
	at net.java.games.jogl.impl.GLDrawableHelper.display(GLDrawableHelper.java:74)
	at net.java.games.jogl.GLCanvas$DisplayAction.run(GLCanvas.java:241)
	at net.java.games.jogl.impl.GLContext.invokeGL(GLContext.java:283)
	- locked <0x11444468> (a net.java.games.jogl.impl.windows.WindowsOnscreenGLContext)
	at net.java.games.jogl.impl.windows.WindowsOnscreenGLContext.invokeGL(WindowsOnscreenGLContext.java:79)
	at net.java.games.jogl.GLCanvas.withSingleThreadedWorkaroundDo(GLCanvas.java:228)
	at net.java.games.jogl.GLCanvas.display(GLCanvas.java:75)
	at com.vorax.VoraxEngine.doGameLoop(VoraxEngine.java:441)
	at com.vorax.VoraxEngine.startGame(VoraxEngine.java:419)
	at com.vorax.VoraxEngine.engineLoop(VoraxEngine.java:1053)
	at Exigent.main(Exigent.java:84)

Have you tried running the latest version of JOGL? Your stack trace indicates you’re probably running 1.1 b09.

What graphics card and driver level? Have you tried upgrading? I can’t see any way that JOGL’s generated Java or native code could be the problem, but more likely a bug in your graphics drivers. The InfiniteShadowVolumes demo uses glVertex4f to place vertices at infinity as you’re doing, though it doesn’t create display lists, and it works fine. Have you tried using vertex arrays or vertex buffer objects instead?

You were right, my JOGL version was wrong. I hadn’t noticed my JRE was still referencing an old version…thanks :slight_smile:

However:


An unexpected exception has been detected in native code outside the VM.
Unexpected Signal : EXCEPTION_ACCESS_VIOLATION (0xc0000005) occurred at PC=0x7C910F29
Function=wcsncpy+0x49A
Library=C:\WINDOWS\system32\ntdll.dll

Current Java thread:
	at net.java.games.jogl.impl.windows.WindowsGLImpl.glVertex4f(Native Method)
	at com.vorax.geometry.ShadowRendererB.drawInfiniteShadowVolume(ShadowRendererB.java:406)
	at com.vorax.Renderer.display(Renderer.java:564)
	- locked <0x114ff130> (a java.lang.Object)
	at net.java.games.jogl.impl.GLDrawableHelper.display(GLDrawableHelper.java:74)
	at net.java.games.jogl.GLCanvas$DisplayAction.run(GLCanvas.java:249)
	at net.java.games.jogl.impl.GLContext.invokeGL(GLContext.java:292)
	- locked <0x114ff1e0> (a net.java.games.jogl.impl.windows.WindowsOnscreenGLContext)
	at net.java.games.jogl.impl.windows.WindowsOnscreenGLContext.invokeGL(WindowsOnscreenGLContext.java:79)
	at net.java.games.jogl.GLCanvas$DisplayOnEventDispatchThreadAction.run(GLCanvas.java:266)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:171)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:454)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)

Video card: nVidia GeForce 5500FX 256MB - ForceWare version: 71.89 (latest)

This also works if I don’t use the display list, that’s the work around for now but at the cost of performance.

I haven’t tried that code as VA’s or VBO’s. I can probably do that as a work around, but only if necessary or if it will be faster, which for the dynamic cases it will, but I am not sure about the static ones.