Jogamp
Bug 1078: Add Fallback in AWTPrintLifecycle.setupPrint(): Use Onscreen GLAD if Offscr...
authorSven Gothel <sgothel@jausoft.com>
Tue, 30 Sep 2014 21:18:15 +0000 (23:18 +0200)
committerSven Gothel <sgothel@jausoft.com>
Tue, 30 Sep 2014 21:18:15 +0000 (23:18 +0200)
- GLDrawableFactoryImpl: createOffscreenDrawable(..) and createDummyAutoDrawable(..)
  Temporary catch exception during setRealized(true) of newly created GLDrawable,
  to unrealize the instance before propagating the exception.

  This handling removes a memory leak in case the exception of this method is handled
  and application continues to operate, e.g. as in AWTPrintLifecycle.setupPrint().

  The underlying drawable gets unrealized, since it's setRealized(boolean)
  implementation toggles its realize-state before delegating the realize-operation.
  Hence this is functional.

- AWTPrintLifecycle.setupPrint() Stability
  Catch exception thrown by factory.createOffscreenAutoDrawable(..)'s setRealize(true)
  to continue operation w/ onscreen GLAD.

src/jogl/classes/com/jogamp/opengl/util/GLDrawableUtil.java
src/jogl/classes/javax/media/opengl/awt/GLCanvas.java
src/jogl/classes/javax/media/opengl/awt/GLJPanel.java
src/jogl/classes/jogamp/opengl/GLDrawableFactoryImpl.java
src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java

index 956693c..634cfea 100644 (file)
@@ -150,7 +150,7 @@ public class GLDrawableUtil {
     }
 
     /**
-     * Return a heuristic value whether switching the {@link GLContext} is safe between {@lin GLAutoDrawable}s,
+     * Return a heuristic value whether switching the {@link GLContext} is safe between {@link GLAutoDrawable}s,
      * i.e. via {@link #swapGLContext(GLAutoDrawable, GLAutoDrawable)} or {@link #swapGLContextAndAllGLEventListener(GLAutoDrawable, GLAutoDrawable)}.
      * <p>
      * Method currently returns <code>false</code> if:
index 563158a..a648e3b 100644 (file)
@@ -82,6 +82,7 @@ import javax.media.opengl.GLDrawable;
 import javax.media.opengl.GLDrawableFactory;
 import javax.media.opengl.GLEventListener;
 import javax.media.opengl.GLException;
+import javax.media.opengl.GLOffscreenAutoDrawable;
 import javax.media.opengl.GLProfile;
 import javax.media.opengl.GLRunnable;
 import javax.media.opengl.GLSharedContextSetter;
@@ -893,11 +894,22 @@ public class GLCanvas extends Canvas implements AWTGLAutoDrawable, WindowClosing
               }
               if( reqNewGLAD ) {
                   final GLDrawableFactory factory = GLDrawableFactory.getFactory(newGLADCaps.getGLProfile());
-                  printGLAD = factory.createOffscreenAutoDrawable(null, newGLADCaps, null,
-                          printAWTTiles.customTileWidth != -1 ? printAWTTiles.customTileWidth : DEFAULT_PRINT_TILE_SIZE,
-                          printAWTTiles.customTileHeight != -1 ? printAWTTiles.customTileHeight : DEFAULT_PRINT_TILE_SIZE);
-                  GLDrawableUtil.swapGLContextAndAllGLEventListener(GLCanvas.this, printGLAD);
-                  printDrawable = printGLAD.getDelegatedDrawable();
+                  GLOffscreenAutoDrawable offGLAD = null;
+                  try {
+                      offGLAD = factory.createOffscreenAutoDrawable(null, newGLADCaps, null,
+                                  printAWTTiles.customTileWidth != -1 ? printAWTTiles.customTileWidth : DEFAULT_PRINT_TILE_SIZE,
+                                  printAWTTiles.customTileHeight != -1 ? printAWTTiles.customTileHeight : DEFAULT_PRINT_TILE_SIZE);
+                  } catch (final GLException gle) {
+                      if( DEBUG ) {
+                          System.err.println("Caught: "+gle.getMessage());
+                          gle.printStackTrace();
+                      }
+                  }
+                  if( null != offGLAD ) {
+                      printGLAD = offGLAD;
+                      GLDrawableUtil.swapGLContextAndAllGLEventListener(GLCanvas.this, printGLAD);
+                      printDrawable = printGLAD.getDelegatedDrawable();
+                  }
               }
               printAWTTiles.setGLOrientation(printGLAD.isGLOriented(), printGLAD.isGLOriented());
               printAWTTiles.renderer.setTileSize(printDrawable.getSurfaceWidth(), printDrawable.getSurfaceHeight(), 0);
index 5bc4c9a..126513e 100644 (file)
@@ -753,11 +753,22 @@ public class GLJPanel extends JPanel implements AWTGLAutoDrawable, WindowClosing
               }
               if( reqNewGLAD ) {
                   final GLDrawableFactory factory = GLDrawableFactory.getFactory(newGLADCaps.getGLProfile());
-                  printGLAD = factory.createOffscreenAutoDrawable(null, newGLADCaps, null,
-                          printAWTTiles.customTileWidth != -1 ? printAWTTiles.customTileWidth : DEFAULT_PRINT_TILE_SIZE,
-                          printAWTTiles.customTileHeight != -1 ? printAWTTiles.customTileHeight : DEFAULT_PRINT_TILE_SIZE);
-                  GLDrawableUtil.swapGLContextAndAllGLEventListener(GLJPanel.this, printGLAD);
-                  printDrawable = printGLAD.getDelegatedDrawable();
+                  GLOffscreenAutoDrawable offGLAD = null;
+                  try {
+                      offGLAD = factory.createOffscreenAutoDrawable(null, newGLADCaps, null,
+                              printAWTTiles.customTileWidth != -1 ? printAWTTiles.customTileWidth : DEFAULT_PRINT_TILE_SIZE,
+                              printAWTTiles.customTileHeight != -1 ? printAWTTiles.customTileHeight : DEFAULT_PRINT_TILE_SIZE);
+                  } catch (final GLException gle) {
+                      if( DEBUG ) {
+                          System.err.println("Caught: "+gle.getMessage());
+                          gle.printStackTrace();
+                      }
+                  }
+                  if( null != offGLAD ) {
+                      printGLAD = offGLAD;
+                      GLDrawableUtil.swapGLContextAndAllGLEventListener(GLJPanel.this, printGLAD);
+                      printDrawable = printGLAD.getDelegatedDrawable();
+                  }
               }
               printAWTTiles.setGLOrientation( !GLJPanel.this.skipGLOrientationVerticalFlip && printGLAD.isGLOriented(), printGLAD.isGLOriented() );
               printAWTTiles.renderer.setTileSize(printDrawable.getSurfaceWidth(), printDrawable.getSurfaceHeight(), 0);
index 8d65f16..b51f290 100644 (file)
@@ -275,7 +275,14 @@ public abstract class GLDrawableFactoryImpl extends GLDrawableFactory {
                                                              final GLCapabilitiesChooser chooser,
                                                              final int width, final int height) {
     final GLDrawable drawable = createOffscreenDrawable( deviceReq, capsRequested, chooser, width, height );
-    drawable.setRealized(true);
+    try {
+        drawable.setRealized(true);
+    } catch( final GLException gle) {
+        try {
+            drawable.setRealized(false);
+        } catch( final GLException gle2) { /* ignore */ }
+        throw gle;
+    }
     if(drawable instanceof GLFBODrawableImpl) {
         return new GLOffscreenAutoDrawableImpl.FBOImpl( (GLFBODrawableImpl)drawable, null, null, null );
     }
