filename | test/pvr.c |
changeset | 213:da6b1904f67b |
prev | 190:f7653df5e832 |
next | 306:818c11570593 |
author | nkeynes |
date | Wed Jan 03 09:03:50 2007 +0000 (17 years ago) |
permissions | -rw-r--r-- |
last change | Fix to actually work (need the write read/write sizes) Implement the microsecond conversion function |
file | annotate | diff | log | raw |
1.1 --- a/test/pvr.c Wed Aug 02 04:13:15 2006 +00001.2 +++ b/test/pvr.c Wed Jan 03 09:03:50 2007 +00001.3 @@ -1,5 +1,5 @@1.4 /**1.5 - * $Id: pvr.c,v 1.2 2006-08-02 04:13:15 nkeynes Exp $1.6 + * $Id: pvr.c,v 1.3 2006-08-18 09:33:19 nkeynes Exp $1.7 *1.8 * PVR support code1.9 *1.10 @@ -30,8 +30,26 @@1.11 #define TA_OBJPOSN (PVR_BASE+0x138)1.12 #define TA_SIZE (PVR_BASE+0x13C)1.13 #define TA_TILECFG (PVR_BASE+0x140)1.14 +#define TA_REINIT (PVR_BASE+0x160)1.15 #define TA_PLISTSTART (PVR_BASE+0x164)1.17 +#define RENDER_START (PVR_BASE+0x014)1.18 +#define RENDER_POLYBASE (PVR_BASE+0x020)1.19 +#define RENDER_TILEBASE (PVR_BASE+0x02C)1.20 +#define RENDER_MODE (PVR_BASE+0x048)1.21 +#define RENDER_SIZE (PVR_BASE+0x04C)1.22 +#define RENDER_ADDR1 (PVR_BASE+0x060)1.23 +#define RENDER_ADDR2 (PVR_BASE+0x064)1.24 +#define RENDER_HCLIP (PVR_BASE+0x068)1.25 +#define RENDER_VCLIP (PVR_BASE+0x06C)1.26 +#define RENDER_NEARCLIP (PVR_BASE+0x078)1.27 +#define RENDER_FARCLIP (PVR_BASE+0x088)1.28 +#define RENDER_BGPLANE (PVR_BASE+0x08C)1.29 +1.30 +#define DISPLAY_MODE (PVR_BASE+0x044)1.31 +#define DISPLAY_ADDR1 (PVR_BASE+0x050)1.32 +#define DISPLAY_ADDR2 (PVR_BASE+0x054)1.33 +#define DISPLAY_SIZE (PVR_BASE+0x05C1.35 void ta_dump_regs( FILE *f )1.36 {1.37 @@ -59,11 +77,21 @@1.38 long_write( TA_INIT, 0x80000000 );1.39 }1.41 +void ta_reinit( )1.42 +{1.43 + long_write( TA_REINIT, 0x80000000 );1.44 +}1.45 +1.46 int pvr_get_objbuf_size( )1.47 {1.48 return long_read( TA_OBJPOSN ) - long_read( TA_OBJSTART );1.49 }1.51 +int pvr_get_objbuf_posn( )1.52 +{1.53 + return long_read( TA_OBJPOSN );1.54 +}1.55 +1.56 int pvr_get_plist_posn( )1.57 {1.58 unsigned int addr = long_read( TA_TILEPOSN ) << 2;1.59 @@ -108,6 +136,138 @@1.60 fwrite_dump( f, buf, length );1.61 }1.63 +static int ta_tile_sizes[4] = { 0, 32, 64, 128 };1.64 +#define TILE_SIZE(cfg, tile) ta_tile_sizes[((((cfg->ta_cfg) >> (4*tile))&0x03))]1.65 +#define TILE_ENABLED(cfg, tile) ((((cfg->ta_cfg) >> (4*tile))&0x03) != 0)1.66 +void pvr_compute_tilematrix_addr( int *tile_ptrs, struct ta_config *config ) {1.67 + int tile_sizes[5], i;1.68 + int hsegs = (config->grid_size & 0xFFFF)+1;1.69 + int vsegs = (config->grid_size >> 16) + 1;1.70 + for( i=0; i<5; i++ ) {1.71 + tile_sizes[i] = TILE_SIZE(config,i);1.72 + }1.73 + tile_ptrs[0] = config->tile_start;1.74 + tile_ptrs[1] = tile_ptrs[0] + (hsegs*vsegs*tile_sizes[0]);1.75 + tile_ptrs[2] = tile_ptrs[1] + (hsegs*vsegs*tile_sizes[1]);1.76 + tile_ptrs[3] = tile_ptrs[2] + (hsegs*vsegs*tile_sizes[2]);1.77 + tile_ptrs[4] = tile_ptrs[3] + (hsegs*vsegs*tile_sizes[3]);1.78 +}1.79 +1.80 +static uint32_t *pvr_compute_tile_ptrs( uint32_t *target, struct ta_config *config, int x, int y )1.81 +{1.82 + int i;1.83 + int cfg = config->ta_cfg;1.84 + int hsegs = (config->grid_size & 0xFFFF)+1;1.85 + int vsegs = (config->grid_size >> 16) + 1;1.86 + int tilematrix = config->tile_start;1.87 + for( i=0; i<5; i++ ) {1.88 + if( cfg & 0x03 ) {1.89 + int tile_size = ta_tile_sizes[cfg&0x03];1.90 + *target++ = tilematrix + (((y*hsegs)+x)*tile_size);1.91 + tilematrix += hsegs*vsegs*tile_size;1.92 + } else {1.93 + *target++ = 0x80000000;1.94 + }1.95 + cfg = cfg >> 4;1.96 + }1.97 + return target;1.98 +}1.99 +1.100 +void pvr_build_tilemap1( uint32_t addr, struct ta_config *config, uint32_t control_word )1.101 +{1.102 + uint32_t *dest = (uint32_t *)(PVR_VRAM_BASE+addr);1.103 + int w = (config->grid_size & 0x0000FFFF) + 1;1.104 + int h = (config->grid_size >> 16) + 1;1.105 +1.106 + int x,y;1.107 + memset( (char *)(dest-18), 0, 18*4 );1.108 + *dest++ = 0x10000000;1.109 + *dest++ = 0x80000000;1.110 + *dest++ = 0x80000000;1.111 + *dest++ = 0x80000000;1.112 + *dest++ = 0x80000000;1.113 + *dest++ = 0x80000000;1.114 + for( x=0; x<w; x++ ) {1.115 + for( y=0; y<h; y++ ) {1.116 + *dest++ = control_word | (y << 8) | (x << 2);1.117 + dest = pvr_compute_tile_ptrs(dest, config, x, y);1.118 + }1.119 + }1.120 + dest[-6] |= 0x80000000; /* End-of-render */1.121 +}1.122 +1.123 +void pvr_build_tilemap2( uint32_t addr, struct ta_config *config, uint32_t control_word )1.124 +{1.125 + uint32_t *dest = (uint32_t *)(PVR_VRAM_BASE+addr);1.126 + int w = (config->grid_size & 0x0000FFFF) + 1;1.127 + int h = (config->grid_size >> 16) + 1;1.128 +1.129 + int x,y;1.130 + *dest++ = 0x10000000;1.131 + *dest++ = 0x80000000;1.132 + *dest++ = 0x80000000;1.133 + *dest++ = 0x80000000;1.134 + *dest++ = 0x80000000;1.135 + *dest++ = 0x80000000;1.136 + for( x=0; x<w; x++ ) {1.137 + for( y=0; y<h; y++ ) {1.138 + *dest++ = 0x40000000;1.139 + *dest++ = 0x80000000;1.140 + *dest++ = 0x80000000;1.141 + *dest++ = 0x80000000;1.142 + *dest++ = 0x80000000;1.143 + *dest++ = 0x80000000;1.144 + *dest++ = control_word | (y << 8) | (x << 2);1.145 + dest = pvr_compute_tile_ptrs(dest, config, x, y);1.146 + }1.147 + }1.148 + dest[-6] |= 0x80000000; /* End-of-render */1.149 +}1.150 +1.151 +void render_set_backplane( uint32_t mode )1.152 +{1.153 + long_write( RENDER_BGPLANE, mode );1.154 +}1.155 +1.156 +int get_line_size( struct render_config *config )1.157 +{1.158 + int modulo = config->width;1.159 + switch( config->mode & 0x07 ) {1.160 + case 4:1.161 + modulo *= 3; /* ??? */1.162 + break;1.163 + case 5:1.164 + case 6:1.165 + modulo *= 4;1.166 + break;1.167 + default:1.168 + modulo *= 2;1.169 + }1.170 + return modulo;1.171 +}1.172 +1.173 +void render_start( struct render_config *config )1.174 +{1.175 + int modulo = get_line_size( config );1.176 + long_write( RENDER_POLYBASE, config->polybuf );1.177 + long_write( RENDER_TILEBASE, config->tilemap );1.178 + long_write( RENDER_ADDR1, config->render_addr );1.179 + long_write( RENDER_SIZE, modulo >> 3 );1.180 + long_write( RENDER_ADDR2, config->render_addr + modulo ); /* Not used? */1.181 + long_write( RENDER_HCLIP, (config->width - 1) << 16 );1.182 + long_write( RENDER_VCLIP, (config->height - 1) << 16 );1.183 + long_write( RENDER_MODE, config->mode );1.184 + float_write( RENDER_FARCLIP, config->farclip );1.185 + float_write( RENDER_NEARCLIP, config->nearclip );1.186 + long_write( RENDER_START, 0xFFFFFFFF );1.187 +}1.188 +1.189 +void display_render( struct render_config *config )1.190 +{1.191 + long_write( DISPLAY_ADDR1, config->render_addr );1.192 + long_write( DISPLAY_ADDR2, config->render_addr + get_line_size(config) );1.193 +}1.194 +1.195 /************** Stolen from TATEST *************/1.197 static unsigned int three_d_params[] = {
.