Browse Source

First attempt of fix for the issue #490

Julien Gouesse 9 years ago
parent
commit
5a5ffdc2ae

+ 23 - 9
jme3-jogl/src/main/java/com/jme3/system/jogl/JoglOffscreenBuffer.java

@@ -37,14 +37,13 @@ import com.jme3.input.MouseInput;
 import com.jme3.input.TouchInput;
 import com.jme3.input.dummy.DummyKeyInput;
 import com.jme3.input.dummy.DummyMouseInput;
+import com.jme3.system.AppSettings;
 
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import com.jogamp.opengl.GL;
 import com.jogamp.opengl.GLCapabilities;
-import com.jogamp.opengl.GLContext;
 import com.jogamp.opengl.GLDrawableFactory;
 import com.jogamp.opengl.GLOffscreenAutoDrawable;
 import com.jogamp.opengl.GLProfile;
@@ -61,14 +60,19 @@ public class JoglOffscreenBuffer extends JoglContext implements Runnable {
     private GLCapabilities caps;
 
     protected void initInThread(){
-        GL gl = GLContext.getCurrentGL();
-        if (!gl.hasFullFBOSupport()){
-            logger.severe("Offscreen surfaces are not supported.");
-            return;
+    	// not necessary as JOGL can create an offscreen buffer even without full FBO support
+//        if (!GLContext.getCurrent().hasFullFBOSupport()){
+//            logger.severe("Offscreen surfaces are not supported.");
+//            return;
+//        }
+    	final GLProfile profile;
+    	if (settings.getRenderer().equals(AppSettings.JOGL_OPENGL_FORWARD_COMPATIBLE)) {
+    		profile = GLProfile.getMaxProgrammable(true);
+        } else {
+        	profile = GLProfile.getMaxFixedFunc(true);
         }
-
+    	caps = new GLCapabilities(profile);
         int samples = getNumSamplesToUse();
-        caps = new GLCapabilities(GLProfile.getMaxFixedFunc(true));
         caps.setHardwareAccelerated(true);
         caps.setDoubleBuffered(true);
         caps.setStencilBits(settings.getStencilBits());
@@ -77,7 +81,7 @@ public class JoglOffscreenBuffer extends JoglContext implements Runnable {
         caps.setSampleBuffers(true);
         caps.setNumSamples(samples);
 
-        offscreenDrawable = GLDrawableFactory.getFactory(GLProfile.getMaxFixedFunc(true)).createOffscreenAutoDrawable(null, caps, null, width, height);
+        offscreenDrawable = GLDrawableFactory.getFactory(profile).createOffscreenAutoDrawable(null, caps, null, width, height);
         
         offscreenDrawable.display();
         
@@ -88,6 +92,16 @@ public class JoglOffscreenBuffer extends JoglContext implements Runnable {
         super.internalCreate();
         listener.initialize();
     }
+    
+    @Override
+	protected void initContextFirstTime(){
+    	offscreenDrawable.getContext().makeCurrent();
+    	try {
+    	    super.initContextFirstTime();
+    	} finally {
+    	    offscreenDrawable.getContext().release();
+    	}
+    }
 
     protected boolean checkGLError(){
         //FIXME