--- a/src/pvr2/glrender.c Sat Jun 14 11:54:15 2008 +0000 +++ b/src/pvr2/glrender.c Wed Aug 20 11:25:46 2008 +0000 @@ -25,25 +25,25 @@ #include "pvr2/glutil.h" int pvr2_poly_depthmode[8] = { GL_NEVER, GL_LESS, GL_EQUAL, GL_LEQUAL, - GL_GREATER, GL_NOTEQUAL, GL_GEQUAL, - GL_ALWAYS }; + GL_GREATER, GL_NOTEQUAL, GL_GEQUAL, + GL_ALWAYS }; int pvr2_poly_srcblend[8] = { - GL_ZERO, GL_ONE, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, - GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, - GL_ONE_MINUS_DST_ALPHA }; + GL_ZERO, GL_ONE, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, + GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, + GL_ONE_MINUS_DST_ALPHA }; int pvr2_poly_dstblend[8] = { - GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, - GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, - GL_ONE_MINUS_DST_ALPHA }; + GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, + GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, + GL_ONE_MINUS_DST_ALPHA }; int pvr2_poly_texblend[4] = { - GL_REPLACE, - GL_MODULATE, - GL_DECAL, - GL_MODULATE + GL_REPLACE, + GL_MODULATE, + GL_DECAL, + GL_MODULATE }; int pvr2_render_colour_format[8] = { - COLFMT_BGRA1555, COLFMT_RGB565, COLFMT_BGRA4444, COLFMT_BGRA1555, - COLFMT_BGR888, COLFMT_BGRA8888, COLFMT_BGRA8888, COLFMT_BGRA4444 }; + COLFMT_BGRA1555, COLFMT_RGB565, COLFMT_BGRA4444, COLFMT_BGRA1555, + COLFMT_BGR888, COLFMT_BGRA8888, COLFMT_BGRA8888, COLFMT_BGRA4444 }; /** @@ -63,20 +63,20 @@ { int i; for( i=0; i < pvr2_scene.poly_count; i++ ) { - struct polygon_struct *poly = &pvr2_scene.poly_array[i]; - if( POLY1_TEXTURED(poly->context[0]) ) { - poly->tex_id = texcache_get_texture( poly->context[2], - POLY2_TEX_WIDTH(poly->context[1]), - POLY2_TEX_HEIGHT(poly->context[1]) ); - if( poly->mod_vertex_index != -1 ) { - poly->mod_tex_id = texcache_get_texture( poly->context[4], - POLY2_TEX_WIDTH(poly->context[3]), - POLY2_TEX_HEIGHT(poly->context[3]) ); - } - } else { - poly->tex_id = -1; - poly->mod_tex_id = -1; - } + struct polygon_struct *poly = &pvr2_scene.poly_array[i]; + if( POLY1_TEXTURED(poly->context[0]) ) { + poly->tex_id = texcache_get_texture( poly->context[2], + POLY2_TEX_WIDTH(poly->context[1]), + POLY2_TEX_HEIGHT(poly->context[1]) ); + if( poly->mod_vertex_index != -1 ) { + poly->mod_tex_id = texcache_get_texture( poly->context[4], + POLY2_TEX_WIDTH(poly->context[3]), + POLY2_TEX_HEIGHT(poly->context[3]) ); + } + } else { + poly->tex_id = -1; + poly->mod_tex_id = -1; + } } } @@ -89,11 +89,11 @@ { if( glsl_is_supported() ) { - if( !glsl_load_shaders( glsl_vertex_shader_src, NULL ) ) { + if( !glsl_load_shaders( glsl_vertex_shader_src, NULL ) ) { WARN( "Unable to load GL shaders" ); } } - + texcache_gl_init(); // Allocate texture IDs glCullFace( GL_BACK ); glEnable( GL_BLEND ); @@ -101,7 +101,7 @@ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - + #ifdef HAVE_OPENGL_CLAMP_COLOR if( isGLExtensionSupported("GL_ARB_color_buffer_float") ) { glClampColorARB(GL_CLAMP_VERTEX_COLOR_ARB, GL_FALSE ); @@ -129,57 +129,57 @@ { uint32_t poly1 = context[0], poly2, texture; if( render_mode == RENDER_FULLMOD ) { - poly2 = context[3]; - texture = context[4]; + poly2 = context[3]; + texture = context[4]; } else { - poly2 = context[1]; - texture = context[2]; + poly2 = context[1]; + texture = context[2]; } - + glDepthFunc( POLY1_DEPTH_MODE(poly1) ); glDepthMask( POLY1_DEPTH_WRITE(poly1) ? GL_TRUE : GL_FALSE ); - + switch( POLY1_CULL_MODE(poly1) ) { case CULL_NONE: case CULL_SMALL: - glDisable( GL_CULL_FACE ); - break; + glDisable( GL_CULL_FACE ); + break; case CULL_CCW: - glEnable( GL_CULL_FACE ); - glFrontFace( GL_CW ); - break; + glEnable( GL_CULL_FACE ); + glFrontFace( GL_CW ); + break; case CULL_CW: - glEnable( GL_CULL_FACE ); - glFrontFace( GL_CCW ); - break; + glEnable( GL_CULL_FACE ); + glFrontFace( GL_CCW ); + break; } if( POLY1_SPECULAR(poly1) ) { - glEnable(GL_COLOR_SUM); + glEnable(GL_COLOR_SUM); } else { - glDisable(GL_COLOR_SUM); + glDisable(GL_COLOR_SUM); } if( POLY1_TEXTURED(poly1) ) { - glEnable(GL_TEXTURE_2D); - glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, pvr2_poly_texblend[POLY2_TEX_BLEND(poly2)] ); - if( POLY2_TEX_CLAMP_U(poly2) ) { - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP ); - } else if( POLY2_TEX_MIRROR_U(poly2) ) { - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT_ARB ); - } else { - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); - } - if( POLY2_TEX_CLAMP_V(poly2) ) { - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP ); - } else if( POLY2_TEX_MIRROR_V(poly2) ) { - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT_ARB ); - } else { - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); - } + glEnable(GL_TEXTURE_2D); + glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, pvr2_poly_texblend[POLY2_TEX_BLEND(poly2)] ); + if( POLY2_TEX_CLAMP_U(poly2) ) { + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP ); + } else if( POLY2_TEX_MIRROR_U(poly2) ) { + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT_ARB ); + } else { + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); + } + if( POLY2_TEX_CLAMP_V(poly2) ) { + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP ); + } else if( POLY2_TEX_MIRROR_V(poly2) ) { + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT_ARB ); + } else { + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); + } } else { - glDisable( GL_TEXTURE_2D ); + glDisable( GL_TEXTURE_2D ); } glShadeModel( POLY1_SHADE_MODEL(poly1) ); @@ -189,7 +189,7 @@ glBlendFunc( srcblend, destblend ); if( POLY2_SRC_BLEND_TARGET(poly2) || POLY2_DEST_BLEND_TARGET(poly2) ) { - ERROR( "Accumulation buffer not supported" ); + ERROR( "Accumulation buffer not supported" ); } } @@ -198,7 +198,7 @@ static void gl_render_poly( struct polygon_struct *poly ) { if( poly->tex_id != -1 ) { - glBindTexture(GL_TEXTURE_2D, poly->tex_id); + glBindTexture(GL_TEXTURE_2D, poly->tex_id); } render_set_context( poly->context, RENDER_NORMAL ); glDrawArrays(GL_TRIANGLE_STRIP, poly->vertex_index, poly->vertex_count ); @@ -228,29 +228,29 @@ struct polygon_struct *poly; while(1) { - uint32_t entry = *tile_list++; - switch( entry >> 28 ) { - case 0x0F: - return; // End-of-list - case 0x0E: - tile_list = (uint32_t *)(video_base + (entry&0x007FFFFF)); - break; - case 0x08: case 0x09: case 0x0A: case 0x0B: - strip_count = ((entry >> 25) & 0x0F)+1; - poly = pvr2_scene.buf_to_poly_map[entry&0x000FFFFF]; - while( strip_count > 0 ) { - assert( poly != NULL ); - gl_render_poly( poly ); - poly = poly->next; - strip_count--; - } - break; - default: - if( entry & 0x7E000000 ) { - poly = pvr2_scene.buf_to_poly_map[entry&0x000FFFFF]; - gl_render_poly( poly ); - } - } + uint32_t entry = *tile_list++; + switch( entry >> 28 ) { + case 0x0F: + return; // End-of-list + case 0x0E: + tile_list = (uint32_t *)(video_base + (entry&0x007FFFFF)); + break; + case 0x08: case 0x09: case 0x0A: case 0x0B: + strip_count = ((entry >> 25) & 0x0F)+1; + poly = pvr2_scene.buf_to_poly_map[entry&0x000FFFFF]; + while( strip_count > 0 ) { + assert( poly != NULL ); + gl_render_poly( poly ); + poly = poly->next; + strip_count--; + } + break; + default: + if( entry & 0x7E000000 ) { + poly = pvr2_scene.buf_to_poly_map[entry&0x000FFFFF]; + gl_render_poly( poly ); + } + } } } @@ -267,10 +267,10 @@ display_driver->set_render_target(buffer); pvr2_check_palette_changed(); pvr2_scene_load_textures(); - + gettimeofday( &tex_tv, NULL ); uint32_t ms = (tex_tv.tv_sec - start_tv.tv_sec) * 1000 + - (tex_tv.tv_usec - start_tv.tv_usec)/1000; + (tex_tv.tv_usec - start_tv.tv_usec)/1000; DEBUG( "Scene setup in %dms", ms ); /* Setup view projection matrix */ @@ -282,7 +282,7 @@ farz*= 4.0; } glOrtho( 0, pvr2_scene.buffer_width, pvr2_scene.buffer_height, 0, - -farz, -nearz ); + -farz, -nearz ); float alphaRef = ((float)(MMIO_READ(PVR2, RENDER_ALPHA_REF)&0xFF)+1)/256.0; glAlphaFunc( GL_GEQUAL, alphaRef ); @@ -302,39 +302,39 @@ /* Render the background */ gl_render_bkgnd( pvr2_scene.bkgnd_poly ); - + glEnable( GL_SCISSOR_TEST ); /* Process the segment list */ struct tile_segment *segment = pvr2_scene.segment_list; do { - int tilex = SEGMENT_X(segment->control); - int tiley = SEGMENT_Y(segment->control); - - uint32_t tile_bounds[4] = { tilex << 5, (tilex+1)<<5, tiley<<5, (tiley+1)<<5 }; - if( !clip_tile_bounds(tile_bounds, pvr2_scene.bounds) ) { - continue; // fully clipped, skip tile - } + int tilex = SEGMENT_X(segment->control); + int tiley = SEGMENT_Y(segment->control); - /* Clip to the visible part of the tile */ - glScissor( tile_bounds[0], pvr2_scene.buffer_height-tile_bounds[3], - tile_bounds[1]-tile_bounds[0], tile_bounds[3] - tile_bounds[2] ); - if( IS_TILE_PTR(segment->opaque_ptr) ) { - gl_render_tilelist(segment->opaque_ptr); - } - if( IS_TILE_PTR(segment->trans_ptr) ) { - if( pvr2_scene.sort_mode == SORT_NEVER || - (pvr2_scene.sort_mode == SORT_TILEFLAG && (segment->control&SEGMENT_SORT_TRANS))) { - gl_render_tilelist(segment->trans_ptr); - } else { - render_autosort_tile(segment->trans_ptr, RENDER_NORMAL ); - } - } - if( IS_TILE_PTR(segment->punchout_ptr) ) { - glEnable(GL_ALPHA_TEST ); - render_autosort_tile(segment->punchout_ptr, RENDER_NORMAL ); - glDisable(GL_ALPHA_TEST ); - } + uint32_t tile_bounds[4] = { tilex << 5, (tilex+1)<<5, tiley<<5, (tiley+1)<<5 }; + if( !clip_tile_bounds(tile_bounds, pvr2_scene.bounds) ) { + continue; // fully clipped, skip tile + } + + /* Clip to the visible part of the tile */ + glScissor( tile_bounds[0], pvr2_scene.buffer_height-tile_bounds[3], + tile_bounds[1]-tile_bounds[0], tile_bounds[3] - tile_bounds[2] ); + if( IS_TILE_PTR(segment->opaque_ptr) ) { + gl_render_tilelist(segment->opaque_ptr); + } + if( IS_TILE_PTR(segment->trans_ptr) ) { + if( pvr2_scene.sort_mode == SORT_NEVER || + (pvr2_scene.sort_mode == SORT_TILEFLAG && (segment->control&SEGMENT_SORT_TRANS))) { + gl_render_tilelist(segment->trans_ptr); + } else { + render_autosort_tile(segment->trans_ptr, RENDER_NORMAL ); + } + } + if( IS_TILE_PTR(segment->punchout_ptr) ) { + glEnable(GL_ALPHA_TEST ); + render_autosort_tile(segment->punchout_ptr, RENDER_NORMAL ); + glDisable(GL_ALPHA_TEST ); + } } while( !IS_LAST_SEGMENT(segment++) ); glDisable( GL_SCISSOR_TEST ); @@ -342,6 +342,6 @@ gettimeofday( &end_tv, NULL ); ms = (end_tv.tv_sec - tex_tv.tv_sec) * 1000 + - (end_tv.tv_usec - tex_tv.tv_usec)/1000; + (end_tv.tv_usec - tex_tv.tv_usec)/1000; DEBUG( "Scene render in %dms", ms ); }