After upgrading from JOGL1 my canvas dies when moving between monitors

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

After upgrading from JOGL1 my canvas dies when moving between monitors

wspear
I just updated my application from an ancient version of JOGL 1 to the most recent release. This mostly consisted of changing some import paths and changing GL objects to GL2 objects.

Everything seems to work except when I drag my application from one of my monitors to the other the canvas with my rendered objects turns blank and I have to reset the whole application to see anything. The application also hops to the monitor where it is being dragged when the canvas begins to cross over instead of transitioning smoothly with my mouse movement as it used to.

I am running on 64 bit Ubuntu 12.04 and my dual-head setup is managed by the Nouveau drivers.

I noticed two API changes during the upgrade which might be relevant.  The first is that GLCapabilities now requires an argument. I wasn't sure where to find what it wanted so I just passed in null which results in it grabbing a default.

The second is that my renderer which implements GLEventListener now requires a dispose(GLAutoDrawable) method. Destroying my drawable (or doing anything else) inside the dispose method didn't seem to accomplish anything, but this method is called whenever I move my application between monitors. The problem is presumably a chain of disposal that occurs when the monitor switch is detected but I don't know what I can do to recover from that smoothly.

A block of console error output is generated when the switch occurs and the canvas goes blank. Just googling around I haven't been able to find much useful information on it but it seems to suggest some kind of issue with reinitializing itself on the new monitor:

Info: Nativewindow X11 Error: 3 - BadWindow (invalid Window parameter), dpy 0x7f3d2c27c7a0, id 360009d, # 5838: 20:0 X_GetProperty
Info: Nativewindow X11 Error: 3 - BadWindow (invalid Window parameter), dpy 0x7f3d2c27c7a0, id 360009d, # 5839: 20:0 X_GetProperty
nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 30
nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 30
nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 55
nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 56
nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 59
nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 58
nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 30
nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 30
nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 30
nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 55
nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 56
nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 59
nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 58
nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 30

Please let me know if there is any more information I can provide. Any assistance would be greatly appreciated. I'll have to switch back to my prior version of JOGL if I can't get this fixed.
Reply | Threaded
Open this post in threaded view
|

Re: After upgrading from JOGL1 my canvas dies when moving between monitors

Sven Gothel
Administrator
On 04/18/2013 01:15 AM, wspear [via jogamp] wrote:

> I just updated my application from an ancient version of JOGL 1 to the most
> recent release. This mostly consisted of changing some import paths and
> changing GL objects to GL2 objects.
>
> Everything seems to work except when I drag my application from one of my
> monitors to the other the canvas with my rendered objects turns blank and I
> have to reset the whole application to see anything. The application also hops
> to the monitor where it is being dragged when the canvas begins to cross over
> instead of transitioning smoothly with my mouse movement as it used to.
>
> I am running on 64 bit Ubuntu 12.04 and my dual-head setup is managed by the
> Nouveau drivers.
>
> I noticed two API changes during the upgrade which might be relevant.  The
> first is that GLCapabilities now requires an argument. I wasn't sure where to
> find what it wanted so I just passed in null which results in it grabbing a
> default.
>
> The second is that my renderer which implements GLEventListener now requires a
> dispose(GLAutoDrawable) method. Destroying my drawable (or doing anything
> else) inside the dispose method didn't seem to accomplish anything, but this
> method is called whenever I move my application between monitors. The problem
> is presumably a chain of disposal that occurs when the monitor switch is
> detected but I don't know what I can do to recover from that smoothly.
>
> A block of console error output is generated when the switch occurs and the
> canvas goes blank. Just googling around I haven't been able to find much
> useful information on it but it seems to suggest some kind of issue with
> reinitializing itself on the new monitor:
>
> Info: Nativewindow X11 Error: 3 - BadWindow (invalid Window parameter), dpy
> 0x7f3d2c27c7a0, id 360009d, # 5838: 20:0 X_GetProperty
> Info: Nativewindow X11 Error: 3 - BadWindow (invalid Window parameter), dpy
> 0x7f3d2c27c7a0, id 360009d, # 5839: 20:0 X_GetProperty
> nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 30
> nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 30
> nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 55
> nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 56
> nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 59
> nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 58
> nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 30
> nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 30
> nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 30
> nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 55
> nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 56
> nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 59
> nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 58
> nvfx_screen_get_param:95 -  Warning: unknown PIPE_CAP 30
>
> Please let me know if there is any more information I can provide. Any
> assistance would be greatly appreciated. I'll have to switch back to my prior
> version of JOGL if I can't get this fixed.
First of all thank you for your bug report via this forum.

