How to force OpenGL 3+ with JOGL?

@gouessej , and others who can help

I give a try to jogl backend. In my deferred renderer I use shader in GLSL 1.5. But on mac os x (macbook pro) to be able to use OpenGL 3+ we have to force “3.2 core” profile (without compatibility, see OpenGL 3.2 on Mac OS X trouble. jme 3.1 from github).

With LWJGL I used the following line :

settings.setRenderer(AppSettings.LWJGL_OPENGL3)

How to do this with JOGL ?

with

settings.setRenderer("JOGL")
settings.setAudioRenderer("JOAL")

I got the following error (the mac stay on OpenGL 2.1 and doesn’t swith to the OpenGL 4.1 card) :

Oct 30, 2015 9:01:29 AM com.jme3.system.JmeDesktopSystem initialize
INFO: Running on jMonkeyEngine 3.1-5289
 * Branch: master
 * Git Hash: b34649d
 * Build Date: 2015-10-27
Oct 30, 2015 9:01:30 AM com.jme3.renderer.opengl.GLRenderer loadCapabilitiesCommon
INFO: OpenGL Renderer Information
 * Vendor: NVIDIA Corporation
 * Renderer: NVIDIA GeForce GT 750M OpenGL Engine
 * OpenGL Version: 2.1 NVIDIA-10.6.47 310.42.05f01
 * GLSL Version: 1.20
 * Profile: Compatibility
Oct 30, 2015 9:01:30 AM com.jme3.renderer.opengl.GLRenderer loadCapabilitiesCommon
INFO: OpenGL Renderer Information
 * Vendor: NVIDIA Corporation
 * Renderer: NVIDIA GeForce GT 750M OpenGL Engine
 * OpenGL Version: 2.1 NVIDIA-10.6.47 310.42.05f01
 * GLSL Version: 1.20
 * Profile: Compatibility
Oct 30, 2015 9:01:30 AM com.jme3.asset.AssetConfig loadText
WARNING: Cannot find loader com.jme3.scene.plugins.ogre.MeshLoader
Oct 30, 2015 9:01:30 AM com.jme3.asset.AssetConfig loadText
WARNING: Cannot find loader com.jme3.scene.plugins.ogre.SkeletonLoader
Oct 30, 2015 9:01:30 AM com.jme3.asset.AssetConfig loadText
WARNING: Cannot find loader com.jme3.scene.plugins.ogre.MaterialLoader
Oct 30, 2015 9:01:30 AM com.jme3.asset.AssetConfig loadText
WARNING: Cannot find loader com.jme3.scene.plugins.ogre.SceneLoader
Oct 30, 2015 9:01:30 AM com.jme3.asset.AssetConfig loadText
WARNING: Cannot find loader com.jme3.scene.plugins.blender.BlenderModelLoader
Oct 30, 2015 9:01:30 AM com.jme3.asset.AssetConfig loadText
WARNING: Cannot find loader com.jme3.scene.plugins.fbx.SceneLoader
Oct 30, 2015 9:01:30 AM com.jme3.asset.AssetConfig loadText
WARNING: Cannot find loader com.jme3.scene.plugins.fbx.SceneWithAnimationLoader
Oct 30, 2015 9:01:30 AM com.jme3.asset.AssetConfig loadText
WARNING: Cannot find loader com.jme3.audio.plugins.OGGLoader
2015-10-30 09:01:30.796 java[14489:231710] 09:01:30.796 WARNING:  140: This application, or a library it uses, is using the deprecated Carbon Component Manager for hosting Audio Units. Support for this will be removed in a future release. Also, this makes the host incompatible with version 3 audio units. Please transition to the API's in AudioComponent.h.
Oct 30, 2015 9:01:30 AM com.jme3.audio.openal.ALAudioRenderer initOpenAL
INFO: Audio Renderer Information
 * Device: OpenAL Soft
 * Vendor: OpenAL Community
 * Renderer: OpenAL Soft
 * Version: 1.1 ALSOFT 1.15.1
 * Supported channels: 64
 * ALC extensions: ALC_ENUMERATE_ALL_EXT ALC_ENUMERATION_EXT ALC_EXT_CAPTURE ALC_EXT_DEDICATED ALC_EXT_disconnect ALC_EXT_EFX ALC_EXT_thread_local_context ALC_SOFT_loopback
 * AL extensions: AL_EXT_ALAW AL_EXT_DOUBLE AL_EXT_EXPONENT_DISTANCE AL_EXT_FLOAT32 AL_EXT_IMA4 AL_EXT_LINEAR_DISTANCE AL_EXT_MCFORMATS AL_EXT_MULAW AL_EXT_MULAW_MCFORMATS AL_EXT_OFFSET AL_EXT_source_distance_model AL_LOKI_quadriphonic AL_SOFT_buffer_samples AL_SOFT_buffer_sub_data AL_SOFTX_deferred_updates AL_SOFT_direct_channels AL_SOFT_loop_points AL_SOFT_source_latency
