filename | src/pvr2/scene.c |
changeset | 827:d333f4248727 |
prev | 784:0417e1c488b3 |
next | 847:2089244671d2 |
author | nkeynes |
date | Tue Sep 02 11:53:16 2008 +0000 (15 years ago) |
permissions | -rw-r--r-- |
last change | Initial implementation of the performance counters, only working one for now is raw clock cycles (0x23) |
file | annotate | diff | log | raw |
1.1 --- a/src/pvr2/scene.c Tue Jul 29 08:43:16 2008 +00001.2 +++ b/src/pvr2/scene.c Tue Sep 02 11:53:16 2008 +00001.3 @@ -1,7 +1,7 @@1.4 /**1.5 * $Id$1.6 *1.7 - * Manage the internal vertex/polygon buffers and scene data structure.1.8 + * Manage the internal vertex/polygon buffers and scene data structure.1.9 * Where possible this uses VBOs for the vertex + index data.1.10 *1.11 * Copyright (c) 2005 Nathan Keynes.1.12 @@ -166,7 +166,7 @@1.13 }1.15 static struct polygon_struct *scene_add_polygon( pvraddr_t poly_idx, int vertex_count,1.16 - gboolean is_modified )1.17 + gboolean is_modified )1.18 {1.19 int vert_mul = is_modified ? 2 : 1;1.21 @@ -199,8 +199,8 @@1.22 * @param modify_offset Offset in 32-bit words to the tex/color data. 0 for1.23 * the normal vertex, half the vertex length for the modified vertex.1.24 */1.25 -static void pvr2_decode_render_vertex( struct vertex_struct *vert, uint32_t poly1,1.26 - uint32_t poly2, uint32_t *pvr2_data,1.27 +static void pvr2_decode_render_vertex( struct vertex_struct *vert, uint32_t poly1,1.28 + uint32_t poly2, uint32_t *pvr2_data,1.29 int modify_offset )1.30 {1.31 gboolean force_alpha = !POLY2_ALPHA_ENABLE(poly2);1.32 @@ -250,7 +250,7 @@1.33 vert->offset_rgba[0] = 0.0;1.34 vert->offset_rgba[1] = 0.0;1.35 vert->offset_rgba[2] = 0.0;1.36 - vert->offset_rgba[3] = 0.0;1.37 + vert->offset_rgba[3] = 0.0;1.38 }1.40 if( force_alpha ) {1.41 @@ -263,7 +263,7 @@1.42 * Compute texture, colour, and z values for 1 or more result points by interpolating from1.43 * a set of 3 input points. The result point(s) must define their x,y.1.44 */1.45 -static void scene_compute_vertexes( struct vertex_struct *result,1.46 +static void scene_compute_vertexes( struct vertex_struct *result,1.47 int result_count,1.48 struct vertex_struct *input,1.49 gboolean is_solid_shaded )1.50 @@ -276,7 +276,7 @@1.52 float detxy = ((sy) * (tx)) - ((ty) * (sx));1.53 if( detxy == 0 ) {1.54 - // If the input points fall on a line, they don't define a usable1.55 + // If the input points fall on a line, they don't define a usable1.56 // polygon - the PVR2 takes the last input point as the result in1.57 // this case.1.58 for( i=0; i<result_count; i++ ) {1.59 @@ -305,7 +305,7 @@1.60 if( rz > pvr2_scene.bounds[5] ) {1.61 pvr2_scene.bounds[5] = rz;1.62 } else if( rz < pvr2_scene.bounds[4] ) {1.63 - pvr2_scene.bounds[4] = rz;1.64 + pvr2_scene.bounds[4] = rz;1.65 }1.66 result[i].z = rz;1.67 result[i].u = input[1].u + (t*tu) + (s*su);1.68 @@ -360,7 +360,7 @@1.69 }1.70 }1.72 -static void scene_add_quad_vertexes( pvraddr_t poly_idx, int vertex_length,1.73 +static void scene_add_quad_vertexes( pvraddr_t poly_idx, int vertex_length,1.74 gboolean is_modified )1.75 {1.76 struct polygon_struct *poly = pvr2_scene.buf_to_poly_map[poly_idx];1.77 @@ -369,7 +369,7 @@1.78 unsigned int i;1.80 if( poly->vertex_index == -1 ) {1.81 - // Construct it locally and copy to the vertex buffer, as the VBO is1.82 + // Construct it locally and copy to the vertex buffer, as the VBO is1.83 // allowed to be horribly slow for reads (ie it could be direct-mapped1.84 // vram).1.85 struct vertex_struct quad[4];1.86 @@ -524,7 +524,7 @@1.87 }1.88 }1.89 }1.90 - } while( 1 );1.91 + } while( 1 );1.92 }1.94 static void scene_extract_background( void )1.95 @@ -543,7 +543,7 @@1.96 context_length = 5;1.97 vertex_length <<= 1;1.98 poly->mod_vertex_index = pvr2_scene.vertex_count + 4;1.99 - pvr2_scene.vertex_count += 8;1.100 + pvr2_scene.vertex_count += 8;1.101 } else {1.102 poly->mod_vertex_index = -1;1.103 pvr2_scene.vertex_count += 4;1.104 @@ -555,7 +555,7 @@1.105 pvr2_scene.bkgnd_poly = poly;1.107 struct vertex_struct base_vertexes[3];1.108 - uint32_t *ptr = context + context_length;1.109 + uint32_t *ptr = context + context_length;1.110 for( i=0; i<3; i++ ) {1.111 pvr2_decode_render_vertex( &base_vertexes[i], context[0], context[1],1.112 ptr, 0 );1.113 @@ -599,10 +599,10 @@1.115 /**1.116 * Extract the current scene into the rendering structures. We run two passes1.117 - * - first pass extracts the polygons into pvr2_scene.poly_array (finding vertex counts),1.118 + * - first pass extracts the polygons into pvr2_scene.poly_array (finding vertex counts),1.119 * second pass extracts the vertex data into the VBO/vertex array.1.120 *1.121 - * Difficult to do in single pass as we don't generally know the size of a1.122 + * Difficult to do in single pass as we don't generally know the size of a1.123 * polygon for certain until we've seen all tiles containing it. It also means we1.124 * can count the vertexes and allocate the appropriate size VBO.1.125 *1.126 @@ -619,6 +619,15 @@1.127 pvr2_scene.bounds[3] = ((MMIO_READ( PVR2, RENDER_VCLIP ) >> 16) & 0x03FF) + 1;1.128 pvr2_scene.bounds[4] = pvr2_scene.bounds[5] = MMIO_READF( PVR2, RENDER_FARCLIP );1.130 + uint32_t scaler = MMIO_READ( PVR2, RENDER_SCALER );1.131 + if( scaler & SCALER_HSCALE ) {1.132 + /* If the horizontal scaler is in use, we're (in principle) supposed to1.133 + * divide everything by 2. However in the interests of display quality,1.134 + * instead we want to render to the unscaled resolution and downsample1.135 + * only if/when required.1.136 + */1.137 + pvr2_scene.bounds[1] *= 2;1.138 + }1.139 uint32_t *tilebuffer = (uint32_t *)(video_base + MMIO_READ( PVR2, RENDER_TILEBASE ));1.140 uint32_t *segment = tilebuffer;1.141 pvr2_scene.segment_list = (struct tile_segment *)tilebuffer;1.142 @@ -640,7 +649,7 @@1.143 pvr2_scene.sort_mode = SORT_TILEFLAG;1.144 }1.146 - // Pass 1: Extract polygon list1.147 + // Pass 1: Extract polygon list1.148 uint32_t control;1.149 int i;1.150 do {1.151 @@ -649,7 +658,7 @@1.152 int tile_y = SEGMENT_Y(control);1.153 if( tile_x > max_tile_x ) {1.154 max_tile_x = tile_x;1.155 - }1.156 + }1.157 if( tile_y > max_tile_y ) {1.158 max_tile_y = tile_y;1.159 }1.160 @@ -709,7 +718,7 @@1.161 for( j=0; j<poly->vertex_count; j++ ) {1.162 struct vertex_struct *v = &pvr2_scene.vertex_array[poly->vertex_index+j];1.163 fprintf( f, " %.5f %.5f %.5f, (%.5f,%.5f) %.5f,%.5f,%.5f,%.5f %.5f %.5f %.5f %.5f\n", v->x, v->y, v->z, v->u, v->v,1.164 - v->rgba[0], v->rgba[1], v->rgba[2], v->rgba[3],1.165 + v->rgba[0], v->rgba[1], v->rgba[2], v->rgba[3],1.166 v->offset_rgba[0], v->offset_rgba[1], v->offset_rgba[2], v->offset_rgba[3] );1.167 }1.168 if( poly->mod_vertex_index != -1 ) {1.169 @@ -717,7 +726,7 @@1.170 for( j=0; j<poly->vertex_count; j++ ) {1.171 struct vertex_struct *v = &pvr2_scene.vertex_array[poly->mod_vertex_index+j];1.172 fprintf( f, " %.5f %.5f %.5f, (%.5f,%.5f) %.5f,%.5f,%.5f,%.5f %.5f %.5f %.5f %.5f\n", v->x, v->y, v->z, v->u, v->v,1.173 - v->rgba[0], v->rgba[1], v->rgba[2], v->rgba[3],1.174 + v->rgba[0], v->rgba[1], v->rgba[2], v->rgba[3],1.175 v->offset_rgba[0], v->offset_rgba[1], v->offset_rgba[2], v->offset_rgba[3] );1.176 }1.177 }
.