Improve GL debug (#626)
This commit is contained in:
parent
8d34090eb8
commit
4b418b9bb9
@ -120,7 +120,7 @@ public class CustomRenderer extends LayerRenderer {
|
|||||||
// Draw the triangle
|
// Draw the triangle
|
||||||
gl.drawArrays(GL.TRIANGLE_STRIP, 0, 4);
|
gl.drawArrays(GL.TRIANGLE_STRIP, 0, 4);
|
||||||
|
|
||||||
GLUtils.checkGlError("...");
|
GLUtils.checkGlError(getClass().getName() + ": render() end");
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean init() {
|
private boolean init() {
|
||||||
|
@ -175,7 +175,7 @@ public class HexagonRenderTest extends GdxMapApp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GLUtils.checkGlError("...");
|
GLUtils.checkGlError(getClass().getName() + ": render() end");
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean init() {
|
private boolean init() {
|
||||||
|
@ -106,7 +106,7 @@ public interface GL {
|
|||||||
public static final int POLYGON_OFFSET_FILL = 0x8037;
|
public static final int POLYGON_OFFSET_FILL = 0x8037;
|
||||||
public static final int SAMPLE_ALPHA_TO_COVERAGE = 0x809E;
|
public static final int SAMPLE_ALPHA_TO_COVERAGE = 0x809E;
|
||||||
public static final int SAMPLE_COVERAGE = 0x80A0;
|
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_ENUM = 0x0500;
|
||||||
public static final int INVALID_VALUE = 0x0501;
|
public static final int INVALID_VALUE = 0x0501;
|
||||||
public static final int INVALID_OPERATION = 0x0502;
|
public static final int INVALID_OPERATION = 0x0502;
|
||||||
|
@ -139,11 +139,11 @@ public abstract class GLShader {
|
|||||||
|
|
||||||
int program = gl.createProgram();
|
int program = gl.createProgram();
|
||||||
if (program != 0) {
|
if (program != 0) {
|
||||||
GLUtils.checkGlError("glCreateProgram");
|
GLUtils.checkGlError(GLShader.class.getName() + ": glCreateProgram");
|
||||||
gl.attachShader(program, vertexShader);
|
gl.attachShader(program, vertexShader);
|
||||||
GLUtils.checkGlError("glAttachShader");
|
GLUtils.checkGlError(GLShader.class.getName() + ": glAttachShader");
|
||||||
gl.attachShader(program, pixelShader);
|
gl.attachShader(program, pixelShader);
|
||||||
GLUtils.checkGlError("glAttachShader");
|
GLUtils.checkGlError(GLShader.class.getName() + ": glAttachShader");
|
||||||
gl.linkProgram(program);
|
gl.linkProgram(program);
|
||||||
IntBuffer linkStatus = MapRenderer.getIntBuffer(1);
|
IntBuffer linkStatus = MapRenderer.getIntBuffer(1);
|
||||||
gl.getProgramiv(program, GL.LINK_STATUS, linkStatus);
|
gl.getProgramiv(program, GL.LINK_STATUS, linkStatus);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 Hannes Janetzek
|
* 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).
|
* 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.ByteOrder;
|
||||||
import java.nio.FloatBuffer;
|
import java.nio.FloatBuffer;
|
||||||
import java.nio.IntBuffer;
|
import java.nio.IntBuffer;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import static org.oscim.backend.GLAdapter.gl;
|
import static org.oscim.backend.GLAdapter.gl;
|
||||||
|
|
||||||
@ -107,26 +110,102 @@ public class GLUtils {
|
|||||||
return textureIds[0];
|
return textureIds[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @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) {
|
public static void checkGlError(String op) {
|
||||||
//GL = GLAdapter.get();
|
int error; // GL.NO_ERROR
|
||||||
|
while ((error = gl.getError()) != GL.NO_ERROR) {
|
||||||
int error;
|
log.error(op + ": \tglError " + getGlErrorString(error) + " (" + error + ")");
|
||||||
while ((error = gl.getError()) != 0) { // GL20.NO_ERROR) {
|
|
||||||
log.error(op + ": glError " + error);
|
|
||||||
// throw new RuntimeException(op + ": glError " + error);
|
// throw new RuntimeException(op + ": glError " + error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean checkGlOutOfMemory(String op) {
|
/**
|
||||||
int error;
|
* Check GL errors.
|
||||||
boolean oom = false;
|
* See: https://www.khronos.org/opengl/wiki/OpenGL_Error
|
||||||
while ((error = gl.getError()) != 0) {// GL20.NO_ERROR) {
|
*
|
||||||
log.error(op + ": glError " + 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);
|
// 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) {
|
public static void setColor(int handle, float[] c, float alpha) {
|
||||||
|
@ -160,7 +160,7 @@ public class MapRenderer {
|
|||||||
GLUtils.checkGlError(renderer.getClass().getName());
|
GLUtils.checkGlError(renderer.getClass().getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GLUtils.checkGlOutOfMemory("finish")) {
|
if (GLUtils.checkGlErrors(getClass().getName() + ": finish").contains(GL.OUT_OF_MEMORY)) {
|
||||||
BufferObject.checkBufferUsage(true);
|
BufferObject.checkBufferUsage(true);
|
||||||
// FIXME also throw out some textures etc
|
// FIXME also throw out some textures etc
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ public class OffscreenRenderer extends LayerRenderer {
|
|||||||
gl.genTextures(1, buf);
|
gl.genTextures(1, buf);
|
||||||
renderTex = buf.get(0);
|
renderTex = buf.get(0);
|
||||||
|
|
||||||
GLUtils.checkGlError("0");
|
GLUtils.checkGlError(getClass().getName() + ": 0");
|
||||||
|
|
||||||
gl.bindFramebuffer(GL.FRAMEBUFFER, fb);
|
gl.bindFramebuffer(GL.FRAMEBUFFER, fb);
|
||||||
|
|
||||||
@ -89,7 +89,7 @@ public class OffscreenRenderer extends LayerRenderer {
|
|||||||
GL.COLOR_ATTACHMENT0,
|
GL.COLOR_ATTACHMENT0,
|
||||||
GL.TEXTURE_2D,
|
GL.TEXTURE_2D,
|
||||||
renderTex, 0);
|
renderTex, 0);
|
||||||
GLUtils.checkGlError("1");
|
GLUtils.checkGlError(getClass().getName() + ": 1");
|
||||||
|
|
||||||
if (useDepthTexture) {
|
if (useDepthTexture) {
|
||||||
buf.clear();
|
buf.clear();
|
||||||
@ -128,17 +128,13 @@ public class OffscreenRenderer extends LayerRenderer {
|
|||||||
depthRenderbuffer);
|
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.bindFramebuffer(GL.FRAMEBUFFER, 0);
|
||||||
gl.bindTexture(GL.TEXTURE_2D, 0);
|
gl.bindTexture(GL.TEXTURE_2D, 0);
|
||||||
|
|
||||||
if (status != GL.FRAMEBUFFER_COMPLETE) {
|
return status == GL.FRAMEBUFFER_COMPLETE;
|
||||||
log.debug("invalid framebuffer! " + status);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void enable(boolean on) {
|
public void enable(boolean on) {
|
||||||
@ -223,6 +219,6 @@ public class OffscreenRenderer extends LayerRenderer {
|
|||||||
GLState.test(false, false);
|
GLState.test(false, false);
|
||||||
GLState.blend(true);
|
GLState.blend(true);
|
||||||
gl.drawArrays(GL.TRIANGLE_STRIP, 0, 4);
|
gl.drawArrays(GL.TRIANGLE_STRIP, 0, 4);
|
||||||
GLUtils.checkGlError("....");
|
GLUtils.checkGlError(getClass().getName() + ": render() end");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -305,7 +305,7 @@ public class TextureItem extends Inlist<TextureItem> {
|
|||||||
gl.generateMipmap(GL.TEXTURE_2D);
|
gl.generateMipmap(GL.TEXTURE_2D);
|
||||||
|
|
||||||
if (dbg)
|
if (dbg)
|
||||||
GLUtils.checkGlError(TextureItem.class.getName());
|
GLUtils.checkGlError(getClass().getName());
|
||||||
|
|
||||||
if (mUseBitmapPool)
|
if (mUseBitmapPool)
|
||||||
releaseBitmap(t);
|
releaseBitmap(t);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user