Skip to content

RenderException in loadExtensions #1243

@MeFisto94

Description

@MeFisto94

Loading Extensions doesn't seem to work on GL3+ (at least in core profile, as the compat profile bypasses this problem).

Note that for this to work you need AppSetttings#set("GraphicsDebug", true). Then:

com.jme3.renderer.RendererException: An OpenGL error occurred - Invalid enum argument (Error Code: 1280)
    at com.jme3.renderer.opengl.GLDebug.checkError(GLDebug.java:46)
    at com.jme3.renderer.opengl.GLDebugES.glGetString(GLDebugES.java:287)
    at com.jme3.renderer.opengl.GLRenderer.loadExtensions(GLRenderer.java:145)
    at com.jme3.renderer.opengl.GLRenderer.loadCapabilitiesCommon(GLRenderer.java:294)
    at com.jme3.renderer.opengl.GLRenderer.loadCapabilities(GLRenderer.java:583)
    at com.jme3.renderer.opengl.GLRenderer.initialize(GLRenderer.java:599)
    at com.jme3.system.lwjgl.LwjglContext.initContextFirstTime(LwjglContext.java:284)
    at com.jme3.system.lwjgl.LwjglContext.internalCreate(LwjglContext.java:424)
    at com.jme3.system.lwjgl.LwjglAbstractDisplay.initInThread(LwjglAbstractDisplay.java:117)
    at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:211)
    at java.lang.Thread.run(Thread.java:748)

if (gl2 != null && !(gl instanceof GLES_30)) {
loadCapabilitiesGL2();
} else {
loadCapabilitiesES();
}

This is the problem:
We need a much better way to differentiate the OpenGL Version, because

if (caps.contains(Caps.OpenGL30)) {
// If OpenGL3+ is available, use the non-deprecated way
// of getting supported extensions.
gl3.glGetInteger(GL3.GL_NUM_EXTENSIONS, intBuf16);
int extensionCount = intBuf16.get(0);
for (int i = 0; i < extensionCount; i++) {
String extension = gl3.glGetString(GL.GL_EXTENSIONS, i);
extensionSet.add(extension);
}
} else {
extensionSet.addAll(Arrays.asList(gl.glGetString(GL.GL_EXTENSIONS).split(" ")));
relies on that.

I am not 100% sure, that Caps.OpenGL30 is not set because of that, but according to the stack trace it really seems to me, that here, openGL ES is falsely detected and thus OpenGL30 is not present. This means we use the OpenGL 1 way of querying for extensions, which doesn't work in the Core Profile.

I think this issue has a much greater impact on everything, as every code trying to detect OpenGL30 or any version for that matter, would have failed before(?) when in core profile.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions