Jogamp
GLDrawable: Expose getRequestedGLCapabilities() (Include to public API)
authorSven Gothel <sgothel@jausoft.com>
Wed, 30 Jul 2014 22:48:40 +0000 (00:48 +0200)
committerSven Gothel <sgothel@jausoft.com>
Wed, 30 Jul 2014 22:48:40 +0000 (00:48 +0200)
In certain cases, it is required to read the user requested capabilities
from places other than the user code.

Hence adding public method to GLDrawable interface.

This removes the need to cast to private GLDrawableImpl,
which included such method.

src/jogl/classes/com/jogamp/opengl/swt/GLCanvas.java
src/jogl/classes/javax/media/opengl/GLDrawable.java
src/jogl/classes/javax/media/opengl/awt/GLCanvas.java
src/jogl/classes/javax/media/opengl/awt/GLJPanel.java
src/jogl/classes/jogamp/opengl/GLAutoDrawableBase.java
src/jogl/classes/jogamp/opengl/GLDrawableImpl.java

index eae5948..03c6d69 100644 (file)
@@ -832,14 +832,10 @@ public class GLCanvas extends Canvas implements GLAutoDrawable, GLSharedContextS
       return null != _drawable ? (GLCapabilitiesImmutable)_drawable.getChosenGLCapabilities() : null;
    }
 
-   /**
-    * Accessor for the GLCapabilities that were requested (via the constructor parameter).
-    *
-    * @return Non-null GLCapabilities.
-    */
+   @Override
    public GLCapabilitiesImmutable getRequestedGLCapabilities() {
       final GLDrawable _drawable = drawable;
-      return null != _drawable ? (GLCapabilitiesImmutable)_drawable.getNativeSurface().getGraphicsConfiguration().getRequestedCapabilities() : null;
+      return null != _drawable ? (GLCapabilitiesImmutable)_drawable.getRequestedGLCapabilities() : null;
    }
 
    @Override
index 57883c8..ac86446 100644 (file)
@@ -174,17 +174,36 @@ public interface GLDrawable extends NativeSurfaceHolder {
   public void swapBuffers() throws GLException;
 
   /** Fetches the {@link GLCapabilitiesImmutable} corresponding to the chosen
-      OpenGL capabilities (pixel format / visual / GLProfile) for this drawable.<br>
+      OpenGL capabilities (pixel format / visual / GLProfile) for this drawable.
+      <p>
+      This query only returns the chosen capabilities if {@link #isRealized()}.
+      </p>
+      <p>
       On some platforms, the pixel format is not directly associated
       with the drawable; a best attempt is made to return a reasonable
-      value in this case. <br>
+      value in this case.
+      </p>
+      <p>
       This object shall be directly associated to the attached {@link NativeSurface}'s
       {@link AbstractGraphicsConfiguration}, and if changes are necessary,
       they should reflect those as well.
+      </p>
       @return The immutable queried instance.
+      @see #getRequestedGLCapabilities()
     */
   public GLCapabilitiesImmutable getChosenGLCapabilities();
 
+  /** Fetches the {@link GLCapabilitiesImmutable} corresponding to the user requested
+      OpenGL capabilities (pixel format / visual / GLProfile) for this drawable.
+      <p>
+      If {@link #isRealized() realized}, {@link #getChosenGLCapabilities() the chosen capabilities}
+      reflect the actual selected OpenGL capabilities.
+      </p>
+      @return The immutable queried instance.
+      @see #getChosenGLCapabilities()
+    */
+  public GLCapabilitiesImmutable getRequestedGLCapabilities();
+
   /** Fetches the {@link GLProfile} for this drawable.
       Returns the GLProfile object, no copy.
     */
index 4b1d4a7..4bd4b2c 100644 (file)
@@ -1146,6 +1146,7 @@ public class GLCanvas extends Canvas implements AWTGLAutoDrawable, WindowClosing
     return (GLCapabilitiesImmutable)awtConfig.getChosenCapabilities();
   }
 
