From 96e71b020a48e8a01e3790e81bd888977d9cab6d Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Wed, 7 Oct 2015 11:54:31 +0200
Subject: Bug 1189 - Add OpenGL ES 3.2 and new GL 4.5 Extensions support -
 Part5: GL_ARB_ES3_2_compatibility -> [GL|GLContext].isGLES32Compatible()

---
 src/jogl/classes/com/jogamp/opengl/GLBase.java     | 13 ++++
 src/jogl/classes/com/jogamp/opengl/GLContext.java  | 72 ++++++++++++++--------
 .../classes/com/jogamp/opengl/GLExtensions.java    |  1 +
 src/jogl/classes/jogamp/opengl/GLContextImpl.java  | 20 ++++--
 4 files changed, 73 insertions(+), 33 deletions(-)

(limited to 'src')

diff --git a/src/jogl/classes/com/jogamp/opengl/GLBase.java b/src/jogl/classes/com/jogamp/opengl/GLBase.java
index e0c784398..0cbcbe40f 100644
--- a/src/jogl/classes/com/jogamp/opengl/GLBase.java
+++ b/src/jogl/classes/com/jogamp/opengl/GLBase.java
@@ -236,6 +236,19 @@ public interface GLBase {
    */
   public boolean isGLES31Compatible();
 
+  /**
+   * Indicates whether this GL object is compatible with the core OpenGL ES3.2 functionality.
+   * <p>
+   * Return true if the underlying context is an ES3 context &ge; 3.2 or implements
+   * the extension <code>GL_ARB_ES3_2_compatibility</code>, otherwise false.
+   * </p>
+   * <p>
+   * Includes [ GL &ge; 4.5, GL &ge; 3.1 w/ GL_ARB_ES3_2_compatibility and GLES3 &ge; 3.2 ]
+   * </p>
+   * @see GLContext#isGLES32Compatible()
+   */
+  public boolean isGLES32Compatible();
+
   /**
    * Indicates whether this GL object supports GLSL.
    * @see GLContext#hasGLSL()
diff --git a/src/jogl/classes/com/jogamp/opengl/GLContext.java b/src/jogl/classes/com/jogamp/opengl/GLContext.java
index 45cc1c509..6576c9f10 100644
--- a/src/jogl/classes/com/jogamp/opengl/GLContext.java
+++ b/src/jogl/classes/com/jogamp/opengl/GLContext.java
@@ -198,16 +198,19 @@ public abstract class GLContext {
   /** <code>GL_ARB_ES3_compatibility</code> implementation related: Context is compatible w/ ES3. Not a cache key. See {@link #isGLES3Compatible()}, {@link #getAvailableContextProperties(AbstractGraphicsDevice, GLProfile)}. */
   protected static final int CTX_IMPL_ES3_COMPAT  = 1 << 11;
 
-  /** <code>GL_ARB_ES3_1_compatibility</code> implementation related: Context is compatible w/ ES3. Not a cache key. See {@link #isGLES31Compatible()}, {@link #getAvailableContextProperties(AbstractGraphicsDevice, GLProfile)}. */
+  /** <code>GL_ARB_ES3_1_compatibility</code> implementation related: Context is compatible w/ ES 3.1. Not a cache key. See {@link #isGLES31Compatible()}, {@link #getAvailableContextProperties(AbstractGraphicsDevice, GLProfile)}. */
   protected static final int CTX_IMPL_ES31_COMPAT = 1 << 12;
 
+  /** <code>GL_ARB_ES3_2_compatibility</code> implementation related: Context is compatible w/ ES 3.2. Not a cache key. See {@link #isGLES32Compatible()}, {@link #getAvailableContextProperties(AbstractGraphicsDevice, GLProfile)}. */
+  protected static final int CTX_IMPL_ES32_COMPAT = 1 << 13;
+
   /**
    * Context supports basic FBO, details see {@link #hasBasicFBOSupport()}.
    * Not a cache key.
    * @see #hasBasicFBOSupport()
    * @see #getAvailableContextProperties(AbstractGraphicsDevice, GLProfile)
    */
-  protected static final int CTX_IMPL_FBO         = 1 << 13;
+  protected static final int CTX_IMPL_FBO         = 1 << 14;
 
   /**
    * Context supports <code>OES_single_precision</code>, fp32, fixed function point (FFP) compatibility entry points,
@@ -216,7 +219,7 @@ public abstract class GLContext {
    * @see #hasFP32CompatAPI()
    * @see #getAvailableContextProperties(AbstractGraphicsDevice, GLProfile)
    */
-  protected static final int CTX_IMPL_FP32_COMPAT_API = 1 << 14;
+  protected static final int CTX_IMPL_FP32_COMPAT_API = 1 << 15;
 
   private static final ThreadLocal<GLContext> currentContext = new ThreadLocal<GLContext>();
 
@@ -922,6 +925,17 @@ public abstract class GLContext {
       return 0 != ( ctxOptions & CTX_IMPL_ES31_COMPAT ) ;
   }
 
+  /**
+   * Return true if this context is an ES3 context &ge; 3.2 or implements
+   * the extension <code>GL_ARB_ES3_2_compatibility</code>, otherwise false.
+   * <p>
+   * Includes [ GL &ge; 4.5, GL &ge; 3.1 w/ GL_ARB_ES3_2_compatibility and GLES3 &ge; 3.2 ]
+   * </p>
+   */
+  public final boolean isGLES32Compatible() {
+      return 0 != ( ctxOptions & CTX_IMPL_ES32_COMPAT ) ;
+  }
+
   /**
    * @return true if impl. is a hardware rasterizer, otherwise false.
    * @see #isHardwareRasterizer(AbstractGraphicsDevice, GLProfile)
@@ -1497,7 +1511,7 @@ public abstract class GLContext {
       /* 0.*/ { -1 },
       /* 1.*/ { 0, 1 },
       /* 2.*/ { 0 },
-      /* 3.*/ { 0, 1 } };
+      /* 3.*/ { 0, 1, 2 } };
 
   public static final int getMaxMajor(final int ctxProfile) {
       return ( 0 != ( CTX_PROFILE_ES & ctxProfile ) ) ? ES_VERSIONS.length-1 : GL_VERSIONS.length-1;
@@ -1948,15 +1962,7 @@ public abstract class GLContext {
       return isGLVersionAvailable(device, 3, GLContext.CTX_PROFILE_ES, isHardware);
   }
 
-  /**
-   * Returns true if a ES3 compatible profile is available,
-   * i.e. either a &ge; 4.3 context or a &ge; 3.1 context supporting <code>GL_ARB_ES3_compatibility</code>,
-   * otherwise false.
-   * <p>
-   * Includes [ GL &ge; 4.3, GL &ge; 3.1 w/ GL_ARB_ES3_compatibility and GLES3 ]
-   * </p>
-   */
-  public static final boolean isGLES3CompatibleAvailable(final AbstractGraphicsDevice device) {
+  private static final int getGL3ctp(final AbstractGraphicsDevice device) {
       final int major[] = { 0 };
       final int minor[] = { 0 };
       final int ctp[] = { 0 };
@@ -1969,7 +1975,19 @@ public abstract class GLContext {
       if( !ok ) {
           GLContext.getAvailableGLVersion(device, 3, GLContext.CTX_PROFILE_COMPAT, major, minor, ctp);
       }
-      return 0 != ( ctp[0] & CTX_IMPL_ES3_COMPAT );
+      return ctp[0];
+  }
+
+  /**
+   * Returns true if a ES3 compatible profile is available,
+   * i.e. either a &ge; 4.3 context or a &ge; 3.1 context supporting <code>GL_ARB_ES3_compatibility</code>,
+   * otherwise false.
+   * <p>
+   * Includes [ GL &ge; 4.3, GL &ge; 3.1 w/ GL_ARB_ES3_compatibility and GLES3 ]
+   * </p>
+   */
+  public static final boolean isGLES3CompatibleAvailable(final AbstractGraphicsDevice device) {
+      return 0 != ( getGL3ctp(device) & CTX_IMPL_ES3_COMPAT );
   }
   /**
    * Returns true if a ES3 &ge; 3.1 compatible profile is available,
@@ -1980,19 +1998,18 @@ public abstract class GLContext {
    * </p>
    */
   public static final boolean isGLES31CompatibleAvailable(final AbstractGraphicsDevice device) {
-      final int major[] = { 0 };
-      final int minor[] = { 0 };
-      final int ctp[] = { 0 };
-      boolean ok;
-
-      ok = GLContext.getAvailableGLVersion(device, 3, GLContext.CTX_PROFILE_ES, major, minor, ctp);
-      if( !ok ) {
-          ok = GLContext.getAvailableGLVersion(device, 3, GLContext.CTX_PROFILE_CORE, major, minor, ctp);
-      }
-      if( !ok ) {
-          GLContext.getAvailableGLVersion(device, 3, GLContext.CTX_PROFILE_COMPAT, major, minor, ctp);
-      }
-      return 0 != ( ctp[0] & CTX_IMPL_ES31_COMPAT );
+      return 0 != ( getGL3ctp(device) & CTX_IMPL_ES31_COMPAT );
+  }
+  /**
+   * Returns true if a ES3 &ge; 3.2 compatible profile is available,
+   * i.e. either a &ge; 4.5 context or a &ge; 3.1 context supporting <code>GL_ARB_ES3_2_compatibility</code>,
+   * otherwise false.
+   * <p>
+   * Includes [ GL &ge; 4.5, GL &ge; 3.1 w/ GL_ARB_ES3_2_compatibility and GLES3 &ge; 3.2 ]
+   * </p>
+   */
+  public static final boolean isGLES32CompatibleAvailable(final AbstractGraphicsDevice device) {
+      return 0 != ( getGL3ctp(device) & CTX_IMPL_ES32_COMPAT );
   }
 
   public static boolean isGL4bcAvailable(final AbstractGraphicsDevice device, final boolean isHardware[]) {
@@ -2029,6 +2046,7 @@ public abstract class GLContext {
         needColon = appendString(sb, "ES2",               needColon, 0 != ( CTX_IMPL_ES2_COMPAT & ctp ));
         needColon = appendString(sb, "ES3",               needColon, 0 != ( CTX_IMPL_ES3_COMPAT & ctp ));
         needColon = appendString(sb, "ES31",              needColon, 0 != ( CTX_IMPL_ES31_COMPAT & ctp ));
+        needColon = appendString(sb, "ES32",              needColon, 0 != ( CTX_IMPL_ES32_COMPAT & ctp ));
         needColon = appendString(sb, "FP32",              needColon, 0 != ( CTX_IMPL_FP32_COMPAT_API & ctp ));
         needColon = false;
     }
diff --git a/src/jogl/classes/com/jogamp/opengl/GLExtensions.java b/src/jogl/classes/com/jogamp/opengl/GLExtensions.java
index dc1a4e010..23e7dec31 100644
--- a/src/jogl/classes/com/jogamp/opengl/GLExtensions.java
+++ b/src/jogl/classes/com/jogamp/opengl/GLExtensions.java
@@ -54,6 +54,7 @@ public class GLExtensions {
   public static final String ARB_ES2_compatibility           = "GL_ARB_ES2_compatibility";
   public static final String ARB_ES3_compatibility           = "GL_ARB_ES3_compatibility";
   public static final String ARB_ES3_1_compatibility         = "GL_ARB_ES3_1_compatibility";
+  public static final String ARB_ES3_2_compatibility         = "GL_ARB_ES3_2_compatibility";
 
   public static final String EXT_abgr                        = "GL_EXT_abgr";
   public static final String OES_rgb8_rgba8                  = "GL_OES_rgb8_rgba8";
diff --git a/src/jogl/classes/jogamp/opengl/GLContextImpl.java b/src/jogl/classes/jogamp/opengl/GLContextImpl.java
index a5d8f609c..2cb6228ba 100644
--- a/src/jogl/classes/jogamp/opengl/GLContextImpl.java
+++ b/src/jogl/classes/jogamp/opengl/GLContextImpl.java
@@ -1894,7 +1894,8 @@ public abstract class GLContextImpl extends GLContext {
     }
 
     if( major < 2 ) { // there is no ES2/3-compat for a profile w/ major < 2
-        ctxProfileBits &= ~ ( GLContext.CTX_IMPL_ES2_COMPAT | GLContext.CTX_IMPL_ES3_COMPAT | GLContext.CTX_IMPL_ES31_COMPAT ) ;
+        ctxProfileBits &= ~ ( GLContext.CTX_IMPL_ES2_COMPAT | GLContext.CTX_IMPL_ES3_COMPAT |
+                              GLContext.CTX_IMPL_ES31_COMPAT | GLContext.CTX_IMPL_ES32_COMPAT ) ;
     }
 
     if(!isCurrentContextHardwareRasterizer()) {
@@ -2017,7 +2018,9 @@ public abstract class GLContextImpl extends GLContext {
         if( major >= 3 ) {
             ctxProfileBits |= CTX_IMPL_ES3_COMPAT | CTX_IMPL_ES2_COMPAT ;
             ctxProfileBits |= CTX_IMPL_FBO;
-            if( minor >= 1 ) {
+            if( minor >= 2 ) {
+                ctxProfileBits |= CTX_IMPL_ES32_COMPAT | CTX_IMPL_ES31_COMPAT;
+            } else if( minor >= 1 ) {
                 ctxProfileBits |= CTX_IMPL_ES31_COMPAT;
             }
         } else if( major >= 2 ) {
@@ -2025,10 +2028,15 @@ public abstract class GLContextImpl extends GLContext {
             ctxProfileBits |= CTX_IMPL_FBO;
         }
     } else if( ( major > 4 || major == 4 && minor >= 5 ) ||
-               ( ( major > 3 || major == 3 && minor >= 1 ) && isExtensionAvailable( GLExtensions.ARB_ES3_1_compatibility ) ) ) {
-        // See GLContext.isGLES31CompatibleAvailable(..)/isGLES31Compatible()
-        //   Includes [ GL &ge; 4.5, GL &ge; 3.1 w/ GL_ARB_ES3_1_compatibility and GLES &ge; 3.1 ]
-        ctxProfileBits |= CTX_IMPL_ES31_COMPAT | CTX_IMPL_ES3_COMPAT | CTX_IMPL_ES2_COMPAT ;
+               ( major > 3 || major == 3 && minor >= 1 ) ) {
+        // See GLContext.isGLES31CompatibleAvailable(..)/isGLES3[12]Compatible()
+        //   Includes [ GL &ge; 4.5, GL &ge; 3.1 w/ GL_ARB_ES3_[12]_compatibility and GLES &ge; 3.[12] ]
+        if( isExtensionAvailable( GLExtensions.ARB_ES3_2_compatibility ) ) {
+            ctxProfileBits |= CTX_IMPL_ES32_COMPAT | CTX_IMPL_ES31_COMPAT;
+        } else if( isExtensionAvailable( GLExtensions.ARB_ES3_1_compatibility ) ) {
+            ctxProfileBits |= CTX_IMPL_ES31_COMPAT;
+        }
+        ctxProfileBits |= CTX_IMPL_ES3_COMPAT | CTX_IMPL_ES2_COMPAT;
         ctxProfileBits |= CTX_IMPL_FBO;
     } else if( ( major > 4 || major == 4 && minor >= 3 ) ||
                ( ( major > 3 || major == 3 && minor >= 1 ) && isExtensionAvailable( GLExtensions.ARB_ES3_compatibility ) ) ) {
-- 
cgit v1.2.3