From be59bd91fb69eaba1a3ad4bf472a869b26fc850b Mon Sep 17 00:00:00 2001 From: "Sha..rd" Date: Sat, 10 Nov 2012 21:33:42 +0000 Subject: [PATCH] * Fixed issue 550 git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9985 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../com/jme3/system/lwjgl/LwjglContext.java | 101 ++++++++++++------ 1 file changed, 66 insertions(+), 35 deletions(-) diff --git a/engine/src/lwjgl/com/jme3/system/lwjgl/LwjglContext.java b/engine/src/lwjgl/com/jme3/system/lwjgl/LwjglContext.java index 8da354eee..2edad3caa 100644 --- a/engine/src/lwjgl/com/jme3/system/lwjgl/LwjglContext.java +++ b/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; } }