1
Support / Shadows - Causing JVM crash.
« on: December 02, 2010, 07:40:21 pm »Hi,
When I enable shadows, using the shadowhelper, around 60 percent of the time I get a JVM fatal error that causes the application to crash. The other 40 percent the shadows are displayed as expected (my avatar casts a shadow on the floor). Below is the error, the stack trace, and snippets of my code. The error is related to the buffer when openGl is drawing the elements. The crash happened outside the Java Virtual Machine in native code.
Code: [Select]
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000000fc55ea9, pid=2340, tid=8428
#
# JRE version: 6.0_20-b02
# Java VM: Java HotSpot(TM) 64-Bit Server VM (16.3-b01 mixed mode windows-amd64 )
# Problematic frame:
# C [atio6axx.dll+0x6a5ea9]
#
And the trace:
Code: [Select]
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j org.lwjgl.opengl.GL11.nglDrawElements(IIILjava/nio/Buffer;IJ)V+0
j org.lwjgl.opengl.GL11.glDrawElements(ILjava/nio/IntBuffer;)V+37
j com.threed.jpct.CompiledInstance.compileToDL()V+139
j com.threed.jpct.GLBase.compileDLs()V+57
j com.threed.jpct.AWTGLRenderer.drawVertexArray(Lcom/threed/jpct/AWTDisplayList;I)V+9
j com.threed.jpct.AWTJPCTCanvas.paintGL()V+149
j org.lwjgl.opengl.AWTGLCanvas.paint(Ljava/awt/Graphics;)V+165
j org.lwjgl.opengl.AWTGLCanvas.update(Ljava/awt/Graphics;)V+2
As seen in the above stack, the error occurs when jPCT calls glDrawElements on GL11. I see a few forums that discuss this issue, such as: http://www.gamedev.net/community/forums/topic.asp?topic_id=463211 and http://jmonkeyengine.org/groups/graphics/forum/topic/trouble-with-dynamically-built-geometry/
However, since no one else has posted this error, I’m assuming that I must be doing something wrong. However, the steps are straight forward so I am hoping that this requires a simple change.
Framebuffer mode: FrameBuffer.SAMPLINGMODE_GL_AA_4X
and the width and height is set at runtime based on the browser size calculations.
Also, since this is running in HW mode, I compile the objects as follows:
Code: [Select]
objs.compile(true, true, true, true, 4000);
My code snippets:
Initialization code for shadow helper (runs only once):
Code: [Select]
projector = new Projector();
projector.setFOV(0.5f);
projector.setYFOV(0.5f);
shadowHelper = new ShadowHelper(jpctWorld, frameBuffer, projector, 2048);
shadowHelper.setCullingMode(false);
shadowHelper.setAmbientLight(new Color(80, 80, 80));
shadowHelper.setLightMode(true);
shadowHelper.setBorder(1);
shadowHelper.addCaster(avatar);
shadowHelper.addReceiver(floor);
Then, in the game loop, after the initialization has completed:
Code: [Select]
frameBuffer.clear();
projector.lookAt(avatar.getTransformedCenter());
projector.setPosition( new SimpleVector(10, -20, 0) );
shadowHelper.updateShadowMap();
shadowHelper.drawScene();
//Code to render scene to buffer, draw to the buffer, etc...
jpctWorld.renderScene( frameBuffer );
jpctWorld.draw( frameBuffer );
frameBuffer.update();
frameBuffer.displayGLOnly();
hardwareOpenGLWorldCanvas.repaint();
Note: when I set the indexed mode to false when compiling objects that cast shadows, that is:
Code: [Select]
objs.compile(true, true, true, false, 4000);
then I get a similar error, but the glDrawArrays is called instead of glDrawElements.Code: [Select]
j org.lwjgl.opengl.GL11.nglDrawArrays(IIIJ)V+0
j org.lwjgl.opengl.GL11.glDrawArrays(III)V+20
j com.threed.jpct.CompiledInstance.compileToDL()V+151
I’ve tried decreasing the shadow buffer to 256 and still the same error. I’ve looked at other code samples and I don’t see any major differences. I don’t see a similar issue on the forum, except one where updating the graphics driver solved the problem. Any suggestions of what I can try would be greatly appreciated (except for update your graphics drivers, because I have done that). Perhaps the way I am using jPCT to specify the Open GL buffer is incorrect? BTW, my card is an ATI Mobility Radeon HD 4650.
Thanks!