From 85d70b7d38885fa8ba6374aa790d5a296acc8ec1 Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Sun, 20 Jan 2013 15:05:02 +0100
Subject: Android: Allow selection of native window formats RGBA8888, RGBX8888
 and RGB565; Fix HiSilicon/Vivante/Immersion.16 EGLConfig selection (zero
 depth buffer @ visualID)

- NEWT/Android Fix PixelFormat/NativeWindowFormat/VisualID Selection
  - Fix allows proper selection of native window formats: RGBA8888, RGBX8888 and RGB565

  - Selection is performed in 3 steps:
    1) @ Construction (non native): SurfaceHolder.setFormat( getSurfaceHolderFormat( caps ) )
    2) @ Native Surface Creation: getANativeWindowFormat( androidFormat) -> ANativeWindow_setBuffersGeometry(..)
       Note: The set native format is revalidated, i.e. read out via ANativeWindow_getFormat(..).
    3) @ EGL Creation: ANativeWindow_getFormat(..) -> fixCaps(..) - simply fixing the chosen caps.

- NEWT GLWindow.GLLifecycleHook.resetCounter:
  - Also reset GLAnimatorControl's counter, if attached.

- NEWT WindowImpl -> GLLifecycleHook.resetCounter() calls issued _after_ operation before unlock().

- JOGL/EGLGraphicsConfigurationFactory
  - Validate whether the visualID matching EGLConfig depth buffer is suitable.
    On HiSilicon/Vivante/Immersion.16: Depth buffer w/ matching visualID is zero!

- NativeWindow/Capabilities.compareTo: Fix alpha comparison
---
 .../classes/jogamp/opengl/egl/EGLGraphicsConfiguration.java  | 11 +++++++++--
 .../jogamp/opengl/egl/EGLGraphicsConfigurationFactory.java   | 12 ++++++++++--
 2 files changed, 19 insertions(+), 4 deletions(-)

(limited to 'src/jogl/classes/jogamp/opengl')

diff --git a/src/jogl/classes/jogamp/opengl/egl/EGLGraphicsConfiguration.java b/src/jogl/classes/jogamp/opengl/egl/EGLGraphicsConfiguration.java
index 71dfe1d0f..b1ffe608e 100644
--- a/src/jogl/classes/jogamp/opengl/egl/EGLGraphicsConfiguration.java
+++ b/src/jogl/classes/jogamp/opengl/egl/EGLGraphicsConfiguration.java
@@ -72,7 +72,14 @@ public class EGLGraphicsConfiguration extends MutableGraphicsConfiguration imple
         this.chooser = chooser;
     }
 
-    public static EGLGraphicsConfiguration create(GLCapabilitiesImmutable capsRequested, AbstractGraphicsScreen absScreen, int cfgID) {
+    /**
+     * @param capsRequested
+     * @param absScreen
+     * @param eglConfigID {@link EGL#EGL_CONFIG_ID} for which the config is being created for.
+     * @return
+     * @throws GLException if invalid EGL display. 
+     */
+    public static EGLGraphicsConfiguration create(GLCapabilitiesImmutable capsRequested, AbstractGraphicsScreen absScreen, int eglConfigID) {
         final AbstractGraphicsDevice absDevice = absScreen.getDevice();
         if(null==absDevice || !(absDevice instanceof EGLGraphicsDevice)) {
             throw new GLException("GraphicsDevice must be a valid EGLGraphicsDevice");
@@ -81,7 +88,7 @@ public class EGLGraphicsConfiguration extends MutableGraphicsConfiguration imple
         if (dpy == EGL.EGL_NO_DISPLAY) {
             throw new GLException("Invalid EGL display: "+absDevice);
         }
-        final long cfg = EGLConfigId2EGLConfig(dpy, cfgID);
+        final long cfg = EGLConfigId2EGLConfig(dpy, eglConfigID);
         if(0 < cfg) {
             final int winattrmask = GLGraphicsConfigurationUtil.getExclusiveWinAttributeBits(capsRequested);
             final EGLGLCapabilities caps = EGLConfig2Capabilities((EGLGraphicsDevice)absDevice, capsRequested.getGLProfile(), cfg, winattrmask, false);
diff --git a/src/jogl/classes/jogamp/opengl/egl/EGLGraphicsConfigurationFactory.java b/src/jogl/classes/jogamp/opengl/egl/EGLGraphicsConfigurationFactory.java
index f638ef82b..7e1f8a5a2 100644
--- a/src/jogl/classes/jogamp/opengl/egl/EGLGraphicsConfigurationFactory.java
+++ b/src/jogl/classes/jogamp/opengl/egl/EGLGraphicsConfigurationFactory.java
@@ -411,8 +411,13 @@ public class EGLGraphicsConfigurationFactory extends GLGraphicsConfigurationFact
         if( VisualIDHolder.VID_UNDEFINED != nativeVisualID ) {
             List<GLCapabilitiesImmutable> removedCaps = new ArrayList<GLCapabilitiesImmutable>();
             for(int i=0; i<availableCaps.size(); ) {
-                VisualIDHolder vidh = (VisualIDHolder) availableCaps.get(i);
-                if(vidh.getVisualID(VIDType.NATIVE) != nativeVisualID) {
+                final GLCapabilitiesImmutable aCap = availableCaps.get(i);
+                if(aCap.getVisualID(VIDType.NATIVE) != nativeVisualID) {
+                    if(DEBUG) { System.err.println("Remove["+i+"] (mismatch VisualID): "+aCap); }
+                    removedCaps.add(availableCaps.remove(i));
+                } if( 0 == aCap.getDepthBits() && 0 < capsChosen.getDepthBits() ) {
+                    // Hack for HiSilicon/Vivante/Immersion.16 Renderer ..
+                    if(DEBUG) { System.err.println("Remove["+i+"] (mismatch depth-bits): "+aCap); }
                     removedCaps.add(availableCaps.remove(i));
                 } else {
                     i++;
@@ -425,6 +430,9 @@ public class EGLGraphicsConfigurationFactory extends GLGraphicsConfigurationFact
                 }
             } else if(DEBUG) {
                 System.err.println("EGLGraphicsConfiguration.eglChooseConfig: post filter nativeVisualID "+toHexString(nativeVisualID)+" got configs: "+availableCaps.size());
+                for(int i=0; i<availableCaps.size(); i++) {
+                    System.err.println(i+": "+availableCaps.get(i));
+                }
             }
         }
 
-- 
cgit v1.2.3