@@ -285,7 +292,14 @@ public abstract class GLDrawableFactoryImpl extends GLDrawableFactory {
   @Override
   public final GLAutoDrawable createDummyAutoDrawable(final AbstractGraphicsDevice deviceReq, final boolean createNewDevice, final GLCapabilitiesImmutable capsRequested, final GLCapabilitiesChooser chooser) {
       final GLDrawable drawable = createDummyDrawable(deviceReq, createNewDevice, capsRequested, chooser);
-      drawable.setRealized(true);
+      try {
+          drawable.setRealized(true);
+      } catch( final GLException gle) {
+          try {
+              drawable.setRealized(false);
+          } catch( final GLException gle2) { /* ignore */ }
+          throw gle;
+      }
       final GLAutoDrawable sharedDrawable = new GLAutoDrawableDelegate(drawable, null, null, true /*ownDevice*/, null) { };
       return sharedDrawable;
   }
index 397c810..e7ef224 100644 (file)
@@ -56,6 +56,8 @@ import javax.media.opengl.GLCapabilities;
 import javax.media.opengl.GLCapabilitiesImmutable;
 import javax.media.opengl.GLDrawable;
 import javax.media.opengl.GLDrawableFactory;
+import javax.media.opengl.GLException;
+import javax.media.opengl.GLOffscreenAutoDrawable;
 import javax.swing.MenuSelectionManager;
 
 import jogamp.nativewindow.awt.AWTMisc;
@@ -670,11 +672,21 @@ public class NewtCanvasAWT extends java.awt.Canvas implements WindowClosingProto
                 }
                 if( reqNewGLAD ) {
                     final GLDrawableFactory factory = GLDrawableFactory.getFactory(newGLADCaps.getGLProfile());
-                    printGLAD = factory.createOffscreenAutoDrawable(null, newGLADCaps, null,
-                            printAWTTiles.customTileWidth != -1 ? printAWTTiles.customTileWidth : DEFAULT_PRINT_TILE_SIZE,
-                            printAWTTiles.customTileHeight != -1 ? printAWTTiles.customTileHeight : DEFAULT_PRINT_TILE_SIZE);
-                    GLDrawableUtil.swapGLContextAndAllGLEventListener(glad, printGLAD);
-                    printDrawable = printGLAD.getDelegatedDrawable();
+                    GLOffscreenAutoDrawable offGLAD = null;
+                    try {
+                        offGLAD = factory.createOffscreenAutoDrawable(null, newGLADCaps, null,
+                                printAWTTiles.customTileWidth != -1 ? printAWTTiles.customTileWidth : DEFAULT_PRINT_TILE_SIZE,
+                                printAWTTiles.customTileHeight != -1 ? printAWTTiles.customTileHeight : DEFAULT_PRINT_TILE_SIZE);
+                    } catch (final GLException gle) {
+                        if( DEBUG ) {
+                            System.err.println("Caught: "+gle.getMessage());
+                            gle.printStackTrace();
+                        }
+                    }
+                    if( null != offGLAD ) {
+                        GLDrawableUtil.swapGLContextAndAllGLEventListener(glad, printGLAD);
+                        printDrawable = printGLAD.getDelegatedDrawable();
+                    }
                 }
                 printAWTTiles.setGLOrientation(printGLAD.isGLOriented(), printGLAD.isGLOriented());
                 printAWTTiles.renderer.setTileSize(printDrawable.getSurfaceWidth(), printDrawable.getSurfaceHeight(), 0);
http://JogAmp.org git info: FAQ, tutorial and man pages.