Explorar o código

* Fixed issue 550

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9985 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
Sha..rd %!s(int64=13) %!d(string=hai) anos
pai
achega
be59bd91fb
Modificáronse 1 ficheiros con 66 adicións e 35 borrados
  1. 66 35
      engine/src/lwjgl/com/jme3/system/lwjgl/LwjglContext.java

+ 66 - 35
engine/src/lwjgl/com/jme3/system/lwjgl/LwjglContext.java

@@ -112,56 +112,87 @@ public abstract class LwjglContext implements JmeContext {
     }
     
     protected int determineMaxSamples(int requestedSamples) {
-        if ((Pbuffer.getCapabilities() & Pbuffer.PBUFFER_SUPPORTED) == 0) {
-            // No pbuffer, assume everything is supported.
-            return Integer.MAX_VALUE;
-        } else {
-            Pbuffer pb = null;
-            
-            // OpenGL2 method: Create pbuffer and query samples
-            // from GL_ARB_framebuffer_object or GL_EXT_framebuffer_multisample.
-            try {
-                pb = new Pbuffer(1, 1, new PixelFormat(0, 0, 0), null);
-                pb.makeCurrent();
-                
+        boolean displayWasCurrent = false;
+        try {
+            // If we already have a valid context, determine samples using current
+            // context.
+            if (Display.isCreated() && Display.isCurrent()) {
                 if (GLContext.getCapabilities().GL_ARB_framebuffer_object) {
                     return GL11.glGetInteger(ARBFramebufferObject.GL_MAX_SAMPLES);
                 } else if (GLContext.getCapabilities().GL_EXT_framebuffer_multisample) {
                     return GL11.glGetInteger(EXTFramebufferMultisample.GL_MAX_SAMPLES_EXT);
                 }
-                
-                // OpenGL2 method failed.
-            } catch (LWJGLException ex) {
-                // Something else failed.
-                return Integer.MAX_VALUE;
-            } finally { 
-                if (pb != null) {
-                    pb.destroy();
-                    pb = null;
-                }
+                // Doesn't support any of the needed extensions .. continue down.
+                displayWasCurrent = true;
             }
+        } catch (LWJGLException ex) {
+            listener.handleError("Failed to check if display is current", ex);
+        }
+        
+        if ((Pbuffer.getCapabilities() & Pbuffer.PBUFFER_SUPPORTED) == 0) {
+            // No pbuffer, assume everything is supported.
+            return Integer.MAX_VALUE;
+        } else {
+            Pbuffer pb = null;
             
-            // OpenGL1 method
-            requestedSamples = FastMath.nearestPowerOfTwo(requestedSamples);
-            while (requestedSamples > 1) {
+            if (!displayWasCurrent) {
+                // OpenGL2 method: Create pbuffer and query samples
+                // from GL_ARB_framebuffer_object or GL_EXT_framebuffer_multisample.
                 try {
-                    pb = new Pbuffer(1, 1, new PixelFormat(0, 0, 0, requestedSamples), null);
-                } catch (LWJGLException ex) {
-                    if (ex.getMessage().startsWith("Failed to find ARB pixel format")) {
-                        // Unsupported format, so continue.
-                        requestedSamples /= 2;
-                    } else {
-                        // Something else went wrong ..
-                        return Integer.MAX_VALUE;
+                    pb = new Pbuffer(1, 1, new PixelFormat(0, 0, 0), null);
+                    pb.makeCurrent();
+
+                    if (GLContext.getCapabilities().GL_ARB_framebuffer_object) {
+                        return GL11.glGetInteger(ARBFramebufferObject.GL_MAX_SAMPLES);
+                    } else if (GLContext.getCapabilities().GL_EXT_framebuffer_multisample) {
+                        return GL11.glGetInteger(EXTFramebufferMultisample.GL_MAX_SAMPLES_EXT);
                     }
-                } finally {
-                    if (pb != null){
+
+                    // OpenGL2 method failed.
+                } catch (LWJGLException ex) {
+                    // Something else failed.
+                    return Integer.MAX_VALUE;
+                } finally { 
+                    if (pb != null) {
                         pb.destroy();
                         pb = null;
                     }
                 }
             }
             
+            // OpenGL1 method (DOESNT WORK RIGHT NOW ..)
+            requestedSamples = FastMath.nearestPowerOfTwo(requestedSamples);
+            try {
+                requestedSamples = Integer.MAX_VALUE;
+                /*
+                while (requestedSamples > 1) {
+                    try {
+                        pb = new Pbuffer(1, 1, new PixelFormat(16, 0, 8, 0, requestedSamples), null);
+                    } catch (LWJGLException ex) {
+                        if (ex.getMessage().startsWith("Failed to find ARB pixel format")) {
+                            // Unsupported format, so continue.
+                            requestedSamples = FastMath.nearestPowerOfTwo(requestedSamples / 2);
+                        } else {
+                            // Something else went wrong ..
+                            return Integer.MAX_VALUE;
+                        }
+                    } finally {
+                        if (pb != null){
+                            pb.destroy();
+                            pb = null;
+                        }
+                    }
+                }*/
+            } finally {
+                if (displayWasCurrent) {
+                    try {
+                        Display.makeCurrent();
+                    } catch (LWJGLException ex) {
+                        listener.handleError("Failed to make display current after checking samples", ex);
+                    }
+                }
+            }
+            
             return requestedSamples;
         }
     }