Improve GL debug (#626)

This commit is contained in:
Gustl22 2018-12-31 14:31:19 +01:00 committed by Emux
parent 8d34090eb8
commit 4b418b9bb9
No known key found for this signature in database
GPG Key ID: 64ED9980896038C3
8 changed files with 107 additions and 32 deletions

View File

@ -120,7 +120,7 @@ public class CustomRenderer extends LayerRenderer {
// Draw the triangle
gl.drawArrays(GL.TRIANGLE_STRIP, 0, 4);
GLUtils.checkGlError("...");
GLUtils.checkGlError(getClass().getName() + ": render() end");
}
private boolean init() {

View File

@ -175,7 +175,7 @@ public class HexagonRenderTest extends GdxMapApp {
}
}
GLUtils.checkGlError("...");
GLUtils.checkGlError(getClass().getName() + ": render() end");
}
private boolean init() {

View File

@ -106,7 +106,7 @@ public interface GL {
public static final int POLYGON_OFFSET_FILL = 0x8037;
public static final int SAMPLE_ALPHA_TO_COVERAGE = 0x809E;
public static final int SAMPLE_COVERAGE = 0x80A0;
//public static final int NO_ERROR = 0;
public static final int NO_ERROR = 0;
public static final int INVALID_ENUM = 0x0500;
public static final int INVALID_VALUE = 0x0501;
public static final int INVALID_OPERATION = 0x0502;

View File

@ -139,11 +139,11 @@ public abstract class GLShader {
int program = gl.createProgram();
if (program != 0) {
GLUtils.checkGlError("glCreateProgram");
GLUtils.checkGlError(GLShader.class.getName() + ": glCreateProgram");
gl.attachShader(program, vertexShader);
GLUtils.checkGlError("glAttachShader");
GLUtils.checkGlError(GLShader.class.getName() + ": glAttachShader");
gl.attachShader(program, pixelShader);
GLUtils.checkGlError("glAttachShader");
GLUtils.checkGlError(GLShader.class.getName() + ": glAttachShader");
gl.linkProgram(program);
IntBuffer linkStatus = MapRenderer.getIntBuffer(1);
gl.getProgramiv(program, GL.LINK_STATUS, linkStatus);

View File

@ -1,6 +1,7 @@
/*
* Copyright 2013 Hannes Janetzek
* Copyright 2016 devemux86
* Copyright 2016-2019 devemux86
* Copyright 2019 Gustl22
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
@ -27,6 +28,8 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.util.ArrayList;
import java.util.List;
import static org.oscim.backend.GLAdapter.gl;
@ -107,26 +110,102 @@ public class GLUtils {
return textureIds[0];
}
public static void checkGlError(String op) {
//GL = GLAdapter.get();
/**
* Check the status of current framebuffer.
* See: https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glCheckFramebufferStatus.xml
*
* @param op the operation which should be debugged
* @return the status code
*/
public static int checkFramebufferStatus(String op) {
int status = gl.checkFramebufferStatus(GL.FRAMEBUFFER);
if (status != GL.FRAMEBUFFER_COMPLETE)
log.error(op + ": \tglFramebuffer " + getFramebufferStatusString(status) + " (" + status + ")");
return status;
}
int error;
while ((error = gl.getError()) != 0) { // GL20.NO_ERROR) {
log.error(op + ": glError " + error);
/**
* @param status the status code of a framebuffer
* @return the status code as string
*/
public static String getFramebufferStatusString(int status) {
switch (status) {
case GL.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
return "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT";
case GL.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
return "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS";
case GL.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
return "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";
case GL.FRAMEBUFFER_UNSUPPORTED:
return "GL_FRAMEBUFFER_UNSUPPORTED";
case GL.FRAMEBUFFER_COMPLETE:
return "GL_FRAMEBUFFER_COMPLETE";
default:
return String.valueOf(status);
}
}
/**
* Check GL error.
* See: https://www.khronos.org/opengl/wiki/OpenGL_Error
*
* @param op the operation which should be debugged
*/
public static void checkGlError(String op) {
int error; // GL.NO_ERROR
while ((error = gl.getError()) != GL.NO_ERROR) {
log.error(op + ": \tglError " + getGlErrorString(error) + " (" + error + ")");
// throw new RuntimeException(op + ": glError " + error);
}
}
public static boolean checkGlOutOfMemory(String op) {
int error;
boolean oom = false;
while ((error = gl.getError()) != 0) {// GL20.NO_ERROR) {
log.error(op + ": glError " + error);
/**
* Check GL errors.
* See: https://www.khronos.org/opengl/wiki/OpenGL_Error
*
* @param op the operation which should be debugged
* @return the OpenGL error codes
*/
public static List<Integer> checkGlErrors(String op) {
int error; // GL.NO_ERROR
List<Integer> errors = new ArrayList<>();
while ((error = gl.getError()) != GL.NO_ERROR) {
log.error(op + ": \tglError " + getGlErrorString(error) + " (" + error + ")");
errors.add(error);
// throw new RuntimeException(op + ": glError " + error);
if (error == 1285)
oom = true;
}
return oom;
return errors;
}
/**
* @param error the error code of OpenGL
* @return the error code as string
*/
public static String getGlErrorString(int error) {
switch (error) {
case GL.INVALID_ENUM:
return "GL_INVALID_ENUM";
case GL.INVALID_VALUE:
return "GL_INVALID_VALUE";
case GL.INVALID_OPERATION:
return "GL_INVALID_OPERATION";
case 0x0503: // GL.STACK_OVERFLOW
return "GL_STACK_OVERFLOW";
case 0x0504: // GL.STACK_UNDERFLOW
return "GL_STACK_UNDERFLOW";
case GL.OUT_OF_MEMORY:
return "GL_OUT_OF_MEMORY";
case GL.INVALID_FRAMEBUFFER_OPERATION:
return "GL_INVALID_FRAMEBUFFER_OPERATION";
case 0x0507: // GL.CONTEXT_LOST (with OpenGL 4.5)
return "GL_CONTEXT_LOST";
case 0x8031: // GL.TABLE_TOO_LARGE (deprecated in OpenGL 3.0)
return "GL_TABLE_TOO_LARGE";
case GL.NO_ERROR:
return "GL_NO_ERROR";
default:
return String.valueOf(error);
}
}
public static void setColor(int handle, float[] c, float alpha) {

View File

@ -160,7 +160,7 @@ public class MapRenderer {
GLUtils.checkGlError(renderer.getClass().getName());
}
if (GLUtils.checkGlOutOfMemory("finish")) {
if (GLUtils.checkGlErrors(getClass().getName() + ": finish").contains(GL.OUT_OF_MEMORY)) {
BufferObject.checkBufferUsage(true);
// FIXME also throw out some textures etc
}

View File

@ -66,7 +66,7 @@ public class OffscreenRenderer extends LayerRenderer {
gl.genTextures(1, buf);
renderTex = buf.get(0);
GLUtils.checkGlError("0");
GLUtils.checkGlError(getClass().getName() + ": 0");
gl.bindFramebuffer(GL.FRAMEBUFFER, fb);
@ -89,7 +89,7 @@ public class OffscreenRenderer extends LayerRenderer {
GL.COLOR_ATTACHMENT0,
GL.TEXTURE_2D,
renderTex, 0);
GLUtils.checkGlError("1");
GLUtils.checkGlError(getClass().getName() + ": 1");
if (useDepthTexture) {
buf.clear();
@ -128,17 +128,13 @@ public class OffscreenRenderer extends LayerRenderer {
depthRenderbuffer);
}
GLUtils.checkGlError("2");
GLUtils.checkGlError(getClass().getName() + ": 2");
int status = gl.checkFramebufferStatus(GL.FRAMEBUFFER);
int status = GLUtils.checkFramebufferStatus(getClass().getName());
gl.bindFramebuffer(GL.FRAMEBUFFER, 0);
gl.bindTexture(GL.TEXTURE_2D, 0);
if (status != GL.FRAMEBUFFER_COMPLETE) {
log.debug("invalid framebuffer! " + status);
return false;
}
return true;
return status == GL.FRAMEBUFFER_COMPLETE;
}
public void enable(boolean on) {
@ -223,6 +219,6 @@ public class OffscreenRenderer extends LayerRenderer {
GLState.test(false, false);
GLState.blend(true);
gl.drawArrays(GL.TRIANGLE_STRIP, 0, 4);
GLUtils.checkGlError("....");
GLUtils.checkGlError(getClass().getName() + ": render() end");
}
}

View File

@ -305,7 +305,7 @@ public class TextureItem extends Inlist<TextureItem> {
gl.generateMipmap(GL.TEXTURE_2D);
if (dbg)
GLUtils.checkGlError(TextureItem.class.getName());
GLUtils.checkGlError(getClass().getName());
if (mUseBitmapPool)
releaseBitmap(t);