Oct 30, 2015 9:01:30 AM com.jme3.audio.openal.ALAudioRenderer initOpenAL
WARNING: Pausing audio device not supported.
Oct 30, 2015 9:01:30 AM com.jme3.audio.openal.ALAudioRenderer initOpenAL
INFO: Audio effect extension version: 1.0
Oct 30, 2015 9:01:30 AM com.jme3.audio.openal.ALAudioRenderer initOpenAL
INFO: Audio max auxiliary sends: 4
spotOuterAngle : 0.7853982
Exception in thread "main-AWTAnimator#00" com.jogamp.opengl.util.AnimatorBase$UncaughtAnimatorException: com.jogamp.opengl.GLException: Caught OnErrorNotImplementedException: The explicitly chosen technique 'normals' on material 'debug_gbuffer'
requires caps [GLSL150] which are not supported by the video renderer on thread main-AWTAnimator#00
    at com.jogamp.opengl.util.AWTAnimatorImpl.display(AWTAnimatorImpl.java:84)
    at com.jogamp.opengl.util.AnimatorBase.display(AnimatorBase.java:451)
    at com.jogamp.opengl.util.Animator$MainLoop.run(Animator.java:198)
    at java.lang.Thread.run(Thread.java:745)
Caused by: com.jogamp.opengl.GLException: Caught OnErrorNotImplementedException: The explicitly chosen technique 'normals' on material 'debug_gbuffer'
requires caps [GLSL150] which are not supported by the video renderer on thread main-AWTAnimator#00
    at com.jogamp.opengl.GLException.newGLException(GLException.java:76)
    at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1311)
    at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:1131)
    at com.jogamp.newt.opengl.GLWindow.display(GLWindow.java:680)
    at com.jogamp.opengl.util.AWTAnimatorImpl.display(AWTAnimatorImpl.java:77)
    ... 3 more
Caused by: rx.exceptions.OnErrorNotImplementedException: The explicitly chosen technique 'normals' on material 'debug_gbuffer'
requires caps [GLSL150] which are not supported by the video renderer
    at rx.Observable$32.onError(Observable.java:7322)
    at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:154)
    at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:111)
    at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:137)
    at rx.internal.operators.NotificationLite.accept(NotificationLite.java:150)
    at rx.subjects.SubjectSubscriptionManager$SubjectObserver.emitNext(SubjectSubscriptionManager.java:254)
    at rx.subjects.BehaviorSubject.onNext(BehaviorSubject.java:159)
    at jme3_ext_deferred.SceneProcessor4Deferred.reshape(SceneProcessor4Deferred.java:94)
    at jme3_ext_deferred.SceneProcessor4Deferred.initialize(SceneProcessor4Deferred.java:78)
    at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:999)
    at com.jme3.renderer.RenderManager.render(RenderManager.java:1078)
    at com.jme3.app.SimpleApplication.update(SimpleApplication.java:260)
    at com.jme3.system.jogl.JoglNewtDisplay.display(JoglNewtDisplay.java:243)
    at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:691)
    at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:673)
    at jogamp.opengl.GLAutoDrawableBase$2.run(GLAutoDrawableBase.java:442)
    at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1277)
    ... 6 more
