aboutsummaryrefslogtreecommitdiffstats
path: root/src/jogl
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2014-09-20 16:06:56 +0200
committerSven Gothel <[email protected]>2014-09-20 16:59:15 +0200
commite99f5060d62aad25fcc37ebf50c8f2a270c9d5df (patch)
tree0552e86445c856ef2b3e0f83a54637e003a51fa6 /src/jogl
parenta6123fe0c71ebe87b2fcef8475cc1fbdd0fe0a36 (diff)
FBObject: Fix depth- and stencil bit count selection for attachRenderbuffer(..);
- Fix depth- and stencil bit count selection for attachRenderbuffer(..) - Add generic values: DEFAULT_BITS, REQUESTED_BITS, CHOSEN_BITS, MAXIMUM_BITS - Refactor depth- and stencil bit-count -> format into own method - Allow depth- and stencil bit-count select a higher bit-count if required (fix) - GLFBODrawable.FBOMODE_USE_DEPTH is deprecated, using GLCapabilities.[get|set]DepthBits(..) - It was an oversight to introduce the bit flag in the first place, since we should have used the capabilities depth bit-count - Graph Test: GLEventListenerButton shall use requested capabilities for FBO drawable.
Diffstat (limited to 'src/jogl')
-rw-r--r--src/jogl/classes/com/jogamp/opengl/FBObject.java130
-rw-r--r--src/jogl/classes/com/jogamp/opengl/util/stereo/StereoClientRenderer.java6
-rw-r--r--src/jogl/classes/javax/media/opengl/GLFBODrawable.java17
-rw-r--r--src/jogl/classes/javax/media/opengl/awt/GLJPanel.java2
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java4
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java2
-rw-r--r--src/jogl/classes/jogamp/opengl/GLFBODrawableImpl.java43
-rw-r--r--src/jogl/classes/jogamp/opengl/GLOffscreenAutoDrawableImpl.java2
8 files changed, 134 insertions, 72 deletions
diff --git a/src/jogl/classes/com/jogamp/opengl/FBObject.java b/src/jogl/classes/com/jogamp/opengl/FBObject.java
index c845b46ad..1e2d296f4 100644
--- a/src/jogl/classes/com/jogamp/opengl/FBObject.java
+++ b/src/jogl/classes/com/jogamp/opengl/FBObject.java
@@ -37,6 +37,7 @@ import javax.media.opengl.GL2GL3;
import javax.media.opengl.GL3;
import javax.media.opengl.GLBase;
import javax.media.opengl.GLCapabilities;
+import javax.media.opengl.GLCapabilitiesImmutable;
import javax.media.opengl.GLContext;
import javax.media.opengl.GLException;
import javax.media.opengl.GLProfile;
@@ -1604,6 +1605,68 @@ public class FBObject {
return colbuf;
}
+ private final int getDepthIFormat(final int reqBits) {
+ if( 32 <= reqBits && depth32Avail ) {
+ return GL.GL_DEPTH_COMPONENT32;
+ } else if( 24 <= reqBits && ( depth24Avail || depth32Avail ) ) {
+ if( depth24Avail ) {
+ return GL.GL_DEPTH_COMPONENT24;
+ } else {
+ return GL.GL_DEPTH_COMPONENT32;
+ }
+ } else {
+ return GL.GL_DEPTH_COMPONENT16;
+ }
+ }
+ private final int getStencilIFormat(final int reqBits) {
+ if( 16 <= reqBits && stencil16Avail ) {
+ return GL2GL3.GL_STENCIL_INDEX16;
+ } else if( 8 <= reqBits && ( stencil08Avail || stencil16Avail ) ) {
+ if( stencil08Avail ) {
+ return GL.GL_STENCIL_INDEX8;
+ } else {
+ return GL2GL3.GL_STENCIL_INDEX16;
+ }
+ } else if( 4 <= reqBits && ( stencil04Avail || stencil08Avail || stencil16Avail ) ) {
+ if( stencil04Avail ) {
+ return GL.GL_STENCIL_INDEX4;
+ } else if( stencil08Avail ) {
+ return GL.GL_STENCIL_INDEX8;
+ } else {
+ return GL2GL3.GL_STENCIL_INDEX16;
+ }
+ } else if( 1 <= reqBits && ( stencil01Avail || stencil04Avail || stencil08Avail || stencil16Avail ) ) {
+ if( stencil01Avail ) {
+ return GL.GL_STENCIL_INDEX1;
+ } else if( stencil04Avail ) {
+ return GL.GL_STENCIL_INDEX4;
+ } else if( stencil08Avail ) {
+ return GL.GL_STENCIL_INDEX8;
+ } else {
+ return GL2GL3.GL_STENCIL_INDEX16;
+ }
+ } else {
+ throw new GLException("stencil buffer n/a");
+ }
+ }
+
+ /** Request default bit count for depth- or stencil buffer (depth 24 bits, stencil 8 bits), value {@value} */
+ public static final int DEFAULT_BITS = 0;
+
+ /**
+ * Request current context drawable's <i>requested</i>
+ * {@link GLCapabilitiesImmutable#getDepthBits() depth-} or {@link GLCapabilitiesImmutable#getStencilBits() stencil-}bits; value {@value} */
+ public static final int REQUESTED_BITS = -1;
+
+ /**
+ * Request current context drawable's <i>chosen</i>
+ * {@link GLCapabilitiesImmutable#getDepthBits() depth-} or {@link GLCapabilitiesImmutable#getStencilBits() stencil-}bits; value {@value} */
+ public static final int CHOSEN_BITS = -2;
+
+ /** Request maximum bit count for depth- or stencil buffer (depth 32 bits, stencil 16 bits), value {@value} */
+ public static final int MAXIMUM_BITS = -3;
+
+
/**
* Attaches one depth, stencil or packed-depth-stencil buffer to this FBO's instance,
* selecting the internalFormat automatically.
@@ -1611,7 +1674,8 @@ public class FBObject {
* Stencil and depth buffer can be attached only once.
* </p>
* <p>
- * In case the desired type or bit-number is not supported, the next available one is chosen.
+ * In case the bit-count is not supported,
+ * the next available one is chosen, i.e. next higher (preferred) or lower bit-count.
* </p>
* <p>
* Use {@link #getDepthAttachment()} and/or {@link #getStencilAttachment()} to retrieve details
@@ -1623,68 +1687,58 @@ public class FBObject {
*
* @param gl
* @param atype either {@link Type#DEPTH}, {@link Type#STENCIL} or {@link Type#DEPTH_STENCIL}
- * @param reqBits desired bits for depth or -1 for default (24 bits)
+ * @param reqBits desired bits for depth or stencil,
+ * may use generic values {@link #DEFAULT_BITS}, {@link #REQUESTED_BITS}, {@link #CHOSEN_BITS} or {@link #MAXIMUM_BITS}.
* @throws GLException in case the renderbuffer couldn't be allocated or one is already attached.
* @throws IllegalArgumentException
* @see #getDepthAttachment()
* @see #getStencilAttachment()
*/
- public final void attachRenderbuffer(final GL gl, final Attachment.Type atype, int reqBits) throws GLException, IllegalArgumentException {
- if( 0 > reqBits ) {
- reqBits = 24;
+ public final void attachRenderbuffer(final GL gl, final Attachment.Type atype, final int reqBits) throws GLException, IllegalArgumentException {
+ final int reqDepth, reqStencil;
+ if( MAXIMUM_BITS > reqBits ) {
+ throw new IllegalArgumentException("reqBits out of range, shall be >= "+MAXIMUM_BITS);
+ } else if( MAXIMUM_BITS == reqBits ) {
+ reqDepth = 32;
+ reqStencil = 16;
+ } else if( CHOSEN_BITS == reqBits ) {
+ final GLCapabilitiesImmutable caps = gl.getContext().getGLDrawable().getChosenGLCapabilities();
+ reqDepth = caps.getDepthBits();
+ reqStencil = caps.getStencilBits();
+ } else if( REQUESTED_BITS == reqBits ) {
+ final GLCapabilitiesImmutable caps = gl.getContext().getGLDrawable().getRequestedGLCapabilities();
+ reqDepth = caps.getDepthBits();
+ reqStencil = caps.getStencilBits();
+ } else if( DEFAULT_BITS == reqBits ) {
+ reqDepth = 24;
+ reqStencil = 8;
+ } else {
+ reqDepth = reqBits;
+ reqStencil = reqBits;
}
final int internalFormat;
int internalStencilFormat = -1;
switch ( atype ) {
case DEPTH:
- if( 32 <= reqBits && depth32Avail ) {
- internalFormat = GL.GL_DEPTH_COMPONENT32;
- } else if( 24 <= reqBits && depth24Avail ) {
- internalFormat = GL.GL_DEPTH_COMPONENT24;
- } else {
- internalFormat = GL.GL_DEPTH_COMPONENT16;
- }
+ internalFormat = getDepthIFormat(reqDepth);
break;
case STENCIL:
- if( 16 <= reqBits && stencil16Avail ) {
- internalFormat = GL2GL3.GL_STENCIL_INDEX16;
- } else if( 8 <= reqBits && stencil08Avail ) {
- internalFormat = GL.GL_STENCIL_INDEX8;
- } else if( 4 <= reqBits && stencil04Avail ) {
- internalFormat = GL.GL_STENCIL_INDEX4;
- } else if( 1 <= reqBits && stencil01Avail ) {
- internalFormat = GL.GL_STENCIL_INDEX1;
- } else {
- throw new GLException("stencil buffer n/a");
- }
+ internalFormat = getStencilIFormat(reqStencil);
break;
case DEPTH_STENCIL:
if( packedDepthStencilAvail ) {
internalFormat = GL.GL_DEPTH24_STENCIL8;
} else {
- if( 24 <= reqBits && depth24Avail ) {
- internalFormat = GL.GL_DEPTH_COMPONENT24;
- } else {
- internalFormat = GL.GL_DEPTH_COMPONENT16;
- }
- if( stencil08Avail ) {
- internalStencilFormat = GL.GL_STENCIL_INDEX8;
- } else if( stencil04Avail ) {
- internalStencilFormat = GL.GL_STENCIL_INDEX4;
- } else if( stencil01Avail ) {
- internalStencilFormat = GL.GL_STENCIL_INDEX1;
- } else {
- throw new GLException("stencil buffer n/a");
- }
+ internalFormat = getDepthIFormat(reqDepth);
+ internalStencilFormat = getStencilIFormat(reqStencil);
}
break;
default:
throw new IllegalArgumentException("only depth/stencil types allowed, was "+atype+", "+this);
}
-
attachRenderbufferImpl(gl, atype, internalFormat);
if(0<=internalStencilFormat) {
diff --git a/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoClientRenderer.java b/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoClientRenderer.java
index 8b00aefb7..f70ebf928 100644
--- a/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoClientRenderer.java
+++ b/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoClientRenderer.java
@@ -95,19 +95,19 @@ public class StereoClientRenderer implements GLEventListener {
if(numSamples>0) {
fbos[i].attachColorbuffer(gl, 0, true); // MSAA requires alpha
- fbos[i].attachRenderbuffer(gl, Type.DEPTH, 24);
+ fbos[i].attachRenderbuffer(gl, Type.DEPTH, FBObject.DEFAULT_BITS);
final FBObject ssink = new FBObject();
{
ssink.init(gl, size.getWidth(), size.getHeight(), 0);
ssink.attachTexture2D(gl, 0, false, magFilter, minFilter, GL.GL_CLAMP_TO_EDGE, GL.GL_CLAMP_TO_EDGE);
- ssink.attachRenderbuffer(gl, Attachment.Type.DEPTH, 24);
+ ssink.attachRenderbuffer(gl, Attachment.Type.DEPTH, FBObject.DEFAULT_BITS);
}
fbos[i].setSamplingSink(ssink);
fbos[i].resetSamplingSink(gl); // validate
fboTexs[i] = fbos[i].getSamplingSink().getTextureAttachment();
} else {
fboTexs[i] = fbos[i].attachTexture2D(gl, 0, false, magFilter, minFilter, GL.GL_CLAMP_TO_EDGE, GL.GL_CLAMP_TO_EDGE);
- fbos[i].attachRenderbuffer(gl, Type.DEPTH, 24);
+ fbos[i].attachRenderbuffer(gl, Type.DEPTH, FBObject.DEFAULT_BITS);
}
fbos[i].unbind(gl);
System.err.println("FBO["+i+"]: "+fbos[i]);
diff --git a/src/jogl/classes/javax/media/opengl/GLFBODrawable.java b/src/jogl/classes/javax/media/opengl/GLFBODrawable.java
index e98e5cbd5..01db60b2e 100644
--- a/src/jogl/classes/javax/media/opengl/GLFBODrawable.java
+++ b/src/jogl/classes/javax/media/opengl/GLFBODrawable.java
@@ -80,11 +80,14 @@ public interface GLFBODrawable extends GLDrawable {
/** FBO Mode Bit: Use a {@link TextureAttachment} for the {@link #getColorbuffer(int) render colorbuffer} ({@link #FBOMODE_DEFAULT default}), see {@link #setFBOMode(int)}. */
public static final int FBOMODE_USE_TEXTURE = 1 << 0;
- /** FBO Mode Bit: Use a depth renderbuffer ({@link #FBOMODE_DEFAULT default}), see {@link #setFBOMode(int)}. */
+ /**
+ * FBO Mode Bit: Use a depth renderbuffer ({@link #FBOMODE_DEFAULT default}), see {@link #setFBOMode(int)}.
+ * @deprecated Use {@link GLCapabilities#setDepthBits(int)}!
+ */
public static final int FBOMODE_USE_DEPTH = 1 << 1;
- /** FBO Default Mode Bit: {@link #FBOMODE_USE_TEXTURE} | {@link #FBOMODE_USE_DEPTH}. */
- public static final int FBOMODE_DEFAULT = FBOMODE_USE_TEXTURE | FBOMODE_USE_DEPTH;
+ /** FBO Default Mode Bit: {@link #FBOMODE_USE_TEXTURE}. */
+ public static final int FBOMODE_DEFAULT = FBOMODE_USE_TEXTURE;
/**
* @return <code>true</code> if initialized, i.e. a {@link GLContext} is bound and made current once, otherwise <code>false</code>.
@@ -101,8 +104,8 @@ public interface GLFBODrawable extends GLDrawable {
* {@link #FBOMODE_USE_TEXTURE} is always added at initialization.
* </p>
*
- * @param modeBits custom FBO mode bits like {@link #FBOMODE_USE_TEXTURE} and {@link #FBOMODE_USE_DEPTH}.
- * @throws IllegalStateException if the underlying FBO is already {@link #isInitialized()}.
+ * @param modeBits custom FBO mode bits like {@link #FBOMODE_USE_TEXTURE}.
+ * @throws IllegalStateException if already initialized, see {@link #isInitialized()}.
*/
void setFBOMode(final int modeBits) throws IllegalStateException;
@@ -155,9 +158,9 @@ public interface GLFBODrawable extends GLDrawable {
* Must be called before {@link #isInitialized() initialization}, otherwise an exception is thrown.
* </p>
* @return the new number of buffers (FBO) used, maybe different than the requested <code>bufferCount</code> (see above)
- * @throws GLException if already initialized, see {@link #isInitialized()}.
+ * @throws IllegalStateException if already initialized, see {@link #isInitialized()}.
*/
- int setNumBuffers(final int bufferCount) throws GLException;
+ int setNumBuffers(final int bufferCount) throws /* IllegalStateException, */ GLException;
/**
* @return the number of buffers (FBO) being used. 1 if not using {@link GLCapabilities#getDoubleBuffered() double buffering},
diff --git a/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java b/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java
index 132367102..5bc4c9a60 100644
--- a/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java
+++ b/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java
@@ -1663,7 +1663,7 @@ public class GLJPanel extends JPanel implements AWTGLAutoDrawable, WindowClosing
final boolean useGLSLFlip_pre = flipVertical && offscreenIsFBO && reqOffscreenCaps.getGLProfile().isGL2ES2() && USE_GLSL_TEXTURE_RASTERIZER;
if( offscreenIsFBO && !useGLSLFlip_pre ) {
// Texture attachment only required for GLSL vertical flip, hence simply use a color-renderbuffer attachment.
- ((GLFBODrawable)offscreenDrawable).setFBOMode(GLFBODrawable.FBOMODE_USE_DEPTH);
+ ((GLFBODrawable)offscreenDrawable).setFBOMode(0);
}
offscreenContext = (GLContextImpl) offscreenDrawable.createContext(shareWith[0]);
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java
index 422714ac5..fbd40ebdd 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java
@@ -459,7 +459,7 @@ public class VBORegion2PMSAAES2 extends GLRegion {
fbo.attachColorbuffer(gl, 0, true);
if( !blendingEnabled ) {
// no depth-buffer w/ blending
- fbo.attachRenderbuffer(gl, Attachment.Type.DEPTH, 24);
+ fbo.attachRenderbuffer(gl, Attachment.Type.DEPTH, FBObject.DEFAULT_BITS);
}
final FBObject ssink = new FBObject();
{
@@ -469,7 +469,7 @@ public class VBORegion2PMSAAES2 extends GLRegion {
ssink.attachTexture2D(gl, 0, true, GL.GL_NEAREST, GL.GL_NEAREST, GL.GL_CLAMP_TO_EDGE, GL.GL_CLAMP_TO_EDGE);
if( !blendingEnabled ) {
// no depth-buffer w/ blending
- ssink.attachRenderbuffer(gl, Attachment.Type.DEPTH, 24);
+ ssink.attachRenderbuffer(gl, Attachment.Type.DEPTH, FBObject.DEFAULT_BITS);
}
}
fbo.setSamplingSink(ssink);
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java
index 5251ade39..8f1de9157 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java
@@ -580,7 +580,7 @@ public class VBORegion2PVBAAES2 extends GLRegion {
texA = fbo.attachTexture2D(gl, 0, true, GL.GL_NEAREST, GL.GL_NEAREST, GL.GL_CLAMP_TO_EDGE, GL.GL_CLAMP_TO_EDGE);
if( !blendingEnabled ) {
// no depth-buffer w/ blending
- fbo.attachRenderbuffer(gl, Attachment.Type.DEPTH, 24);
+ fbo.attachRenderbuffer(gl, Attachment.Type.DEPTH, FBObject.DEFAULT_BITS);
}
if( DEBUG_FBO_1 ) {
System.err.printf("XXX.createFBO: %dx%d%n%s%n", fboWidth, fboHeight, fbo.toString());
diff --git a/src/jogl/classes/jogamp/opengl/GLFBODrawableImpl.java b/src/jogl/classes/jogamp/opengl/GLFBODrawableImpl.java
index 1bdc99a9b..fdd5aa5e9 100644
--- a/src/jogl/classes/jogamp/opengl/GLFBODrawableImpl.java
+++ b/src/jogl/classes/jogamp/opengl/GLFBODrawableImpl.java
@@ -91,7 +91,7 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable {
final GLCapabilitiesImmutable fboCaps, final int textureUnit) {
super(factory, surface, fboCaps, false);
this.initialized = false;
- this.fboModeBits = FBOMODE_USE_TEXTURE | FBOMODE_USE_DEPTH;
+ this.fboModeBits = FBOMODE_USE_TEXTURE;
this.parent = parent;
this.origParentChosenCaps = getChosenGLCapabilities(); // just to avoid null, will be reset at initialize(..)
@@ -102,11 +102,14 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable {
}
private final void setupFBO(final GL gl, final int idx, final int width, final int height, final int samples,
- final boolean useAlpha, final boolean useStencil, final boolean useDepth, final boolean useTexture,
- final boolean realUnbind) {
+ final boolean useAlpha, final int depthBits, final int stencilBits,
+ final boolean useTexture, final boolean realUnbind) {
final FBObject fbo = new FBObject();
fbos[idx] = fbo;
+ final boolean useDepth = depthBits > 0 || 0 != ( FBOMODE_USE_DEPTH & fboModeBits );
+ final boolean useStencil = stencilBits > 0;
+
fbo.init(gl, width, height, samples);
if(fbo.getNumSamples() != samples) {
throw new InternalError("Sample number mismatch: "+samples+", fbos["+idx+"] "+fbo);
@@ -118,12 +121,12 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable {
}
if( useStencil ) {
if( useDepth ) {
- fbo.attachRenderbuffer(gl, Attachment.Type.DEPTH_STENCIL, 24);
+ fbo.attachRenderbuffer(gl, Attachment.Type.DEPTH_STENCIL, depthBits);
} else {
- fbo.attachRenderbuffer(gl, Attachment.Type.STENCIL, 24);
+ fbo.attachRenderbuffer(gl, Attachment.Type.STENCIL, stencilBits);
}
} else if( useDepth ) {
- fbo.attachRenderbuffer(gl, Attachment.Type.DEPTH, 24);
+ fbo.attachRenderbuffer(gl, Attachment.Type.DEPTH, depthBits);
}
if(samples > 0) {
final FBObject ssink = new FBObject();
@@ -136,12 +139,12 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable {
}
if( useStencil ) {
if( useDepth ) {
- ssink.attachRenderbuffer(gl, Attachment.Type.DEPTH_STENCIL, 24);
+ ssink.attachRenderbuffer(gl, Attachment.Type.DEPTH_STENCIL, depthBits);
} else {
- ssink.attachRenderbuffer(gl, Attachment.Type.STENCIL, 24);
+ ssink.attachRenderbuffer(gl, Attachment.Type.STENCIL, stencilBits);
}
} else if( useDepth ) {
- ssink.attachRenderbuffer(gl, Attachment.Type.DEPTH, 24);
+ ssink.attachRenderbuffer(gl, Attachment.Type.DEPTH, depthBits);
}
}
fbo.setSamplingSink(ssink);
@@ -206,14 +209,13 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable {
}
final boolean useTexture = 0 != ( FBOMODE_USE_TEXTURE & fboModeBits );
- final boolean useDepth = 0 != ( FBOMODE_USE_DEPTH & fboModeBits );
- final boolean useStencil = chosenFBOCaps.getStencilBits() > 0;
final boolean useAlpha = chosenFBOCaps.getAlphaBits() > 0;
final int width = getSurfaceWidth();
final int height = getSurfaceHeight();
for(int i=0; i<fbosN; i++) {
- setupFBO(gl, i, width, height, samples, useAlpha, useStencil, useDepth, useTexture, fbosN-1==i);
+ setupFBO(gl, i, width, height, samples, useAlpha,
+ chosenFBOCaps.getDepthBits(), chosenFBOCaps.getStencilBits(), useTexture, fbosN-1==i);
}
fbos[0].formatToGLCapabilities(chosenFBOCaps);
chosenFBOCaps.setDoubleBuffered( chosenFBOCaps.getDoubleBuffered() || samples > 0 );
@@ -239,8 +241,7 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable {
}
private final void reset(final GL gl, final int idx, final int width, final int height, final int samples,
- final boolean useAlpha, final boolean useStencil) {
- final boolean useDepth = 0 != ( FBOMODE_USE_DEPTH & fboModeBits );
+ final boolean useAlpha, final int depthBits, final int stencilBits) {
if( !fboResetQuirk ) {
try {
fbos[idx].reset(gl, width, height, samples);
@@ -268,7 +269,7 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable {
// resetQuirk fallback
fbos[idx].destroy(gl);
final boolean useTexture = 0 != ( FBOMODE_USE_TEXTURE & fboModeBits );
- setupFBO(gl, idx, width, height, samples, useAlpha, useStencil, useDepth, useTexture, true);
+ setupFBO(gl, idx, width, height, samples, useAlpha, depthBits, stencilBits, useTexture, true);
}
private final void reset(final GL gl, int newSamples) throws GLException {
@@ -313,7 +314,7 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable {
final GLCapabilitiesImmutable caps = (GLCapabilitiesImmutable) surface.getGraphicsConfiguration().getChosenCapabilities();
for(int i=0; i<fbos.length; i++) {
if( pendingFBOReset != i ) {
- reset(gl, i, nWidth, nHeight, samples, caps.getAlphaBits()>0, caps.getStencilBits()>0);
+ reset(gl, i, nWidth, nHeight, samples, caps.getAlphaBits()>0, caps.getDepthBits(), caps.getStencilBits());
}
}
final GLCapabilities fboCapsNative = (GLCapabilities) surface.getGraphicsConfiguration().getChosenCapabilities();
@@ -440,7 +441,8 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable {
// Safely reset the previous front FBO - after completing propagating swap
if(0 <= pendingFBOReset) {
final GLCapabilitiesImmutable caps = (GLCapabilitiesImmutable) surface.getGraphicsConfiguration().getChosenCapabilities();
- reset(glc.getGL(), pendingFBOReset, getSurfaceWidth(), getSurfaceHeight(), samples, caps.getAlphaBits()>0, caps.getStencilBits()>0);
+ reset(glc.getGL(), pendingFBOReset, getSurfaceWidth(), getSurfaceHeight(), samples,
+ caps.getAlphaBits()>0, caps.getDepthBits(), caps.getStencilBits());
pendingFBOReset = -1;
}
}
@@ -523,9 +525,12 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable {
}
@Override
- public final int setNumBuffers(final int bufferCount) throws GLException {
+ public final int setNumBuffers(final int bufferCount) throws /* IllegalStateException, */ GLException {
+ if( isInitialized() ) {
+ throw new IllegalStateException("Already initialized: "+this);
+ }
// FIXME: Implement
- return bufferCount;
+ return GLFBODrawableImpl.bufferCount;
}
@Override
diff --git a/src/jogl/classes/jogamp/opengl/GLOffscreenAutoDrawableImpl.java b/src/jogl/classes/jogamp/opengl/GLOffscreenAutoDrawableImpl.java
index 60cc9f0fd..721dc7384 100644
--- a/src/jogl/classes/jogamp/opengl/GLOffscreenAutoDrawableImpl.java
+++ b/src/jogl/classes/jogamp/opengl/GLOffscreenAutoDrawableImpl.java
@@ -102,7 +102,7 @@ public class GLOffscreenAutoDrawableImpl extends GLAutoDrawableDelegate implemen
}
@Override
- public final int setNumBuffers(final int bufferCount) throws GLException {
+ public final int setNumBuffers(final int bufferCount) throws /* IllegalStateException, */ GLException {
return ((GLFBODrawableImpl)drawable).setNumBuffers(bufferCount);
}