|
|
@ -29,6 +29,7 @@ |
|
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
package com.jme3.system.lwjgl; |
|
|
|
package com.jme3.system.lwjgl; |
|
|
|
|
|
|
|
|
|
|
|
import com.jme3.input.jinput.JInputJoyInput; |
|
|
|
import com.jme3.input.jinput.JInputJoyInput; |
|
|
@ -68,7 +69,6 @@ public abstract class LwjglContext implements JmeContext { |
|
|
|
private static final Logger logger = Logger.getLogger(LwjglContext.class.getName()); |
|
|
|
private static final Logger logger = Logger.getLogger(LwjglContext.class.getName()); |
|
|
|
|
|
|
|
|
|
|
|
protected static final String THREAD_NAME = "jME3 Main"; |
|
|
|
protected static final String THREAD_NAME = "jME3 Main"; |
|
|
|
|
|
|
|
|
|
|
|
protected AtomicBoolean created = new AtomicBoolean(false); |
|
|
|
protected AtomicBoolean created = new AtomicBoolean(false); |
|
|
|
protected AtomicBoolean renderable = new AtomicBoolean(false); |
|
|
|
protected AtomicBoolean renderable = new AtomicBoolean(false); |
|
|
|
protected final Object createdLock = new Object(); |
|
|
|
protected final Object createdLock = new Object(); |
|
|
@ -112,7 +112,6 @@ public abstract class LwjglContext implements JmeContext { |
|
|
|
return null; |
|
|
|
return null; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected int determineMaxSamples(int requestedSamples) { |
|
|
|
protected int determineMaxSamples(int requestedSamples) { |
|
|
|
try { |
|
|
|
try { |
|
|
|
// If we already have a valid context, determine samples using current
|
|
|
|
// If we already have a valid context, determine samples using current
|
|
|
@ -130,13 +129,11 @@ public abstract class LwjglContext implements JmeContext { |
|
|
|
} catch (LWJGLException ex) { |
|
|
|
} catch (LWJGLException ex) { |
|
|
|
listener.handleError("Failed to check if display is current", ex); |
|
|
|
listener.handleError("Failed to check if display is current", ex); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if ((Pbuffer.getCapabilities() & Pbuffer.PBUFFER_SUPPORTED) == 0) { |
|
|
|
if ((Pbuffer.getCapabilities() & Pbuffer.PBUFFER_SUPPORTED) == 0) { |
|
|
|
// No pbuffer, assume everything is supported.
|
|
|
|
// No pbuffer, assume everything is supported.
|
|
|
|
return Integer.MAX_VALUE; |
|
|
|
return Integer.MAX_VALUE; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
Pbuffer pb = null; |
|
|
|
Pbuffer pb = null; |
|
|
|
|
|
|
|
|
|
|
|
// OpenGL2 method: Create pbuffer and query samples
|
|
|
|
// OpenGL2 method: Create pbuffer and query samples
|
|
|
|
// from GL_ARB_framebuffer_object or GL_EXT_framebuffer_multisample.
|
|
|
|
// from GL_ARB_framebuffer_object or GL_EXT_framebuffer_multisample.
|
|
|
|
try { |
|
|
|
try { |
|
|
@ -161,7 +158,6 @@ public abstract class LwjglContext implements JmeContext { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected void loadNatives() { |
|
|
|
protected void loadNatives() { |
|
|
|
if (JmeSystem.isLowPermissions()) { |
|
|
|
if (JmeSystem.isLowPermissions()) { |
|
|
|
return; |
|
|
|
return; |
|
|
@ -179,7 +175,6 @@ public abstract class LwjglContext implements JmeContext { |
|
|
|
System.setProperty("org.lwjgl.librarypath", extractPath); |
|
|
|
System.setProperty("org.lwjgl.librarypath", extractPath); |
|
|
|
NativeLibraryLoader.loadNativeLibrary("lwjgl", true, false); |
|
|
|
NativeLibraryLoader.loadNativeLibrary("lwjgl", true, false); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected int getNumSamplesToUse() { |
|
|
|
protected int getNumSamplesToUse() { |
|
|
|
int samples = 0; |
|
|
|
int samples = 0; |
|
|
|
if (settings.getSamples() > 1) { |
|
|
|
if (settings.getSamples() > 1) { |
|
|
@ -190,7 +185,6 @@ public abstract class LwjglContext implements JmeContext { |
|
|
|
"Couldn''t satisfy antialiasing samples requirement: x{0}. " |
|
|
|
"Couldn''t satisfy antialiasing samples requirement: x{0}. " |
|
|
|
+ "Video hardware only supports: x{1}", |
|
|
|
+ "Video hardware only supports: x{1}", |
|
|
|
new Object[]{samples, supportedSamples}); |
|
|
|
new Object[]{samples, supportedSamples}); |
|
|
|
|
|
|
|
|
|
|
|
samples = supportedSamples; |
|
|
|
samples = supportedSamples; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -202,48 +196,43 @@ public abstract class LwjglContext implements JmeContext { |
|
|
|
throw new RendererException("OpenGL 2.0 or higher is " |
|
|
|
throw new RendererException("OpenGL 2.0 or higher is " |
|
|
|
+ "required for jMonkeyEngine"); |
|
|
|
+ "required for jMonkeyEngine"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (settings.getRenderer().equals(AppSettings.LWJGL_OPENGL2) |
|
|
|
if (settings.getRenderer().equals(AppSettings.LWJGL_OPENGL2) |
|
|
|
|| settings.getRenderer().equals(AppSettings.LWJGL_OPENGL3)) { |
|
|
|
|| settings.getRenderer().equals(AppSettings.LWJGL_OPENGL3)) { |
|
|
|
GL gl = new LwjglGL(); |
|
|
|
GL gl = new LwjglGL(); |
|
|
|
GLExt glext = new LwjglGLExt(); |
|
|
|
GLExt glext = new LwjglGLExt(); |
|
|
|
GLFbo glfbo; |
|
|
|
GLFbo glfbo; |
|
|
|
|
|
|
|
|
|
|
|
if (GLContext.getCapabilities().OpenGL30) { |
|
|
|
if (GLContext.getCapabilities().OpenGL30) { |
|
|
|
glfbo = new LwjglGLFboGL3(); |
|
|
|
glfbo = new LwjglGLFboGL3(); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
glfbo = new LwjglGLFboEXT(); |
|
|
|
glfbo = new LwjglGLFboEXT(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (settings.getBoolean("GraphicsDebug")) { |
|
|
|
if (settings.getBoolean("GraphicsDebug")) { |
|
|
|
gl = new GLDebugDesktop(gl, glext, glfbo); |
|
|
|
gl = new GLDebugDesktop(gl, glext, glfbo); |
|
|
|
glext = (GLExt) gl; |
|
|
|
glext = (GLExt) gl; |
|
|
|
glfbo = (GLFbo) gl; |
|
|
|
glfbo = (GLFbo) gl; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (settings.getBoolean("GraphicsTiming")) { |
|
|
|
if (settings.getBoolean("GraphicsTiming")) { |
|
|
|
GLTimingState timingState = new GLTimingState(); |
|
|
|
GLTimingState timingState = new GLTimingState(); |
|
|
|
gl = (GL) GLTiming.createGLTiming(gl, timingState, GL.class, GL2.class, GL3.class, GL4.class); |
|
|
|
gl = (GL) GLTiming.createGLTiming(gl, timingState, GL.class, GL2.class, GL3.class, GL4.class); |
|
|
|
glext = (GLExt) GLTiming.createGLTiming(glext, timingState, GLExt.class); |
|
|
|
glext = (GLExt) GLTiming.createGLTiming(glext, timingState, GLExt.class); |
|
|
|
glfbo = (GLFbo) GLTiming.createGLTiming(glfbo, timingState, GLFbo.class); |
|
|
|
glfbo = (GLFbo) GLTiming.createGLTiming(glfbo, timingState, GLFbo.class); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (settings.getBoolean("GraphicsTrace")) { |
|
|
|
if (settings.getBoolean("GraphicsTrace")) { |
|
|
|
gl = (GL) GLTracer.createDesktopGlTracer(gl, GL.class, GL2.class, GL3.class, GL4.class); |
|
|
|
gl = (GL) GLTracer.createDesktopGlTracer(gl, GL.class, GL2.class, GL3.class, GL4.class); |
|
|
|
glext = (GLExt) GLTracer.createDesktopGlTracer(glext, GLExt.class); |
|
|
|
glext = (GLExt) GLTracer.createDesktopGlTracer(glext, GLExt.class); |
|
|
|
glfbo = (GLFbo) GLTracer.createDesktopGlTracer(glfbo, GLFbo.class); |
|
|
|
glfbo = (GLFbo) GLTracer.createDesktopGlTracer(glfbo, GLFbo.class); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
renderer = new GLRenderer(gl, glext, glfbo); |
|
|
|
renderer = new GLRenderer(gl, glext, glfbo); |
|
|
|
renderer.initialize(); |
|
|
|
renderer.initialize(); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
throw new UnsupportedOperationException("Unsupported renderer: " + settings.getRenderer()); |
|
|
|
throw new UnsupportedOperationException("Unsupported renderer: " + settings.getRenderer()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (GLContext.getCapabilities().GL_ARB_debug_output && settings.getBoolean("GraphicsDebug")) { |
|
|
|
if (GLContext.getCapabilities().GL_ARB_debug_output && settings.getBoolean("GraphicsDebug")) { |
|
|
|
ARBDebugOutput.glDebugMessageCallbackARB(new ARBDebugOutputCallback(new LwjglGLDebugOutputHandler())); |
|
|
|
ARBDebugOutput.glDebugMessageCallbackARB(new ARBDebugOutputCallback(new LwjglGLDebugOutputHandler())); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
renderer.setMainFrameBufferSrgb(settings.isGammaCorrection()); |
|
|
|
renderer.setMainFrameBufferSrgb(settings.isGammaCorrection()); |
|
|
|
renderer.setLinearizeSrgbImages(settings.isGammaCorrection()); |
|
|
|
renderer.setLinearizeSrgbImages(settings.isGammaCorrection()); |
|
|
|
|
|
|
|
|
|
|
@ -270,15 +259,12 @@ public abstract class LwjglContext implements JmeContext { |
|
|
|
createdLock.notifyAll(); |
|
|
|
createdLock.notifyAll(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void internalCreate() { |
|
|
|
public void internalCreate() { |
|
|
|
timer = new LwjglTimer(); |
|
|
|
timer = new LwjglTimer(); |
|
|
|
|
|
|
|
|
|
|
|
synchronized (createdLock) { |
|
|
|
synchronized (createdLock) { |
|
|
|
created.set(true); |
|
|
|
created.set(true); |
|
|
|
createdLock.notifyAll(); |
|
|
|
createdLock.notifyAll(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (renderable.get()) { |
|
|
|
if (renderable.get()) { |
|
|
|
initContextFirstTime(); |
|
|
|
initContextFirstTime(); |
|
|
|
} else { |
|
|
|
} else { |
|
|
@ -308,7 +294,6 @@ public abstract class LwjglContext implements JmeContext { |
|
|
|
public boolean isCreated() { |
|
|
|
public boolean isCreated() { |
|
|
|
return created.get(); |
|
|
|
return created.get(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public boolean isRenderable() { |
|
|
|
public boolean isRenderable() { |
|
|
|
return renderable.get(); |
|
|
|
return renderable.get(); |
|
|
|
} |
|
|
|
} |
|
|
|