Caused by: java.lang.UnsupportedOperationException: The explicitly chosen technique 'normals' on material 'debug_gbuffer'
requires caps [GLSL150] which are not supported by the video renderer
    at com.jme3.material.Material.selectTechnique(Material.java:1013)
    at jme3_ext_deferred.AppState4ViewDeferredTexture.getDebugMaterial(AppState4ViewDeferredTexture.java:84)
    at jme3_ext_deferred.AppState4ViewDeferredTexture$2.call(AppState4ViewDeferredTexture.java:130)
    at jme3_ext_deferred.AppState4ViewDeferredTexture$2.call(AppState4ViewDeferredTexture.java:1)
    at rx.Observable$32.onNext(Observable.java:7327)
    at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:130)
    ... 19 more
AL lib: (EE) alc_cleanup: 1 device not closed

Thanks.

Hi

I advise you to read this document to understand how the OpenGL profiles are managed in JOGL. It will probably change a little bit to support Vulkan.

You can use those methods to pick the most capable GLProfile or a particular one:
http://jogamp.org/deployment/jogamp-next/javadoc/jogl/javadoc/com/jogamp/opengl/GLProfile.html#getMaxProgrammable(boolean)
http://jogamp.org/deployment/jogamp-next/javadoc/jogl/javadoc/com/jogamp/opengl/GLProfile.html#get(java.lang.String)
http://jogamp.org/deployment/jogamp-next/javadoc/jogl/javadoc/com/jogamp/opengl/GLProfile.html#GL3

Modify this part of the code:
https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-jogl/src/main/java/com/jme3/system/jogl/JoglAbstractDisplay.java#L85
https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-jogl/src/main/java/com/jme3/system/jogl/JoglNewtAbstractDisplay.java#L79

Only JogAmp’s Ardor3D Continuation benefits of an easy way of customizing the OpenGL profile picked by the engine yet.

I’ll modify the code once for all as nobody except me really needs getMaxFixedFunc(true).

Hi, thanks for the info.
But I don’t want to pick/get the profile. I want to force the profile to use when I create the GLContext.
Macbook as dual OpenGL 2.1 (default), OpenGL 4.x (on demand/force).

Sorry, if I misunderstood your answer.

It think it is

GLProfile.getMaxProgrammableCore(true)

or:

GLProfile.get(GLProfile.GL3)

You probably misunderstood my answer. You have to create the GLCapabilities object with the right OpenGL profile and it will pick OpenGL 3.2 as you wish.

Don’t worry, I’ll make the change by myself when I’m at home. I’ll have to provide two constants and to test the settings before creating the GLCapabilities instance. You’ll have to call settings.setRenderer(AppSettings.JOGL_OPENGL_FORWARD_COMPATIBLE) to force OpenGL 3.2 or settings.setRenderer(AppSettings.JOGL_OPENGL_BACKWARD_COMPATIBLE) to use OpenGL 2.1.

Is it ok for you?

Thanks, it’s Ok for me, I’ll test tomorrow or when you’ll ping me. (I’m in France)

tbh, I try jogl to see if it can help me to fix an opengl crash I have only on macosx + lwjgl. And because I would like to try jogl’s multi-monitor support.

Lwjgl3?

no LWJGL 2 (I’ve got the error 1280 :wink: ), LWJGL3 is too young/WIP IMHO

If you find a way of making a virtual screen with several monitors with GLFW, let me know:
http://www.glfw.org/docs/latest/monitor.html
http://www.glfw.org/docs/latest/group__monitor.html

I’m sorry, I don’t want to hurt anybody but I loose my motivation when some developers repeatedly suggest to use another backend each time there is obviously an excellent test case for the JogAmp APIs. I encourage you to prove me that what I do is useless, please quote some documentation, show me that you are already able to use exactly the same windowing system in desktop environments and under Android without JogAmp.

That was a question to david, if he gets the error with the lwjgl3 backend or with the lwjgl2 one. Sorry if i was unclear

[OT] I test my current jogl code (available on github) on my Linux, and I’got a jvm crash.
I copy paste a fragment below, if you have any idea :

