| Summary: | OpenGL 4.0/4.1 core context creation fails if done via getGL4() method | ||
|---|---|---|---|
| Product: | [JogAmp] Jogl | Reporter: | Job Zwiers <zwiers> |
| Component: | core | Assignee: | Sven Gothel <sgothel> |
| Status: | VERIFIED FIXED | ||
| Severity: | normal | CC: | kai, sgothel |
| Priority: | --- | ||
| Version: | 2 | ||
| Hardware: | pc_x86_64 | ||
| OS: | windows | ||
| Type: | --- | SCM Refs: |
4a77b439ca85a29c1cf5ac5043c4ef03c4206e0d
|
| Workaround: | --- | ||
| Attachments: | test program showing a bug for getGL4() method | ||
I'm experiencing a very similar result using jogl-2.0-b23-20110303-windows-amd64
Hardware, OS and Drivers are all the same.
Default Profile: GL4bc
GL-Class: GL4bcImpl
Context Version: 3.0 (compatibility profile, any, old) - 4.1.0
but: getGL3(), getGL3bc(), getGL4() and getGL4bc() fail
I've attached a detailed extract of what JOGL allows/disallows.
My creation method (I'm relative new to JOGL, so I hope there's no newbie-mistake inside)
AbstractGraphicsDevice device = GLProfile.getDefaultDevice();
GLProfile glProfile = GLProfile.getDefault(device);
GLContext glContext = GLDrawableFactory.getFactory(glProfile).create.createExternalGLContext();
--------- SNIP ---------
AbstractGraphicsDevice.DEFAULT_CONNECTION = decon
AbstractGraphicsDevice.DEFAULT_UNIT = 0
AbstractGraphicsDevice.EXTERNAL_CONNECTION = excon
device = WindowsGraphicsDevice[type Windows, connection decon, unitID 0, handle 0x0]
device.getConnection = decon
device.getHandle = 0
device.getType = Windows
device.getUniqueID = Windows_decon_0
device.getUnitID = 0
GLContext.getMaxMajor = 4
GLContext.getMaxMinor(getMaxMajor) = 1
GLContext.isGL2Available(device) = true
GLContext.isGL3Available(device) = true
GLContext.isGL3bcAvailable(device) = true
GLContext.isGL4Available(device) = true
GLContext.isGL4bcAvailable(device) = true
GLContext.isGLES1Available(device) = false
GLContext.isGLES2Available(device) = false
GLContext.isValidGLVersion(1, 0) = true
GLContext.isValidGLVersion(1, 1) = true
GLContext.isValidGLVersion(1, 2) = true
GLContext.isValidGLVersion(1, 3) = true
GLContext.isValidGLVersion(1, 4) = true
GLContext.isValidGLVersion(1, 5) = true
GLContext.isValidGLVersion(2, 0) = true
GLContext.isValidGLVersion(2, 1) = true
GLContext.isValidGLVersion(3, 0) = true
GLContext.isValidGLVersion(3, 1) = true
GLContext.isValidGLVersion(3, 2) = true
GLContext.isValidGLVersion(3, 3) = true
GLContext.isValidGLVersion(4, 0) = true
GLContext.isValidGLVersion(4, 1) = true
GLProfile.glAvailabilityToString =
GLAvailability[
Native[
GL4bc true[4.1 (compatibility profile, any, new)],
GL4 true[4.1 (core profile, any, new)],
GL3bc true[3.3 (compatibility profile, any, new)],
GL3 true[3.3 (core profile, any, new)],
GL2 true[3.0 (compatibility profile, any, new)],
GL2ES1 true,
GLES1 false,
GL2ES2 true,
GLES2 false
],
Profiles[
GLProfile[GL2ES2/GL2],
GLProfile[GL2ES1/GL2],
GLProfile[GL2/GL2],
GLProfile[GL4/GL4],
GLProfile[GL3/GL3],
GLProfile[GL4bc/GL4bc],
GLProfile[GL4bc/GL4bc],
GLProfile[GL2GL3/GL2],
GLProfile[GL3bc/GL3bc],
,
default GLProfile[GL4bc/GL4bc]
]
]
GLProfile.getDefaultDesktopDevice = WindowsGraphicsDevice[type Windows, connection decon, unitID 0, handle 0x0]
GLProfile.getDefaultDevice = WindowsGraphicsDevice[type Windows, connection decon, unitID 0, handle 0x0]
GLProfile.getDefaultEGLDevice = EGLGraphicsDevice[type EGL, connection decon, unitID 0, handle 0x0]
GLProfile.isAWTAvailable = true
GLProfile.isGL2Available = true
GLProfile.isGL2ES1Available = true
GLProfile.isGL2ES2Available = true
GLProfile.isGL3Available = true
GLProfile.isGL3bcAvailable = true
GLProfile.isGL4Available = true
GLProfile.isGL4bcAvailable = true
GLProfile.isGLES1Available = false
GLProfile.isGLES2Available = false
glprofile = GLProfile[GL4bc/GL4bc]
glprofile.getGLImplBaseClassName = jogamp.opengl.gl4.GL4bc
glprofile.getImplName = GL4bc
glprofile.getName = GL4bc
glprofile.hasGLSL = true
glprofile.isGL2 = true
glprofile.isGL2ES1 = true
glprofile.isGL2ES2 = true
glprofile.isGL2GL3 = true
glprofile.isGL3 = true
glprofile.isGL3bc = true
glprofile.isGL4 = true
glprofile.isGL4bc = true
glprofile.isGLES1 = false
glprofile.isGLES2 = false
glprofile.usesNativeGLES = false
glprofile.usesNativeGLES1 = false
glprofile.usesNativeGLES2 = false
glcontext = jogamp.opengl.windows.wgl.WindowsExternalWGLContext[
OpenGL 3.0,
options 0x22,
3.0 (compatibility profile, any, old) - 4.1.0,
handle 0x20000,
jogamp.opengl.gl4.GL4bcImpl@7290cb03,
Drawable: jogamp.opengl.windows.wgl.WindowsExternalWGLContext$Drawable[
Realized true,
Factory jogamp.opengl.windows.wgl.WindowsWGLDrawableFactory@6cb8,
handle 0x40011b9a,
Window WrappedSurface[
config WindowsWGLGraphicsConfiguration[
DefaultGraphicsScreen[
DefaultGraphicsDevice[
type Windows,
connection decon,
unitID 0,
handle 0x0
],
idx 0
],
pfdID 7,
ARB-Choosen true,
requested GLCaps[
7 arb: on-scr,
rgba 8/8/8/0,
opaque,
accum-rgba 16/16/16/16,
dp/st/ms: 24/0/0,
dbl,
mono ,
hw,
GLProfile[GL4bc/GL4bc]
],
chosen GLCaps[
7 arb: on-scr,
rgba 8/8/8/0,
opaque,
accum-rgba 16/16/16/16,
dp/st/ms: 24/0/0,
dbl,
mono ,
hw,
GLProfile[GL4bc/GL4bc]
]
],
displayHandle 0x0,
surfaceHandle 0x40011b9a,
size 0x0
]
]
]
glcontext.getGLVersion = 3.0 (compatibility profile, any, old) - 4.1.0
glcontext.getGLVersionMajor = 3
glcontext.getGLVersionMinor = 0
glcontext.getGL().class = class jogamp.opengl.gl4.GL4bcImpl
glcontext.getGL() instanceof GL2 = true
glcontext.getGL().getGL(): Ok
glcontext.getGL() instanceof GL2 = true
glcontext.getGL().getGL2() Ok
glcontext.getGL() instanceof GL2ES1 = true
glcontext.getGL().getGL2ES1() Ok
glcontext.getGL() instanceof GL2ES2 = true
glcontext.getGL().getGL2ES2() Ok
glcontext.getGL() instanceof GL2GL3 = true
glcontext.getGL().getGL2GL3() Ok
glcontext.getGL() instanceof GL3 = true
glcontext.getGL().getGL3(): Not a GL3 implementation
glcontext.getGL() instanceof GL3bc = true
glcontext.getGL().getGL3bc(): Not a GL3bc implementation
glcontext.getGL() instanceof GL4 = true
glcontext.getGL().getGL4(): Not a GL4 implementation
glcontext.getGL() instanceof GL4bc = true
glcontext.getGL().getGL4bc(): Not a GL4bc implementation
glcontext.getGL() instanceof GL4bc = false
glcontext.getGL().getGLES1(): Not a GLES1 implementation
glcontext.getGL() instanceof GL4bc = false
glcontext.getGL().getGLES2(): Not a GLES2 implementation
--------- SNAP ---------
I cannot confirm this bug, since we use GL4 ctx a long time ago on linux/windows w/ appropriate GPUs .. Your logs might say that you have requested a GL4 ctx, but for some reason it is not, and no exception has been thrown at getGL4() ? NV GTX 460 supports GL4 AFAIK. So does it's driver on windows. Please attach your test application, or better a unit test. Thank you. BTW, we already have a simple unit test for those GLProfiles here: jogl/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestGLProfile01NEWT.java Maybe you can test that one on your machine and/or create a modified version of it, reproducing the bug you experience. Its much simpler to understand the issue having a unit test .. Created attachment 262 [details]
test program showing a bug for getGL4() method
Small test program showing a bug when using the combination
GLProfile.get(GLProfile.GL4) and later on GL4 gl = drawable.getGL().getGL4();
I could run the junit test (except for a few lines in the first test which seem to require some android.content.Context class which I apparantly don't have) The test completes ok, but it would not trigger this bug, since it is only the particular *combination* of GLProfile.get(GLProfile.GL4) for profile selction and later on GL4 gl = drawable.getGL().getGL4() for obtaining a GL4 context. Replacing the latter line with GL4 gl = (GL4) drawable.getGL(); for instancce works ok. Alternatively, selecting the profile with GLProfile glp = GLProfile.getDefault(); also avaoid this bug (I think it selects a GL4bc rather than a GL4 profile). For triggering this bug in the junit test I guess we need a revised dumpVersion/DumpGLInfo, so I created a small test program instead. fixed (jogl: 4a77b439ca85a29c1cf5ac5043c4ef03c4206e0d) sorry, it was copy/paste code bug. thx for being persistent demonstrating it. |
The following method for creating an OGL 4 context fails: public void init(GLAutoDrawable drawable) { GL4 gl = drawable.getGL().getGL4(); The Exception: ---------------------------------------------------------------------- Exception in thread "AWT-EventQueue-0" javax.media.opengl.GLException: Not a GL4 implementation [java] at jogamp.opengl.gl4.GL4bcImpl.getGL4(GL4bcImpl.java:32456) [java] at firstopengl.OGL4Test.init(OGL4Test.java:173) [java] at jogamp.opengl.GLDrawableHelper.init(GLDrawableHelper.java:132) [java] at jogamp.opengl.GLDrawableHelper.init(GLDrawableHelper.java:151) [java] at javax.media.opengl.awt.GLCanvas$InitAction.run(GLCanvas.java:872) [java] at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:328) [java] at javax.media.opengl.awt.GLCanvas.maybeDoSingleThreadedWorkaround(GLCanvas.java:785) [java] at javax.media.opengl.awt.GLCanvas.display(GLCanvas.java:389) [java] at javax.media.opengl.awt.GLCanvas.paint(GLCanvas.java:488) [java] at sun.awt.RepaintArea.paintComponent(RepaintArea.java:248) ... ------------------------------------------------------------------------ Hardware: NVidia GTX 460, driver 270.61(whql), Win7 64 bits Jogl builds used for the test: b391, b392 Jogl profile selected with: GLProfile glp = GLProfile.get(GLProfile.GL4); The following workaround is ok: GL4 gl = (GL4)drawable.getGL(); This yields a context reported by glGetString(GL4.GL_VERSION) as OGL4.1) A similar call for GL3 works fine: GL3 gl = drawable.getGL().getGL3(); // Ok, but of course OGL3.3) ====================================================================== The following is a printout for gl.getContext().toString(): [java] GL context: jogamp.opengl.windows.wgl.WindowsOnscreenWGLContext [OpenGL 4.1, options 0x25, 4.1 (core profile, any, new) - 4.1.0, handle 0x20000, jogamp.opengl.gl4.GL4bcImpl@1a42792, [java] Drawable: jogamp.opengl.windows.wgl.WindowsOnscreenWGLDrawable[Realized true, [java] Factory jogamp.opengl.windows.wgl.WindowsWGLDrawableFactory@2200d5, [java] handle 0xffffffff93011a9c, [java] Window JAWT-Window[windowHandle 0x100eec, surfaceHandle 0xffffffff93011a9c, bounds [ 8 / 30 624 x 362 ], pos 8/30, size 624x362, visible true, lockedExt false, [java] config AWTGraphicsConfiguration[AWTGraphicsScreen[AWTGraphicsDevice[type AWT[subType null], connection \Display0, unitID 0, awtDevice D3DGraphicsDevice[screen=0], handle 0x0], idx 0], [java] chosen GLCaps[7 arb: on-scr, rgba 8/8/8/0, opaque, accum-rgba 16/16/16/16, dp/st/ms: 24/0/0, dbl, mono , hw, GLProfile[GL4/GL4]], [java] requested GLCaps[on-scr, rgba 8/8/8/0, opaque, accum-rgba 0/0/0/0, dp/st/ms: 16/0/0, dbl, mono , hw, GLProfile[GL4/GL4]], [java] sun.awt.Win32GraphicsConfig@1632847[dev=D3DGraphicsDevice[screen=0],pixfmt=7], [java] encapsulated WindowsWGLGraphicsConfiguration[DefaultGraphicsScreen[WindowsGraphicsDevice[type Windows, connection decon, unitID 0, handle 0x0], idx 0], pfdID 7, ARB-Choosen true, [java] requested GLCaps[on-scr, rgba 8/8/8/0, opaque, accum-rgba 0/0/0/0, dp/st/ms: 16/0/0, dbl, mono , hw, GLProfile[GL4/GL4]], [java] chosen GLCaps[7 arb: on-scr, rgba 8/8/8/0, opaque, accum-rgba 16/16/16/16, dp/st/ms: 24/0/0, dbl, mono , hw, GLProfile[GL4/GL4]]]], [java] awtComponent AWT-GLCanvas[Realized true, [java] jogamp.opengl.windows.wgl.WindowsOnscreenWGLDrawable, [java] Realized true, [java] Factory jogamp.opengl.windows.wgl.WindowsWGLDrawableFactory@2200d5, [java] handle 0xffffffff93011a9c, [java] Drawable size 624x362, [java] AWT pos 8/30, size 624x362, [java] visible true, [java] AWTGraphicsConfiguration[AWTGraphicsScreen[AWTGraphicsDevice[type AWT[subType null], connection \Display0, unitID 0, awtDevice D3DGraphicsDevice[screen=0], handle 0x0], idx 0], [java] chosen GLCaps[7 arb: on-scr, rgba 8/8/8/0, opaque, accum-rgba 16/16/16/16, dp/st/ms: 24/0/0, dbl, mono , hw, GLProfile[GL4/GL4]], [java] requested GLCaps[on-scr, rgba 8/8/8/0, opaque, accum-rgba 0/0/0/0, dp/st/ms: 16/0/0, dbl, mono , hw, GLProfile[GL4/GL4]], [java] sun.awt.Win32GraphicsConfig@1632847[dev=D3DGraphicsDevice[screen=0],pixfmt=7], [java] encapsulated WindowsWGLGraphicsConfiguration[DefaultGraphicsScreen[WindowsGraphicsDevice[type Windows, connection decon, unitID 0, handle 0x0], idx 0], pfdID 7, ARB-Choosen true, [java] requested GLCaps[on-scr, rgba 8/8/8/0, opaque, accum-rgba 0/0/0/0, dp/st/ms: 16/0/0, dbl, mono , hw, GLProfile[GL4/GL4]], [java] chosen GLCaps[7 arb: on-scr, rgba 8/8/8/0, opaque, accum-rgba 16/16/16/16, dp/st/ms: 24/0/0, dbl, mono , hw, GLProfile[GL4/GL4]]]]]]]]