+  @Override
   public GLCapabilitiesImmutable getRequestedGLCapabilities() {
     if( null == awtConfig ) {
         return capsReqUser;
index 96f9e45..0c30945 100644 (file)
@@ -249,8 +249,8 @@ public class GLJPanel extends JPanel implements AWTGLAutoDrawable, WindowClosing
   // Data used for either pbuffers or pixmap-based offscreen surfaces
   //
   private AWTGLPixelBufferProvider customPixelBufferProvider = null;
-  /** Single buffered offscreen caps */
-  private GLCapabilitiesImmutable offscreenCaps;
+  /** Requested single buffered offscreen caps */
+  private final GLCapabilitiesImmutable reqOffscreenCaps;
   private final GLProfile             glProfile;
   private final GLDrawableFactoryImpl factory;
   private final GLCapabilitiesChooser chooser;
@@ -357,9 +357,9 @@ public class GLJPanel extends JPanel implements AWTGLAutoDrawable, WindowClosing
             caps = new GLCapabilities(GLProfile.getDefault(GLProfile.getDefaultDevice()));
         }
         caps.setDoubleBuffered(false);
-        offscreenCaps = caps;
+        reqOffscreenCaps = caps;
     }
-    this.glProfile = offscreenCaps.getGLProfile();
+    this.glProfile = reqOffscreenCaps.getGLProfile();
     this.factory = GLDrawableFactoryImpl.getFactoryImpl(glProfile);
     this.chooser = chooser;
 
@@ -1138,6 +1138,11 @@ public class GLJPanel extends JPanel implements AWTGLAutoDrawable, WindowClosing
   }
 
   @Override
+  public final GLCapabilitiesImmutable getRequestedGLCapabilities() {
+    return reqOffscreenCaps;
+  }
+
+  @Override
   public final GLProfile getGLProfile() {
     return glProfile;
   }
@@ -1504,7 +1509,7 @@ public class GLJPanel extends JPanel implements AWTGLAutoDrawable, WindowClosing
     protected IntBuffer readBackIntsForCPUVFlip;
 
     // Implementation using software rendering
-    private volatile GLDrawableImpl offscreenDrawable; // volatile: avoid locking for read-only access
+    private volatile GLDrawable offscreenDrawable; // volatile: avoid locking for read-only access
     private boolean offscreenIsFBO;
     private FBObject fboFlipped;
     private GLSLTextureRaster glslTextureRaster;
@@ -1543,9 +1548,9 @@ public class GLJPanel extends JPanel implements AWTGLAutoDrawable, WindowClosing
           if( helper.isSharedGLContextPending(shareWith) ) {
               return; // pending ..
           }
-          offscreenDrawable = (GLDrawableImpl) factory.createOffscreenDrawable(
+          offscreenDrawable = factory.createOffscreenDrawable(
                                                     null /* default platform device */,
-                                                    offscreenCaps,
+                                                    reqOffscreenCaps,
                                                     chooser,
                                                     panelWidth, panelHeight);
           updateWrappedSurfaceScale(offscreenDrawable);
@@ -1563,7 +1568,7 @@ public class GLJPanel extends JPanel implements AWTGLAutoDrawable, WindowClosing
           //
           flipVertical = !GLJPanel.this.skipGLOrientationVerticalFlip && offscreenDrawable.isGLOriented();
           offscreenIsFBO = offscreenDrawable.getRequestedGLCapabilities().isFBO();
-          final boolean useGLSLFlip_pre = flipVertical && offscreenIsFBO && offscreenCaps.getGLProfile().isGL2ES2() && USE_GLSL_TEXTURE_RASTERIZER;
+          final boolean useGLSLFlip_pre = flipVertical && offscreenIsFBO && reqOffscreenCaps.getGLProfile().isGL2ES2() && USE_GLSL_TEXTURE_RASTERIZER;
           if( offscreenIsFBO && !useGLSLFlip_pre ) {
               // Texture attachment only required for GLSL vertical flip, hence simply use a color-renderbuffer attachment.
               ((GLFBODrawable)offscreenDrawable).setFBOMode(GLFBODrawable.FBOMODE_USE_DEPTH);
@@ -1629,7 +1634,7 @@ public class GLJPanel extends JPanel implements AWTGLAutoDrawable, WindowClosing
               }
           }
           if( null != glException ) {
-              throw new GLException("Handled GLException: "+glException.getMessage(), glException);
+              throw new GLException("Caught GLException: "+glException.getMessage(), glException);
           }
       }
     }
