revision 161:408b9210395f
summary |
tree |
shortlog |
changelog |
graph |
changeset |
raw | bz2 | zip | gz changeset | 161:408b9210395f |
parent | 160:17c4c0e4f9ce |
child | 162:f7781f928f7e |
author | nkeynes |
date | Sun Jun 18 11:57:05 2006 +0000 (16 years ago) |
Implement render buffer invalidation
![]() | src/pvr2/pvr2.c | view | annotate | diff | log | |
![]() | src/pvr2/pvr2.h | view | annotate | diff | log | |
![]() | src/pvr2/render.c | view | annotate | diff | log |
1.1 --- a/src/pvr2/pvr2.c Sun Jun 18 11:55:25 2006 +00001.2 +++ b/src/pvr2/pvr2.c Sun Jun 18 11:57:05 2006 +00001.3 @@ -1,5 +1,5 @@1.4 /**1.5 - * $Id: pvr2.c,v 1.26 2006-06-15 10:33:08 nkeynes Exp $1.6 + * $Id: pvr2.c,v 1.27 2006-06-18 11:57:05 nkeynes Exp $1.7 *1.8 * PVR2 (Video) Core module implementation and MMIO registers.1.9 *1.10 @@ -36,6 +36,8 @@1.12 void pvr2_display_frame( void );1.14 +int colour_format_bytes[] = { 2, 2, 2, 1, 3, 4, 1, 1 };1.15 +1.16 struct dreamcast_module pvr2_module = { "PVR2", pvr2_init, pvr2_reset, NULL,1.17 pvr2_run_slice, NULL,1.18 pvr2_save_state, pvr2_load_state };1.19 @@ -155,50 +157,51 @@1.20 int vid_ppl = ((dispsize & DISPSIZE_PPL)) + 1;1.21 gboolean bEnabled = (dispmode & DISPMODE_DE) && (vidcfg & DISPCFG_VO ) ? TRUE : FALSE;1.22 gboolean interlaced = (vidcfg & DISPCFG_I ? TRUE : FALSE);1.23 - if( bEnabled ) {1.24 - video_buffer_t buffer = &video_buffer[video_buffer_idx];1.25 - video_buffer_idx = !video_buffer_idx;1.26 - video_buffer_t last = &video_buffer[video_buffer_idx];1.27 - buffer->rowstride = (vid_ppl + vid_stride) << 2;1.28 - buffer->data = video_base + MMIO_READ( PVR2, DISPADDR1 );1.29 - buffer->vres = vid_lpf;1.30 - if( interlaced ) buffer->vres <<= 1;1.31 - switch( (dispmode & DISPMODE_COL) >> 2 ) {1.32 - case 0:1.33 - buffer->colour_format = COLFMT_ARGB1555;1.34 - buffer->hres = vid_ppl << 1;1.35 - break;1.36 - case 1:1.37 - buffer->colour_format = COLFMT_RGB565;1.38 - buffer->hres = vid_ppl << 1;1.39 - break;1.40 - case 2:1.41 - buffer->colour_format = COLFMT_RGB888;1.42 - buffer->hres = (vid_ppl << 2) / 3;1.43 - break;1.44 - case 3:1.45 - buffer->colour_format = COLFMT_ARGB8888;1.46 - buffer->hres = vid_ppl;1.47 - break;1.48 + video_buffer_t buffer = &video_buffer[video_buffer_idx];1.49 + video_buffer_idx = !video_buffer_idx;1.50 + video_buffer_t last = &video_buffer[video_buffer_idx];1.51 + buffer->rowstride = (vid_ppl + vid_stride) << 2;1.52 + buffer->data = video_base + MMIO_READ( PVR2, DISPADDR1 );1.53 + buffer->vres = vid_lpf;1.54 + if( interlaced ) buffer->vres <<= 1;1.55 + switch( (dispmode & DISPMODE_COL) >> 2 ) {1.56 + case 0:1.57 + buffer->colour_format = COLFMT_ARGB1555;1.58 + buffer->hres = vid_ppl << 1;1.59 + break;1.60 + case 1:1.61 + buffer->colour_format = COLFMT_RGB565;1.62 + buffer->hres = vid_ppl << 1;1.63 + break;1.64 + case 2:1.65 + buffer->colour_format = COLFMT_RGB888;1.66 + buffer->hres = (vid_ppl << 2) / 3;1.67 + break;1.68 + case 3:1.69 + buffer->colour_format = COLFMT_ARGB8888;1.70 + buffer->hres = vid_ppl;1.71 + break;1.72 + }1.73 +1.74 + if( buffer->hres <=8 )1.75 + buffer->hres = 640;1.76 + if( buffer->vres <=8 )1.77 + buffer->vres = 480;1.78 + if( display_driver != NULL ) {1.79 + if( buffer->hres != last->hres ||1.80 + buffer->vres != last->vres ||1.81 + buffer->colour_format != last->colour_format) {1.82 + display_driver->set_display_format( buffer->hres, buffer->vres,1.83 + buffer->colour_format );1.84 }1.85 -1.86 - if( display_driver != NULL ) {1.87 - if( buffer->hres != last->hres ||1.88 - buffer->vres != last->vres ||1.89 - buffer->colour_format != last->colour_format) {1.90 - display_driver->set_display_format( buffer->hres, buffer->vres,1.91 - buffer->colour_format );1.92 - }1.93 - if( MMIO_READ( PVR2, DISPCFG2 ) & 0x08 ) { /* Blanked */1.94 - uint32_t colour = MMIO_READ( PVR2, DISPBORDER );1.95 - display_driver->display_blank_frame( colour );1.96 - } else if( !pvr2_render_display_frame( PVR2_RAM_BASE + display_addr ) ) {1.97 - display_driver->display_frame( buffer );1.98 - }1.99 + if( !bEnabled ) {1.100 + display_driver->display_blank_frame( 0 );1.101 + } else if( MMIO_READ( PVR2, DISPCFG2 ) & 0x08 ) { /* Blanked */1.102 + uint32_t colour = MMIO_READ( PVR2, DISPBORDER );1.103 + display_driver->display_blank_frame( colour );1.104 + } else if( !pvr2_render_display_frame( PVR2_RAM_BASE + display_addr ) ) {1.105 + display_driver->display_frame( buffer );1.106 }1.107 - } else {1.108 - video_buffer_idx = 0;1.109 - video_buffer[0].hres = video_buffer[0].vres = 0;1.110 }1.111 pvr2_state.frame_count++;1.112 }
2.1 --- a/src/pvr2/pvr2.h Sun Jun 18 11:55:25 2006 +00002.2 +++ b/src/pvr2/pvr2.h Sun Jun 18 11:57:05 2006 +00002.3 @@ -1,5 +1,5 @@2.4 /**2.5 - * $Id: pvr2.h,v 1.13 2006-05-15 08:28:52 nkeynes Exp $2.6 + * $Id: pvr2.h,v 1.14 2006-06-18 11:57:05 nkeynes Exp $2.7 *2.8 * PVR2 (video chip) functions and macros.2.9 *2.10 @@ -139,6 +139,11 @@2.11 gboolean pvr2_render_init( void );2.13 /**2.14 + * Invalidate any caching on the supplied SH4 address2.15 + */2.16 +gboolean pvr2_render_invalidate( sh4addr_t addr );2.17 +2.18 +/**2.19 * Render the current scene stored in PVR ram to the GL back buffer.2.20 */2.21 void pvr2_render_scene( void );
3.1 --- a/src/pvr2/render.c Sun Jun 18 11:55:25 2006 +00003.2 +++ b/src/pvr2/render.c Sun Jun 18 11:57:05 2006 +00003.3 @@ -1,5 +1,5 @@3.4 /**3.5 - * $Id: render.c,v 1.8 2006-05-15 08:28:52 nkeynes Exp $3.6 + * $Id: render.c,v 1.9 2006-06-18 11:57:05 nkeynes Exp $3.7 *3.8 * PVR2 Renderer support. This is where the real work happens.3.9 *3.10 @@ -60,7 +60,8 @@3.11 * to fetch the bits back to vram.3.12 */3.13 typedef struct pvr2_render_buffer {3.14 - uint32_t render_addr; /* The actual address rendered to in pvr ram */3.15 + sh4addr_t render_addr; /* The actual address rendered to in pvr ram */3.16 + uint32_t size; /* Length of rendering region in bytes */3.17 int width, height;3.18 int colour_format;3.19 } *pvr2_render_buffer_t;3.20 @@ -176,6 +177,31 @@3.21 }3.23 /**3.24 + * Invalidate any caching on the supplied address. Specifically, if it falls3.25 + * within either the front buffer or back buffer, flush the buffer back to3.26 + * PVR2 ram (note that front buffer flush may be corrupt under some3.27 + * circumstances).3.28 + */3.29 +gboolean pvr2_render_invalidate( sh4addr_t address )3.30 +{3.31 + address = address & 0x1FFFFFFF;3.32 + if( front_buffer.render_addr != -1 &&3.33 + front_buffer.render_addr <= address &&3.34 + (front_buffer.render_addr + front_buffer.size) > address ) {3.35 + pvr2_render_copy_to_sh4( &front_buffer, FALSE );3.36 + front_buffer.render_addr = -1;3.37 + return TRUE;3.38 + } else if( back_buffer.render_addr != -1 &&3.39 + back_buffer.render_addr <= address &&3.40 + (back_buffer.render_addr + back_buffer.size) > address ) {3.41 + pvr2_render_copy_to_sh4( &back_buffer, TRUE );3.42 + back_buffer.render_addr = -1;3.43 + return TRUE;3.44 + }3.45 + return FALSE;3.46 +}3.47 +3.48 +/**3.49 * Display a rendered frame if one is available.3.50 * @param address An address in PVR ram (0500000 range).3.51 * @return TRUE if a frame was available to be displayed, otherwise false.3.52 @@ -235,6 +261,7 @@3.53 back_buffer.width = width;3.54 back_buffer.height = height;3.55 back_buffer.colour_format = colour_format;3.56 + back_buffer.size = width * height * colour_format_bytes[colour_format];3.58 /* Setup the display model */3.59 glDrawBuffer(GL_BACK);3.60 @@ -243,7 +270,7 @@3.61 glViewport( 0, 0, width, height );3.62 glMatrixMode(GL_PROJECTION);3.63 glLoadIdentity();3.64 - glOrtho( 0, width, height, 0, bgplanez, -1 );3.65 + glOrtho( 0, width, height, 0, bgplanez, -10 );3.66 glMatrixMode(GL_MODELVIEW);3.67 glLoadIdentity();3.68 glCullFace( GL_BACK );
.