private bool _tryPackedFormat( int packedFormat )
{
int packedRB;
bool failed = false; // flag on GL errors
/// Generate renderbuffer
Gl.glGenRenderbuffersEXT( 1, out packedRB );
/// Bind it to FBO
Gl.glBindRenderbufferEXT( Gl.GL_RENDERBUFFER_EXT, packedRB );
/// Allocate storage for buffer
Gl.glRenderbufferStorageEXT( Gl.GL_RENDERBUFFER_EXT, packedFormat, PROBE_SIZE, PROBE_SIZE );
Gl.glGetError(); // NV hack
/// Attach depth
Gl.glFramebufferRenderbufferEXT( Gl.GL_FRAMEBUFFER_EXT, Gl.GL_DEPTH_ATTACHMENT_EXT, Gl.GL_RENDERBUFFER_EXT, packedRB );
if ( Gl.glGetError() != Gl.GL_NO_ERROR ) // NV hack
failed = true;
/// Attach stencil
Gl.glFramebufferRenderbufferEXT( Gl.GL_FRAMEBUFFER_EXT, Gl.GL_STENCIL_ATTACHMENT_EXT, Gl.GL_RENDERBUFFER_EXT, packedRB );
if ( Gl.glGetError() != Gl.GL_NO_ERROR ) // NV hack
failed = true;
int status = Gl.glCheckFramebufferStatusEXT( Gl.GL_FRAMEBUFFER_EXT );
/// Detach and destroy
Gl.glFramebufferRenderbufferEXT( Gl.GL_FRAMEBUFFER_EXT, Gl.GL_DEPTH_ATTACHMENT_EXT, Gl.GL_RENDERBUFFER_EXT, 0 );
Gl.glFramebufferRenderbufferEXT( Gl.GL_FRAMEBUFFER_EXT, Gl.GL_STENCIL_ATTACHMENT_EXT, Gl.GL_RENDERBUFFER_EXT, 0 );
Gl.glDeleteRenderbuffersEXT( 1, ref packedRB );
return status == Gl.GL_FRAMEBUFFER_COMPLETE_EXT && !failed;
}