@@ -1915,7 +1920,7 @@ public class GLJPanel extends JPanel implements AWTGLAutoDrawable, WindowClosing
 
     @Override
     public final boolean handleReshape() {
-        GLDrawableImpl _drawable = offscreenDrawable;
+        GLDrawableImpl _drawable = (GLDrawableImpl)offscreenDrawable;
         {
             final GLDrawableImpl _drawableNew = GLDrawableHelper.resizeOffscreenDrawable(_drawable, offscreenContext, panelWidth, panelHeight);
             if(_drawable != _drawableNew) {
@@ -2333,29 +2338,29 @@ public class GLJPanel extends JPanel implements AWTGLAutoDrawable, WindowClosing
 
               j2dContext.makeCurrent();
               final GL gl = j2dContext.getGL();
-              if ((getGLInteger(gl, GL.GL_RED_BITS)         < offscreenCaps.getRedBits())        ||
-                  (getGLInteger(gl, GL.GL_GREEN_BITS)       < offscreenCaps.getGreenBits())      ||
-                  (getGLInteger(gl, GL.GL_BLUE_BITS)        < offscreenCaps.getBlueBits())       ||
+              if ((getGLInteger(gl, GL.GL_RED_BITS)         < reqOffscreenCaps.getRedBits())        ||
+                  (getGLInteger(gl, GL.GL_GREEN_BITS)       < reqOffscreenCaps.getGreenBits())      ||
+                  (getGLInteger(gl, GL.GL_BLUE_BITS)        < reqOffscreenCaps.getBlueBits())       ||
                   //                  (getGLInteger(gl, GL.GL_ALPHA_BITS)       < offscreenCaps.getAlphaBits())      ||
-                  (getGLInteger(gl, GL2.GL_ACCUM_RED_BITS)   < offscreenCaps.getAccumRedBits())   ||
-                  (getGLInteger(gl, GL2.GL_ACCUM_GREEN_BITS) < offscreenCaps.getAccumGreenBits()) ||
-                  (getGLInteger(gl, GL2.GL_ACCUM_BLUE_BITS)  < offscreenCaps.getAccumBlueBits())  ||
-                  (getGLInteger(gl, GL2.GL_ACCUM_ALPHA_BITS) < offscreenCaps.getAccumAlphaBits()) ||
+                  (getGLInteger(gl, GL2.GL_ACCUM_RED_BITS)   < reqOffscreenCaps.getAccumRedBits())   ||
+                  (getGLInteger(gl, GL2.GL_ACCUM_GREEN_BITS) < reqOffscreenCaps.getAccumGreenBits()) ||
+                  (getGLInteger(gl, GL2.GL_ACCUM_BLUE_BITS)  < reqOffscreenCaps.getAccumBlueBits())  ||
+                  (getGLInteger(gl, GL2.GL_ACCUM_ALPHA_BITS) < reqOffscreenCaps.getAccumAlphaBits()) ||
                   //          (getGLInteger(gl, GL2.GL_DEPTH_BITS)       < offscreenCaps.getDepthBits())      ||
-                  (getGLInteger(gl, GL.GL_STENCIL_BITS)     < offscreenCaps.getStencilBits())) {
+                  (getGLInteger(gl, GL.GL_STENCIL_BITS)     < reqOffscreenCaps.getStencilBits())) {
                 if (DEBUG) {
                   System.err.println(getThreadName()+": GLJPanel: Falling back to pbuffer-based support because Java2D context insufficient");
                   System.err.println("                    Available              Required");
-                  System.err.println("GL_RED_BITS         " + getGLInteger(gl, GL.GL_RED_BITS)         + "              " + offscreenCaps.getRedBits());
-                  System.err.println("GL_GREEN_BITS       " + getGLInteger(gl, GL.GL_GREEN_BITS)       + "              " + offscreenCaps.getGreenBits());
-                  System.err.println("GL_BLUE_BITS        " + getGLInteger(gl, GL.GL_BLUE_BITS)        + "              " + offscreenCaps.getBlueBits());
-                  System.err.println("GL_ALPHA_BITS       " + getGLInteger(gl, GL.GL_ALPHA_BITS)       + "              " + offscreenCaps.getAlphaBits());
-                  System.err.println("GL_ACCUM_RED_BITS   " + getGLInteger(gl, GL2.GL_ACCUM_RED_BITS)   + "              " + offscreenCaps.getAccumRedBits());
-                  System.err.println("GL_ACCUM_GREEN_BITS " + getGLInteger(gl, GL2.GL_ACCUM_GREEN_BITS) + "              " + offscreenCaps.getAccumGreenBits());
-                  System.err.println("GL_ACCUM_BLUE_BITS  " + getGLInteger(gl, GL2.GL_ACCUM_BLUE_BITS)  + "              " + offscreenCaps.getAccumBlueBits());
-                  System.err.println("GL_ACCUM_ALPHA_BITS " + getGLInteger(gl, GL2.GL_ACCUM_ALPHA_BITS) + "              " + offscreenCaps.getAccumAlphaBits());
-                  System.err.println("GL_DEPTH_BITS       " + getGLInteger(gl, GL.GL_DEPTH_BITS)       + "              " + offscreenCaps.getDepthBits());
-                  System.err.println("GL_STENCIL_BITS     " + getGLInteger(gl, GL.GL_STENCIL_BITS)     + "              " + offscreenCaps.getStencilBits());
+                  System.err.println("GL_RED_BITS         " + getGLInteger(gl, GL.GL_RED_BITS)         + "              " + reqOffscreenCaps.getRedBits());
+                  System.err.println("GL_GREEN_BITS       " + getGLInteger(gl, GL.GL_GREEN_BITS)       + "              " + reqOffscreenCaps.getGreenBits());
+                  System.err.println("GL_BLUE_BITS        " + getGLInteger(gl, GL.GL_BLUE_BITS)        + "              " + reqOffscreenCaps.getBlueBits());
+                  System.err.println("GL_ALPHA_BITS       " + getGLInteger(gl, GL.GL_ALPHA_BITS)       + "              " + reqOffscreenCaps.getAlphaBits());
+                  System.err.println("GL_ACCUM_RED_BITS   " + getGLInteger(gl, GL2.GL_ACCUM_RED_BITS)   + "              " + reqOffscreenCaps.getAccumRedBits());
+                  System.err.println("GL_ACCUM_GREEN_BITS " + getGLInteger(gl, GL2.GL_ACCUM_GREEN_BITS) + "              " + reqOffscreenCaps.getAccumGreenBits());
+                  System.err.println("GL_ACCUM_BLUE_BITS  " + getGLInteger(gl, GL2.GL_ACCUM_BLUE_BITS)  + "              " + reqOffscreenCaps.getAccumBlueBits());
+                  System.err.println("GL_ACCUM_ALPHA_BITS " + getGLInteger(gl, GL2.GL_ACCUM_ALPHA_BITS) + "              " + reqOffscreenCaps.getAccumAlphaBits());
+                  System.err.println("GL_DEPTH_BITS       " + getGLInteger(gl, GL.GL_DEPTH_BITS)       + "              " + reqOffscreenCaps.getDepthBits());
+                  System.err.println("GL_STENCIL_BITS     " + getGLInteger(gl, GL.GL_STENCIL_BITS)     + "              " + reqOffscreenCaps.getStencilBits());
                 }
                 isInitialized = false;
                 backend = null;
index 605c3fc..45240df 100644 (file)
@@ -735,6 +735,12 @@ public abstract class GLAutoDrawableBase implements GLAutoDrawable, GLStateKeepe
     }
 
     @Override
+    public final GLCapabilitiesImmutable getRequestedGLCapabilities() {
+        final GLDrawable _drawable = drawable;
+        return null != _drawable ? _drawable.getRequestedGLCapabilities() : null;
+    }
+
+    @Override
     public final GLProfile getGLProfile() {
         final GLDrawable _drawable = drawable;
         return null != _drawable ? _drawable.getGLProfile() : null;
index 3bb2261..544aaf0 100644 (file)
@@ -130,10 +130,11 @@ public abstract class GLDrawableImpl implements GLDrawable {
   }
 
   @Override
-  public GLCapabilitiesImmutable getChosenGLCapabilities() {
+  public final GLCapabilitiesImmutable getChosenGLCapabilities() {
     return  (GLCapabilitiesImmutable) surface.getGraphicsConfiguration().getChosenCapabilities();
   }
 
+  @Override
   public final GLCapabilitiesImmutable getRequestedGLCapabilities() {
     return requestedCapabilities;
   }
http://JogAmp.org git info: FAQ, tutorial and man pages.