From 3a0d7703da32e9a5ddf08a334f18588a78038d88 Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Mon, 15 Jul 2013 13:39:22 +0200
Subject: Add Support for GL 4.3 (Bug 716) and ES 3.0 (Bug 717)

ES3 / GL4.3:

- Update all EGL, GLX, WGL and GL (desktop and mobile) khronos headers to latest version.
  - GL3/gl3* -> GL/glcorearb*

  - Explicitly preserve ES2_compatibility and ES3_compatibility in header,
    most extension grouping was removed in new headers.

  - Always load all GLHeader to ensure proper extension association across all profiles.

  - Unified method signatures

  - Added GL_EXT_map_buffer_range to core

  - Using common 'glMapBufferImpl(..)' for all glMapBuffer(..) and glMapBufferRange(..) impl.

  - Init necessary fields of GL instances via 'finalizeInit()' called by reflection, if exist.
    This allows removing initialization checks, i.e. for all buffer validations.

- BuildStaticGLInfo: Can handle new GL header structure, i.e. one CPP extenstion block incl. define + funcs.

- GLJavaMethodBindingEmitter: Simply print the

- No GL duplication due to new intermediate interfaces, see below

- OO lineare inheritance (Added GL2ES3, GL3ES3 and GL4ES3 intemediates):
  GLBase - GL - GL2ES2 - GLES2
  GLBase - GL - GL2ES2 - GL2GL3 - [ GL2, GL3 ]
  GLBase - GL - GL2ES2 - GL2ES3 - GL3ES3 - [ GL3 ]
  GLBase - GL - GL2ES2 - GL2ES3 - GL3ES3 - GL4ES3 - [ GLES3, GL4, .. ]

- Expose 'usable' intermediate interfaces GL3ES3 and GL4ES3 in GLBase/GLProfile/GLContext
  via is*() and get*().

