1.1 --- a/src/pvr2/glrender.c Sat Jun 14 11:54:15 2008 +0000
1.2 +++ b/src/pvr2/glrender.c Wed Jul 30 03:00:40 2008 +0000
1.4 #include "pvr2/glutil.h"
1.6 int pvr2_poly_depthmode[8] = { GL_NEVER, GL_LESS, GL_EQUAL, GL_LEQUAL,
1.7 - GL_GREATER, GL_NOTEQUAL, GL_GEQUAL,
1.9 + GL_GREATER, GL_NOTEQUAL, GL_GEQUAL,
1.11 int pvr2_poly_srcblend[8] = {
1.12 - GL_ZERO, GL_ONE, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR,
1.13 - GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA,
1.14 - GL_ONE_MINUS_DST_ALPHA };
1.15 + GL_ZERO, GL_ONE, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR,
1.16 + GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA,
1.17 + GL_ONE_MINUS_DST_ALPHA };
1.18 int pvr2_poly_dstblend[8] = {
1.19 - GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR,
1.20 - GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA,
1.21 - GL_ONE_MINUS_DST_ALPHA };
1.22 + GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR,
1.23 + GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA,
1.24 + GL_ONE_MINUS_DST_ALPHA };
1.25 int pvr2_poly_texblend[4] = {
1.35 int pvr2_render_colour_format[8] = {
1.36 - COLFMT_BGRA1555, COLFMT_RGB565, COLFMT_BGRA4444, COLFMT_BGRA1555,
1.37 - COLFMT_BGR888, COLFMT_BGRA8888, COLFMT_BGRA8888, COLFMT_BGRA4444 };
1.38 + COLFMT_BGRA1555, COLFMT_RGB565, COLFMT_BGRA4444, COLFMT_BGRA1555,
1.39 + COLFMT_BGR888, COLFMT_BGRA8888, COLFMT_BGRA8888, COLFMT_BGRA4444 };
1.46 for( i=0; i < pvr2_scene.poly_count; i++ ) {
1.47 - struct polygon_struct *poly = &pvr2_scene.poly_array[i];
1.48 - if( POLY1_TEXTURED(poly->context[0]) ) {
1.49 - poly->tex_id = texcache_get_texture( poly->context[2],
1.50 - POLY2_TEX_WIDTH(poly->context[1]),
1.51 - POLY2_TEX_HEIGHT(poly->context[1]) );
1.52 - if( poly->mod_vertex_index != -1 ) {
1.53 - poly->mod_tex_id = texcache_get_texture( poly->context[4],
1.54 - POLY2_TEX_WIDTH(poly->context[3]),
1.55 - POLY2_TEX_HEIGHT(poly->context[3]) );
1.58 - poly->tex_id = -1;
1.59 - poly->mod_tex_id = -1;
1.61 + struct polygon_struct *poly = &pvr2_scene.poly_array[i];
1.62 + if( POLY1_TEXTURED(poly->context[0]) ) {
1.63 + poly->tex_id = texcache_get_texture( poly->context[2],
1.64 + POLY2_TEX_WIDTH(poly->context[1]),
1.65 + POLY2_TEX_HEIGHT(poly->context[1]) );
1.66 + if( poly->mod_vertex_index != -1 ) {
1.67 + poly->mod_tex_id = texcache_get_texture( poly->context[4],
1.68 + POLY2_TEX_WIDTH(poly->context[3]),
1.69 + POLY2_TEX_HEIGHT(poly->context[3]) );
1.72 + poly->tex_id = -1;
1.73 + poly->mod_tex_id = -1;
1.81 if( glsl_is_supported() ) {
1.82 - if( !glsl_load_shaders( glsl_vertex_shader_src, NULL ) ) {
1.83 + if( !glsl_load_shaders( glsl_vertex_shader_src, NULL ) ) {
1.84 WARN( "Unable to load GL shaders" );
1.89 texcache_gl_init(); // Allocate texture IDs
1.90 glCullFace( GL_BACK );
1.91 glEnable( GL_BLEND );
1.93 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
1.94 glMatrixMode(GL_MODELVIEW);
1.98 #ifdef HAVE_OPENGL_CLAMP_COLOR
1.99 if( isGLExtensionSupported("GL_ARB_color_buffer_float") ) {
1.100 glClampColorARB(GL_CLAMP_VERTEX_COLOR_ARB, GL_FALSE );
1.101 @@ -129,57 +129,57 @@
1.103 uint32_t poly1 = context[0], poly2, texture;
1.104 if( render_mode == RENDER_FULLMOD ) {
1.105 - poly2 = context[3];
1.106 - texture = context[4];
1.107 + poly2 = context[3];
1.108 + texture = context[4];
1.110 - poly2 = context[1];
1.111 - texture = context[2];
1.112 + poly2 = context[1];
1.113 + texture = context[2];
1.117 glDepthFunc( POLY1_DEPTH_MODE(poly1) );
1.118 glDepthMask( POLY1_DEPTH_WRITE(poly1) ? GL_TRUE : GL_FALSE );
1.121 switch( POLY1_CULL_MODE(poly1) ) {
1.124 - glDisable( GL_CULL_FACE );
1.126 + glDisable( GL_CULL_FACE );
1.129 - glEnable( GL_CULL_FACE );
1.130 - glFrontFace( GL_CW );
1.132 + glEnable( GL_CULL_FACE );
1.133 + glFrontFace( GL_CW );
1.136 - glEnable( GL_CULL_FACE );
1.137 - glFrontFace( GL_CCW );
1.139 + glEnable( GL_CULL_FACE );
1.140 + glFrontFace( GL_CCW );
1.144 if( POLY1_SPECULAR(poly1) ) {
1.145 - glEnable(GL_COLOR_SUM);
1.146 + glEnable(GL_COLOR_SUM);
1.148 - glDisable(GL_COLOR_SUM);
1.149 + glDisable(GL_COLOR_SUM);
1.153 if( POLY1_TEXTURED(poly1) ) {
1.154 - glEnable(GL_TEXTURE_2D);
1.155 - glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, pvr2_poly_texblend[POLY2_TEX_BLEND(poly2)] );
1.156 - if( POLY2_TEX_CLAMP_U(poly2) ) {
1.157 - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
1.158 - } else if( POLY2_TEX_MIRROR_U(poly2) ) {
1.159 - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT_ARB );
1.161 - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
1.163 - if( POLY2_TEX_CLAMP_V(poly2) ) {
1.164 - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
1.165 - } else if( POLY2_TEX_MIRROR_V(poly2) ) {
1.166 - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT_ARB );
1.168 - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
1.170 + glEnable(GL_TEXTURE_2D);
1.171 + glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, pvr2_poly_texblend[POLY2_TEX_BLEND(poly2)] );
1.172 + if( POLY2_TEX_CLAMP_U(poly2) ) {
1.173 + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
1.174 + } else if( POLY2_TEX_MIRROR_U(poly2) ) {
1.175 + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT_ARB );
1.177 + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
1.179 + if( POLY2_TEX_CLAMP_V(poly2) ) {
1.180 + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
1.181 + } else if( POLY2_TEX_MIRROR_V(poly2) ) {
1.182 + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT_ARB );
1.184 + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
1.187 - glDisable( GL_TEXTURE_2D );
1.188 + glDisable( GL_TEXTURE_2D );
1.191 glShadeModel( POLY1_SHADE_MODEL(poly1) );
1.192 @@ -189,7 +189,7 @@
1.193 glBlendFunc( srcblend, destblend );
1.195 if( POLY2_SRC_BLEND_TARGET(poly2) || POLY2_DEST_BLEND_TARGET(poly2) ) {
1.196 - ERROR( "Accumulation buffer not supported" );
1.197 + ERROR( "Accumulation buffer not supported" );
1.201 @@ -198,7 +198,7 @@
1.202 static void gl_render_poly( struct polygon_struct *poly )
1.204 if( poly->tex_id != -1 ) {
1.205 - glBindTexture(GL_TEXTURE_2D, poly->tex_id);
1.206 + glBindTexture(GL_TEXTURE_2D, poly->tex_id);
1.208 render_set_context( poly->context, RENDER_NORMAL );
1.209 glDrawArrays(GL_TRIANGLE_STRIP, poly->vertex_index, poly->vertex_count );
1.210 @@ -228,29 +228,29 @@
1.211 struct polygon_struct *poly;
1.214 - uint32_t entry = *tile_list++;
1.215 - switch( entry >> 28 ) {
1.217 - return; // End-of-list
1.219 - tile_list = (uint32_t *)(video_base + (entry&0x007FFFFF));
1.221 - case 0x08: case 0x09: case 0x0A: case 0x0B:
1.222 - strip_count = ((entry >> 25) & 0x0F)+1;
1.223 - poly = pvr2_scene.buf_to_poly_map[entry&0x000FFFFF];
1.224 - while( strip_count > 0 ) {
1.225 - assert( poly != NULL );
1.226 - gl_render_poly( poly );
1.227 - poly = poly->next;
1.232 - if( entry & 0x7E000000 ) {
1.233 - poly = pvr2_scene.buf_to_poly_map[entry&0x000FFFFF];
1.234 - gl_render_poly( poly );
1.237 + uint32_t entry = *tile_list++;
1.238 + switch( entry >> 28 ) {
1.240 + return; // End-of-list
1.242 + tile_list = (uint32_t *)(video_base + (entry&0x007FFFFF));
1.244 + case 0x08: case 0x09: case 0x0A: case 0x0B:
1.245 + strip_count = ((entry >> 25) & 0x0F)+1;
1.246 + poly = pvr2_scene.buf_to_poly_map[entry&0x000FFFFF];
1.247 + while( strip_count > 0 ) {
1.248 + assert( poly != NULL );
1.249 + gl_render_poly( poly );
1.250 + poly = poly->next;
1.255 + if( entry & 0x7E000000 ) {
1.256 + poly = pvr2_scene.buf_to_poly_map[entry&0x000FFFFF];
1.257 + gl_render_poly( poly );
1.263 @@ -267,10 +267,10 @@
1.264 display_driver->set_render_target(buffer);
1.265 pvr2_check_palette_changed();
1.266 pvr2_scene_load_textures();
1.269 gettimeofday( &tex_tv, NULL );
1.270 uint32_t ms = (tex_tv.tv_sec - start_tv.tv_sec) * 1000 +
1.271 - (tex_tv.tv_usec - start_tv.tv_usec)/1000;
1.272 + (tex_tv.tv_usec - start_tv.tv_usec)/1000;
1.273 DEBUG( "Scene setup in %dms", ms );
1.275 /* Setup view projection matrix */
1.276 @@ -282,7 +282,7 @@
1.279 glOrtho( 0, pvr2_scene.buffer_width, pvr2_scene.buffer_height, 0,
1.282 float alphaRef = ((float)(MMIO_READ(PVR2, RENDER_ALPHA_REF)&0xFF)+1)/256.0;
1.283 glAlphaFunc( GL_GEQUAL, alphaRef );
1.285 @@ -302,39 +302,39 @@
1.287 /* Render the background */
1.288 gl_render_bkgnd( pvr2_scene.bkgnd_poly );
1.291 glEnable( GL_SCISSOR_TEST );
1.293 /* Process the segment list */
1.294 struct tile_segment *segment = pvr2_scene.segment_list;
1.296 - int tilex = SEGMENT_X(segment->control);
1.297 - int tiley = SEGMENT_Y(segment->control);
1.299 - uint32_t tile_bounds[4] = { tilex << 5, (tilex+1)<<5, tiley<<5, (tiley+1)<<5 };
1.300 - if( !clip_tile_bounds(tile_bounds, pvr2_scene.bounds) ) {
1.301 - continue; // fully clipped, skip tile
1.303 + int tilex = SEGMENT_X(segment->control);
1.304 + int tiley = SEGMENT_Y(segment->control);
1.306 - /* Clip to the visible part of the tile */
1.307 - glScissor( tile_bounds[0], pvr2_scene.buffer_height-tile_bounds[3],
1.308 - tile_bounds[1]-tile_bounds[0], tile_bounds[3] - tile_bounds[2] );
1.309 - if( IS_TILE_PTR(segment->opaque_ptr) ) {
1.310 - gl_render_tilelist(segment->opaque_ptr);
1.312 - if( IS_TILE_PTR(segment->trans_ptr) ) {
1.313 - if( pvr2_scene.sort_mode == SORT_NEVER ||
1.314 - (pvr2_scene.sort_mode == SORT_TILEFLAG && (segment->control&SEGMENT_SORT_TRANS))) {
1.315 - gl_render_tilelist(segment->trans_ptr);
1.317 - render_autosort_tile(segment->trans_ptr, RENDER_NORMAL );
1.320 - if( IS_TILE_PTR(segment->punchout_ptr) ) {
1.321 - glEnable(GL_ALPHA_TEST );
1.322 - render_autosort_tile(segment->punchout_ptr, RENDER_NORMAL );
1.323 - glDisable(GL_ALPHA_TEST );
1.325 + uint32_t tile_bounds[4] = { tilex << 5, (tilex+1)<<5, tiley<<5, (tiley+1)<<5 };
1.326 + if( !clip_tile_bounds(tile_bounds, pvr2_scene.bounds) ) {
1.327 + continue; // fully clipped, skip tile
1.330 + /* Clip to the visible part of the tile */
1.331 + glScissor( tile_bounds[0], pvr2_scene.buffer_height-tile_bounds[3],
1.332 + tile_bounds[1]-tile_bounds[0], tile_bounds[3] - tile_bounds[2] );
1.333 + if( IS_TILE_PTR(segment->opaque_ptr) ) {
1.334 + gl_render_tilelist(segment->opaque_ptr);
1.336 + if( IS_TILE_PTR(segment->trans_ptr) ) {
1.337 + if( pvr2_scene.sort_mode == SORT_NEVER ||
1.338 + (pvr2_scene.sort_mode == SORT_TILEFLAG && (segment->control&SEGMENT_SORT_TRANS))) {
1.339 + gl_render_tilelist(segment->trans_ptr);
1.341 + render_autosort_tile(segment->trans_ptr, RENDER_NORMAL );
1.344 + if( IS_TILE_PTR(segment->punchout_ptr) ) {
1.345 + glEnable(GL_ALPHA_TEST );
1.346 + render_autosort_tile(segment->punchout_ptr, RENDER_NORMAL );
1.347 + glDisable(GL_ALPHA_TEST );
1.349 } while( !IS_LAST_SEGMENT(segment++) );
1.350 glDisable( GL_SCISSOR_TEST );
1.352 @@ -342,6 +342,6 @@
1.354 gettimeofday( &end_tv, NULL );
1.355 ms = (end_tv.tv_sec - tex_tv.tv_sec) * 1000 +
1.356 - (end_tv.tv_usec - tex_tv.tv_usec)/1000;
1.357 + (end_tv.tv_usec - tex_tv.tv_usec)/1000;
1.358 DEBUG( "Scene render in %dms", ms );