private void DetectFBOFormats()
{
// Try all formats, and report which ones work as target
int fb = 0, tid = 0;
All target = All.Texture2D;
for ( int x = 0; x < (int)Media.PixelFormat.Count; x++ )
{
_props[ x ] = new FormatProperties();
_props[ x ].IsValid = false;
_props[ x ].Modes = new List<FormatProperties.Mode>();
// Fetch GL format token
All fmt = GLESPixelUtil.GetClosestGLInternalFormat( (Media.PixelFormat)x );
if ( fmt == 0 && x != 0 )
continue;
// No test for compressed formats
if ( PixelUtil.IsCompressed( (Media.PixelFormat)x ) )
continue;
// Create and attach framebuffer
OpenGLOES.GenRenderbuffers( 1, ref fb );
GLESConfig.GlCheckError( this );
OpenGLOES.BindFramebuffer( All.FramebufferOes, fb );
GLESConfig.GlCheckError( this );
if ( fmt != 0 )
{
// Create and attach texture
OpenGL.GenTextures( 1, ref tid );
GLESConfig.GlCheckError( this );
OpenGL.BindTexture( target, tid );
GLESConfig.GlCheckError( this );
// Set some default parameters
OpenGL.TexParameterx( target, All.TextureMinFilter, (int)All.LinearMipmapNearest );
GLESConfig.GlCheckError( this );
OpenGL.TexParameterx( target, All.TextureMagFilter, (int)All.Nearest );
GLESConfig.GlCheckError( this );
OpenGL.TexParameterx( target, All.TextureWrapS, (int)All.ClampToEdge );
GLESConfig.GlCheckError( this );
OpenGL.TexParameterx( target, All.TextureWrapT, (int)All.ClampToEdge );
GLESConfig.GlCheckError( this );
OpenGL.TexImage2D( target, 0, (int)fmt, ProbeSize, ProbeSize, 0, fmt, All.UnsignedByte, IntPtr.Zero );
GLESConfig.GlCheckError( this );
OpenGLOES.FramebufferTexture2D( All.FramebufferOes, All.ColorAttachment0Oes,
target, tid, 0 );
GLESConfig.GlCheckError( this );
}
// Check status
All status = OpenGLOES.CheckFramebufferStatus( All.FramebufferOes );
GLESConfig.GlCheckError( this );
// Ignore status in case of fmt==GL_NONE, because no implementation will accept
// a buffer without *any* attachment. Buffers with only stencil and depth attachment
// might still be supported, so we must continue probing.
if ( fmt == 0 || status == All.FramebufferCompleteOes )
{
_props[ x ].IsValid = true;
StringBuilder str = new StringBuilder();
str.Append( "FBO " + PixelUtil.GetFormatName( (Media.PixelFormat)x ) +
" depth/stencil support: " );
// For each depth/stencil formats
for ( int depth = 0; depth < DepthFormatCount; ++depth )
{
if ( DepthFormats[ depth ] != All.Depth24Stencil8Oes )
{
// General depth/stencil combination
for ( int stencil = 0; stencil < StencilFormatCount; ++stencil )
{
if ( TryFormat( DepthFormats[ depth ], StencilFormats[ stencil ] ) )
{
/// Add mode to allowed modes
str.Append( "D" + DepthBits[ depth ] + "S" + StencilBits[ stencil ] + " " );
FormatProperties.Mode mode = new FormatProperties.Mode();
mode.Depth = depth;
mode.Stencil = stencil;
_props[ x ].Modes.Add( mode );
}
}//end for stencil
}//end if
else
{
// Packed depth/stencil format
if ( TryPacketFormat( DepthFormats[ depth ] ) )
{
/// Add mode to allowed modes
str.Append( "Packed-D" + DepthBits[ depth ] + "S8" + " " );
FormatProperties.Mode mode = new FormatProperties.Mode();
mode.Depth = depth;
mode.Stencil = 0;//unused
_props[ x ].Modes.Add( mode );
}
}
}//end for depth
LogManager.Instance.Write( str.ToString() );
}//end if
// Delete texture and framebuffer
#if AXIOM_PLATFORM_IPHONE
// The screen buffer is 1 on iPhone
OpenGLOES.BindFramebuffer(All.FramebufferOes, 1);
#else
OpenGLOES.BindFramebuffer( All.FramebufferOes, 0 );
#endif
GLESConfig.GlCheckError( this );
OpenGLOES.DeleteFramebuffers( 1, ref fb );
GLESConfig.GlCheckError( this );
if ( fmt != 0 )
OpenGL.DeleteTextures( 1, ref tid );
}//end for pixelformat count
string fmtstring = string.Empty;
for ( int x = 0; x < (int)Media.PixelFormat.Count; x++ )
{
if ( _props[ x ].IsValid )
{
fmtstring += PixelUtil.GetFormatName( (Media.PixelFormat)x );
}
}
LogManager.Instance.Write("[GL] : Valid FBO targets " + fmtstring);
}