summaryrefslogtreecommitdiffstats
path: root/src/jogl/classes/jogamp
diff options
context:
space:
mode:
Diffstat (limited to 'src/jogl/classes/jogamp')
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java7
-rw-r--r--src/jogl/classes/jogamp/opengl/GLFBODrawableImpl.java87
-rw-r--r--src/jogl/classes/jogamp/opengl/GLOffscreenAutoDrawableImpl.java15
-rw-r--r--src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLContext.java4
4 files changed, 86 insertions, 27 deletions
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java
index fa81e2a3f..ca50b5d2d 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java
@@ -427,7 +427,7 @@ public class VBORegion2PMSAAES2 extends GLRegion {
gl.glActiveTexture(GL.GL_TEXTURE0 + gcu_FboTexUnit.intValue());
- fbo.use(gl, fbo.getSamplingSink());
+ fbo.use(gl, fbo.getSamplingSink().getTextureAttachment());
gca_FboVerticesAttr.enableBuffer(gl, true);
gca_FboTexCoordsAttr.enableBuffer(gl, true);
indicesFbo.bindBuffer(gl, true); // keeps VBO binding
@@ -457,7 +457,10 @@ public class VBORegion2PMSAAES2 extends GLRegion {
fbo.reset(gl, fboWidth, fboHeight, sampleCount[0], false);
sampleCount[0] = fbo.getNumSamples();
fbo.attachColorbuffer(gl, 0, true);
- fbo.attachRenderbuffer(gl, Attachment.Type.DEPTH, 24);
+ if( !blendingEnabled ) {
+ // no depth-buffer w/ blending
+ fbo.attachRenderbuffer(gl, Attachment.Type.DEPTH, 24);
+ }
final FBObject ssink = new FBObject();
{
ssink.reset(gl, fboWidth, fboHeight);
diff --git a/src/jogl/classes/jogamp/opengl/GLFBODrawableImpl.java b/src/jogl/classes/jogamp/opengl/GLFBODrawableImpl.java
index 6046527d1..2d0f8f70b 100644
--- a/src/jogl/classes/jogamp/opengl/GLFBODrawableImpl.java
+++ b/src/jogl/classes/jogamp/opengl/GLFBODrawableImpl.java
@@ -51,6 +51,7 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable {
private GLCapabilitiesImmutable origParentChosenCaps;
private boolean initialized;
+ private int fboModeBits;
private int texUnit;
private int samples;
private boolean fboResetQuirk;
@@ -89,6 +90,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.parent = parent;
this.origParentChosenCaps = getChosenGLCapabilities(); // just to avoid null, will be reset at initialize(..)
@@ -138,25 +140,56 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable {
fboIBack = 0; // head
fboIFront = fbos.length - 1; // tail
+ 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++) {
fbos[i] = new FBObject();
- fbos[i].reset(gl, getSurfaceWidth(), getSurfaceHeight(), samples, false);
+ fbos[i].reset(gl, width, height, samples, false);
if(fbos[i].getNumSamples() != samples) {
throw new InternalError("Sample number mismatch: "+samples+", fbos["+i+"] "+fbos[i]);
}
- if(samples > 0) {
- fbos[i].attachColorbuffer(gl, 0, chosenFBOCaps.getAlphaBits()>0);
+ if(samples > 0 || !useTexture) {
+ fbos[i].attachColorbuffer(gl, 0, useAlpha);
} else {
- fbos[i].attachTexture2D(gl, 0, chosenFBOCaps.getAlphaBits()>0);
+ fbos[i].attachTexture2D(gl, 0, useAlpha);
}
- if( chosenFBOCaps.getStencilBits() > 0 ) {
- fbos[i].attachRenderbuffer(gl, Attachment.Type.DEPTH_STENCIL, 24);
- } else {
+ if( useStencil ) {
+ if( useDepth ) {
+ fbos[i].attachRenderbuffer(gl, Attachment.Type.DEPTH_STENCIL, 24);
+ } else {
+ fbos[i].attachRenderbuffer(gl, Attachment.Type.STENCIL, 24);
+ }
+ } else if( useDepth ) {
fbos[i].attachRenderbuffer(gl, Attachment.Type.DEPTH, 24);
}
+ if(samples > 0) {
+ final FBObject ssink = new FBObject();
+ {
+ ssink.reset(gl, width, height);
+ if( !useTexture ) {
+ ssink.attachColorbuffer(gl, 0, useAlpha);
+ } else {
+ ssink.attachTexture2D(gl, 0, useAlpha);
+ }
+ if( useStencil ) {
+ if( useDepth ) {
+ ssink.attachRenderbuffer(gl, Attachment.Type.DEPTH_STENCIL, 24);
+ } else {
+ ssink.attachRenderbuffer(gl, Attachment.Type.STENCIL, 24);
+ }
+ } else if( useDepth ) {
+ ssink.attachRenderbuffer(gl, Attachment.Type.DEPTH, 24);
+ }
+ }
+ fbos[i].setSamplingSink(ssink);
+ fbos[i].resetSamplingSink(gl); // validate
+ }
}
- fbos[fboIFront].resetSamplingSink(gl);
-
fbos[0].formatToGLCapabilities(chosenFBOCaps);
chosenFBOCaps.setDoubleBuffered( chosenFBOCaps.getDoubleBuffered() || samples > 0 );
} else {
@@ -414,17 +447,16 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable {
fboIBack = ( fboIBack + 1 ) % fbos.length;
final Colorbuffer colorbuffer = samples > 0 ? fbos[fboIFront].getSamplingSink() : fbos[fboIFront].getColorbuffer(0);
+ if(null == colorbuffer) {
+ throw new GLException("Front colorbuffer is null: samples "+samples+", "+this);
+ }
final TextureAttachment texAttachment;
- if(colorbuffer instanceof TextureAttachment) {
- texAttachment = (TextureAttachment) colorbuffer;
+ if( colorbuffer.isTextureAttachment() ) {
+ texAttachment = colorbuffer.getTextureAttachment();
+ gl.glActiveTexture(GL.GL_TEXTURE0 + texUnit);
} else {
- if(null == colorbuffer) {
- throw new GLException("Front colorbuffer is null: samples "+samples+", "+this);
- } else {
- throw new GLException("Front colorbuffer is not a texture: "+colorbuffer.getClass().getName()+": samples "+samples+", "+colorbuffer+", "+this);
- }
+ texAttachment = null;
}
- gl.glActiveTexture(GL.GL_TEXTURE0 + texUnit);
fbos[fboIFront].use(gl, texAttachment);
/* Included in above use command:
@@ -447,6 +479,19 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable {
}
@Override
+ public final void setFBOMode(final int modeBits) throws IllegalStateException {
+ if( isInitialized() ) {
+ throw new IllegalStateException("Already initialized: "+this);
+ }
+ this.fboModeBits = modeBits;
+ }
+
+ @Override
+ public final int getFBOMode() {
+ return fboModeBits;
+ }
+
+ @Override
public final void resetSize(final GL gl) throws GLException {
reset(gl, samples);
}
@@ -519,24 +564,24 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable {
}
@Override
- public final TextureAttachment getTextureBuffer(final int bufferName) throws IllegalArgumentException {
+ public final Colorbuffer getColorbuffer(final int bufferName) throws IllegalArgumentException {
if(!initialized) {
return null;
}
- final TextureAttachment res;
+ final Colorbuffer res;
switch(bufferName) {
case GL.GL_FRONT:
if( samples > 0 ) {
res = fbos[0].getSamplingSink();
} else {
- res = (TextureAttachment) fbos[fboIFront].getColorbuffer(0);
+ res = fbos[fboIFront].getColorbuffer(0);
}
break;
case GL.GL_BACK:
if( samples > 0 ) {
throw new IllegalArgumentException("Cannot access GL_BACK buffer of MSAA FBO: "+this);
} else {
- res = (TextureAttachment) fbos[fboIBack].getColorbuffer(0);
+ res = fbos[fboIBack].getColorbuffer(0);
}
break;
default:
diff --git a/src/jogl/classes/jogamp/opengl/GLOffscreenAutoDrawableImpl.java b/src/jogl/classes/jogamp/opengl/GLOffscreenAutoDrawableImpl.java
index 95c4ceb98..60cc9f0fd 100644
--- a/src/jogl/classes/jogamp/opengl/GLOffscreenAutoDrawableImpl.java
+++ b/src/jogl/classes/jogamp/opengl/GLOffscreenAutoDrawableImpl.java
@@ -128,13 +128,24 @@ public class GLOffscreenAutoDrawableImpl extends GLAutoDrawableDelegate implemen
}
@Override
- public final FBObject.TextureAttachment getTextureBuffer(final int bufferName) {
- return ((GLFBODrawableImpl)drawable).getTextureBuffer(bufferName);
+ public final FBObject.Colorbuffer getColorbuffer(final int bufferName) {
+ return ((GLFBODrawableImpl)drawable).getColorbuffer(bufferName);
}
@Override
public void resetSize(final GL gl) throws GLException {
((GLFBODrawableImpl)drawable).resetSize(gl);
}
+
+ @Override
+ public final void setFBOMode(final int modeBits) throws IllegalStateException {
+ ((GLFBODrawableImpl)drawable).setFBOMode(modeBits);
+
+ }
+
+ @Override
+ public final int getFBOMode() {
+ return ((GLFBODrawableImpl)drawable).getFBOMode();
+ }
}
}
diff --git a/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLContext.java b/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLContext.java
index dbca7c2e8..7066a6db5 100644
--- a/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLContext.java
+++ b/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLContext.java
@@ -828,7 +828,7 @@ public class MacOSXCGLContext extends GLContextImpl
final long drawableHandle = drawable.getHandle();
if(drawable instanceof GLFBODrawableImpl) {
final GLFBODrawableImpl fbod = (GLFBODrawableImpl)drawable;
- texID = fbod.getTextureBuffer(GL.GL_FRONT).getName();
+ texID = fbod.getColorbuffer(GL.GL_FRONT).getName();
pbufferHandle = 0;
fbod.setSwapBufferContext(new GLFBODrawableImpl.SwapBufferContext() {
@Override
@@ -1043,7 +1043,7 @@ public class MacOSXCGLContext extends GLContextImpl
final boolean valid;
final boolean isFBO = drawable instanceof GLFBODrawableImpl;
if( isFBO ){
- texID = ((GLFBODrawableImpl)drawable).getTextureBuffer(GL.GL_FRONT).getName();
+ texID = ((GLFBODrawableImpl)drawable).getColorbuffer(GL.GL_FRONT).getName();
valid = 0 != texID;
} else {
texID = 0;