I'm using Slick2D (yeah, I know, outdated library) with lwjgl 2.9.3. On some machines only, if using a fullscreen display, I get an EXCEPTION_ACCESS_VIOLATION from WindowsContextImplementation.nSwapBuffers if I used an FBO-based "Graphics" object.
Details:
The Slick2D code that causes this:
Image img = new Image(128, 128);
img.getGraphics();
What it does in the background:
(See linked code for details.)
Somehow, in this process, it messes up some state, which later causes the following crash:
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j org.lwjgl.opengl.WindowsContextImplementation.nSwapBuffers(Ljava/nio/ByteBuffer;)V+0
j org.lwjgl.opengl.WindowsContextImplementation.swapBuffers()V+35
j org.lwjgl.opengl.ContextGL.swapBuffers()V+3
j org.lwjgl.opengl.DrawableGL.swapBuffers()V+0
j org.lwjgl.opengl.Display.swapBuffers()V+39
j org.lwjgl.opengl.Display.update(Z)V+44
j org.lwjgl.opengl.Display.update()V+1
I've been digging through the code, but I don't know how the FBO stuff is supposed to work, and what it might be doing wrong. I can reliably reproduce it one one machine using the following Slick2D code:
package crashrepro;
import org.newdawn.slick.*;
public class CrashRepro extends BasicGame {
public static void main(String[] args) throws Exception {
CrashRepro cr = new CrashRepro("CrashRepro");
// Crash only happens in fullscreen mode, and only on some machines.
AppGameContainer agc = new AppGameContainer(cr, 800, 600, true);
agc.start();
}
public CrashRepro(String title) { super(title); }
@Override
public void init(GameContainer gc) throws SlickException {}
@Override
public void update(GameContainer gc, int i) throws SlickException {}
Image img;
@Override
public void render(GameContainer gc, Graphics grphcs) throws SlickException {
if (img == null) { img = new Image(128, 128); }
img.getGraphics(); // This causes a crash in the next nSwapBuffers call.
}
}
Any advice, or ideas where to start digging/diagnosing this further?