revision 284:808617ee7135
summary |
tree |
shortlog |
changelog |
graph |
changeset |
raw | bz2 | zip | gz changeset | 284:808617ee7135 |
parent | 283:b1fbeaaff6bb |
child | 285:4fefedafebc6 |
author | nkeynes |
date | Mon Jan 15 08:32:09 2007 +0000 (17 years ago) |
Break vram routines out into pvr2mem.c
Initial (untested) implementation of stride textures
Hookup YUV converter code in pvr2.c
Initial (untested) implementation of stride textures
Hookup YUV converter code in pvr2.c
src/Makefile.am | view | annotate | diff | log | ||
src/Makefile.in | view | annotate | diff | log | ||
src/pvr2/pvr2.c | view | annotate | diff | log | ||
src/pvr2/pvr2.h | view | annotate | diff | log | ||
src/pvr2/pvr2mem.c | view | annotate | diff | log | ||
src/pvr2/texcache.c | view | annotate | diff | log | ||
src/pvr2/yuv.c | view | annotate | diff | log |
1.1 --- a/src/Makefile.am Mon Jan 15 08:30:50 2007 +00001.2 +++ b/src/Makefile.am Mon Jan 15 08:32:09 2007 +00001.3 @@ -21,7 +21,7 @@1.4 sh4/sh4mmio.c sh4/sh4mmio.h sh4/scif.c \1.5 aica/armcore.c aica/armcore.h aica/armdasm.c aica/armmem.c \1.6 aica/aica.c aica/aica.h aica/audio.c aica/audio.h \1.7 - pvr2/pvr2.c pvr2/pvr2.h \1.8 + pvr2/pvr2.c pvr2/pvr2.h pvr2/pvr2mem.c \1.9 pvr2/tacore.c pvr2/render.c pvr2/rendcore.c pvr2/rendbkg.c pvr2/rendsort.c \1.10 pvr2/texcache.c pvr2/yuv.c \1.11 maple/maple.c maple/maple.h \
2.1 --- a/src/Makefile.in Mon Jan 15 08:30:50 2007 +00002.2 +++ b/src/Makefile.in Mon Jan 15 08:32:09 2007 +00002.3 @@ -155,7 +155,7 @@2.4 sh4/sh4mmio.c sh4/sh4mmio.h sh4/scif.c \2.5 aica/armcore.c aica/armcore.h aica/armdasm.c aica/armmem.c \2.6 aica/aica.c aica/aica.h aica/audio.c aica/audio.h \2.7 - pvr2/pvr2.c pvr2/pvr2.h \2.8 + pvr2/pvr2.c pvr2/pvr2.h pvr2/pvr2mem.c \2.9 pvr2/tacore.c pvr2/render.c pvr2/rendcore.c pvr2/rendbkg.c pvr2/rendsort.c \2.10 pvr2/texcache.c pvr2/yuv.c \2.11 maple/maple.c maple/maple.h \2.12 @@ -192,16 +192,16 @@2.13 timer.$(OBJEXT) dmac.$(OBJEXT) sh4core.$(OBJEXT) \2.14 sh4dasm.$(OBJEXT) sh4mmio.$(OBJEXT) scif.$(OBJEXT) \2.15 armcore.$(OBJEXT) armdasm.$(OBJEXT) armmem.$(OBJEXT) \2.16 - aica.$(OBJEXT) audio.$(OBJEXT) pvr2.$(OBJEXT) tacore.$(OBJEXT) \2.17 - render.$(OBJEXT) rendcore.$(OBJEXT) rendbkg.$(OBJEXT) \2.18 - rendsort.$(OBJEXT) texcache.$(OBJEXT) yuv.$(OBJEXT) \2.19 - maple.$(OBJEXT) controller.$(OBJEXT) support.$(OBJEXT) \2.20 - interface.$(OBJEXT) callbacks.$(OBJEXT) gui.$(OBJEXT) \2.21 - mmr_win.$(OBJEXT) debug_win.$(OBJEXT) dump_win.$(OBJEXT) \2.22 - loader.$(OBJEXT) bootstrap.$(OBJEXT) util.$(OBJEXT) \2.23 - display.$(OBJEXT) audio_null.$(OBJEXT) audio_esd.$(OBJEXT) \2.24 - video_null.$(OBJEXT) video_gtk.$(OBJEXT) video_x11.$(OBJEXT) \2.25 - video_gl.$(OBJEXT)2.26 + aica.$(OBJEXT) audio.$(OBJEXT) pvr2.$(OBJEXT) pvr2mem.$(OBJEXT) \2.27 + tacore.$(OBJEXT) render.$(OBJEXT) rendcore.$(OBJEXT) \2.28 + rendbkg.$(OBJEXT) rendsort.$(OBJEXT) texcache.$(OBJEXT) \2.29 + yuv.$(OBJEXT) maple.$(OBJEXT) controller.$(OBJEXT) \2.30 + support.$(OBJEXT) interface.$(OBJEXT) callbacks.$(OBJEXT) \2.31 + gui.$(OBJEXT) mmr_win.$(OBJEXT) debug_win.$(OBJEXT) \2.32 + dump_win.$(OBJEXT) loader.$(OBJEXT) bootstrap.$(OBJEXT) \2.33 + util.$(OBJEXT) display.$(OBJEXT) audio_null.$(OBJEXT) \2.34 + audio_esd.$(OBJEXT) video_null.$(OBJEXT) video_gtk.$(OBJEXT) \2.35 + video_x11.$(OBJEXT) video_gl.$(OBJEXT)2.36 lxdream_OBJECTS = $(am_lxdream_OBJECTS)2.37 lxdream_DEPENDENCIES =2.38 lxdream_LDFLAGS =2.39 @@ -225,17 +225,18 @@2.40 @AMDEP_TRUE@ ./$(DEPDIR)/loader.Po ./$(DEPDIR)/main.Po \2.41 @AMDEP_TRUE@ ./$(DEPDIR)/maple.Po ./$(DEPDIR)/mem.Po \2.42 @AMDEP_TRUE@ ./$(DEPDIR)/mmr_win.Po ./$(DEPDIR)/nrg.Po \2.43 -@AMDEP_TRUE@ ./$(DEPDIR)/pvr2.Po ./$(DEPDIR)/rendbkg.Po \2.44 -@AMDEP_TRUE@ ./$(DEPDIR)/rendcore.Po ./$(DEPDIR)/render.Po \2.45 -@AMDEP_TRUE@ ./$(DEPDIR)/rendsort.Po ./$(DEPDIR)/scif.Po \2.46 -@AMDEP_TRUE@ ./$(DEPDIR)/sh4core.Po ./$(DEPDIR)/sh4dasm.Po \2.47 -@AMDEP_TRUE@ ./$(DEPDIR)/sh4mem.Po ./$(DEPDIR)/sh4mmio.Po \2.48 -@AMDEP_TRUE@ ./$(DEPDIR)/support.Po ./$(DEPDIR)/syscall.Po \2.49 -@AMDEP_TRUE@ ./$(DEPDIR)/tacore.Po ./$(DEPDIR)/texcache.Po \2.50 -@AMDEP_TRUE@ ./$(DEPDIR)/timer.Po ./$(DEPDIR)/util.Po \2.51 -@AMDEP_TRUE@ ./$(DEPDIR)/video_gl.Po ./$(DEPDIR)/video_gtk.Po \2.52 -@AMDEP_TRUE@ ./$(DEPDIR)/video_null.Po ./$(DEPDIR)/video_x11.Po \2.53 -@AMDEP_TRUE@ ./$(DEPDIR)/watch.Po ./$(DEPDIR)/yuv.Po2.54 +@AMDEP_TRUE@ ./$(DEPDIR)/pvr2.Po ./$(DEPDIR)/pvr2mem.Po \2.55 +@AMDEP_TRUE@ ./$(DEPDIR)/rendbkg.Po ./$(DEPDIR)/rendcore.Po \2.56 +@AMDEP_TRUE@ ./$(DEPDIR)/render.Po ./$(DEPDIR)/rendsort.Po \2.57 +@AMDEP_TRUE@ ./$(DEPDIR)/scif.Po ./$(DEPDIR)/sh4core.Po \2.58 +@AMDEP_TRUE@ ./$(DEPDIR)/sh4dasm.Po ./$(DEPDIR)/sh4mem.Po \2.59 +@AMDEP_TRUE@ ./$(DEPDIR)/sh4mmio.Po ./$(DEPDIR)/support.Po \2.60 +@AMDEP_TRUE@ ./$(DEPDIR)/syscall.Po ./$(DEPDIR)/tacore.Po \2.61 +@AMDEP_TRUE@ ./$(DEPDIR)/texcache.Po ./$(DEPDIR)/timer.Po \2.62 +@AMDEP_TRUE@ ./$(DEPDIR)/util.Po ./$(DEPDIR)/video_gl.Po \2.63 +@AMDEP_TRUE@ ./$(DEPDIR)/video_gtk.Po ./$(DEPDIR)/video_null.Po \2.64 +@AMDEP_TRUE@ ./$(DEPDIR)/video_x11.Po ./$(DEPDIR)/watch.Po \2.65 +@AMDEP_TRUE@ ./$(DEPDIR)/yuv.Po2.66 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \2.67 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)2.68 CCLD = $(CC)2.69 @@ -320,6 +321,7 @@2.70 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmr_win.Po@am__quote@2.71 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nrg.Po@am__quote@2.72 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pvr2.Po@am__quote@2.73 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pvr2mem.Po@am__quote@2.74 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rendbkg.Po@am__quote@2.75 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rendcore.Po@am__quote@2.76 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/render.Po@am__quote@2.77 @@ -782,6 +784,28 @@2.78 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@2.79 @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pvr2.obj `if test -f 'pvr2/pvr2.c'; then $(CYGPATH_W) 'pvr2/pvr2.c'; else $(CYGPATH_W) '$(srcdir)/pvr2/pvr2.c'; fi`2.81 +pvr2mem.o: pvr2/pvr2mem.c2.82 +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pvr2mem.o -MD -MP -MF "$(DEPDIR)/pvr2mem.Tpo" \2.83 +@am__fastdepCC_TRUE@ -c -o pvr2mem.o `test -f 'pvr2/pvr2mem.c' || echo '$(srcdir)/'`pvr2/pvr2mem.c; \2.84 +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/pvr2mem.Tpo" "$(DEPDIR)/pvr2mem.Po"; \2.85 +@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/pvr2mem.Tpo"; exit 1; \2.86 +@am__fastdepCC_TRUE@ fi2.87 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pvr2/pvr2mem.c' object='pvr2mem.o' libtool=no @AMDEPBACKSLASH@2.88 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/pvr2mem.Po' tmpdepfile='$(DEPDIR)/pvr2mem.TPo' @AMDEPBACKSLASH@2.89 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@2.90 +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pvr2mem.o `test -f 'pvr2/pvr2mem.c' || echo '$(srcdir)/'`pvr2/pvr2mem.c2.91 +2.92 +pvr2mem.obj: pvr2/pvr2mem.c2.93 +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pvr2mem.obj -MD -MP -MF "$(DEPDIR)/pvr2mem.Tpo" \2.94 +@am__fastdepCC_TRUE@ -c -o pvr2mem.obj `if test -f 'pvr2/pvr2mem.c'; then $(CYGPATH_W) 'pvr2/pvr2mem.c'; else $(CYGPATH_W) '$(srcdir)/pvr2/pvr2mem.c'; fi`; \2.95 +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/pvr2mem.Tpo" "$(DEPDIR)/pvr2mem.Po"; \2.96 +@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/pvr2mem.Tpo"; exit 1; \2.97 +@am__fastdepCC_TRUE@ fi2.98 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pvr2/pvr2mem.c' object='pvr2mem.obj' libtool=no @AMDEPBACKSLASH@2.99 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/pvr2mem.Po' tmpdepfile='$(DEPDIR)/pvr2mem.TPo' @AMDEPBACKSLASH@2.100 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@2.101 +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pvr2mem.obj `if test -f 'pvr2/pvr2mem.c'; then $(CYGPATH_W) 'pvr2/pvr2mem.c'; else $(CYGPATH_W) '$(srcdir)/pvr2/pvr2mem.c'; fi`2.102 +2.103 tacore.o: pvr2/tacore.c2.104 @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tacore.o -MD -MP -MF "$(DEPDIR)/tacore.Tpo" \2.105 @am__fastdepCC_TRUE@ -c -o tacore.o `test -f 'pvr2/tacore.c' || echo '$(srcdir)/'`pvr2/tacore.c; \
3.1 --- a/src/pvr2/pvr2.c Mon Jan 15 08:30:50 2007 +00003.2 +++ b/src/pvr2/pvr2.c Mon Jan 15 08:32:09 2007 +00003.3 @@ -1,5 +1,5 @@3.4 /**3.5 - * $Id: pvr2.c,v 1.38 2007-01-14 11:43:00 nkeynes Exp $3.6 + * $Id: pvr2.c,v 1.39 2007-01-15 08:32:09 nkeynes Exp $3.7 *3.8 * PVR2 (Video) Core module implementation and MMIO registers.3.9 *3.10 @@ -137,6 +137,8 @@3.11 pvr2_state.back_porch_ns = 4000;3.12 mmio_region_PVR2_write( DISP_TOTAL, 0x0270035F );3.13 mmio_region_PVR2_write( DISP_SYNCTIME, 0x07D6A53F );3.14 + mmio_region_PVR2_write( YUV_ADDR, 0 );3.15 + mmio_region_PVR2_write( YUV_CFG, 0 );3.16 video_buffer_idx = 0;3.18 pvr2_ta_init();3.19 @@ -466,18 +468,19 @@3.20 * 10: ???3.21 * 16: enable FSAA3.22 */3.23 - DEBUG( "Scaler config set to %08X", val );3.24 MMIO_WRITE( PVR2, reg, val&0x0007FFFF );3.25 break;3.27 case YUV_ADDR:3.28 - MMIO_WRITE( PVR2, reg, val&0x00FFFFF8 );3.29 + val = val & 0x00FFFFF8;3.30 + MMIO_WRITE( PVR2, reg, val );3.31 + pvr2_yuv_init( val );3.32 break;3.33 case YUV_CFG:3.34 MMIO_WRITE( PVR2, reg, val&0x01013F3F );3.35 + pvr2_yuv_set_config(val);3.36 break;3.38 -3.39 /**************** Unknowns ***************/3.40 case PVRUNK1:3.41 MMIO_WRITE( PVR2, reg, val&0x000007FF );3.42 @@ -634,155 +637,3 @@3.43 pvr2_ta_write( (char *)&val, sizeof(uint32_t) );3.44 }3.46 -3.47 -void pvr2_vram64_write( sh4addr_t destaddr, char *src, uint32_t length )3.48 -{3.49 - int bank_flag = (destaddr & 0x04) >> 2;3.50 - uint32_t *banks[2];3.51 - uint32_t *dwsrc;3.52 - int i;3.53 -3.54 - destaddr = destaddr & 0x7FFFFF;3.55 - if( destaddr + length > 0x800000 ) {3.56 - length = 0x800000 - destaddr;3.57 - }3.58 -3.59 - for( i=destaddr & 0xFFFFF000; i < destaddr + length; i+= PAGE_SIZE ) {3.60 - texcache_invalidate_page( i );3.61 - }3.62 -3.63 - banks[0] = ((uint32_t *)(video_base + ((destaddr & 0x007FFFF8) >>1)));3.64 - banks[1] = banks[0] + 0x100000;3.65 - if( bank_flag )3.66 - banks[0]++;3.67 -3.68 - /* Handle non-aligned start of source */3.69 - if( destaddr & 0x03 ) {3.70 - char *dest = ((char *)banks[bank_flag]) + (destaddr & 0x03);3.71 - for( i= destaddr & 0x03; i < 4 && length > 0; i++, length-- ) {3.72 - *dest++ = *src++;3.73 - }3.74 - bank_flag = !bank_flag;3.75 - }3.76 -3.77 - dwsrc = (uint32_t *)src;3.78 - while( length >= 4 ) {3.79 - *banks[bank_flag]++ = *dwsrc++;3.80 - bank_flag = !bank_flag;3.81 - length -= 4;3.82 - }3.83 -3.84 - /* Handle non-aligned end of source */3.85 - if( length ) {3.86 - src = (char *)dwsrc;3.87 - char *dest = (char *)banks[bank_flag];3.88 - while( length-- > 0 ) {3.89 - *dest++ = *src++;3.90 - }3.91 - }3.92 -}3.93 -3.94 -/**3.95 - * Write an image to 64-bit vram, with a line-stride different from the line-size.3.96 - * The destaddr must be 32-bit aligned, and both line_bytes and line_stride_bytes3.97 - * must be multiples of 4.3.98 - */3.99 -void pvr2_vram64_write_stride( sh4addr_t destaddr, char *src, uint32_t line_bytes,3.100 - uint32_t line_stride_bytes, uint32_t line_count )3.101 -{3.102 - int bank_flag = (destaddr & 0x04) >> 2;3.103 - uint32_t *banks[2];3.104 - uint32_t *dwsrc;3.105 - uint32_t line_gap;3.106 - int line_gap_flag;3.107 - int i,j;3.108 -3.109 - destaddr = destaddr & 0x7FFFF8;3.110 - i = line_stride_bytes - line_bytes;3.111 - line_gap_flag = i & 0x04;3.112 - line_gap = i >> 3;3.113 -3.114 -3.115 - for( i=destaddr & 0xFFFFF000; i < destaddr + line_stride_bytes*line_count; i+= PAGE_SIZE ) {3.116 - texcache_invalidate_page( i );3.117 - }3.118 -3.119 - banks[0] = (uint32_t *)(video_base + (destaddr >>1));3.120 - banks[1] = banks[0] + 0x100000;3.121 - if( bank_flag )3.122 - banks[0]++;3.123 -3.124 - dwsrc = (uint32_t *)src;3.125 - for( i=0; i<line_count; i++ ) {3.126 - for( j=0; j<line_bytes; j++ ) {3.127 - *banks[bank_flag]++ = *dwsrc++;3.128 - bank_flag = !bank_flag;3.129 - }3.130 - *banks[0] += line_gap;3.131 - *banks[1] += line_gap;3.132 - if( line_gap_flag ) {3.133 - *banks[bank_flag]++;3.134 - bank_flag = !bank_flag;3.135 - }3.136 - }3.137 -}3.138 -3.139 -void pvr2_vram_write_invert( sh4addr_t destaddr, char *src, uint32_t length, uint32_t line_length )3.140 -{3.141 - char *dest = video_base + (destaddr & 0x007FFFFF);3.142 - char *p = src + length - line_length;3.143 - while( p >= src ) {3.144 - memcpy( dest, p, line_length );3.145 - p -= line_length;3.146 - dest += line_length;3.147 - }3.148 -}3.149 -3.150 -void pvr2_vram64_read( char *dest, sh4addr_t srcaddr, uint32_t length )3.151 -{3.152 - int bank_flag = (srcaddr & 0x04) >> 2;3.153 - uint32_t *banks[2];3.154 - uint32_t *dwdest;3.155 - int i;3.156 -3.157 - srcaddr = srcaddr & 0x7FFFFF;3.158 - if( srcaddr + length > 0x800000 )3.159 - length = 0x800000 - srcaddr;3.160 -3.161 - banks[0] = ((uint32_t *)(video_base + ((srcaddr&0x007FFFF8)>>1)));3.162 - banks[1] = banks[0] + 0x100000;3.163 - if( bank_flag )3.164 - banks[0]++;3.165 -3.166 - /* Handle non-aligned start of source */3.167 - if( srcaddr & 0x03 ) {3.168 - char *src = ((char *)banks[bank_flag]) + (srcaddr & 0x03);3.169 - for( i= srcaddr & 0x03; i < 4 && length > 0; i++, length-- ) {3.170 - *dest++ = *src++;3.171 - }3.172 - bank_flag = !bank_flag;3.173 - }3.174 -3.175 - dwdest = (uint32_t *)dest;3.176 - while( length >= 4 ) {3.177 - *dwdest++ = *banks[bank_flag]++;3.178 - bank_flag = !bank_flag;3.179 - length -= 4;3.180 - }3.181 -3.182 - /* Handle non-aligned end of source */3.183 - if( length ) {3.184 - dest = (char *)dwdest;3.185 - char *src = (char *)banks[bank_flag];3.186 - while( length-- > 0 ) {3.187 - *dest++ = *src++;3.188 - }3.189 - }3.190 -}3.191 -3.192 -void pvr2_vram64_dump( sh4addr_t addr, uint32_t length, FILE *f )3.193 -{3.194 - char tmp[length];3.195 - pvr2_vram64_read( tmp, addr, length );3.196 - fwrite_dump( tmp, length, f );3.197 -}
4.1 --- a/src/pvr2/pvr2.h Mon Jan 15 08:30:50 2007 +00004.2 +++ b/src/pvr2/pvr2.h Mon Jan 15 08:32:09 2007 +00004.3 @@ -1,5 +1,5 @@4.4 /**4.5 - * $Id: pvr2.h,v 1.19 2007-01-14 11:43:00 nkeynes Exp $4.6 + * $Id: pvr2.h,v 1.20 2007-01-15 08:32:09 nkeynes Exp $4.7 *4.8 * PVR2 (video chip) functions and macros.4.9 *4.10 @@ -100,11 +100,13 @@4.11 #define PVR2_TEX_COMPRESSED 0x400000004.12 #define PVR2_TEX_FORMAT_MASK 0x380000004.13 #define PVR2_TEX_UNTWIDDLED 0x040000004.14 +#define PVR2_TEX_STRIDE 0x020000004.16 #define PVR2_TEX_ADDR(x) ( ((x)&0x01FFFFF)<<3 );4.17 #define PVR2_TEX_IS_MIPMAPPED(x) ( (x) & PVR2_TEX_MIPMAP )4.18 #define PVR2_TEX_IS_COMPRESSED(x) ( (x) & PVR2_TEX_COMPRESSED )4.19 #define PVR2_TEX_IS_TWIDDLED(x) (((x) & PVR2_TEX_UNTWIDDLED) == 0)4.20 +#define PVR2_TEX_IS_STRIDE(x) (((x) & 0x06000000) == 0x06000000)4.22 /****************************** Frame Buffer *****************************/4.24 @@ -126,6 +128,15 @@4.25 void pvr2_vram64_read( char *dest, sh4addr_t src, uint32_t length );4.27 /**4.28 + * Read an image from the interleaved memory address space (aka 64-bit address space)4.29 + * where the source and destination line sizes may differ. Note that both byte4.30 + * counts must be a multiple of 4, and the src address must be 32-bit aligned.4.31 + */4.32 +void pvr2_vram64_read_stride( char *dest, sh4addr_t src, uint32_t src_line_bytes,4.33 + uint32_t dest_line_bytes, uint32_t line_count );4.34 +4.35 +4.36 +/**4.37 * Dump a portion of vram to a stream from the interleaved memory address4.38 * space.4.39 */4.40 @@ -156,7 +167,9 @@4.41 /**4.42 * Initialize the YUV converter.4.43 */4.44 -void pvr2_yuv_init( uint32_t target_addr, uint32_t config );4.45 +void pvr2_yuv_init( uint32_t target_addr );4.46 +4.47 +void pvr2_yuv_set_config( uint32_t config );4.49 /********************************* Renderer ******************************/
5.1 --- /dev/null Thu Jan 01 00:00:00 1970 +00005.2 +++ b/src/pvr2/pvr2mem.c Mon Jan 15 08:32:09 2007 +00005.3 @@ -0,0 +1,225 @@5.4 +/**5.5 + * $Id: pvr2mem.c,v 1.1 2007-01-15 08:32:09 nkeynes Exp $5.6 + *5.7 + * PVR2 (Video) VRAM handling routines (mainly for the 64-bit region)5.8 + *5.9 + * Copyright (c) 2005 Nathan Keynes.5.10 + *5.11 + * This program is free software; you can redistribute it and/or modify5.12 + * it under the terms of the GNU General Public License as published by5.13 + * the Free Software Foundation; either version 2 of the License, or5.14 + * (at your option) any later version.5.15 + *5.16 + * This program is distributed in the hope that it will be useful,5.17 + * but WITHOUT ANY WARRANTY; without even the implied warranty of5.18 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the5.19 + * GNU General Public License for more details.5.20 + */5.21 +#include "pvr2.h"5.22 +5.23 +extern char *video_base;5.24 +5.25 +void pvr2_vram64_write( sh4addr_t destaddr, char *src, uint32_t length )5.26 +{5.27 + int bank_flag = (destaddr & 0x04) >> 2;5.28 + uint32_t *banks[2];5.29 + uint32_t *dwsrc;5.30 + int i;5.31 +5.32 + destaddr = destaddr & 0x7FFFFF;5.33 + if( destaddr + length > 0x800000 ) {5.34 + length = 0x800000 - destaddr;5.35 + }5.36 +5.37 + for( i=destaddr & 0xFFFFF000; i < destaddr + length; i+= PAGE_SIZE ) {5.38 + texcache_invalidate_page( i );5.39 + }5.40 +5.41 + banks[0] = ((uint32_t *)(video_base + ((destaddr & 0x007FFFF8) >>1)));5.42 + banks[1] = banks[0] + 0x100000;5.43 + if( bank_flag )5.44 + banks[0]++;5.45 +5.46 + /* Handle non-aligned start of source */5.47 + if( destaddr & 0x03 ) {5.48 + char *dest = ((char *)banks[bank_flag]) + (destaddr & 0x03);5.49 + for( i= destaddr & 0x03; i < 4 && length > 0; i++, length-- ) {5.50 + *dest++ = *src++;5.51 + }5.52 + bank_flag = !bank_flag;5.53 + }5.54 +5.55 + dwsrc = (uint32_t *)src;5.56 + while( length >= 4 ) {5.57 + *banks[bank_flag]++ = *dwsrc++;5.58 + bank_flag = !bank_flag;5.59 + length -= 4;5.60 + }5.61 +5.62 + /* Handle non-aligned end of source */5.63 + if( length ) {5.64 + src = (char *)dwsrc;5.65 + char *dest = (char *)banks[bank_flag];5.66 + while( length-- > 0 ) {5.67 + *dest++ = *src++;5.68 + }5.69 + }5.70 +}5.71 +5.72 +/**5.73 + * Write an image to 64-bit vram, with a line-stride different from the line-size.5.74 + * The destaddr must be 32-bit aligned, and both line_bytes and line_stride_bytes5.75 + * must be multiples of 4.5.76 + */5.77 +void pvr2_vram64_write_stride( sh4addr_t destaddr, char *src, uint32_t line_bytes,5.78 + uint32_t line_stride_bytes, uint32_t line_count )5.79 +{5.80 + int bank_flag = (destaddr & 0x04) >> 2;5.81 + uint32_t *banks[2];5.82 + uint32_t *dwsrc;5.83 + uint32_t line_gap;5.84 + int line_gap_flag;5.85 + int i,j;5.86 +5.87 + destaddr = destaddr & 0x7FFFF8;5.88 + i = line_stride_bytes - line_bytes;5.89 + line_gap_flag = i & 0x04;5.90 + line_gap = i >> 3;5.91 + line_bytes >>= 2;5.92 +5.93 + for( i=destaddr & 0xFFFFF000; i < destaddr + line_stride_bytes*line_count; i+= PAGE_SIZE ) {5.94 + texcache_invalidate_page( i );5.95 + }5.96 +5.97 + banks[0] = (uint32_t *)(video_base + (destaddr >>1));5.98 + banks[1] = banks[0] + 0x100000;5.99 + if( bank_flag )5.100 + banks[0]++;5.101 +5.102 + dwsrc = (uint32_t *)src;5.103 + for( i=0; i<line_count; i++ ) {5.104 + for( j=0; j<line_bytes; j++ ) {5.105 + *banks[bank_flag]++ = *dwsrc++;5.106 + bank_flag = !bank_flag;5.107 + }5.108 + *banks[0] += line_gap;5.109 + *banks[1] += line_gap;5.110 + if( line_gap_flag ) {5.111 + *banks[bank_flag]++;5.112 + bank_flag = !bank_flag;5.113 + }5.114 + }5.115 +}5.116 +5.117 +/**5.118 + * Read an image from 64-bit vram, with a destination line-stride different from the line-size.5.119 + * The srcaddr must be 32-bit aligned, and both line_bytes and line_stride_bytes5.120 + * must be multiples of 4. line_stride_bytes must be >= line_bytes.5.121 + * This method is used to extract a "stride" texture from vram.5.122 + */5.123 +void pvr2_vram64_read_stride( char *dest, uint32_t dest_line_bytes, sh4addr_t srcaddr,5.124 + uint32_t src_line_bytes, uint32_t line_count )5.125 +{5.126 + int bank_flag = (srcaddr & 0x04) >> 2;5.127 + uint32_t *banks[2];5.128 + uint32_t *dwdest;5.129 + uint32_t dest_line_gap;5.130 + uint32_t src_line_gap;5.131 + uint32_t line_bytes;5.132 + int src_line_gap_flag;5.133 + int i,j;5.134 +5.135 + srcaddr = srcaddr & 0x7FFFF8;5.136 + if( src_line_bytes <= dest_line_bytes ) {5.137 + dest_line_gap = (dest_line_bytes - src_line_bytes) >> 2;5.138 + src_line_gap = 0;5.139 + src_line_gap_flag = 0;5.140 + line_bytes = src_line_bytes >> 2;5.141 + } else {5.142 + i = (src_line_bytes - dest_line_bytes);5.143 + src_line_gap_flag = i & 0x04;5.144 + src_line_gap = i >> 3;5.145 + line_bytes = dest_line_bytes >> 2;5.146 + }5.147 +5.148 + banks[0] = (uint32_t *)(video_base + (srcaddr>>1));5.149 + banks[1] = banks[0] + 0x100000;5.150 + if( bank_flag )5.151 + banks[0]++;5.152 +5.153 + dwdest = (uint32_t *)dest;5.154 + for( i=0; i<line_count; i++ ) {5.155 + for( j=0; j<line_bytes; j++ ) {5.156 + *dwdest++ = *banks[bank_flag]++;5.157 + bank_flag = !bank_flag;5.158 + }5.159 + dwdest += dest_line_gap;5.160 + banks[0] += src_line_gap;5.161 + banks[1] += src_line_gap;5.162 + if( src_line_gap_flag ) {5.163 + banks[bank_flag]++;5.164 + bank_flag = !bank_flag;5.165 + }5.166 + }5.167 +5.168 +}5.169 +5.170 +void pvr2_vram_write_invert( sh4addr_t destaddr, char *src, uint32_t length, uint32_t line_length )5.171 +{5.172 + char *dest = video_base + (destaddr & 0x007FFFFF);5.173 + char *p = src + length - line_length;5.174 + while( p >= src ) {5.175 + memcpy( dest, p, line_length );5.176 + p -= line_length;5.177 + dest += line_length;5.178 + }5.179 +}5.180 +5.181 +void pvr2_vram64_read( char *dest, sh4addr_t srcaddr, uint32_t length )5.182 +{5.183 + int bank_flag = (srcaddr & 0x04) >> 2;5.184 + uint32_t *banks[2];5.185 + uint32_t *dwdest;5.186 + int i;5.187 +5.188 + srcaddr = srcaddr & 0x7FFFFF;5.189 + if( srcaddr + length > 0x800000 )5.190 + length = 0x800000 - srcaddr;5.191 +5.192 + banks[0] = ((uint32_t *)(video_base + ((srcaddr&0x007FFFF8)>>1)));5.193 + banks[1] = banks[0] + 0x100000;5.194 + if( bank_flag )5.195 + banks[0]++;5.196 +5.197 + /* Handle non-aligned start of source */5.198 + if( srcaddr & 0x03 ) {5.199 + char *src = ((char *)banks[bank_flag]) + (srcaddr & 0x03);5.200 + for( i= srcaddr & 0x03; i < 4 && length > 0; i++, length-- ) {5.201 + *dest++ = *src++;5.202 + }5.203 + bank_flag = !bank_flag;5.204 + }5.205 +5.206 + dwdest = (uint32_t *)dest;5.207 + while( length >= 4 ) {5.208 + *dwdest++ = *banks[bank_flag]++;5.209 + bank_flag = !bank_flag;5.210 + length -= 4;5.211 + }5.212 +5.213 + /* Handle non-aligned end of source */5.214 + if( length ) {5.215 + dest = (char *)dwdest;5.216 + char *src = (char *)banks[bank_flag];5.217 + while( length-- > 0 ) {5.218 + *dest++ = *src++;5.219 + }5.220 + }5.221 +}5.222 +5.223 +void pvr2_vram64_dump( sh4addr_t addr, uint32_t length, FILE *f )5.224 +{5.225 + char tmp[length];5.226 + pvr2_vram64_read( tmp, addr, length );5.227 + fwrite_dump( tmp, length, f );5.228 +}
6.1 --- a/src/pvr2/texcache.c Mon Jan 15 08:30:50 2007 +00006.2 +++ b/src/pvr2/texcache.c Mon Jan 15 08:32:09 2007 +00006.3 @@ -1,5 +1,5 @@6.4 /**6.5 - * $Id: texcache.c,v 1.10 2007-01-14 11:43:00 nkeynes Exp $6.6 + * $Id: texcache.c,v 1.11 2007-01-15 08:32:09 nkeynes Exp $6.7 *6.8 * Texture cache. Responsible for maintaining a working set of OpenGL6.9 * textures.6.10 @@ -322,8 +322,7 @@6.11 */6.12 static texcache_load_texture( uint32_t texture_addr, int width, int height,6.13 int mode ) {6.14 - uint32_t bytes = width * height;6.15 - int shift = 1;6.16 + int bpp_shift = 1; /* bytes per (output) pixel as a power of 2 */6.17 GLint intFormat, format, type;6.18 int tex_format = mode & PVR2_TEX_FORMAT_MASK;6.19 struct vq_codebook codebook;6.20 @@ -334,52 +333,54 @@6.21 case PVR2_TEX_FORMAT_IDX4:6.22 ERROR( "4-bit indexed textures not supported" );6.23 case PVR2_TEX_FORMAT_IDX8:6.24 + /* For indexed-colour modes, we need to lookup the palette control6.25 + * word to determine the de-indexed texture format.6.26 + */6.27 switch( MMIO_READ( PVR2, RENDER_PALETTE ) & 0x03 ) {6.28 case 0: /* ARGB1555 */6.29 intFormat = GL_RGB5_A1;6.30 format = GL_RGBA;6.31 type = GL_UNSIGNED_SHORT_1_5_5_5_REV;6.32 break;6.33 - case 1:6.34 + case 1: /* RGB565 */6.35 intFormat = GL_RGB;6.36 format = GL_RGB;6.37 type = GL_UNSIGNED_SHORT_5_6_5_REV;6.38 break;6.39 - case 2:6.40 + case 2: /* ARGB4444 */6.41 intFormat = GL_RGBA4;6.42 format = GL_BGRA;6.43 type = GL_UNSIGNED_SHORT_4_4_4_4_REV;6.44 break;6.45 - case 3:6.46 + case 3: /* ARGB8888 */6.47 intFormat = GL_RGBA8;6.48 format = GL_BGRA;6.49 type = GL_UNSIGNED_INT_8_8_8_8_REV;6.50 - shift = 2;6.51 + bpp_shift = 2;6.52 break;6.53 }6.54 - bytes <<= shift;6.55 break;6.57 case PVR2_TEX_FORMAT_ARGB1555:6.58 - bytes <<= 1;6.59 intFormat = GL_RGB5_A1;6.60 format = GL_RGBA;6.61 type = GL_UNSIGNED_SHORT_1_5_5_5_REV;6.62 break;6.63 case PVR2_TEX_FORMAT_RGB565:6.64 - bytes <<= 1;6.65 intFormat = GL_RGB;6.66 format = GL_RGB;6.67 type = GL_UNSIGNED_SHORT_5_6_5_REV;6.68 break;6.69 case PVR2_TEX_FORMAT_ARGB4444:6.70 - bytes <<= 1;6.71 intFormat = GL_RGBA4;6.72 format = GL_BGRA;6.73 type = GL_UNSIGNED_SHORT_4_4_4_4_REV;6.74 break;6.75 case PVR2_TEX_FORMAT_YUV422:6.76 - bytes <<= 2;6.77 + /* YUV422 isn't directly supported by most implementations, so decode6.78 + * it to a (reasonably) standard ARGB32.6.79 + */6.80 + bpp_shift = 2;6.81 intFormat = GL_RGBA8;6.82 format = GL_BGRA;6.83 type = GL_UNSIGNED_INT_8_8_8_8_REV;6.84 @@ -389,16 +390,33 @@6.85 break;6.86 }6.88 - int level=0, last_level = 0, mip_width = width, mip_height = height, mip_bytes = bytes;6.89 + if( PVR2_TEX_IS_STRIDE(mode) ) {6.90 + /* Stride textures cannot be mip-mapped, compressed, indexed or twiddled */6.91 + uint32_t stride = (MMIO_READ( PVR2, RENDER_TEXSIZE ) & 0x003F) << 5;6.92 + char data[(width*height) << bpp_shift];6.93 + if( tex_format == PVR2_TEX_FORMAT_YUV422 ) {6.94 + char tmp[(width*height)<<1];6.95 + pvr2_vram64_read_stride( &tmp, width<<1, texture_addr, stride<<1, height );6.96 + yuv_decode(width, height, &tmp, &data );6.97 + } else {6.98 + pvr2_vram64_read_stride( &data, width<<bpp_shift, texture_addr, stride<<bpp_shift, height );6.99 + }6.100 + glTexImage2D( GL_TEXTURE_2D, 0, intFormat, width, height, 0, format, type, data );6.101 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);6.102 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);6.103 + return;6.104 + }6.105 +6.106 + int level=0, last_level = 0, mip_width = width, mip_height = height, mip_bytes;6.107 if( PVR2_TEX_IS_MIPMAPPED(mode) ) {6.108 int i;6.109 for( i=0; 1<<(i+1) < width; i++ );6.110 last_level = i;6.111 mip_width = width >> i;6.112 mip_height= height >> i;6.113 - mip_bytes = bytes >> (i*2);6.114 filter = GL_LINEAR_MIPMAP_LINEAR;6.115 }6.116 + mip_bytes = (mip_width * mip_width) << bpp_shift;6.118 if( PVR2_TEX_IS_COMPRESSED(mode) ) {6.119 uint16_t tmp[VQ_CODEBOOK_SIZE];6.120 @@ -411,13 +429,13 @@6.121 char data[mip_bytes];6.122 /* load data from image, detwiddling/uncompressing as required */6.123 if( tex_format == PVR2_TEX_FORMAT_IDX8 ) {6.124 - int inputlength = mip_bytes >> shift;6.125 + int inputlength = mip_bytes >> bpp_shift;6.126 int bank = (mode >> 25) &0x03;6.127 - char *palette = mmio_region_PVR2PAL.mem + (bank * (256 << shift));6.128 + char *palette = mmio_region_PVR2PAL.mem + (bank * (256 << bpp_shift));6.129 char tmp[inputlength];6.130 char *p = tmp;6.131 pvr2_vram64_read( tmp, texture_addr, inputlength );6.132 - if( shift == 2 ) {6.133 + if( bpp_shift == 2 ) {6.134 detwiddle_pal8_to_32( 0, 0, mip_width, mip_width, &p,6.135 (uint32_t *)data, (uint32_t *)palette );6.136 } else {
7.1 --- a/src/pvr2/yuv.c Mon Jan 15 08:30:50 2007 +00007.2 +++ b/src/pvr2/yuv.c Mon Jan 15 08:32:09 2007 +00007.3 @@ -1,5 +1,5 @@7.4 /**7.5 - * $Id: yuv.c,v 1.2 2007-01-14 11:43:00 nkeynes Exp $7.6 + * $Id: yuv.c,v 1.3 2007-01-15 08:32:09 nkeynes Exp $7.7 *7.8 * YUV420 and YUV422 decoding7.9 *7.10 @@ -101,6 +101,7 @@7.11 pvr2_yuv_state.y++;7.12 if( pvr2_yuv_state.y >= pvr2_yuv_state.height ) {7.13 asic_event( EVENT_PVR_YUV_DONE );7.14 + pvr2_yuv_state.y = 0;7.15 }7.16 }7.18 @@ -140,18 +141,22 @@7.19 }7.20 }7.22 -void pvr2_yuv_init( uint32_t target, uint32_t config )7.23 +void pvr2_yuv_init( uint32_t target )7.24 {7.25 pvr2_yuv_state.target = target;7.26 - pvr2_yuv_state.width = (config & 0x3f) + 1;7.27 - pvr2_yuv_state.height = ((config>>8) & 0x3f) +1;7.28 pvr2_yuv_state.x = 0;7.29 pvr2_yuv_state.y = 0;7.30 pvr2_yuv_state.data_length = 0;7.31 - pvr2_yuv_state.input_format = (config & 0x01000000) ? FORMAT_YUV420 : FORMAT_YUV422;7.32 + MMIO_WRITE( PVR2, YUV_COUNT, 0 );7.33 +}7.34 +7.35 +void pvr2_yuv_set_config( uint32_t config )7.36 +{7.37 + pvr2_yuv_state.width = (config & 0x3f) + 1;7.38 + pvr2_yuv_state.height = ((config>>8) & 0x3f) +1;7.39 + pvr2_yuv_state.input_format = (config & 0x01000000) ? FORMAT_YUV422 : FORMAT_YUV420;7.40 if( config & 0x00010000 ) {7.41 pvr2_yuv_state.height *= pvr2_yuv_state.width;7.42 pvr2_yuv_state.width = 1;7.43 }7.44 - MMIO_WRITE( PVR2, YUV_COUNT, 0 );7.45 }
.