nkeynes@185: /** nkeynes@561: * $Id$ nkeynes@185: * nkeynes@185: * PVR support code nkeynes@185: * nkeynes@185: * Copyright (c) 2006 Nathan Keynes. nkeynes@185: * nkeynes@185: * This program is free software; you can redistribute it and/or modify nkeynes@185: * it under the terms of the GNU General Public License as published by nkeynes@185: * the Free Software Foundation; either version 2 of the License, or nkeynes@185: * (at your option) any later version. nkeynes@185: * nkeynes@185: * This program is distributed in the hope that it will be useful, nkeynes@185: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@185: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@185: * GNU General Public License for more details. nkeynes@185: */ nkeynes@185: nkeynes@185: #define PVR_VRAM_BASE 0xA5000000 nkeynes@185: #define PVR_VRAM64_BASE 0xA4000000 nkeynes@185: nkeynes@185: nkeynes@185: #define TA_PIXFMT_RGB555 0 nkeynes@185: #define TA_PIXFMT_RGB565 1 nkeynes@185: #define TA_PIXFMT_ARGB4444 2 nkeynes@185: #define TA_PIXFMT_ARGB1555 3 nkeynes@185: #define TA_PIXFMT_RGB888 5 nkeynes@185: #define TA_PIXFMT_ARGB8888 6 nkeynes@185: #define TA_PIXFMT_DITHER 8 nkeynes@185: nkeynes@185: #define TA_CMD_POLYGON 0x80000000 nkeynes@185: #define TA_CMD_MODIFIER 0x80000000 nkeynes@185: #define TA_CMD_POLYGON_TYPE_OPAQUE (0<<24) nkeynes@185: #define TA_CMD_MODIFIER_TYPE_OPAQUE (1<<24) nkeynes@185: #define TA_CMD_POLYGON_TYPE_TRANSPARENT (2<<24) nkeynes@185: #define TA_CMD_MODIFIER_TYPE_TRANSPARENT (3<<24) nkeynes@185: #define TA_CMD_POLYGON_TYPE_PUNCHTHRU (4<<24) nkeynes@185: #define TA_CMD_POLYGON_SUBLIST 0x00800000 nkeynes@185: #define TA_CMD_POLYGON_STRIPLENGTH_1 (0<<18) nkeynes@185: #define TA_CMD_POLYGON_STRIPLENGTH_2 (1<<18) nkeynes@185: #define TA_CMD_POLYGON_STRIPLENGTH_4 (2<<18) nkeynes@185: #define TA_CMD_POLYGON_STRIPLENGTH_6 (3<<18) nkeynes@185: #define TA_CMD_POLYGON_USER_CLIP_INSIDE 0x00020000 nkeynes@185: #define TA_CMD_POLYGON_USER_CLIP_OUTSIDE 0x00030000 nkeynes@185: #define TA_CMD_POLYGON_AFFECTED_BY_MODIFIER 0x00000080 nkeynes@185: #define TA_CMD_POLYGON_CHEAP_SHADOW_MODIFIER 0x00000000 nkeynes@185: #define TA_CMD_POLYGON_NORMAL_MODIFIER 0x00000040 nkeynes@185: #define TA_CMD_POLYGON_PACKED_COLOUR (0<<4) nkeynes@185: #define TA_CMD_POLYGON_FLOAT_COLOUR (1<<4) nkeynes@185: #define TA_CMD_POLYGON_INTENSITY (2<<4) nkeynes@185: #define TA_CMD_POLYGON_PREVFACE_INTENSITY (3<<4) nkeynes@185: #define TA_CMD_POLYGON_TEXTURED 0x00000008 nkeynes@185: #define TA_CMD_POLYGON_SPECULAR_HIGHLIGHT 0x00000004 nkeynes@185: #define TA_CMD_POLYGON_GOURAUD_SHADING 0x00000002 nkeynes@185: #define TA_CMD_POLYGON_16BIT_UV 0x00000001 nkeynes@185: nkeynes@185: #define TA_POLYMODE1_Z_NEVER (0<<29) nkeynes@185: #define TA_POLYMODE1_Z_LESS (1<<29) nkeynes@185: #define TA_POLYMODE1_Z_EQUAL (2<<29) nkeynes@185: #define TA_POLYMODE1_Z_LESSEQUAL (3<<29) nkeynes@185: #define TA_POLYMODE1_Z_GREATER (4<<29) nkeynes@185: #define TA_POLYMODE1_Z_NOTEQUAL (5<<29) nkeynes@185: #define TA_POLYMODE1_Z_GREATEREQUAL (6<<29) nkeynes@185: #define TA_POLYMODE1_Z_ALWAYS (7<<29) nkeynes@185: #define TA_POLYMODE1_CULL_SMALL (1<<27) nkeynes@185: #define TA_POLYMODE1_CULL_CCW (2<<27) nkeynes@185: #define TA_POLYMODE1_CULL_CW (3<<27) nkeynes@185: #define TA_POLYMODE1_NO_Z_UPDATE 0x04000000 nkeynes@185: nkeynes@185: #define TA_POLYMODE2_BLEND_DEFAULT (0x20<<24) nkeynes@185: #define TA_POLYMODE2_FOG_TABLE (0<<22) nkeynes@185: #define TA_POLYMODE2_FOG_VERTEX (1<<22) nkeynes@185: #define TA_POLYMODE2_FOG_DISABLED (2<<22) nkeynes@185: #define TA_POLYMODE2_FOG_TABLE2 (3<<22) nkeynes@185: #define TA_POLYMODE2_CLAMP_COLOURS 0x00200000 nkeynes@185: #define TA_POLYMODE2_ENABLE_ALPHA 0x00100000 nkeynes@185: #define TA_POLYMODE2_DISABLE_TEXTURE_TRANSPARENCY 0x00080000 nkeynes@185: #define TA_POLYMODE2_TEXTURE_FLIP_U 0x00080000 nkeynes@185: #define TA_POLYMODE2_TEXTURE_FLIP_V 0x00040000 nkeynes@185: #define TA_POLYMODE2_TEXTURE_CLAMP_U 0x00020000 nkeynes@185: #define TA_POLYMODE2_TEXTURE_CLAMP_V 0x00010000 nkeynes@185: #define TA_POLYMODE2_TRILINEAR_FILTER 0x00004000 nkeynes@185: #define TA_POLYMODE2_BILINEAR_FILTER 0x00002000 nkeynes@185: nkeynes@185: #define TA_POLYMODE2_MIPMAP_D_0_25 (1<<8) nkeynes@185: #define TA_POLYMODE2_MIPMAP_D_0_50 (2<<8) nkeynes@185: #define TA_POLYMODE2_MIPMAP_D_0_75 (3<<8) nkeynes@185: #define TA_POLYMODE2_MIPMAP_D_1_00 (4<<8) nkeynes@185: #define TA_POLYMODE2_MIPMAP_D_1_25 (5<<8) nkeynes@185: #define TA_POLYMODE2_MIPMAP_D_1_50 (6<<8) nkeynes@185: #define TA_POLYMODE2_MIPMAP_D_1_75 (7<<8) nkeynes@185: #define TA_POLYMODE2_MIPMAP_D_2_00 (8<<8) nkeynes@185: #define TA_POLYMODE2_MIPMAP_D_2_25 (9<<8) nkeynes@185: #define TA_POLYMODE2_MIPMAP_D_2_50 (10<<8) nkeynes@185: #define TA_POLYMODE2_MIPMAP_D_2_75 (11<<8) nkeynes@185: #define TA_POLYMODE2_MIPMAP_D_3_00 (12<<8) nkeynes@185: #define TA_POLYMODE2_MIPMAP_D_3_25 (13<<8) nkeynes@185: #define TA_POLYMODE2_MIPMAP_D_3_50 (14<<8) nkeynes@185: #define TA_POLYMODE2_MIPMAP_D_3_75 (15<<8) nkeynes@185: #define TA_POLYMODE2_TEXTURE_REPLACE (0<<6) nkeynes@185: #define TA_POLYMODE2_TEXTURE_MODULATE (1<<6) nkeynes@185: #define TA_POLYMODE2_TEXTURE_DECAL (2<<6) nkeynes@185: #define TA_POLYMODE2_U_SIZE_8 (0<<3) nkeynes@185: #define TA_POLYMODE2_U_SIZE_16 (1<<3) nkeynes@185: #define TA_POLYMODE2_U_SIZE_32 (2<<3) nkeynes@185: #define TA_POLYMODE2_U_SIZE_64 (3<<3) nkeynes@185: #define TA_POLYMODE2_U_SIZE_128 (4<<3) nkeynes@185: #define TA_POLYMODE2_U_SIZE_256 (5<<3) nkeynes@185: #define TA_POLYMODE2_U_SIZE_512 (6<<3) nkeynes@185: #define TA_POLYMODE2_U_SIZE_1024 (7<<3) nkeynes@185: #define TA_POLYMODE2_V_SIZE_8 (0<<0) nkeynes@185: #define TA_POLYMODE2_V_SIZE_16 (1<<0) nkeynes@185: #define TA_POLYMODE2_V_SIZE_32 (2<<0) nkeynes@185: #define TA_POLYMODE2_V_SIZE_64 (3<<0) nkeynes@185: #define TA_POLYMODE2_V_SIZE_128 (4<<0) nkeynes@185: #define TA_POLYMODE2_V_SIZE_256 (5<<0) nkeynes@185: #define TA_POLYMODE2_V_SIZE_512 (6<<0) nkeynes@185: #define TA_POLYMODE2_V_SIZE_1024 (7<<0) nkeynes@185: #define TA_TEXTUREMODE_MIPMAP 0x80000000 nkeynes@185: #define TA_TEXTUREMODE_VQ_COMPRESSION 0x40000000 nkeynes@185: #define TA_TEXTUREMODE_ARGB1555 (0<<27) nkeynes@185: #define TA_TEXTUREMODE_RGB565 (1<<27) nkeynes@185: #define TA_TEXTUREMODE_ARGB4444 (2<<27) nkeynes@185: #define TA_TEXTUREMODE_YUV422 (3<<27) nkeynes@185: #define TA_TEXTUREMODE_BUMPMAP (4<<27) nkeynes@185: #define TA_TEXTUREMODE_CLUT4 (5<<27) nkeynes@185: #define TA_TEXTUREMODE_CLUT8 (6<<27) nkeynes@185: #define TA_TEXTUREMODE_CLUTBANK8(n) ((n)<<25) /* 0-3 */ nkeynes@185: #define TA_TEXTUREMODE_CLUTBANK4(n) ((n)<<21) /* 0-63 */ nkeynes@185: #define TA_TEXTUREMODE_TWIDDLED 0x00000000 nkeynes@185: #define TA_TEXTUREMODE_NON_TWIDDLED 0x04000000 nkeynes@185: #define TA_TEXTUREMODE_ADDRESS(a) ((((unsigned long)(void*)(a))&0x7fffff)>>3) nkeynes@185: #define TA_CMD_VERTEX 0xe0000000 nkeynes@185: #define TA_CMD_VERTEX_LAST 0xF0000000 /* end of strip */ nkeynes@185: nkeynes@190: #define GRID_SIZE( hres, vres ) (((((vres+31) / 32)-1)<<16)|((((hres+31) / 32)-1))) nkeynes@185: nkeynes@190: struct ta_config { nkeynes@190: unsigned int ta_cfg; nkeynes@190: unsigned int grid_size; nkeynes@190: unsigned int obj_start; nkeynes@190: unsigned int obj_end; nkeynes@190: unsigned int tile_start; nkeynes@190: unsigned int tile_end; nkeynes@190: unsigned int plist_start; nkeynes@190: }; nkeynes@185: nkeynes@213: struct render_config { nkeynes@213: unsigned int polybuf; nkeynes@213: unsigned int tilemap; nkeynes@213: unsigned int render_addr; nkeynes@213: unsigned int width, height; nkeynes@213: unsigned int mode; nkeynes@213: float farclip, nearclip; nkeynes@213: }; nkeynes@213: nkeynes@190: void ta_init( struct ta_config *config ); nkeynes@213: void ta_reinit(); nkeynes@185: void pvr_dump_objbuf( FILE *f ); nkeynes@185: void pvr_dump_tilebuf( FILE *f ); nkeynes@185: int pvr_get_objbuf_size(); nkeynes@213: int pvr_get_objbuf_posn(); nkeynes@190: int pvr_get_plist_posn(); nkeynes@213: void render_set_backplane( unsigned int mode ); nkeynes@213: void render_start( struct render_config *config ); nkeynes@213: void display_render( struct render_config *config ); nkeynes@213: void pvr_build_tilemap1( unsigned int addr, struct ta_config *config, unsigned int control_word ); nkeynes@213: nkeynes@213: void pvr_build_tilemap2( unsigned int addr, struct ta_config *config, unsigned int control_word );