1.1 --- a/src/pvr2/pvr2mem.c Thu Sep 11 22:51:24 2008 +0000
1.2 +++ b/src/pvr2/pvr2mem.c Fri Sep 12 05:36:00 2008 +0000
1.3 @@ -430,15 +430,40 @@
1.7 -void pvr2_vram_write_invert( sh4addr_t destaddr, unsigned char *src, uint32_t length, uint32_t line_length,
1.8 +static void pvr2_vram_write_invert( sh4addr_t destaddr, unsigned char *src, uint32_t src_size,
1.9 + uint32_t line_size, uint32_t dest_stride,
1.10 uint32_t src_stride )
1.12 unsigned char *dest = video_base + (destaddr & 0x007FFFFF);
1.13 - unsigned char *p = src + length - src_stride;
1.14 + unsigned char *p = src + src_size - src_stride;
1.16 - memcpy( dest, p, line_length );
1.17 + memcpy( dest, p, line_size );
1.19 - dest += line_length;
1.20 + dest += dest_stride;
1.25 + * Copy a pixel buffer to vram, flipping and scaling at the same time. This
1.26 + * is not massively efficient, but it's used pretty rarely.
1.28 +static void pvr2_vram_write_invert_hscale( sh4addr_t destaddr, unsigned char *src, uint32_t src_size,
1.29 + uint32_t line_size, uint32_t dest_stride,
1.30 + uint32_t src_stride, int bpp )
1.32 + unsigned char *dest = video_base + (destaddr & 0x007FFFFF);
1.33 + unsigned char *p = src + src_size - src_stride;
1.34 + while( p >= src ) {
1.35 + unsigned char *s = p, *d = dest;
1.37 + while( s < p+line_size ) {
1.38 + for( i=0; i<bpp; i++ ) {
1.44 + dest += dest_stride;
1.48 @@ -535,13 +560,21 @@
1.49 pvr2_vram64_write( buffer->address, target, buffer->size );
1.51 /* Regular buffer */
1.52 - unsigned char target[buffer->size];
1.53 int line_size = buffer->width * colour_formats[buffer->colour_format].bpp;
1.54 - display_driver->read_render_buffer( target, buffer, buffer->rowstride, buffer->colour_format );
1.55 - if( (buffer->scale & 0xFFFF) == 0x0800 ) {
1.56 - pvr2_vram_write_invert( buffer->address, target, buffer->size, line_size, line_size << 1 );
1.57 + int src_stride = line_size;
1.58 + if( (buffer->scale & 0xFFFF) == 0x0800 )
1.61 + if( buffer->scale & SCALER_HSCALE ) {
1.62 + unsigned char target[buffer->size];
1.63 + display_driver->read_render_buffer( target, buffer, line_size, buffer->colour_format );
1.64 + pvr2_vram_write_invert_hscale( buffer->address, target, buffer->size, line_size, buffer->rowstride,
1.65 + src_stride, colour_formats[buffer->colour_format].bpp );
1.67 - pvr2_vram_write_invert( buffer->address, target, buffer->size, line_size, line_size );
1.68 + unsigned char target[buffer->size];
1.69 + display_driver->read_render_buffer( target, buffer, line_size, buffer->colour_format );
1.70 + pvr2_vram_write_invert( buffer->address, target, buffer->size, line_size, buffer->rowstride,
1.74 buffer->flushed = TRUE;