- GLContext*:
  - isGL3core() is true if [ GL4, GL3, GLES3 ] (added GLES3)

  - Added ctxProfile argument to allow handling ES versions:
    - getMaxMajor(..), getMaxMinor(..), isValidGLVersion(..) and decrementGLVersion(..)
    - mapGLVersions(..) prepared for ES ARB/KHR validation

  - EGLContext checks ES3 (via old ctx's GL_VERSION)

- ExtensionAvailabilityCache adds GL_ES_Version_X_Y for ES.

- Prelim tests w/ Mesa 9.1.3
  GL Version     3.0 (ES profile, ES2 compat, ES3 compat, FBO, hardware) - OpenGL ES 3.0 Mesa 9.1.3 [GL 3.0.0, vendor 9.1.3 (Mesa 9.1.3)]

- TODO:
  - Use KHR_create_context in EGLContext.createContextARBImpl(..)
  - More tests (Mobile, ..)

+++

Misc:

- GLContext*:
  - Complete glAllocateMemoryNV w/ glFreeMemoryNV.
---
 src/jogl/classes/jogamp/opengl/egl/EGLContext.java | 51 ++++++++++++++--------
 1 file changed, 33 insertions(+), 18 deletions(-)

(limited to 'src/jogl/classes/jogamp/opengl/egl/EGLContext.java')

diff --git a/src/jogl/classes/jogamp/opengl/egl/EGLContext.java b/src/jogl/classes/jogamp/opengl/egl/EGLContext.java
index b54ed6599..e7977e3fb 100644
--- a/src/jogl/classes/jogamp/opengl/egl/EGLContext.java
+++ b/src/jogl/classes/jogamp/opengl/egl/EGLContext.java
@@ -171,7 +171,7 @@ public class EGLContext extends GLContextImpl {
 
         try {
             // might be unavailable on EGL < 1.2
-            if(!EGL.eglBindAPI(EGL.EGL_OPENGL_ES_API)) {
+            if( !EGL.eglBindAPI(EGL.EGL_OPENGL_ES_API) ) {
                 throw new GLException("Catched: eglBindAPI to ES failed , error "+toHexString(EGL.eglGetError()));
             }
         } catch (GLException glex) {
@@ -188,18 +188,21 @@ public class EGLContext extends GLContextImpl {
         }
 
         final IntBuffer contextAttrsNIO;
+        final int contextVersionReq, contextVersionAttr;
         {
-            final int[] contextAttrs = new int[] {
-                    EGL.EGL_CONTEXT_CLIENT_VERSION, -1,
-                    EGL.EGL_NONE
-            };
-            if (glProfile.usesNativeGLES2()) {
-                contextAttrs[1] = 2;
-            } else if (glProfile.usesNativeGLES1()) {
-                contextAttrs[1] = 1;
+            if ( glProfile.usesNativeGLES3() ) {
+                contextVersionReq = 3;
+                contextVersionAttr = 2;
+            } else if ( glProfile.usesNativeGLES2() ) {
+                contextVersionReq = 2;
+                contextVersionAttr = 2;
+            } else if ( glProfile.usesNativeGLES1() ) {
+                contextVersionReq = 1;
+                contextVersionAttr = 1;
             } else {
                 throw new GLException("Error creating OpenGL context - invalid GLProfile: "+glProfile);
             }
+            final int[] contextAttrs = new int[] { EGL.EGL_CONTEXT_CLIENT_VERSION, contextVersionAttr, EGL.EGL_NONE };
             contextAttrsNIO = Buffers.newDirectIntBuffer(contextAttrs);
         }
         contextHandle = EGL.eglCreateContext(eglDisplay, eglConfig, shareWithHandle, contextAttrsNIO);
@@ -219,8 +222,7 @@ public class EGLContext extends GLContextImpl {
             throw new GLException("Error making context " +
                                   toHexString(contextHandle) + " current: error code " + toHexString(EGL.eglGetError()));
         }
-        setGLFunctionAvailability(true, glProfile.usesNativeGLES2() ? 2 : 1, 0, CTX_PROFILE_ES, false);
-        return true;
+        return setGLFunctionAvailability(true, contextVersionReq, 0, CTX_PROFILE_ES, contextVersionReq>=3); // strict match for es >= 3
     }
 
     @Override
@@ -292,16 +294,25 @@ public class EGLContext extends GLContextImpl {
         final GLProfile glp = caps.getGLProfile();
         final int[] reqMajorCTP = new int[2];
         GLContext.getRequestMajorAndCompat(glp, reqMajorCTP);
-        if(glp.isGLES() && reqMajorCTP[0] >= 2) {
-            reqMajorCTP[1] |= GLContext.CTX_IMPL_ES2_COMPAT | GLContext.CTX_IMPL_FBO ;
+        if( glp.isGLES() ) {
+            if( reqMajorCTP[0] >= 3 ) {
+                reqMajorCTP[1] |= GLContext.CTX_IMPL_ES3_COMPAT | GLContext.CTX_IMPL_ES2_COMPAT | GLContext.CTX_IMPL_FBO ;
+            } else if( reqMajorCTP[0] >= 2 ) {
+                reqMajorCTP[1] |= GLContext.CTX_IMPL_ES2_COMPAT | GLContext.CTX_IMPL_FBO ;
+            }
         }
-        if(!caps.getHardwareAccelerated()) {
+        if( !caps.getHardwareAccelerated() ) {
             reqMajorCTP[1] |= GLContext.CTX_IMPL_ACCEL_SOFT;
         }
         mapStaticGLVersion(device, reqMajorCTP[0], 0, reqMajorCTP[1]);
     }    
-    /* pp */ static void mapStaticGLESVersion(AbstractGraphicsDevice device, int major) {
-        int ctp = ( 2 == major ) ? ( GLContext.CTX_PROFILE_ES | GLContext.CTX_IMPL_ES2_COMPAT | GLContext.CTX_IMPL_FBO ) : ( GLContext.CTX_PROFILE_ES );  
+    /* pp */ static void mapStaticGLESVersion(AbstractGraphicsDevice device, final int major) {
+        int ctp = GLContext.CTX_PROFILE_ES;
+        if( major >= 3 ) {
+            ctp |= GLContext.CTX_IMPL_ES3_COMPAT | GLContext.CTX_IMPL_ES2_COMPAT | GLContext.CTX_IMPL_FBO ;
+        } else if( major >= 2 ) {
+            ctp |= GLContext.CTX_IMPL_ES2_COMPAT | GLContext.CTX_IMPL_FBO ;
+        }
         mapStaticGLVersion(device, major, 0, ctp);
     }
     /* pp */ static void mapStaticGLVersion(AbstractGraphicsDevice device, int major, int minor, int ctp) {
@@ -343,9 +354,13 @@ public class EGLContext extends GLContextImpl {
         throw new GLException("Not yet implemented");
     }
 
-
     @Override
-    public ByteBuffer glAllocateMemoryNV(int arg0, float arg1, float arg2, float arg3) {
+    public final ByteBuffer glAllocateMemoryNV(int size, float readFrequency, float writeFrequency, float priority) {
+        throw new GLException("Should not call this");
+    }
+    
+    @Override
+    public final void glFreeMemoryNV(ByteBuffer pointer) {
         throw new GLException("Should not call this");
     }
 }
-- 
cgit v1.2.3