aboutsummaryrefslogtreecommitdiffstats
path: root/src/jogl
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2011-04-22 06:09:08 +0200
committerSven Gothel <[email protected]>2011-04-22 06:09:08 +0200
commit25dc5304c7e775b2c70ff72eff8b40541257592e (patch)
tree0b7617b13505a999d8af7a2f5939393bd8e589e5 /src/jogl
parentbf8a54b502f0fcd930e12a8bbda65f9538e8a2f7 (diff)
FBObject: Add validation / API cleanup
Added validation of FB/render buffer creation using glGetError(), due to users trouble of determine the root cause of erroneous application behavior. This change shall help tackling bug: 492 and 495 https://jogamp.org/bugzilla/show_bug.cgi?id=492 https://jogamp.org/bugzilla/show_bug.cgi?id=495
Diffstat (limited to 'src/jogl')
-rw-r--r--src/jogl/classes/com/jogamp/opengl/util/FBObject.java109
1 files changed, 67 insertions, 42 deletions
diff --git a/src/jogl/classes/com/jogamp/opengl/util/FBObject.java b/src/jogl/classes/com/jogamp/opengl/util/FBObject.java
index c853bff15..c57d4b057 100644
--- a/src/jogl/classes/com/jogamp/opengl/util/FBObject.java
+++ b/src/jogl/classes/com/jogamp/opengl/util/FBObject.java
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright (c) 2011 JogAmp Community. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -50,9 +51,12 @@ public class FBObject {
this.stencil_rb = 0;
this.bound = false;
}
-
- public boolean validateStatus(GL gl) {
- /* vStatus = */ getStatus(gl);
+
+ /**
+ * @return true if the FB status is valid, otherwise false
+ * @see #getStatus()
+ */
+ public boolean isStatusValid() {
switch(vStatus) {
case GL.GL_FRAMEBUFFER_COMPLETE:
return true;
@@ -72,48 +76,40 @@ public class FBObject {
}
}
- /** @return {@link GL.GL_FRAMEBUFFER_COMPLETE} if ok, otherwise return GL FBO error state or -1 */
+ /**
+ * @return The FB status. {@link GL.GL_FRAMEBUFFER_COMPLETE} if ok, otherwise return GL FBO error state or -1
+ * @see #validateStatus()
+ */
public int getStatus() {
return vStatus;
}
- public int getStatus(GL gl) {
- if(!gl.glIsFramebuffer(fb)) {
- vStatus = -1;
- } else {
- vStatus = gl.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER);
- }
- return vStatus;
- }
-
public String getStatusString() {
return getStatusString(vStatus);
}
- public static String getStatusString(int fbStatus) {
+ public static final String getStatusString(int fbStatus) {
switch(fbStatus) {
case -1:
return "NOT A FBO";
case GL.GL_FRAMEBUFFER_COMPLETE:
return "OK";
- case GL.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
- return("GL FBO: incomplete,incomplete attachment\n");
case GL.GL_FRAMEBUFFER_UNSUPPORTED:
return("GL FBO: Unsupported framebuffer format");
+ case GL.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
+ return("GL FBO: incomplete, incomplete attachment\n");
case GL.GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
- return("GL FBO: incomplete,missing attachment");
+ return("GL FBO: incomplete, missing attachment");
case GL.GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
- return("GL FBO: incomplete,attached images must have same dimensions");
+ return("GL FBO: incomplete, attached images must have same dimensions");
case GL.GL_FRAMEBUFFER_INCOMPLETE_FORMATS:
- return("GL FBO: incomplete,attached images must have same format");
- /*
+ return("GL FBO: incomplete, attached images must have same format");
case GL2.GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
- return("GL FBO: incomplete,missing draw buffer");
+ return("GL FBO: incomplete, missing draw buffer");
case GL2.GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
- return("GL FBO: incomplete,missing read buffer");
- case GL2.GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT:
- return("GL FBO: incomplete, duplicate attachment");
- */
+ return("GL FBO: incomplete, missing read buffer");
+ case GL2.GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
+ return("GL FBO: incomplete, missing multisample buffer");
case 0:
return("GL FBO: incomplete, implementation fault");
default:
@@ -153,6 +149,19 @@ public class FBObject {
return init(gl, textureInternalFormat, textureDataFormat, textureDataType, magFilter, minFilter, wrapS, wrapT);
}
+ private boolean checkNoError(GL gl, int err, String exceptionMessage) {
+ if(GL.GL_NO_ERROR != err) {
+ if(null != gl) {
+ destroy(gl);
+ }
+ if(null != exceptionMessage) {
+ throw new GLException(exceptionMessage+" GL Error 0x"+Integer.toHexString(err));
+ }
+ return false;
+ }
+ return true;
+ }
+
/**
* Initializes this FBO's instance with it's texture.
*
@@ -175,6 +184,8 @@ public class FBObject {
throw new GLException("FBO already initialized (fb "+fb+", tex "+fbo_tex+")");
}
+ checkNoError(null, gl.glGetError(), "FBObject Init.pre"); // throws GLException if error
+
texInternalFormat=textureInternalFormat;
texDataFormat=textureDataFormat;
texDataType=textureDataType;
@@ -188,24 +199,24 @@ public class FBObject {
throw new GLException("null generated framebuffer");
}
- gl.glGenTextures(1, name, 0);
- fbo_tex = name[0];
- if(fbo_tex==0) {
- throw new GLException("null generated texture");
- }
-
// bind fbo ..
- gl.glBindFramebuffer(GL.GL_FRAMEBUFFER, fb);
+ gl.glBindFramebuffer(GL.GL_FRAMEBUFFER, fb);
+ checkNoError(gl, gl.glGetError(), "FBObject Init.bindFB"); // throws GLException if error
if(!gl.glIsFramebuffer(fb)) {
- destroy(gl);
- System.err.println("not a framebuffer: "+ fb);
- return false;
+ checkNoError(gl, GL.GL_INVALID_VALUE, "FBObject Init.isFB"); // throws GLException
}
bound = true;
+ gl.glGenTextures(1, name, 0);
+ fbo_tex = name[0];
+ if(fbo_tex==0) {
+ throw new GLException("null generated texture");
+ }
gl.glBindTexture(GL.GL_TEXTURE_2D, fbo_tex);
+ checkNoError(gl, gl.glGetError(), "FBObject Init.bindTex"); // throws GLException if error
gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, texInternalFormat, width, height, 0,
texDataFormat, texDataType, null);
+ checkNoError(gl, gl.glGetError(), "FBObject Init.texImage2D"); // throws GLException if error
if( 0 < magFilter ) {
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, magFilter);
}
@@ -224,7 +235,8 @@ public class FBObject {
GL.GL_COLOR_ATTACHMENT0,
GL.GL_TEXTURE_2D, fbo_tex, 0);
- return validateStatus(gl);
+ updateStatus(gl);
+ return isStatusValid();
}
/**
@@ -263,7 +275,8 @@ public class FBObject {
gl.glFramebufferRenderbuffer(GL.GL_FRAMEBUFFER,
GL.GL_DEPTH_ATTACHMENT,
GL.GL_RENDERBUFFER, depth_rb);
- return validateStatus(gl);
+ updateStatus(gl);
+ return isStatusValid();
}
/**
@@ -297,7 +310,8 @@ public class FBObject {
gl.glFramebufferRenderbuffer(GL.GL_FRAMEBUFFER,
GL.GL_STENCIL_ATTACHMENT,
GL.GL_RENDERBUFFER, stencil_rb);
- return validateStatus(gl);
+ updateStatus(gl);
+ return isStatusValid();
}
public void destroy(GL gl) {
@@ -351,12 +365,15 @@ public class FBObject {
}
public void use(GL gl) {
- if(bound) {
- unbind(gl);
- }
- gl.glBindTexture(GL.GL_TEXTURE_2D, fbo_tex); // to use it ..
+ checkBound(false);
+ gl.glBindTexture(GL.GL_TEXTURE_2D, fbo_tex); // use it ..
}
+ public void unuse(GL gl) {
+ checkBound(false);
+ gl.glBindTexture(GL.GL_TEXTURE_2D, 0); // don't use it
+ }
+
public final boolean isBound() { return bound; }
public final int getWidth() { return width; }
public final int getHeight() { return height; }
@@ -367,4 +384,12 @@ public class FBObject {
public final String toString() {
return "FBO[name "+fb+", size "+width+"x"+height+", tex "+fbo_tex+", depth "+depth_rb+", stencil "+stencil_rb+"]";
}
+
+ private void updateStatus(GL gl) {
+ if(!gl.glIsFramebuffer(fb)) {
+ vStatus = -1;
+ } else {
+ vStatus = gl.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER);
+ }
+ }
}