filename | src/pvr2/scene.c |
changeset | 1159:580436b01b6c |
prev | 1155:f9aefb4613e5 |
next | 1240:190df8a791ca |
author | nkeynes |
date | Thu Feb 23 15:24:47 2012 +1000 (12 years ago) |
permissions | -rw-r--r-- |
last change | Check for existence of glDrawBuffer (assuming that glReadBuffer will follow). Note only need to guard the common code in gl_fbo.c |
file | annotate | diff | log | raw |
1.1 --- a/src/pvr2/scene.c Tue Jan 18 17:48:48 2011 +10001.2 +++ b/src/pvr2/scene.c Thu Feb 23 15:24:47 2012 +10001.3 @@ -2,7 +2,6 @@1.4 * $Id$1.5 *1.6 * Manage the internal vertex/polygon buffers and scene data structure.1.7 - * Where possible this uses VBOs for the vertex + index data.1.8 *1.9 * Copyright (c) 2005 Nathan Keynes.1.10 *1.11 @@ -69,33 +68,33 @@1.12 }1.14 struct pvr2_scene_struct pvr2_scene;1.15 +static float scene_shadow_intensity = 0.0;1.16 +static vertex_buffer_t vbuf = NULL;1.18 -static gboolean vbo_init = FALSE;1.19 -static float scene_shadow_intensity = 0.0;1.20 +static void vertex_buffer_map()1.21 +{1.22 + // Allow 8 vertexes for the background (4+4)1.23 + uint32_t size = (pvr2_scene.vertex_count + 8) * sizeof(struct vertex_struct);1.24 + pvr2_scene.vertex_array = vbuf->map(vbuf, size);1.25 +}1.27 -#ifdef ENABLE_VERTEX_BUFFER1.28 -static gboolean vbo_supported = FALSE;1.29 -#endif1.30 +static void vertex_buffer_unmap()1.31 +{1.32 + pvr2_scene.vertex_array = vbuf->unmap(vbuf);1.33 +}1.35 /**1.36 - * Test for VBO support, and allocate all the system memory needed for the1.37 - * temporary structures. GL context must have been initialized before this1.38 + * Allocate vertex buffer + temporary structures. GL context must have been initialized before this1.39 * point.1.40 */1.41 void pvr2_scene_init()1.42 {1.43 - if( !vbo_init ) {1.44 -#ifdef ENABLE_VERTEX_BUFFER1.45 - if( isGLVertexBufferSupported() ) {1.46 - vbo_supported = TRUE;1.47 - pvr2_scene.vbo_id = 1;1.48 - }1.49 -#endif1.50 + if( vbuf == NULL ) {1.51 + vbuf = display_driver->create_vertex_buffer();1.52 pvr2_scene.vertex_array = NULL;1.53 pvr2_scene.vertex_array_size = 0;1.54 pvr2_scene.poly_array = g_malloc( MAX_POLY_BUFFER_SIZE );1.55 pvr2_scene.buf_to_poly_map = g_malloc0( BUF_POLY_MAP_SIZE );1.56 - vbo_init = TRUE;1.57 }1.58 }1.60 @@ -110,72 +109,16 @@1.61 }1.62 pvr2_scene.poly_count = 0;1.63 pvr2_scene.vertex_count = 0;1.64 -}1.65 + }1.67 void pvr2_scene_shutdown()1.68 {1.69 -#ifdef ENABLE_VERTEX_BUFFER1.70 - if( vbo_supported ) {1.71 - glBindBufferARB( GL_ARRAY_BUFFER_ARB, 0 );1.72 - glDeleteBuffersARB( 1, &pvr2_scene.vbo_id );1.73 - pvr2_scene.vbo_id = 0;1.74 - } else {1.75 -#endif1.76 - g_free( pvr2_scene.vertex_array );1.77 - pvr2_scene.vertex_array = NULL;1.78 -#ifdef ENABLE_VERTEX_BUFFER1.79 - }1.80 -#endif1.81 -1.82 + vbuf->destroy(vbuf);1.83 + vbuf = NULL;1.84 g_free( pvr2_scene.poly_array );1.85 pvr2_scene.poly_array = NULL;1.86 g_free( pvr2_scene.buf_to_poly_map );1.87 pvr2_scene.buf_to_poly_map = NULL;1.88 - vbo_init = FALSE;1.89 -}1.90 -1.91 -void *vertex_buffer_map()1.92 -{1.93 - // Allow 8 vertexes for the background (4+4)1.94 - uint32_t size = (pvr2_scene.vertex_count + 8) * sizeof(struct vertex_struct);1.95 -#ifdef ENABLE_VERTEX_BUFFER1.96 - if( vbo_supported ) {1.97 - glGetError();1.98 - glBindBufferARB( GL_ARRAY_BUFFER_ARB, pvr2_scene.vbo_id );1.99 - if( size > pvr2_scene.vertex_array_size ) {1.100 - glBufferDataARB( GL_ARRAY_BUFFER_ARB, size, NULL, GL_DYNAMIC_DRAW_ARB );1.101 - int status = glGetError();1.102 - if( status != 0 ) {1.103 - fprintf( stderr, "Error %08X allocating vertex buffer\n", status );1.104 - abort();1.105 - }1.106 - pvr2_scene.vertex_array_size = size;1.107 - }1.108 - pvr2_scene.vertex_array = glMapBufferARB( GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB );1.109 - assert(pvr2_scene.vertex_array != NULL );1.110 - } else {1.111 -#endif1.112 - if( size > pvr2_scene.vertex_array_size ) {1.113 - pvr2_scene.vertex_array = g_realloc( pvr2_scene.vertex_array, size );1.114 - }1.115 -#ifdef ENABLE_VERTEX_BUFFER1.116 - }1.117 -#endif1.118 - return pvr2_scene.vertex_array;1.119 -}1.120 -1.121 -gboolean vertex_buffer_unmap()1.122 -{1.123 -#ifdef ENABLE_VERTEX_BUFFER1.124 - if( vbo_supported ) {1.125 - pvr2_scene.vertex_array = NULL;1.126 - return glUnmapBufferARB( GL_ARRAY_BUFFER_ARB );1.127 - } else {1.128 - return TRUE;1.129 - }1.130 -#else1.131 - return TRUE;1.132 -#endif1.133 }1.135 static struct polygon_struct *scene_add_polygon( pvraddr_t poly_idx, int vertex_count,1.136 @@ -252,7 +195,7 @@1.137 * @param modify_offset Offset in 32-bit words to the tex/color data. 0 for1.138 * the normal vertex, half the vertex length for the modified vertex.1.139 */1.140 -static void pvr2_decode_render_vertex( struct vertex_struct *vert, uint32_t poly1,1.141 +static void scene_decode_vertex( struct vertex_struct *vert, uint32_t poly1,1.142 uint32_t poly2, uint32_t tex, uint32_t *pvr2_data,1.143 int modify_offset )1.144 {1.145 @@ -560,7 +503,7 @@1.146 assert( poly != NULL );1.147 assert( pvr2_scene.vertex_index + poly->vertex_count <= pvr2_scene.vertex_count );1.148 for( i=0; i<poly->vertex_count; i++ ) {1.149 - pvr2_decode_render_vertex( &pvr2_scene.vertex_array[pvr2_scene.vertex_index++], context[0], context[1], context[2], ptr, 0 );1.150 + scene_decode_vertex( &pvr2_scene.vertex_array[pvr2_scene.vertex_index++], context[0], context[1], context[2], ptr, 0 );1.151 ptr += vertex_length;1.152 }1.153 if( is_modified ) {1.154 @@ -570,7 +513,7 @@1.155 int mod_offset = (vertex_length - 3)>>1;1.156 ptr = &pvr2_scene.pvr2_pbuf[poly_idx] + 5;1.157 for( i=0; i<poly->vertex_count; i++ ) {1.158 - pvr2_decode_render_vertex( &pvr2_scene.vertex_array[pvr2_scene.vertex_index++], context[0], context[3], context[4], ptr, mod_offset );1.159 + scene_decode_vertex( &pvr2_scene.vertex_array[pvr2_scene.vertex_index++], context[0], context[3], context[4], ptr, mod_offset );1.160 ptr += vertex_length;1.161 }1.162 } else {1.163 @@ -601,7 +544,7 @@1.164 ptr += (is_modified == SHADOW_FULL ? 5 : 3 );1.165 poly->vertex_index = pvr2_scene.vertex_index;1.166 for( i=0; i<4; i++ ) {1.167 - pvr2_decode_render_vertex( &quad[i], context[0], context[1], context[2], ptr, 0 );1.168 + scene_decode_vertex( &quad[i], context[0], context[1], context[2], ptr, 0 );1.169 ptr += vertex_length;1.170 }1.171 scene_compute_vertexes( &quad[3], 1, &quad[0], !POLY1_GOURAUD_SHADED(context[0]) );1.172 @@ -618,7 +561,7 @@1.173 int mod_offset = (vertex_length - 3)>>1;1.174 ptr = &pvr2_scene.pvr2_pbuf[poly_idx] + 5;1.175 for( i=0; i<4; i++ ) {1.176 - pvr2_decode_render_vertex( &quad[4], context[0], context[3], context[4], ptr, mod_offset );1.177 + scene_decode_vertex( &quad[4], context[0], context[3], context[4], ptr, mod_offset );1.178 ptr += vertex_length;1.179 }1.180 scene_compute_vertexes( &quad[3], 1, &quad[0], !POLY1_GOURAUD_SHADED(context[0]) );1.181 @@ -788,7 +731,7 @@1.182 struct vertex_struct base_vertexes[3];1.183 uint32_t *ptr = context + context_length;1.184 for( i=0; i<3; i++ ) {1.185 - pvr2_decode_render_vertex( &base_vertexes[i], context[0], context[1], context[2],1.186 + scene_decode_vertex( &base_vertexes[i], context[0], context[1], context[2],1.187 ptr, 0 );1.188 ptr += vertex_length;1.189 }1.190 @@ -803,7 +746,7 @@1.191 int mod_offset = (vertex_length - 3)>>1;1.192 ptr = context + context_length;1.193 for( i=0; i<3; i++ ) {1.194 - pvr2_decode_render_vertex( &base_vertexes[i], context[0], context[3], context[4],1.195 + scene_decode_vertex( &base_vertexes[i], context[0], context[3], context[4],1.196 ptr, mod_offset );1.197 ptr += vertex_length;1.198 }1.199 @@ -937,6 +880,11 @@1.200 vertex_buffer_unmap();1.201 }1.203 +void pvr2_scene_finished( )1.204 +{1.205 + vbuf->finished(vbuf);1.206 +}1.207 +1.208 /**1.209 * Dump the current scene to file in a (mostly) human readable form1.210 */
.