diff options
Diffstat (limited to 'src/jogl/classes/jogamp')
4 files changed, 162 insertions, 91 deletions
diff --git a/src/jogl/classes/jogamp/opengl/GLDrawableFactoryImpl.java b/src/jogl/classes/jogamp/opengl/GLDrawableFactoryImpl.java index 2e108d3ce..fad77d76d 100644 --- a/src/jogl/classes/jogamp/opengl/GLDrawableFactoryImpl.java +++ b/src/jogl/classes/jogamp/opengl/GLDrawableFactoryImpl.java @@ -55,6 +55,7 @@ import com.jogamp.nativewindow.OffscreenLayerSurface; import com.jogamp.nativewindow.ProxySurface; import com.jogamp.nativewindow.MutableSurface; import com.jogamp.nativewindow.UpstreamSurfaceHook; +import com.jogamp.opengl.FBObject; import com.jogamp.opengl.GLAutoDrawable; import com.jogamp.opengl.GLCapabilities; import com.jogamp.opengl.GLCapabilitiesChooser; @@ -68,7 +69,6 @@ import com.jogamp.opengl.GLOffscreenAutoDrawable; import com.jogamp.opengl.GLProfile; import com.jogamp.common.ExceptionUtils; -import com.jogamp.common.os.Platform; import com.jogamp.nativewindow.MutableGraphicsConfiguration; import com.jogamp.nativewindow.DelegatedUpstreamSurfaceHookWithSurfaceSize; import com.jogamp.nativewindow.GenericUpstreamSurfacelessHook; @@ -76,9 +76,6 @@ import com.jogamp.nativewindow.UpstreamSurfaceHookMutableSize; import com.jogamp.opengl.GLAutoDrawableDelegate; import com.jogamp.opengl.GLRendererQuirks; -import jogamp.common.os.PlatformPropsImpl; - - /** Extends GLDrawableFactory with a few methods for handling typically software-accelerated offscreen rendering (Device Independent Bitmaps on Windows, pixmaps on X11). Direct access to @@ -264,6 +261,36 @@ public abstract class GLDrawableFactoryImpl extends GLDrawableFactory { */ public abstract GLDynamicLookupHelper getGLDynamicLookupHelper(final int majorVersion, final int contextOptions); + /** + * Extends definition of {@link FBObject.Attachment.StorageDefinition} + * for general onscreen FBO layer storage requirements. + * <p> + * Implementations are allowed to specialize {@link FBObject.Attachment.StorageDefinition} + * for the special use-case of: + * <ul> + * <li>Using an underlying {@link FBObject} for onscreen rendering, hence {@link #createGLDrawable(NativeSurface)}, and</li> + * <li>Using a special <i>color renderbuffer storage</i> instead of the default {@link FBObject} <i>internal offscreen</i> storage.</li> + * </ul> + * </p> + * @see {@link FBObject.Attachment.StorageDefinition} + * @see {@link FBObject.Attachment#setStorageDefinition(FBObject.Attachment.StorageDefinition)} + */ + public static interface OnscreenFBOColorbufferStorageDefinition extends FBObject.Attachment.StorageDefinition { + /** + * Returns true if underlying implementation supports double buffering + */ + public boolean isDoubleBufferSupported(); + /** + * Texture-Unit to be used for the FBO colorbuffer. + * <p> + * If a valid unit is returned, i.e. >= 0, a color texturebuffer is used, otherwise a color renderbuffer. + * </p> + */ + public int getTextureUnit(); + } + + protected OnscreenFBOColorbufferStorageDefinition getOnscreenFBOColorbufStorageDef() { return null; } + //--------------------------------------------------------------------------- // Dispatching GLDrawable construction in respect to the NativeSurface Capabilities // @@ -273,29 +300,41 @@ public abstract class GLDrawableFactoryImpl extends GLDrawableFactory { throw new IllegalArgumentException("Null target"); } final MutableGraphicsConfiguration config = (MutableGraphicsConfiguration) target.getGraphicsConfiguration(); + final GLCapabilitiesImmutable reqCaps = (GLCapabilitiesImmutable) config.getRequestedCapabilities(); final GLCapabilitiesImmutable chosenCaps = (GLCapabilitiesImmutable) config.getChosenCapabilities(); final AbstractGraphicsDevice adevice = config.getScreen().getDevice(); final boolean isFBOAvailable = GLContext.isFBOAvailable(adevice, chosenCaps.getGLProfile()); GLDrawable result = null; adevice.lock(); try { + final OnscreenFBOColorbufferStorageDefinition onscreenFBOColorbufStorageDef = getOnscreenFBOColorbufStorageDef(); final boolean forceOnscreenFBOLayer; - final boolean useFBORendertarget; - if( chosenCaps.isOnscreen() && Platform.OSType.IOS == PlatformPropsImpl.OS_TYPE ) // FIXME: avoid hardcoding? - { + final int fboTextureUnit; + if( reqCaps.isOnscreen() && null != onscreenFBOColorbufStorageDef) { forceOnscreenFBOLayer = true; - useFBORendertarget = true; + fboTextureUnit = onscreenFBOColorbufStorageDef.getTextureUnit(); } else { forceOnscreenFBOLayer = false; - useFBORendertarget = false; + fboTextureUnit = 0; // assume texture unit 0 (default) is used at all } final OffscreenLayerSurface ols = NativeWindowFactory.getOffscreenLayerSurface(target, true); if(null != ols || forceOnscreenFBOLayer ) { - final GLCapabilitiesImmutable chosenCapsMod = GLGraphicsConfigurationUtil.fixOffscreenGLCapabilities(chosenCaps, this, adevice); - - // layered surface -> Offscreen/[FBO|PBuffer] - if( !chosenCapsMod.isFBO() && !chosenCapsMod.isPBuffer() ) { - throw new GLException("Neither FBO nor Pbuffer is available for "+chosenCapsMod+", "+target); + final GLCapabilitiesImmutable chosenCapsMod0 = GLGraphicsConfigurationUtil.fixOffscreenGLCapabilities(chosenCaps, this, adevice); + final GLCapabilitiesImmutable chosenCapsMod; + if( forceOnscreenFBOLayer && !onscreenFBOColorbufStorageDef.isDoubleBufferSupported() ) { + chosenCapsMod = GLGraphicsConfigurationUtil.fixDoubleBufferedGLCapabilities(chosenCapsMod0, false); + } else { + chosenCapsMod = chosenCapsMod0; + } + if( forceOnscreenFBOLayer ) { + if( !chosenCapsMod.isFBO() ) { + throw new GLException("FBO is not available for "+chosenCapsMod+", "+target); + } + } else { + // layered surface -> Offscreen/[FBO|PBuffer] + if( !chosenCapsMod.isFBO() && !chosenCapsMod.isPBuffer() ) { + throw new GLException("Neither FBO nor Pbuffer is available for "+chosenCapsMod+", "+target); + } } config.setChosenCapabilities(chosenCapsMod); if( null != ols ) { @@ -303,10 +342,11 @@ public abstract class GLDrawableFactoryImpl extends GLDrawableFactory { } if(DEBUG) { System.err.println("GLDrawableFactoryImpl.createGLDrawable -> OnscreenDrawable -> Offscreen-Layer"); + System.err.println("requestedCaps: "+reqCaps); System.err.println("chosenCaps: "+chosenCaps); System.err.println("chosenCapsMod: "+chosenCapsMod); System.err.println("OffscreenLayerSurface: **** "+ols); - System.err.println("forceOnscreenFBOLayer: **** "+forceOnscreenFBOLayer+", useFBORendertarget "+useFBORendertarget); + System.err.println("forceOnscreenFBOLayer: **** "+forceOnscreenFBOLayer+", fboTextureUnit "+fboTextureUnit); System.err.println("Target: **** "+target); ExceptionUtils.dumpStack(System.err); } @@ -314,7 +354,11 @@ public abstract class GLDrawableFactoryImpl extends GLDrawableFactory { throw new IllegalArgumentException("Passed NativeSurface must implement SurfaceChangeable for offscreen layered surface: "+target); } if( chosenCapsMod.isFBO() ) { - result = createFBODrawableImpl(target, chosenCapsMod, useFBORendertarget?-1:0); + final GLFBODrawableImpl fboDrawable = (GLFBODrawableImpl) createFBODrawableImpl(target, chosenCapsMod, fboTextureUnit); + if( forceOnscreenFBOLayer ) { + fboDrawable.setColorRenderbufferStorageDef(onscreenFBOColorbufStorageDef); + } + result = fboDrawable; } else { result = createOffscreenDrawableImpl(target); } @@ -523,7 +567,13 @@ public abstract class GLDrawableFactoryImpl extends GLDrawableFactory { } } - /** Creates a platform independent unrealized FBO offscreen GLDrawable */ + /** + * Creates a platform independent unrealized FBO offscreen GLDrawable + * @param dummySurface used for dummy-drawable and as surface for {@link GLFBODrawable} + * @param fboCaps + * @param textureUnit if valid, i.e. >= 0, signals using a color texturebuffer {@link GLFBODrawable#FBOMODE_USE_TEXTURE}, otherwise a color renderbuffer is used. + * @return + */ protected final GLFBODrawable createFBODrawableImpl(final NativeSurface dummySurface, final GLCapabilitiesImmutable fboCaps, final int textureUnit) { final GLDrawableImpl dummyDrawable = createOnscreenDrawableImpl(dummySurface); return new GLFBODrawableImpl(this, dummyDrawable, dummySurface, fboCaps, textureUnit); diff --git a/src/jogl/classes/jogamp/opengl/GLFBODrawableImpl.java b/src/jogl/classes/jogamp/opengl/GLFBODrawableImpl.java index 64cca7bdd..ea226b407 100644 --- a/src/jogl/classes/jogamp/opengl/GLFBODrawableImpl.java +++ b/src/jogl/classes/jogamp/opengl/GLFBODrawableImpl.java @@ -76,6 +76,7 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable { // private DoubleBufferMode doubleBufferMode; // TODO: Add or remove TEXTURE (only) DoubleBufferMode support + private FBObject.Attachment.StorageDefinition colorRenderbufferStorageDef; private SwapBufferContext swapBufferContext; public static interface SwapBufferContext { @@ -87,7 +88,7 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable { * @param parent * @param surface * @param fboCaps the requested FBO capabilities - * @param textureUnit if valid, i.e. >= 0, signals {@link #FBOMODE_USE_TEXTURE}, otherwise a color renderbuffer is assumed + * @param textureUnit if valid, i.e. >= 0, signals using a color texturebuffer {@link GLFBODrawable#FBOMODE_USE_TEXTURE}, otherwise a color renderbuffer is used. */ protected GLFBODrawableImpl(final GLDrawableFactoryImpl factory, final GLDrawableImpl parent, final NativeSurface surface, final GLCapabilitiesImmutable fboCaps, final int textureUnit) { @@ -100,6 +101,7 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable { this.texUnit = textureUnit>=0 ? textureUnit : 0; this.samples = fboCaps.getNumSamples(); this.fboResetQuirk = false; + this.colorRenderbufferStorageDef = null; this.swapBufferContext = null; } @@ -117,7 +119,11 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable { throw new InternalError("Sample number mismatch: "+samples+", fbos["+idx+"] "+fbo); } if(samples > 0 || !useTexture) { - fbo.attachColorbuffer(gl, 0, useAlpha); + final FBObject.ColorAttachment ca = fbo.createColorAttachment(useAlpha); + if( null != colorRenderbufferStorageDef ) { + ca.setStorageDefinition(colorRenderbufferStorageDef); + } + fbo.attachColorbuffer(gl, 0, ca); } else { fbo.attachTexture2D(gl, 0, useAlpha); } @@ -135,7 +141,11 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable { { ssink.init(gl, width, height, 0); if( !useTexture ) { - ssink.attachColorbuffer(gl, 0, useAlpha); + final FBObject.ColorAttachment ca = ssink.createColorAttachment(useAlpha); + if( null != colorRenderbufferStorageDef ) { + ca.setStorageDefinition(colorRenderbufferStorageDef); + } + ssink.attachColorbuffer(gl, 0, ca); } else { ssink.attachTexture2D(gl, 0, useAlpha); } @@ -249,6 +259,24 @@ public class GLFBODrawableImpl extends GLDrawableImpl implements GLFBODrawable { swapBufferContext = sbc; } + /** + * Inject custom {@link FBObject.Attachment.StorageDefinition} specialization for the use-case of: + * <ul> + * <li>Using a special <i>color renderbuffer storage</i> instead of the default {@link FBObject} <i>internal offscreen</i> storage.</li> + * </ul> + * @see {@link FBObject.Attachment.StorageDefinition} + * @see {@link FBObject.Attachment#setStorageDefinition(FBObject.Attachment.StorageDefinition)} + */ + public final void setColorRenderbufferStorageDef(final FBObject.Attachment.StorageDefinition sd) { + colorRenderbufferStorageDef = sd; + if(DEBUG) { + System.err.println("EAGL.FBODrawable: setColorRenderbufferStorageDef"); + } + } + public final boolean hasColorRenderbufferStorageDef(final FBObject.Attachment.StorageDefinition sd) { + return sd == colorRenderbufferStorageDef; + } + private final void reset(final GL gl, final int idx, final int width, final int height, final int samples, final boolean useAlpha, final int depthBits, final int stencilBits) { if( !fboResetQuirk ) { diff --git a/src/jogl/classes/jogamp/opengl/ios/eagl/IOSEAGLContext.java b/src/jogl/classes/jogamp/opengl/ios/eagl/IOSEAGLContext.java index 57c20d465..e3b7a64a7 100644 --- a/src/jogl/classes/jogamp/opengl/ios/eagl/IOSEAGLContext.java +++ b/src/jogl/classes/jogamp/opengl/ios/eagl/IOSEAGLContext.java @@ -34,19 +34,18 @@ import com.jogamp.nativewindow.AbstractGraphicsConfiguration; import com.jogamp.nativewindow.AbstractGraphicsDevice; import com.jogamp.nativewindow.MutableGraphicsConfiguration; import com.jogamp.nativewindow.OffscreenLayerSurface; -import com.jogamp.opengl.FBObject; import com.jogamp.opengl.GL; import com.jogamp.opengl.GLCapabilitiesImmutable; import com.jogamp.opengl.GLContext; import com.jogamp.opengl.GLException; -import com.jogamp.opengl.GLFBODrawable; import com.jogamp.opengl.GLProfile; -import jogamp.nativewindow.ios.IOSUtil; import jogamp.opengl.GLContextImpl; +import jogamp.opengl.GLDrawableFactoryImpl; import jogamp.opengl.GLDrawableImpl; import jogamp.opengl.GLDynamicLookupHelper; import jogamp.opengl.GLFBODrawableImpl; +import jogamp.opengl.GLDrawableFactoryImpl.OnscreenFBOColorbufferStorageDefinition; import jogamp.opengl.GLFBODrawableImpl.SwapBufferContext; import jogamp.opengl.DummyGLExtProcAddressTable; import jogamp.opengl.ios.eagl.IOSEAGLDrawable.GLBackendType; @@ -100,8 +99,6 @@ public class IOSEAGLContext extends GLContextImpl // CGL extension functions. private DummyGLExtProcAddressTable cglExtProcAddressTable; - private int lastWidth, lastHeight; - protected IOSEAGLContext(final GLDrawableImpl drawable, final GLContext shareWith) { super(drawable, shareWith); @@ -194,11 +191,6 @@ public class IOSEAGLContext extends GLContextImpl @Override protected void makeCurrentImpl() throws GLException { - /** FIXME: won't work w/ special drawables (like FBO) - check for CGL mode regressions! - * - if (getOpenGLMode() != ((IOSEAGLDrawable)drawable).getOpenGLMode()) { - setOpenGLMode(((IOSEAGLDrawable)drawable).getOpenGLMode()); - } */ if ( !impl.makeCurrent(contextHandle) ) { throw new GLException("Error making Context current: "+this); } @@ -221,50 +213,48 @@ public class IOSEAGLContext extends GLContextImpl @Override protected void drawableUpdatedNotify() throws GLException { - if( drawable.getChosenGLCapabilities().isOnscreen() ) { - final int w = drawable.getSurfaceWidth(); - final int h = drawable.getSurfaceHeight(); - // final boolean sizeChanged = w != lastWidth || h != lastHeight; - if(drawable instanceof GLFBODrawable) { - final GLFBODrawable fbod = (GLFBODrawable) drawable; - final FBObject.Colorbuffer col = fbod.getColorbuffer(GL.GL_FRONT); // FIXME GL_BACK swap .. - final int renderbuffer = col.getName(); - EAGL.eaglPresentRenderbuffer(contextHandle, renderbuffer); - } - // TODO: Check for resize ... - lastWidth = w; - lastHeight = h; - } + // NOTE to resize: GLFBODrawableImpl.resetSize(GL) called from many + // high level instances in the GLDrawable* space, + // e.g. GLAutoDrawableBase's defaultWindowResizedOp(..) } @Override protected void associateDrawable(final boolean bound) { // context stuff depends on drawable stuff - if(bound) { + final GLFBODrawableImpl fboDrawable; + final boolean taggedOnscreenFBOEAGLLayer; + { final GLDrawableImpl drawable = getDrawableImpl(); - if( drawable instanceof GLFBODrawableImpl ) { - final GLFBODrawableImpl fboDrawable = (GLFBODrawableImpl) drawable; + final GLDrawableFactoryImpl factory = drawable.getFactoryImpl(); + final IOSEAGLDrawableFactory iosFactory = (factory instanceof IOSEAGLDrawableFactory) ? (IOSEAGLDrawableFactory) factory : null; + final OnscreenFBOColorbufferStorageDefinition onscreenFBOColorbufStorageDef = (null != iosFactory) ? iosFactory.getOnscreenFBOColorbufStorageDef() : null; + + fboDrawable = (drawable instanceof GLFBODrawableImpl) ? (GLFBODrawableImpl)drawable : null; + taggedOnscreenFBOEAGLLayer = (null != fboDrawable && null != onscreenFBOColorbufStorageDef) ? + fboDrawable.hasColorRenderbufferStorageDef(onscreenFBOColorbufStorageDef) : false; + } + if( DEBUG ) { + System.err.println(getThreadName() + ": IOSEAGLContext.associateDrawable(bound "+bound+"): taggedOnscreenFBOEAGLLayer "+taggedOnscreenFBOEAGLLayer+ + ", hasFBODrawable "+(null != fboDrawable)+", drawable: "+getDrawableImpl().getClass().getName()); + } + if(bound) { + if( taggedOnscreenFBOEAGLLayer ) { + // Done in GLDrawableFactory.createGDrawable(..) for onscreen drawables: + // fboDrawable.setColorRenderbufferStorageDef(iosFactory.getOnscreenFBOColorbufStorageDef()); fboDrawable.setSwapBufferContext(new SwapBufferContext() { @Override public void swapBuffers(final boolean doubleBuffered) { EAGL.eaglPresentRenderbuffer(contextHandle, GL.GL_RENDERBUFFER); } } ); } - // FIXME: Need better way to inject the IOS EAGL Layer into FBObject - // FIXME: May want to implement optional injection of a BufferStorage SPI? - // FBObject.ColorAttachment.initialize(GL): EAGL.eaglBindDrawableStorageToRenderbuffer(contextHandle, GL.GL_RENDERBUFFER, eaglLayer); - final long eaglLayer = IOSUtil.GetCAEAGLLayer(drawable.getNativeSurface().getSurfaceHandle()); - System.err.println("EAGL: Ctx attach EAGLLayer 0x"+Long.toHexString(eaglLayer)); - attachObject("IOS_EAGL_LAYER", new Long(eaglLayer)); - super.associateDrawable(true); // 1) init drawable stuff (FBO init, ..) impl.associateDrawable(true); // 2) init context stuff } else { impl.associateDrawable(false); // 1) free context stuff super.associateDrawable(false); // 2) free drawable stuff - - EAGL.eaglBindDrawableStorageToRenderbuffer(contextHandle, GL.GL_RENDERBUFFER, 0); - detachObject("IOS_EAGL_LAYER"); + if( taggedOnscreenFBOEAGLLayer ) { + EAGL.eaglBindDrawableStorageToRenderbuffer(contextHandle, GL.GL_RENDERBUFFER, 0); + } } } @@ -361,40 +351,6 @@ public class IOSEAGLContext extends GLContextImpl @Override public boolean isUsingCAEAGLLayer() { return null != backingLayerHost; } - /** Only returns a valid UIView. If !UIView, return null and mark isFBO or isSurfaceless. */ - private long getUIViewHandle(final boolean[] isFBO, final boolean[] isSurfaceless) { - final long uiViewHandle; - if(drawable instanceof GLFBODrawableImpl) { - uiViewHandle = 0; - isFBO[0] = true; - isSurfaceless[0] = false; - if(DEBUG) { - System.err.println("UI viewHandle.1: GLFBODrawableImpl drawable: isFBO "+isFBO[0]+", isSurfaceless "+isSurfaceless[0]+", "+drawable.getClass().getName()+",\n\t"+drawable); - } - } else { - final long drawableHandle = drawable.getHandle(); - final boolean isUIView = IOSUtil.isUIView(drawableHandle); - final boolean isUIWindow = IOSUtil.isUIWindow(drawableHandle); - isFBO[0] = false; - isSurfaceless[0] = false; - - if( isUIView ) { - uiViewHandle = drawableHandle; - } else if( isUIWindow ) { - uiViewHandle = IOSUtil.GetUIView(drawableHandle, true /* only EAGL */); - } else if( isSurfaceless() ) { - isSurfaceless[0] = true; - uiViewHandle = 0; - } else { - throw new GLException("Drawable's handle neither NSView, NSWindow nor PBuffer: drawableHandle "+toHexString(drawableHandle)+", isNSView "+isUIView+", isNSWindow "+isUIWindow+", isFBO "+isFBO[0]+", "+drawable.getClass().getName()+",\n\t"+drawable); - } - if(DEBUG) { - System.err.println("NS viewHandle.2: drawableHandle "+toHexString(drawableHandle)+" -> nsViewHandle "+toHexString(uiViewHandle)+": isNSView "+isUIView+", isNSWindow "+isUIWindow+", isFBO "+isFBO[0]+", isSurfaceless "+isSurfaceless[0]+", "+drawable.getClass().getName()+",\n\t"+drawable); - } - } - return uiViewHandle; - } - @Override public long create(final long share, final int ctp, final int major, final int minor) { long ctx = 0; diff --git a/src/jogl/classes/jogamp/opengl/ios/eagl/IOSEAGLDrawableFactory.java b/src/jogl/classes/jogamp/opengl/ios/eagl/IOSEAGLDrawableFactory.java index 3c3f1edb8..71904d1a6 100644 --- a/src/jogl/classes/jogamp/opengl/ios/eagl/IOSEAGLDrawableFactory.java +++ b/src/jogl/classes/jogamp/opengl/ios/eagl/IOSEAGLDrawableFactory.java @@ -41,6 +41,7 @@ import com.jogamp.nativewindow.NativeSurface; import com.jogamp.nativewindow.ProxySurface; import com.jogamp.nativewindow.UpstreamSurfaceHook; import com.jogamp.nativewindow.ios.IOSGraphicsDevice; +import com.jogamp.opengl.FBObject; import com.jogamp.opengl.GL; import com.jogamp.opengl.GLCapabilities; import com.jogamp.opengl.GLCapabilitiesChooser; @@ -52,6 +53,7 @@ import com.jogamp.opengl.GLProfile; import jogamp.nativewindow.WrappedSurface; import jogamp.nativewindow.ios.IOSDummyUpstreamSurfaceHook; +import jogamp.nativewindow.ios.IOSUtil; import jogamp.opengl.GLContextImpl; import jogamp.opengl.GLDrawableFactoryImpl; import jogamp.opengl.GLDrawableImpl; @@ -62,6 +64,8 @@ import jogamp.opengl.SharedResourceRunner; import com.jogamp.nativewindow.GenericUpstreamSurfacelessHook; import com.jogamp.opengl.GLExtensions; import com.jogamp.opengl.GLRendererQuirks; +import com.jogamp.opengl.FBObject.Attachment; +import com.jogamp.opengl.FBObject.Attachment.StorageDefinition; public class IOSEAGLDrawableFactory extends GLDrawableFactoryImpl { private static final boolean DEBUG_SHAREDCTX = DEBUG || GLContext.DEBUG; @@ -343,6 +347,39 @@ public class IOSEAGLDrawableFactory extends GLDrawableFactoryImpl { } @Override + protected final OnscreenFBOColorbufferStorageDefinition getOnscreenFBOColorbufStorageDef() { return onscreenGLDrawableFBOColorRenderbufferStorageDef; } + private final OnscreenFBOColorbufferStorageDefinition onscreenGLDrawableFBOColorRenderbufferStorageDef = new OnscreenFBOColorbufferStorageDefinition() { + @Override + public final void setStorage(final GL gl, final Attachment a) { + final int samples = ((FBObject.RenderAttachment) a).getSamples(); + if( samples > 0 ) { + gl.glRenderbufferStorageMultisample(GL.GL_RENDERBUFFER, samples, a.format, a.getWidth(), a.getHeight()); + } else { + // gl.glRenderbufferStorage(GL.GL_RENDERBUFFER, a.format, a.getWidth(), a.getHeight()); + final long eaglLayer = IOSUtil.GetCAEAGLLayer(gl.getContext().getGLDrawable().getNativeSurface().getSurfaceHandle()); + EAGL.eaglBindDrawableStorageToRenderbuffer(gl.getContext().getHandle(), GL.GL_RENDERBUFFER, eaglLayer); + if( DEBUG ) { + System.err.println("EAGL.eaglBindDrawableStorageToRenderbuffer: ctx 0x"+Long.toHexString(gl.getContext().getHandle()) + + ", eaglLayer 0x"+Long.toHexString(eaglLayer)); + } + } + } + @Override + public final boolean isDoubleBufferSupported() { + return false; + } + @Override + public final int getTextureUnit() { + return -1; // force using a color renderbuffer + } }; + + /** + * {@inheritDoc} + * <p> + * This IOS <i>onscreen drawable</i> implementation actually is only a dummy implementation + * </p> + */ + @Override protected GLDrawableImpl createOnscreenDrawableImpl(final NativeSurface target) { if (target == null) { throw new IllegalArgumentException("Null target"); |