Stack: [0x00007fc7a492f000,0x00007fc7a4a30000],  sp=0x00007fc7a4a2e080,  free space=1020k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [libGL.so.1+0x5239d]

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  jogamp.opengl.x11.glx.GLX.dispatch_glXMakeContextCurrent0(JJJJJ)Z+0
j  jogamp.opengl.x11.glx.GLX.glXMakeContextCurrent(JJJJ)Z+45
j  jogamp.opengl.x11.glx.X11GLXContext.glXMakeContextCurrent(JJJJ)Z+16
j  jogamp.opengl.x11.glx.X11GLXContext.makeCurrentImpl()V+33
j  jogamp.opengl.GLContextImpl.makeCurrentWithinLock(I)I+790
j  jogamp.opengl.GLContextImpl.makeCurrent(Z)I+488
j  jogamp.opengl.GLContextImpl.setGLDrawable(Lcom/jogamp/opengl/GLDrawable;Z)Lcom/jogamp/opengl/GLDrawable;+302
j  jogamp.opengl.GLDrawableFactoryImpl.probeSurfacelessCtx(Lcom/jogamp/opengl/GLContext;Z)Z+93
j  jogamp.opengl.x11.glx.X11GLXDrawableFactory.access$300(Ljogamp/opengl/x11/glx/X11GLXDrawableFactory;Lcom/jogamp/opengl/GLContext;Z)Z+3
j  jogamp.opengl.x11.glx.X11GLXDrawableFactory$SharedResourceImplementation.createSharedResource(Lcom/jogamp/nativewindow/AbstractGraphicsDevice;)Ljogamp/opengl/SharedResourceRunner$Resource;+289
j  jogamp.opengl.SharedResourceRunner.run()V+267
j  java.lang.Thread.run()V+11
v  ~StubRoutines::call_stub

---------------  P R O C E S S  ---------------

Java Threads: ( => current thread )
  0x00007fc7f87f5000 JavaThread "main-SharedResourceRunner" daemon [_thread_blocked, id=2852, stack(0x00007fc793982000,0x00007fc793a83000)]
=>0x00007fc7f8675800 JavaThread "main-SharedResourceRunner" daemon [_thread_in_native, id=2851, stack(0x00007fc7a492f000,0x00007fc7a4a30000)]
  0x00007fc7f8611800 JavaThread "AWT-EventQueue-0" [_thread_blocked, id=2850, stack(0x00007fc7a71e4000,0x00007fc7a72e5000)]
  0x00007fc7f8610000 JavaThread "AWT-Shutdown" [_thread_blocked, id=2849, stack(0x00007fc7a72e5000,0x00007fc7a73e6000)]
  0x00007fc7f85f7000 JavaThread "AWT-XAWT" daemon [_thread_in_native, id=2848, stack(0x00007fc7d407c000,0x00007fc7d417d000)]
  0x00007fc7f85da800 JavaThread "Java2D Disposer" daemon [_thread_blocked, id=2847, stack(0x00007fc7d5f45000,0x00007fc7d6046000)]
  0x00007fc7f8494000 JavaThread "process reaper" daemon [_thread_blocked, id=2842, stack(0x00007fc7d646e000,0x00007fc7d64a7000)]
  0x00007fc7f80c3000 JavaThread "Service Thread" daemon [_thread_blocked, id=2837, stack(0x00007fc7d6695000,0x00007fc7d6796000)]
  0x00007fc7f80be000 JavaThread "C1 CompilerThread2" daemon [_thread_blocked, id=2836, stack(0x00007fc7d6796000,0x00007fc7d6897000)]
  0x00007fc7f80bc000 JavaThread "C2 CompilerThread1" daemon [_thread_blocked, id=2835, stack(0x00007fc7d6897000,0x00007fc7d6998000)]
  0x00007fc7f80b9000 JavaThread "C2 CompilerThread0" daemon [_thread_blocked, id=2834, stack(0x00007fc7d6998000,0x00007fc7d6a99000)]
  0x00007fc7f80b8000 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=2833, stack(0x00007fc7d6a99000,0x00007fc7d6b9a000)]
  0x00007fc7f8081800 JavaThread "Finalizer" daemon [_thread_blocked, id=2832, stack(0x00007fc7d6d6a000,0x00007fc7d6e6b000)]
  0x00007fc7f807f800 JavaThread "Reference Handler" daemon [_thread_blocked, id=2831, stack(0x00007fc7d6e6b000,0x00007fc7d6f6c000)]
  0x00007fc7f800c800 JavaThread "main" [_thread_blocked, id=2821, stack(0x00007fc7ff2b2000,0x00007fc7ff3b3000)]

