Bug 78

Summary: Re-assigning rendering thread causes subsequent display() to fail
Product: [JogAmp] Jogl Reporter: Sven Gothel <sgothel>
Component: coreAssignee: Sven Gothel <sgothel>
Status: VERIFIED FIXED    
Severity: normal    
Priority: P2    
Version: 1   
Hardware: All   
OS: windows   
Type: DEFECT SCM Refs:
Workaround: ---

Description Sven Gothel 2010-03-24 07:46:30 CET


---- Reported by yvg 2004-04-26 10:31:57 ----

Imagine I want to turn on FSAA on existing scene. I have GLCanvas created 
(canvasA), set up and running, and its rendering thread set to rendering thread 
of the app.

No the app wants to turn on FSAA. Inside the rendering thread, just after 
canvasA.display() it calls canvasA.setRenderingThread(null), then creates new 
canvasB with FSAA turned on, calls canvasB.setRenderingThread
(Thread.currentThread()), and then canvasB.display().

The code executing is similar to this:

GLCanvas canvasA = createCanvas(FSAA disabled);
canvasA.setRenderingThread(Thread.currentThread());
canvasA.display();
canvasA.setRenderingThread(null);
GLCanvas canvasB = createCanvas(FSAA enabled);
canvasB.setRenderingThread(Thread.currentThread());
canvasB.display();

In current implementation, canvasB.display() fails with "Surface already 
unlocked" exception.

The reason of this problem is that in GLContext.invokeGL() during the handling 
of canvasA.setRenderingThread(null) the second reference to canvasA's context 
pushed, and before freeing only one of the references popped from the stack. 
This causes that reference to context which is already freed left on the stack 
and during the next call to canvasB.display() GLContext.invokeGL() tries to 
free it again, which is invalid.

The simplest fix for this issue is to duplicate pop() operation for case when 
freeing context after setRenderingThread(null), i.e. replace fragment

if (mustFreeBecauseOfNoRenderingThread) {
  // Must match previous push()
  ctxStack.pop();
}

with 

if (mustFreeBecauseOfNoRenderingThread) {
  // Must match previous push()
  ctxStack.pop();
  ctxStack.pop();
}

in GLContext.invokeGL().

I tried this fix and it solved the problem.

Yuri Vl. Gushchin
JProof



---- Additional Comments From kbr 2004-04-30 15:06:48 ----

The code in GLContext.invokeGL() which keeps track of which GLDrawables are in
the process of rendering on the current thread was buggy, largely because it was
too complicated. A restructuring and simplification has made it easier to
understand and has fixed Issue 80, which is probably identical to this one.

Please retest with the nightly build dated April 31 and update this bug
indicating whether this problem has been addressed. This fix will be present in
JOGL 1.1 beta 04.




---- Additional Comments From kbr 2004-05-05 23:50:10 ----

Submitter confirmed that new code fixes this issue.




---- Additional Comments From kbr 2004-05-05 23:51:22 ----

*** Issue 80 has been marked as a duplicate of this issue. ***



--- Bug imported by sgothel@jausoft.com 2010-03-24 07:46 EDT  ---

This bug was previously known as _bug_ 78 at https://jogl.dev.java.net/bugs/show_bug.cgi?id=78

Unknown bug field "has_duplicates" encountered while moving bug
   <has_duplicates>
     <bug_id>80</bug_id>
     <who>kbr</who>
     <when>2004-05-05 23:51:22</when>
</has_duplicates>