LWJGL Forum

Programming => Lightweight Java Gaming Library => Topic started by: Momoko_Fan on November 20, 2011, 00:04:12

Title: pbuffer.isBufferLost() throws IllegalStateException
Post by: Momoko_Fan on November 20, 2011, 00:04:12
This one is a little weird, here's the trace:

java.lang.IllegalStateException: The Drawable has no context available.
at org.lwjgl.opengl.DrawableGL.checkDestroyed(DrawableGL.java:152)
at org.lwjgl.opengl.Pbuffer.isBufferLost(Pbuffer.java:249)
at com.jme3.system.lwjgl.LwjglOffscreenBuffer.runLoop(LwjglOffscreenBuffer.java:113)
at com.jme3.system.lwjgl.LwjglOffscreenBuffer.run(LwjglOffscreenBuffer.java:147)
[catch] at java.lang.Thread.run(Thread.java:722)


The relevant code is this:
if (pbuffer.isBufferLost()){
           pbuffer.destroy();
           try{
               pbuffer = new Pbuffer(width, height, pixelFormat, null);
               pbuffer.makeCurrent();
           }catch (LWJGLException ex){
               listener.handleError("Failed to restore pbuffer content", ex);
           }
       }

As you can see there's really no chance for this code to happen if the pbuffer is destroyed, since it is immediately recreated afterwards.

It seems like this might be a bug? What do you think?

EDIT:
Here's the original post:
http://jmonkeyengine.org/groups/android/forum/topic/cant-install-android-support/#post-151579
There are other additional errors after it, might help understand the issue.
Title: Re: [BUG] pbuffer.isBufferLost() throws IllegalStateException
Post by: spasi on November 21, 2011, 11:38:05
AFAICT, the pbuffer was never created in the first place. See this one:

org.lwjgl.LWJGLException: Could not create Pbuffer
at org.lwjgl.opengl.WindowsPbufferPeerInfo.nCreate(Native Method)
at org.lwjgl.opengl.WindowsPbufferPeerInfo.(WindowsPbufferPeerInfo.java:47)
at org.lwjgl.opengl.WindowsDisplay.createPbuffer(WindowsDisplay.java:663)
at org.lwjgl.opengl.Pbuffer.createPbuffer(Pbuffer.java:234)
at org.lwjgl.opengl.Pbuffer.(Pbuffer.java:219)
at org.lwjgl.opengl.Pbuffer.(Pbuffer.java:190)
at org.lwjgl.opengl.Pbuffer.(Pbuffer.java:166)
[catch] at com.jme3.system.lwjgl.LwjglOffscreenBuffer.runLoop(LwjglOffscreenBuffer.java:116)
at com.jme3.system.lwjgl.LwjglOffscreenBuffer.run(LwjglOffscreenBuffer.java:147)
at java.lang.Thread.run(Thread.java:722)


The pbuffer being lost is not the same as being destroyed. You cannot call .isBufferLost on a destroyed, or (in this case) never created, pbuffer.
Title: Re: [BUG] pbuffer.isBufferLost() throws IllegalStateException
Post by: Momoko_Fan on November 23, 2011, 04:59:59
That makes no sense. If I create a pbuffer with new Pbuffer() then it is created, if I call pbuffer.destroy() the pbuffer is destroyed. How can there exist a never created pbuffer that I can call isBufferLost() on?
Also the buffer can never be in a destroyed state, because in each instance where I destroy the pbuffer, I recreate it again.
Perhaps I am missing something obvious but I don't see it
Title: Re: [BUG] pbuffer.isBufferLost() throws IllegalStateException
Post by: spasi on November 23, 2011, 08:26:53
This is what I think is happening:

- The original pbuffer was created successfully.
- At some point, .isBufferLost() returns true.
- You destroy the original pbuffer.
- You create another pbuffer, but an exception is thrown and the pbuffer variable continues to reference the original pbuffer.
- The next time .isBufferLost() is called on a destroyed pbuffer, so you get that exception.

Indeed, my previous reply wasn't accurate.