Other Threads:
  0x00007fc7f807a800 VMThread [stack: 0x00007fc7d6f6c000,0x00007fc7d706d000] [id=2827]
  0x00007fc7f80c5800 WatcherThread [stack: 0x00007fc7d6594000,0x00007fc7d6695000] [id=2838]


VM Arguments:
jvm_args: -Dfile.encoding=UTF-8 
java_command: sandbox.Main
java_class_path (initial): /home/dwayne/work/jme3/jme3_ext_deferred/bin:/home/dwayne/.gradle/caches/modules-2/files-2.1/org.eclipse.xtend/org.eclipse.xtend.lib/2.8.4/796c9f5edcd034de7d4406b5df422f0aa9663370/org.eclipse.xtend.lib-2.8.4.jar:/home/dwayne/.gradle/caches/modules-2/files-2.1/io.reactivex/rxjava/1.0.8/6a1474076b9a0fb580a9525400727617b5ada5cd/rxjava-1.0.8.jar:/home/dwayne/.m2/repository/org/slf4j/slf4j-api/1.7.7/slf4j-api-1.7.7.jar:/home/dwayne/.gradle/caches/modules-2/files-2.1/com.jme3/jme3-core/3.1.0-SNAPSHOT/8f712f52961d7753bf72396e98cd51cdeba3793/jme3-core-3.1.0-SNAPSHOT.jar:/home/dwayne/.gradle/caches/modules-2/files-2.1/com.jme3/jme3-jogl/3.1.0-SNAPSHOT/9dd0409e102758b422a5162ff386bdc656f0ea2f/jme3-jogl-3.1.0-SNAPSHOT.jar:/home/dwayne/.gradle/caches/modules-2/files-2.1/org.jogamp.jogl/jogl-all-noawt/2.3.1/f16b7e0ed9443e4b64c96df758ad79193a0d232a/jogl-all-noawt-2.3.1.jar:/home/dwayne/.m2/repository/junit/junit/4.11/junit-4.11.jar:/home/dwayne/.gradle/caches/modules-2/files-2.1/org.mockito/mockito-core/1.8.5/7904ce54a754031a32ac78ec7103f484f81b56c6/mockito-core-1.8.5.jar:/home/dwayne/.m2/repository/net/alchim31/assets/crytek_sponza2/0.1.0/crytek_sponza2-0.1.0.jar:/home/dwayne/.m2/repository/net/alchim31/assets/teapot/0.2.0/teapot-0.2.0.jar:/home/dwayne/.m2/repository/net/alchim31/assets/broken_cube/0.1.0/broken_cube-0.1.0.jar:/home/dwayne/.gradle/caches/modules-2/files-2.1/com.jme3/jme3-jbullet/3.1.0-SNAPSHOT/a803fc563cbc423b9dbd6b0b8c41ee5ea7b15fbc/jme3-jbullet-3.1.0-SNAPSHOT.jar:/home/dwayne/.gradle/caches/modules-2/files-2.1/com.jme3/jme3-effects/3.1.0-SNAPSHOT/c74296cb9b31b1b7d94df46d4b81ac5a1dd36a1a/jme3-effects-3.1.0-SNAPSHOT.jar:/home/dwayne/.gradle/caches/modules-2/files-2.1/com.jme3/jme3-desktop/3.1.0-SNAPSHOT/4fe019ba8748569fadd1d2207b7990ad9c96dc68/jme3-desktop-3.1.0-SNAPSHOT.jar:/home/dwayne/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-jdk14/1.7.7/25d160723ea37a6cb84e87cd70773ff02997e857/slf4j-jdk14-1.7.7.jar:/home/dwayne/.gradle/ca
Launcher Type: SUN_STANDARD

