# HG changeset patch # User nkeynes # Date 1296195297 -36000 # Node ID f405d42a9786c263be3ac4b7de94ec4953593c42 # Parent 13406c35849bf188daf16b5eea7a8045c046a368 Perform the sanity checks for FBOs and shaders up front rather than on every use, and remove surplus glGetError() calls --- a/src/drivers/gl_fbo.c Fri Jan 28 15:58:34 2011 +1000 +++ b/src/drivers/gl_fbo.c Fri Jan 28 16:14:57 2011 +1000 @@ -42,6 +42,7 @@ static void gl_fbo_display_render_buffer( render_buffer_t buffer ); static void gl_fbo_load_frame_buffer( frame_buffer_t frame, render_buffer_t buffer ); static void gl_fbo_display_blank( uint32_t colour ); +static gboolean gl_fbo_test_framebuffer( ); static gboolean gl_fbo_read_render_buffer( unsigned char *target, render_buffer_t buffer, int rowstride, int format ); extern uint32_t video_width, video_height; @@ -112,6 +113,7 @@ driver->display_blank = gl_fbo_display_blank; driver->read_render_buffer = gl_fbo_read_render_buffer; + gl_fbo_test_framebuffer(); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); } @@ -214,18 +216,27 @@ glDrawBuffer(ATTACHMENT_POINT(attach)); glReadBuffer(ATTACHMENT_POINT(attach)); + return ATTACHMENT_POINT(attach); +} - GLint status = glGetError(); - if( status != GL_NO_ERROR ) { - ERROR( "GL error setting render target (%x)!", status ); - } - status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); +static gboolean gl_fbo_test_framebuffer( ) +{ + gboolean result = TRUE; + glGetError(); /* Clear error state just in case */ + render_buffer_t buffer = gl_fbo_create_render_buffer( 640, 480, 0 ); + gl_fbo_set_render_target(buffer); + + GLint status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); if( status != GL_FRAMEBUFFER_COMPLETE_EXT ) { ERROR( "Framebuffer failure: %x", status ); - exit(1); + result = FALSE; + } + if( result ) { + result = gl_check_error( "Setting up framebuffer" ); } - return ATTACHMENT_POINT(attach); + gl_fbo_destroy_render_buffer( buffer ); + return result; } static render_buffer_t gl_fbo_create_render_buffer( uint32_t width, uint32_t height, GLuint tex_id ) @@ -294,7 +305,6 @@ static gboolean gl_fbo_set_render_target( render_buffer_t buffer ) { - glGetError(); int fb = gl_fbo_get_framebuffer( buffer->width, buffer->height ); gl_fbo_attach_texture( fb, buffer->buf_id ); /* setup the gl context */ @@ -306,7 +316,6 @@ static void gl_fbo_finish_render( render_buffer_t buffer ) { glFinish(); - glGetError(); gl_fbo_detach_render_buffer(buffer); } @@ -338,12 +347,12 @@ /* Make sure texture attachment is not a current draw/read buffer */ glDrawBuffer( GL_FRONT ); glReadBuffer( GL_FRONT ); + display_driver->swap_buffers(); } static gboolean gl_fbo_read_render_buffer( unsigned char *target, render_buffer_t buffer, int rowstride, int format ) { - glGetError(); int fb = gl_fbo_get_framebuffer( buffer->width, buffer->height ); gl_fbo_attach_texture( fb, buffer->buf_id ); return gl_read_render_buffer( target, buffer, rowstride, format ); --- a/src/pvr2/gl_sl.c Fri Jan 28 15:58:34 2011 +1000 +++ b/src/pvr2/gl_sl.c Fri Jan 28 16:14:57 2011 +1000 @@ -139,7 +139,6 @@ void glsl_use_program(gl_program_t program) { glUseProgramObjectARB(program); - glsl_check_program_error( "Failed to activate shader program", program ); } void glsl_destroy_shader(gl_shader_t shader) @@ -376,6 +375,11 @@ ok = FALSE; break; } else { + /* Check that we can actually use the program (can this really fail?) */ + glsl_use_program(program); + if( !glsl_check_program_error( "Failed to activate shader program", program ) ) { + ok = FALSE; + } program_array[i] = program; } } @@ -396,6 +400,8 @@ glsl_unload_shaders(); return FALSE; } + + glsl_use_program(0); return TRUE; }