--- a/src/pvr2/render.c Mon Jan 29 11:24:44 2007 +0000 +++ b/src/pvr2/render.c Sun Feb 11 10:09:32 2007 +0000 @@ -1,5 +1,5 @@ /** - * $Id: render.c,v 1.23 2007-01-29 11:24:44 nkeynes Exp $ + * $Id: render.c,v 1.24 2007-02-11 10:09:32 nkeynes Exp $ * * PVR2 Renderer support. This part is primarily * @@ -20,20 +20,6 @@ #include "asic.h" -struct pvr2_render_buffer front_buffer; -struct pvr2_render_buffer back_buffer; - -typedef struct pvr2_bgplane_packed { - uint32_t poly_cfg, poly_mode; - uint32_t texture_mode; - float x1, y1, z1; - uint32_t colour1; - float x2, y2, z2; - uint32_t colour2; - float x3, y3, z3; - uint32_t colour3; -} *pvr2_bgplane_packed_t; - int pvr2_render_font_list = -1; int pvr2_render_trace = 0; @@ -85,111 +71,27 @@ } - -gboolean pvr2_render_init( void ) -{ - front_buffer.render_addr = -1; - back_buffer.render_addr = -1; -} - -/** - * Invalidate any caching on the supplied address. Specifically, if it falls - * within either the front buffer or back buffer, flush the buffer back to - * PVR2 ram (note that front buffer flush may be corrupt under some - * circumstances). - */ -gboolean pvr2_render_buffer_invalidate( sh4addr_t address ) -{ - address = address & 0x1FFFFFFF; - if( front_buffer.render_addr != -1 && - front_buffer.render_addr <= address && - (front_buffer.render_addr + front_buffer.size) > address ) { - pvr2_render_buffer_copy_to_sh4( &front_buffer, FALSE ); - front_buffer.render_addr = -1; - return TRUE; - } else if( back_buffer.render_addr != -1 && - back_buffer.render_addr <= address && - (back_buffer.render_addr + back_buffer.size) > address ) { - pvr2_render_buffer_copy_to_sh4( &back_buffer, TRUE ); - back_buffer.render_addr = -1; - return TRUE; - } - return FALSE; -} - -/** - * Display a rendered frame if one is available. - * @param address An address in PVR ram (0500000 range). - * @return TRUE if a frame was available to be displayed, otherwise false. - */ -gboolean pvr2_render_display_frame( uint32_t address ) -{ - if( front_buffer.render_addr == address ) { - /* Current front buffer is already displayed, so do nothing - * and tell the caller that all is well. - */ - return TRUE; - } - if( back_buffer.render_addr == address ) { - /* The more useful case - back buffer is to be displayed. Swap - * the buffers - */ - display_driver->display_back_buffer(); - front_buffer = back_buffer; - back_buffer.render_addr = -1; - return TRUE; - } - return FALSE; -} - /** * Prepare the OpenGL context to receive instructions for a new frame. */ -static void pvr2_render_prepare_context( sh4addr_t render_addr, - uint32_t width, uint32_t height, - uint32_t colour_format, - float bgplanez, float nearz, - gboolean texture_target ) +static void pvr2_render_prepare_context( render_buffer_t buffer, + float bgplanez, float nearz ) { /* Select and initialize the render context */ - display_driver->set_render_format( width, height, colour_format, texture_target ); + display_driver->set_render_target(buffer); if( pvr2_render_font_list == -1 ) { pvr2_render_font_list = video_glx_load_font( "-*-helvetica-*-r-normal--16-*-*-*-p-*-iso8859-1"); } - if( back_buffer.render_addr != -1 && - back_buffer.render_addr != render_addr ) { - /* There's a current back buffer, and we're rendering somewhere else - - * flush the back buffer back to vram and start a new back buffer - */ - pvr2_render_buffer_copy_to_sh4( &back_buffer, TRUE ); - } - - if( front_buffer.render_addr == render_addr ) { - /* In case we've been asked to render to the current front buffer - - * invalidate the front buffer and render to the back buffer, ensuring - * we swap at the next frame display. - */ - front_buffer.render_addr = -1; - } - back_buffer.render_addr = render_addr; - back_buffer.width = width; - back_buffer.height = height; - back_buffer.colour_format = colour_format; - back_buffer.scale = MMIO_READ( PVR2, RENDER_SCALER ); - back_buffer.size = width * height * colour_format_bytes[colour_format]; - pvr2_check_palette_changed(); /* Setup the display model */ - glDrawBuffer(GL_BACK); glShadeModel(GL_SMOOTH); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); - glViewport( 0, 0, width, height ); glMatrixMode(GL_PROJECTION); glLoadIdentity(); - glOrtho( 0, width, height, 0, -bgplanez, -nearz ); + glOrtho( 0, buffer->width, buffer->height, 0, -bgplanez, -nearz ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glCullFace( GL_BACK ); @@ -200,7 +102,6 @@ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(0); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); - } /** @@ -208,58 +109,32 @@ * Note: this will probably need to be broken up eventually once timings are * determined. */ -void pvr2_render_scene( ) +void pvr2_render_scene( render_buffer_t buffer ) { struct tile_descriptor *tile_desc = (struct tile_descriptor *)mem_get_region(PVR2_RAM_BASE + MMIO_READ( PVR2, RENDER_TILEBASE )); - uint32_t render_addr = MMIO_READ( PVR2, RENDER_ADDR1 ); - gboolean render_to_tex; - if( render_addr & 0x01000000 ) { - render_addr = (render_addr & 0x00FFFFFF) + PVR2_RAM_BASE_INT; - /* Heuristic - if we're rendering to the interlaced region we're - * probably creating a texture rather than rendering actual output. - * We can optimise for this case a little - */ - render_to_tex = TRUE; - WARN( "Render to texture not supported properly yet" ); - } else { - render_addr = (render_addr & 0x00FFFFFF) + PVR2_RAM_BASE; - render_to_tex = FALSE; - } - float bgplanez = 1/MMIO_READF( PVR2, RENDER_FARCLIP ); - uint32_t render_mode = MMIO_READ( PVR2, RENDER_MODE ); - int width, height; - pvr2_render_getsize( &width, &height ); - int colour_format = pvr2_render_colour_format[render_mode&0x07]; - pvr2_render_prepare_context( render_addr, width, height, colour_format, - bgplanez, 0, render_to_tex ); + pvr2_render_prepare_context( buffer, bgplanez, 0 ); int clip_x = MMIO_READ( PVR2, RENDER_HCLIP ) & 0x03FF; int clip_y = MMIO_READ( PVR2, RENDER_VCLIP ) & 0x03FF; int clip_width = ((MMIO_READ( PVR2, RENDER_HCLIP ) >> 16) & 0x03FF) - clip_x + 1; int clip_height= ((MMIO_READ( PVR2, RENDER_VCLIP ) >> 16) & 0x03FF) - clip_y + 1; - /* Fog setup goes here */ + /* Fog setup goes here? */ /* Render the background plane */ + uint32_t bgplane_mode = MMIO_READ(PVR2, RENDER_BGPLANE); uint32_t *display_list = (uint32_t *)mem_get_region(PVR2_RAM_BASE + MMIO_READ( PVR2, RENDER_POLYBASE )); uint32_t *bgplane = display_list + (((bgplane_mode & 0x00FFFFFF)) >> 3) ; - render_backplane( bgplane, width, height, bgplane_mode ); - - pvr2_render_tilebuffer( width, height, clip_x, clip_y, + render_backplane( bgplane, buffer->width, buffer->height, bgplane_mode ); + + pvr2_render_tilebuffer( buffer->width, buffer->height, clip_x, clip_y, clip_x + clip_width, clip_y + clip_height ); - - /* Post-render cleanup and update */ - - /* Add frame, fps, etc data */ - //glDrawGrid( width, height ); - glPrintf( 4, 16, "Frame %d", pvr2_get_frame_count() ); - /* Generate end of render event */ - asic_event( EVENT_PVR_RENDER_DONE ); - DEBUG( "Rendered frame %d to %08X", pvr2_get_frame_count(), render_addr ); + + DEBUG( "Rendered frame %d to %08X", pvr2_get_frame_count(), buffer->address ); }