Proper bug reporting is described here:
  <https://jogamp.org/wiki/index.php/Jogl_FAQ#Bugreports_.26_Testing>

We do prefer bugzilla bug reports, after initial discussion here.

Regarding latest builds, please have a look here:
  Please use one of the latest aggregated archives[1],
  as described in this section[2].

  [1] <http://jogamp.org/deployment/archive/master/?C=M;O=D>
  [2] <https://jogamp.org/wiki/index.php/Downloading_and_installing_JOGL#Downloading_the_latest_aggregated_autobuild>

Then I would need your test case, which you may attach to the bug report.
At least you could reference one of our many unit tests within JOGL, maybe under the 'demo' sub-packages.
Chose one which matches your test case the most .. and use it as a boiler plate for your new one.
Or .. simply create a small test case.

You mention X11, your test case will show whether you use GLCanvas (I guess so) or
any other GLAutoDrawable.

I will test multi monitor behavior w/ AWT GLCanvas and NEWT
on a vbox 3d hw-accel machine in a bit and post you the result.

I will use the following demo unit tests on GNU/Linux (X11) and Windows:
  com.jogamp.opengl.test.junit.jogl.demos.es2.awt.TestGearsES2AWT
  com.jogamp.opengl.test.junit.jogl.demos.es2.newt.TestGearsES2NEWT
  com.jogamp.opengl.test.junit.jogl.demos.es2.newt.TestGearsES2NewtCanvasSWT
  com.jogamp.opengl.test.junit.jogl.demos.gl2.awt.TestGearsGLJPanelAWT

~Sven



