From ffcf0cb5beaf3c7c363d45cef0b9d18dcf3f50c6 Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Thu, 21 Feb 2013 10:27:31 +0100
Subject: Bug 548 and Bug 679: Add 'glFlush()' requirement (OSX < 10.7.3 &&
 NVIDIA GPU) to GLRendererQuirks and perform only if exists.

---
 .../com/jogamp/opengl/GLRendererQuirks.java        | 12 +++++-
 src/jogl/classes/jogamp/opengl/GLContextImpl.java  | 50 ++++++++++++++++------
 .../jogamp/opengl/macosx/cgl/MacOSXCGLContext.java |  9 ++--
 3 files changed, 54 insertions(+), 17 deletions(-)

(limited to 'src')

diff --git a/src/jogl/classes/com/jogamp/opengl/GLRendererQuirks.java b/src/jogl/classes/com/jogamp/opengl/GLRendererQuirks.java
index 9a13ff904..715511d1b 100644
--- a/src/jogl/classes/com/jogamp/opengl/GLRendererQuirks.java
+++ b/src/jogl/classes/com/jogamp/opengl/GLRendererQuirks.java
@@ -73,12 +73,20 @@ public class GLRendererQuirks {
      */
     public static final int GLNonCompliant = 6;
     
+    /**
+     * The OpenGL Context needs a <code>glFlush()</code> before releasing it, otherwise driver may freeze:
+     * <ul>
+     *   <li>OSX < 10.7.3 - NVidia Driver. Bug 533 and Bug 548 @ https://jogamp.org/bugzilla/.</li>
+     * </ul>  
+     */
+    public static final int GLFlushBeforeRelease = 7;
+    
     /** Number of quirks known. */
-    public static final int COUNT = 7;
+    public static final int COUNT = 8;
     
     private static final String[] _names = new String[] { "NoDoubleBufferedPBuffer", "NoDoubleBufferedBitmap", "NoSetSwapInterval",
                                                           "NoOffscreenBitmap", "NoSetSwapIntervalPostRetarget", "GLSLBuggyDiscard",
-                                                          "GLNonCompliant"
+                                                          "GLNonCompliant", "GLFlushBeforeRelease"
                                                         };
 
     private final int _bitmask;
diff --git a/src/jogl/classes/jogamp/opengl/GLContextImpl.java b/src/jogl/classes/jogamp/opengl/GLContextImpl.java
index 98b9ede36..42364dbfd 100644
--- a/src/jogl/classes/jogamp/opengl/GLContextImpl.java
+++ b/src/jogl/classes/jogamp/opengl/GLContextImpl.java
@@ -1462,29 +1462,55 @@ public abstract class GLContextImpl extends GLContext {
     final boolean hwAccel = 0 == ( ctp & GLContext.CTX_IMPL_ACCEL_SOFT );
     final boolean compatCtx = 0 != ( ctp & GLContext.CTX_PROFILE_COMPAT );
     
+    //
     // OS related quirks
+    //
     if( Platform.getOSType() == Platform.OSType.MACOS ) {
-        final int quirk1 = GLRendererQuirks.NoOffscreenBitmap;
-        if(DEBUG) {
-            System.err.println("Quirk: "+GLRendererQuirks.toString(quirk1)+": cause: OS "+Platform.getOSType());
+        //
+        // OSX
+        //
+        {
+            final int quirk = GLRendererQuirks.NoOffscreenBitmap;
+            if(DEBUG) {
+                System.err.println("Quirk: "+GLRendererQuirks.toString(quirk)+": cause: OS "+Platform.getOSType());
+            }
+            quirks[i++] = quirk;
+        }
+        
+        final VersionNumber OSXVersion173 = new VersionNumber(1,7,3);
+        if( Platform.getOSVersionNumber().compareTo(OSXVersion173) < 0 && glRendererLowerCase.contains("nvidia") ) {
+            final int quirk = GLRendererQuirks.GLFlushBeforeRelease;
+            if(DEBUG) {
+                System.err.println("Quirk: "+GLRendererQuirks.toString(quirk)+": cause: OS "+Platform.getOSType()+", OS Version "+Platform.getOSVersionNumber()+", Renderer "+glRenderer);
+            }
+            quirks[i++] = quirk;
         }
-        quirks[i++] = quirk1;
     } else if( Platform.getOSType() == Platform.OSType.WINDOWS ) {
+        //
+        // WINDOWS
+        //
         final int quirk = GLRendererQuirks.NoDoubleBufferedBitmap;
         if(DEBUG) {
             System.err.println("Quirk: "+GLRendererQuirks.toString(quirk)+": cause: OS "+Platform.getOSType());
         }
         quirks[i++] = quirk;
-    }
-    
-    // Renderer related quirks, may also involve OS
-    if( Platform.OSType.ANDROID == Platform.getOSType() && glRendererLowerCase.contains("powervr") ) {
-        final int quirk = GLRendererQuirks.NoSetSwapInterval;
-        if(DEBUG) {
-            System.err.println("Quirk: "+GLRendererQuirks.toString(quirk)+": cause: OS "+Platform.getOSType() + " / Renderer " + glRenderer);
+    } else if( Platform.OSType.ANDROID == Platform.getOSType() ) {    
+        //
+        // ANDROID
+        //
+        // Renderer related quirks, may also involve OS
+        if( glRendererLowerCase.contains("powervr") ) {
+            final int quirk = GLRendererQuirks.NoSetSwapInterval;
+            if(DEBUG) {
+                System.err.println("Quirk: "+GLRendererQuirks.toString(quirk)+": cause: OS "+Platform.getOSType() + " / Renderer " + glRenderer);
+            }
+            quirks[i++] = quirk;
         }
-        quirks[i++] = quirk;
     }
+    
+    //
+    // RENDERER related quirks
+    //
     if( glRendererLowerCase.contains("mesa") || glRendererLowerCase.contains("gallium") ) {
         {
             final int quirk = GLRendererQuirks.NoSetSwapIntervalPostRetarget;
diff --git a/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLContext.java b/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLContext.java
index dbb1d4931..3825f855c 100644
--- a/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLContext.java
+++ b/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLContext.java
@@ -74,6 +74,7 @@ import com.jogamp.common.util.VersionNumber;
 import com.jogamp.gluegen.runtime.ProcAddressTable;
 import com.jogamp.gluegen.runtime.opengl.GLProcAddressResolver;
 import com.jogamp.opengl.GLExtensions;
+import com.jogamp.opengl.GLRendererQuirks;
 import com.jogamp.opengl.util.PMVMatrix;
 import com.jogamp.opengl.util.glsl.ShaderCode;
 import com.jogamp.opengl.util.glsl.ShaderProgram;
@@ -793,8 +794,8 @@ public abstract class MacOSXCGLContext extends GLContextImpl
       @Override
       public boolean release(long ctx) {
           try {
-              if( null != MacOSXCGLContext.this.getGLProcAddressTable() ) { // gl successfully initialized ?
-                  gl.glFlush(); // w/o glFlush()/glFinish() OSX < 10.7 (NVidia driver) may freeze
+              if( hasRendererQuirk(GLRendererQuirks.GLFlushBeforeRelease) && null != MacOSXCGLContext.this.getGLProcAddressTable() ) {
+                  gl.glFlush();
               }
           } catch (GLException gle) {
               if(DEBUG) {
@@ -975,7 +976,9 @@ public abstract class MacOSXCGLContext extends GLContextImpl
       @Override
       public boolean release(long ctx) {
           try {
-              gl.glFlush(); // w/o glFlush()/glFinish() OSX < 10.7 (NVidia driver) may freeze
+              if( hasRendererQuirk(GLRendererQuirks.GLFlushBeforeRelease) && null != MacOSXCGLContext.this.getGLProcAddressTable() ) {
+                  gl.glFlush();
+              }
           } catch (GLException gle) {
               if(DEBUG) {
                   System.err.println("MacOSXCGLContext.CGLImpl.release: INFO: glFlush() catched exception:");
-- 
cgit v1.2.3