--- a/src/pvr2/pvr2mem.c Mon May 12 10:00:13 2008 +0000 +++ b/src/pvr2/pvr2mem.c Mon Jul 14 07:44:42 2008 +0000 @@ -31,31 +31,31 @@ switch( destaddr & 0x13800000 ) { case 0x10000000: case 0x12000000: - pvr2_ta_write( src, count ); - break; + pvr2_ta_write( src, count ); + break; case 0x11000000: case 0x11800000: - region = MMIO_READ( ASIC, PVRDMARGN1 ); - if( region == 0 ) { - pvr2_vram64_write( destaddr, src, count ); - } else { - unsigned char *dest = mem_get_region(destaddr); - memcpy( dest, src, count ); - } - break; + region = MMIO_READ( ASIC, PVRDMARGN1 ); + if( region == 0 ) { + pvr2_vram64_write( destaddr, src, count ); + } else { + unsigned char *dest = mem_get_region(destaddr); + memcpy( dest, src, count ); + } + break; case 0x10800000: case 0x12800000: - pvr2_yuv_write( src, count ); - break; + pvr2_yuv_write( src, count ); + break; case 0x13000000: case 0x13800000: - region = MMIO_READ( ASIC, PVRDMARGN2 ); - if( region == 0 ) { - pvr2_vram64_write( destaddr, src, count ); - } else { - unsigned char *dest = mem_get_region(destaddr); - memcpy( dest, src, count ); - } + region = MMIO_READ( ASIC, PVRDMARGN2 ); + if( region == 0 ) { + pvr2_vram64_write( destaddr, src, count ); + } else { + unsigned char *dest = mem_get_region(destaddr); + memcpy( dest, src, count ); + } } } @@ -68,41 +68,41 @@ destaddr = destaddr & 0x7FFFFF; if( destaddr + length > 0x800000 ) { - length = 0x800000 - destaddr; + length = 0x800000 - destaddr; } for( i=destaddr & 0xFFFFF000; i < destaddr + length; i+= PAGE_SIZE ) { - texcache_invalidate_page( i ); + texcache_invalidate_page( i ); } banks[0] = ((uint32_t *)(video_base + ((destaddr & 0x007FFFF8) >>1))); banks[1] = banks[0] + 0x100000; if( bank_flag ) - banks[0]++; - + banks[0]++; + /* Handle non-aligned start of source */ if( destaddr & 0x03 ) { - unsigned char *dest = ((unsigned char *)banks[bank_flag]) + (destaddr & 0x03); - for( i= destaddr & 0x03; i < 4 && length > 0; i++, length-- ) { - *dest++ = *src++; - } - bank_flag = !bank_flag; + unsigned char *dest = ((unsigned char *)banks[bank_flag]) + (destaddr & 0x03); + for( i= destaddr & 0x03; i < 4 && length > 0; i++, length-- ) { + *dest++ = *src++; + } + bank_flag = !bank_flag; } dwsrc = (uint32_t *)src; while( length >= 4 ) { - *banks[bank_flag]++ = *dwsrc++; - bank_flag = !bank_flag; - length -= 4; + *banks[bank_flag]++ = *dwsrc++; + bank_flag = !bank_flag; + length -= 4; } - + /* Handle non-aligned end of source */ if( length ) { - src = (unsigned char *)dwsrc; - unsigned char *dest = (unsigned char *)banks[bank_flag]; - while( length-- > 0 ) { - *dest++ = *src++; - } + src = (unsigned char *)dwsrc; + unsigned char *dest = (unsigned char *)banks[bank_flag]; + while( length-- > 0 ) { + *dest++ = *src++; + } } } @@ -112,7 +112,7 @@ * must be multiples of 4. */ void pvr2_vram64_write_stride( sh4addr_t destaddr, unsigned char *src, uint32_t line_bytes, - uint32_t line_stride_bytes, uint32_t line_count ) + uint32_t line_stride_bytes, uint32_t line_count ) { int bank_flag = (destaddr & 0x04) >> 2; uint32_t *banks[2]; @@ -128,26 +128,26 @@ line_bytes >>= 2; for( i=destaddr & 0xFFFFF000; i < destaddr + line_stride_bytes*line_count; i+= PAGE_SIZE ) { - texcache_invalidate_page( i ); + texcache_invalidate_page( i ); } banks[0] = (uint32_t *)(video_base + (destaddr >>1)); banks[1] = banks[0] + 0x100000; if( bank_flag ) - banks[0]++; - + banks[0]++; + dwsrc = (uint32_t *)src; for( i=0; i> 2; uint32_t *banks[2]; @@ -171,35 +171,35 @@ srcaddr = srcaddr & 0x7FFFF8; if( src_line_bytes <= dest_line_bytes ) { - dest_line_gap = (dest_line_bytes - src_line_bytes) >> 2; - src_line_gap = 0; - src_line_gap_flag = 0; - line_bytes = src_line_bytes >> 2; + dest_line_gap = (dest_line_bytes - src_line_bytes) >> 2; + src_line_gap = 0; + src_line_gap_flag = 0; + line_bytes = src_line_bytes >> 2; } else { - i = (src_line_bytes - dest_line_bytes); - src_line_gap_flag = i & 0x04; - src_line_gap = i >> 3; - line_bytes = dest_line_bytes >> 2; + i = (src_line_bytes - dest_line_bytes); + src_line_gap_flag = i & 0x04; + src_line_gap = i >> 3; + line_bytes = dest_line_bytes >> 2; } - + banks[0] = (uint32_t *)(video_base + (srcaddr>>1)); banks[1] = banks[0] + 0x100000; if( bank_flag ) - banks[0]++; - + banks[0]++; + dwdest = (uint32_t *)dest; for( i=0; i> 1; - uint8_t t1 = *banks[offset<4?0:1]++; - uint8_t t2 = *banks[offset<3?0:1]++; - dest[y1*stride + x1] = (t1 & 0x0F) | (t2<<4); - dest[(y1+1)*stride + x1] = (t1>>4) | (t2&0xF0); + x1 = x1 >> 1; + uint8_t t1 = *banks[offset<4?0:1]++; + uint8_t t2 = *banks[offset<3?0:1]++; + dest[y1*stride + x1] = (t1 & 0x0F) | (t2<<4); + dest[(y1+1)*stride + x1] = (t1>>4) | (t2&0xF0); } else if( width == 4 ) { - pvr2_vram64_detwiddle_4( dest, banks, offset, x1, y1, 2, stride ); - pvr2_vram64_detwiddle_4( dest, banks, offset+2, x1, y1+2, 2, stride ); - pvr2_vram64_detwiddle_4( dest, banks, offset+4, x1+2, y1, 2, stride ); - pvr2_vram64_detwiddle_4( dest, banks, offset+6, x1+2, y1+2, 2, stride ); - + pvr2_vram64_detwiddle_4( dest, banks, offset, x1, y1, 2, stride ); + pvr2_vram64_detwiddle_4( dest, banks, offset+2, x1, y1+2, 2, stride ); + pvr2_vram64_detwiddle_4( dest, banks, offset+4, x1+2, y1, 2, stride ); + pvr2_vram64_detwiddle_4( dest, banks, offset+6, x1+2, y1+2, 2, stride ); + } else { - int subdivide = width >> 1; - pvr2_vram64_detwiddle_4( dest, banks, offset, x1, y1, subdivide, stride ); - pvr2_vram64_detwiddle_4( dest, banks, offset, x1, y1+subdivide, subdivide, stride ); - pvr2_vram64_detwiddle_4( dest, banks, offset, x1+subdivide, y1, subdivide, stride ); - pvr2_vram64_detwiddle_4( dest, banks, offset, x1+subdivide, y1+subdivide, subdivide, stride ); + int subdivide = width >> 1; + pvr2_vram64_detwiddle_4( dest, banks, offset, x1, y1, subdivide, stride ); + pvr2_vram64_detwiddle_4( dest, banks, offset, x1, y1+subdivide, subdivide, stride ); + pvr2_vram64_detwiddle_4( dest, banks, offset, x1+subdivide, y1, subdivide, stride ); + pvr2_vram64_detwiddle_4( dest, banks, offset, x1+subdivide, y1+subdivide, subdivide, stride ); } } @@ -249,22 +249,22 @@ */ static void pvr2_vram64_detwiddle_8( uint8_t *dest, uint8_t *banks[2], int offset, - int x1, int y1, int width, int stride ) + int x1, int y1, int width, int stride ) { if( width == 2 ) { - dest[y1*stride + x1] = *banks[0]++; - dest[(y1+1)*stride + x1] = *banks[offset<3?0:1]++; - dest[y1*stride + x1 + 1] = *banks[offset<2?0:1]++; - dest[(y1+1)*stride + x1 + 1] = *banks[offset==0?0:1]++; - uint8_t *tmp = banks[0]; /* swap banks */ - banks[0] = banks[1]; - banks[1] = tmp; + dest[y1*stride + x1] = *banks[0]++; + dest[(y1+1)*stride + x1] = *banks[offset<3?0:1]++; + dest[y1*stride + x1 + 1] = *banks[offset<2?0:1]++; + dest[(y1+1)*stride + x1 + 1] = *banks[offset==0?0:1]++; + uint8_t *tmp = banks[0]; /* swap banks */ + banks[0] = banks[1]; + banks[1] = tmp; } else { - int subdivide = width >> 1; - pvr2_vram64_detwiddle_8( dest, banks, offset, x1, y1, subdivide, stride ); - pvr2_vram64_detwiddle_8( dest, banks, offset, x1, y1+subdivide, subdivide, stride ); - pvr2_vram64_detwiddle_8( dest, banks, offset, x1+subdivide, y1, subdivide, stride ); - pvr2_vram64_detwiddle_8( dest, banks, offset, x1+subdivide, y1+subdivide, subdivide, stride ); + int subdivide = width >> 1; + pvr2_vram64_detwiddle_8( dest, banks, offset, x1, y1, subdivide, stride ); + pvr2_vram64_detwiddle_8( dest, banks, offset, x1, y1+subdivide, subdivide, stride ); + pvr2_vram64_detwiddle_8( dest, banks, offset, x1+subdivide, y1, subdivide, stride ); + pvr2_vram64_detwiddle_8( dest, banks, offset, x1+subdivide, y1+subdivide, subdivide, stride ); } } @@ -279,19 +279,19 @@ */ static void pvr2_vram64_detwiddle_16( uint16_t *dest, uint16_t *banks[2], int offset, - int x1, int y1, int width, int stride ) + int x1, int y1, int width, int stride ) { if( width == 2 ) { - dest[y1*stride + x1] = *banks[0]++; - dest[(y1+1)*stride + x1] = *banks[offset]++; - dest[y1*stride + x1 + 1] = *banks[1]++; - dest[(y1+1)*stride + x1 + 1] = *banks[offset^1]++; + dest[y1*stride + x1] = *banks[0]++; + dest[(y1+1)*stride + x1] = *banks[offset]++; + dest[y1*stride + x1 + 1] = *banks[1]++; + dest[(y1+1)*stride + x1 + 1] = *banks[offset^1]++; } else { - int subdivide = width >> 1; - pvr2_vram64_detwiddle_16( dest, banks, offset, x1, y1, subdivide, stride ); - pvr2_vram64_detwiddle_16( dest, banks, offset, x1, y1+subdivide, subdivide, stride ); - pvr2_vram64_detwiddle_16( dest, banks, offset, x1+subdivide, y1, subdivide, stride ); - pvr2_vram64_detwiddle_16( dest, banks, offset, x1+subdivide, y1+subdivide, subdivide, stride ); + int subdivide = width >> 1; + pvr2_vram64_detwiddle_16( dest, banks, offset, x1, y1, subdivide, stride ); + pvr2_vram64_detwiddle_16( dest, banks, offset, x1, y1+subdivide, subdivide, stride ); + pvr2_vram64_detwiddle_16( dest, banks, offset, x1+subdivide, y1, subdivide, stride ); + pvr2_vram64_detwiddle_16( dest, banks, offset, x1+subdivide, y1+subdivide, subdivide, stride ); } } @@ -316,25 +316,25 @@ banks[0] = (uint8_t *)(video_base + (srcaddr>>1)); banks[1] = banks[0] + 0x400000; if( offset_flag & 0x04 ) { // If source is not 64-bit aligned, swap the banks - uint8_t *tmp = banks[0]; - banks[0] = banks[1]; - banks[1] = tmp + 4; - offset_flag &= 0x03; + uint8_t *tmp = banks[0]; + banks[0] = banks[1]; + banks[1] = tmp + 4; + offset_flag &= 0x03; } banks[0] += offset_flag; if( width > height ) { - for( i=0; i width ) { - for( i=0; i>1)); banks[1] = banks[0] + 0x400000; if( offset_flag & 0x04 ) { // If source is not 64-bit aligned, swap the banks - uint8_t *tmp = banks[0]; - banks[0] = banks[1]; - banks[1] = tmp + 4; - offset_flag &= 0x03; + uint8_t *tmp = banks[0]; + banks[0] = banks[1]; + banks[1] = tmp + 4; + offset_flag &= 0x03; } banks[0] += offset_flag; if( width > height ) { - for( i=0; i width ) { - for( i=0; i>1)); banks[1] = banks[0] + 0x200000; if( offset_flag & 0x02 ) { // If source is not 64-bit aligned, swap the banks - uint16_t *tmp = banks[0]; - banks[0] = banks[1]; - banks[1] = tmp + 2; - offset_flag &= 0x01; + uint16_t *tmp = banks[0]; + banks[0] = banks[1]; + banks[1] = tmp + 2; + offset_flag &= 0x01; } banks[0] += offset_flag; - + if( width > height ) { - for( i=0; i width ) { - for( i=0; i= src ) { - memcpy( dest, p, line_length ); - p -= src_stride; - dest += line_length; + memcpy( dest, p, line_length ); + p -= src_stride; + dest += line_length; } } @@ -443,36 +443,36 @@ srcaddr = srcaddr & 0x7FFFFF; if( srcaddr + length > 0x800000 ) - length = 0x800000 - srcaddr; + length = 0x800000 - srcaddr; banks[0] = ((uint32_t *)(video_base + ((srcaddr&0x007FFFF8)>>1))); banks[1] = banks[0] + 0x100000; if( bank_flag ) - banks[0]++; - + banks[0]++; + /* Handle non-aligned start of source */ if( srcaddr & 0x03 ) { - char *src = ((char *)banks[bank_flag]) + (srcaddr & 0x03); - for( i= srcaddr & 0x03; i < 4 && length > 0; i++, length-- ) { - *dest++ = *src++; - } - bank_flag = !bank_flag; + char *src = ((char *)banks[bank_flag]) + (srcaddr & 0x03); + for( i= srcaddr & 0x03; i < 4 && length > 0; i++, length-- ) { + *dest++ = *src++; + } + bank_flag = !bank_flag; } dwdest = (uint32_t *)dest; while( length >= 4 ) { - *dwdest++ = *banks[bank_flag]++; - bank_flag = !bank_flag; - length -= 4; + *dwdest++ = *banks[bank_flag]++; + bank_flag = !bank_flag; + length -= 4; } - + /* Handle non-aligned end of source */ if( length ) { - dest = (unsigned char *)dwdest; - unsigned char *src = (unsigned char *)banks[bank_flag]; - while( length-- > 0 ) { - *dest++ = *src++; - } + dest = (unsigned char *)dwdest; + unsigned char *src = (unsigned char *)banks[bank_flag]; + while( length-- > 0 ) { + *dest++ = *src++; + } } } @@ -483,19 +483,19 @@ unsigned int i, j; if( f == NULL ) { - ERROR( "Unable to write to dump file '%s' (%s)", filename, strerror(errno) ); - return; + ERROR( "Unable to write to dump file '%s' (%s)", filename, strerror(errno) ); + return; } pvr2_vram64_read( (unsigned char *)tmp, addr, length ); fprintf( f, "%08X\n", addr ); for( i =0; i>2; i+=8 ) { - for( j=i; jaddress & 0xFF000000) == 0x04000000 ) { - /* Interlaced buffer. Go the double copy... :( */ - unsigned char target[buffer->size]; - display_driver->read_render_buffer( target, buffer, buffer->rowstride, buffer->colour_format ); - pvr2_vram64_write( buffer->address, target, buffer->size ); + /* Interlaced buffer. Go the double copy... :( */ + unsigned char target[buffer->size]; + display_driver->read_render_buffer( target, buffer, buffer->rowstride, buffer->colour_format ); + pvr2_vram64_write( buffer->address, target, buffer->size ); } else { - /* Regular buffer */ + /* Regular buffer */ unsigned char target[buffer->size]; - int line_size = buffer->width * colour_formats[buffer->colour_format].bpp; - display_driver->read_render_buffer( target, buffer, buffer->rowstride, buffer->colour_format ); + int line_size = buffer->width * colour_formats[buffer->colour_format].bpp; + display_driver->read_render_buffer( target, buffer, buffer->rowstride, buffer->colour_format ); if( (buffer->scale & 0xFFFF) == 0x0800 ) { pvr2_vram_write_invert( buffer->address, target, buffer->size, line_size, line_size << 1 ); } else {