signature.asc (911 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: After upgrading from JOGL1 my canvas dies when moving between monitors

wspear
A quick update: Digging in with some simpler examples it looks like the renderer by itself isn't the problem. The dispose call is coming from higher up in the UI stack. Unless the dispose call arrives when dragging between windows this issue will  not occur and that only happens with my full application, not my little canvas-only test cases.

I'm still trying to figure out what part of my UI is sending dispose on a monitor switch. executeDisplayChangedOnEDT in AWT's XWindowPeer class calls the awt.component's setGraphicsConfiguration and this is what leads to the dispose but all of that is fired off in its own thread and I can't tell where in my UI code it's coming from via the stack trace.
Reply | Threaded
Open this post in threaded view
|

Re: After upgrading from JOGL1 my canvas dies when moving between monitors

Sven Gothel
Administrator
In reply to this post by wspear
On 04/18/2013 03:54 AM, Sven Gothel wrote:

Using:
>   [1] <http://jogamp.org/deployment/archive/master/?C=M;O=D>
>
>
> I will test multi monitor behavior w/ AWT GLCanvas and NEWT
> on a vbox 3d hw-accel machine in a bit and post you the result.
>

VBox-1: Ubuntu 12.04 64bit, monitors 2
  GL_VENDOR: VMware, Inc.
  GL_RENDERER: Gallium 0.4 on llvmpipe (LLVM 0x300)
  GL_VERSION: 2.1 Mesa 8.0.4
  GL GLSL: true, has-compiler: true, version 1.20, 1.20.0
  GL FBO: basic true, full true
  GL Profile: GLProfile[GL2/GL2.sw]
  GL Renderer Quirks:[NoDoubleBufferedPBuffer, NoSetSwapIntervalPostRetarget]
  GL:jogamp.opengl.gl4.GL4bcImpl@bdee400, 2.1 (hardware) - 2.1 Mesa 8.0.4

VBox-2: Ubuntu 12.04 64bit, monitors 2
  GL_VENDOR: Humper
  GL_RENDERER: Chromium
  GL_VERSION: 2.1 Chromium 1.9
  GL GLSL: true, has-compiler: true, version 4.30 NVIDIA via Cg compiler, 4.30.0
  GL FBO: basic true, full false
  GL Profile: GLProfile[GL2/GL2.hw]
  GL Renderer Quirks:[]
  GL:jogamp.opengl.gl4.GL4bcImpl@47ad6b4b, 2.1 (hardware) - 2.1 Chromium 1.9

VBox-3: Like VBox-2 but w/ only: monitors 1

(1) No destroy/init while moving from monitor to monitor
(2) destroy/init while moving from monitor to monitor

> I will use the following demo unit tests on GNU/Linux (X11) and Windows:
>   com.jogamp.opengl.test.junit.jogl.demos.gl2.awt.TestGearsAWT
- VBox-1  : OK (1)
- VBox-2/3: OK (1)

>   com.jogamp.opengl.test.junit.jogl.demos.gl2.newt.TestGearsNEWT
- VBox-1:   OK (1)
- VBox-2/3: No crash, but no visible picture

>   com.jogamp.opengl.test.junit.jogl.demos.gl2.awt.TestGearsGLJPanelAWT
- VBox-1  : OK (1)
- VBox-2/3: FBO doesn't work -> No picture! (this is described in vbox 'issues')
            TODO Should handle error and fallback!

>   com.jogamp.opengl.test.junit.jogl.demos.es2.awt.TestGearsES2AWT
- VBox-1: OK (1)
- VBox-2: Freezes X server after successful test (duh)
          Looks like GLSL is not working properly w/ driver.
- VBox-3: OK (1)

>   com.jogamp.opengl.test.junit.jogl.demos.es2.newt.TestGearsES2NEWT
- VBox-1: OK (1)
- VBox-2: Freezes X server after successful test (duh)
          Looks like GLSL is not working properly w/ driver.
- VBox-3: OK (1)

>   com.jogamp.opengl.test.junit.jogl.demos.es2.newt.TestGearsES2NewtCanvasAWT
- VBox-1: OK (1)
- VBox-2: Freezes X server after successful test (duh)
          Looks like GLSL is not working properly w/ driver.
- VBox-3: OK (1)

>
> ~Sven
>
>



signature.asc (911 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: After upgrading from JOGL1 my canvas dies when moving between monitors

Sven Gothel
Administrator
In reply to this post by wspear
On 04/18/2013 08:25 PM, wspear [via jogamp] wrote:

> A quick update: Digging in with some simpler examples it looks like the
> renderer by itself isn't the problem. The dispose call is coming from higher
> up in the UI stack. Unless the dispose call arrives when dragging between
> windows this issue will  not occur and that only happens with my full
> application, not my little canvas-only test cases.
>
> I'm still trying to figure out what part of my UI is sending dispose on a
> monitor switch. executeDisplayChangedOnEDT in AWT's XWindowPeer class calls
> the awt.component's setGraphicsConfiguration and this is what leads to the
> dispose but all of that is fired off in its own thread and I can't tell where
> in my UI code it's coming from via the stack trace.
Even though this extra lifecycle (destroy/init) triggered by a monitor switch
is not desired - a GLEventListener shall survive it.

As posted earlier, I haven't experienced such extra lifecycle in my
tests.

Hence it would be nice to know the details, and whether we really need
the extra lifecycle.

AFAIK .. we had this issue a while ago w/ some AWT implementation
and you might want to search for it in the forum/bugzilla.

~Sven



signature.asc (911 bytes) Download Attachment