Axiom.RenderSystems.OpenGLES.GLESFBOManager.DetectFBOFormats C# (CSharp) Method

DetectFBOFormats() private method

Detect which internal formats are allowed as RTT Also detect what combinations of stencil and depth are allowed with this internal format.
private DetectFBOFormats ( ) : void
return void
		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);
		}