Environment Variables:
JAVA_HOME=/home/dwayne/bin/soft/jdk1.8.0_51
PATH=/home/dwayne/bin/soft/sbt/bin:/home/dwayne/bin/soft/launch4j:/home/dwayne/bin/soft/gradle-2.3/bin:/home/dwayne/bin/soft/apache-ant-1.9.2/bin:/home/dwayne/bin/soft/apache-maven-3.0.5/bin:/home/dwayne/bin/soft/jdk1.8.0_51/bin:/home/dwayne/.rvm/gems/ruby-2.0.0-p598/bin:/home/dwayne/.rvm/gems/ruby-2.0.0-p598@global/bin:/home/dwayne/.rvm/rubies/ruby-2.0.0-p598/bin:/home/dwayne/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/home/dwayne/.rvm/bin
SHELL=/bin/zsh
DISPLAY=:0.0


Please use JOGL 2.3.2 instead of JOGL 2.3.1 and reproduce your crash on a tiny test case. You can use our online test, for example this one:
http://jogamp.org/deployment/jogamp-current/jogl-application-version.jnlp

Rather post your question specific to JOGL on our official forum, not here.

I have implemented what you asked. Fill a bug report against JOGL if your crash persists but follow our guidelines:
http://jogamp.org/wiki/index.php/Jogl_FAQ#Bugreports_.26_Testing

Thanks, I’m coding a tiny jme3_jogl project to test.

I create a simple jme application at : GitHub - davidB/sandbox_jme3_jogl: experiment jme3 with jogl backend

  • with jogl 2.3.1 I reproduce the crash.
  • with forced jogl 2.3.2, no longer crash (hourra thanks). I saw your commits to used jogl 2.3.2 for next jme3-3.1.0-SNAPSHOT (then I’ll remove the forced version).

So I’ll not open the bug on joamp’s buzilla.

The sample project can be used by other jme user (to test jogl or report bugs,I enable debug-all system property)

Please can you tell me which graphics card you use and which driver? It would be useful for me in case someone else gets a crash with the same hardware with an obsolete version of JOGL.

A contributor has found a regression in the support of fullscreen mode with several monitors, it happens only under Windows with JOGL 2.3.2. We asked him to write a bug report but I’m not sure he did. I’ll have to fix this bug before improving the support of multiple monitors in another engine. After that, I’ll port my code from this engine to JMonkeyEngine. The remaining problem is that you’ll probably have to use some JOGL code as there is not yet any API to abstract the management of screens and monitors. Note that this feature only works with NEWT, not with AWT.

On linux:

Tomorrow I could swith to windows 10 if you need.

INFOS: Running on jMonkeyEngine 3.1-5289
 * Branch: master
 * Git Hash: b34649d
 * Build Date: 2015-10-27
oct. 30, 2015 10:51:21 PM com.jme3.renderer.opengl.GLRenderer loadCapabilitiesCommon
INFOS: OpenGL Renderer Information
 * Vendor: NVIDIA Corporation
 * Renderer: GeForce GTX 660/PCIe/SSE2
 * OpenGL Version: 4.5.0 NVIDIA 355.11
 * GLSL Version: 4.50 NVIDIA
 * Profile: Compatibility

Thank you. You should modify your test to use the correct string to pass to AppSettings.setRenderer(), shouldn’t you?

Good night.

I just tested on my macbook.

Good news it works:

INFO: Running on jMonkeyEngine 3.1-HEAD-5293
 * Branch: HEAD
 * Git Hash: ea28e8a
 * Build Date: 2015-11-01
Nov 01, 2015 10:29:55 PM com.jme3.renderer.opengl.GLRenderer loadCapabilitiesCommon
INFO: OpenGL Renderer Information
 * Vendor: NVIDIA Corporation
 * Renderer: NVIDIA GeForce GT 750M OpenGL Engine
 * OpenGL Version: 4.1 NVIDIA-10.6.47 310.42.05f01
 * GLSL Version: 4.10
 * Profile: Core

Bad news: my deferred sample run at 20-25 FPS with JOGL (vs 45-60 FPS with LWJGL).