1c0e09200SDave Airlie /************************************************************************** 2c0e09200SDave Airlie 3c0e09200SDave Airlie Copyright (C) 2004-2005 Nicolai Haehnle et al. 4c0e09200SDave Airlie 5c0e09200SDave Airlie Permission is hereby granted, free of charge, to any person obtaining a 6c0e09200SDave Airlie copy of this software and associated documentation files (the "Software"), 7c0e09200SDave Airlie to deal in the Software without restriction, including without limitation 8c0e09200SDave Airlie on the rights to use, copy, modify, merge, publish, distribute, sub 9c0e09200SDave Airlie license, and/or sell copies of the Software, and to permit persons to whom 10c0e09200SDave Airlie the Software is furnished to do so, subject to the following conditions: 11c0e09200SDave Airlie 12c0e09200SDave Airlie The above copyright notice and this permission notice (including the next 13c0e09200SDave Airlie paragraph) shall be included in all copies or substantial portions of the 14c0e09200SDave Airlie Software. 15c0e09200SDave Airlie 16c0e09200SDave Airlie THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17c0e09200SDave Airlie IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18c0e09200SDave Airlie FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19c0e09200SDave Airlie THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 20c0e09200SDave Airlie DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 21c0e09200SDave Airlie OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 22c0e09200SDave Airlie USE OR OTHER DEALINGS IN THE SOFTWARE. 23c0e09200SDave Airlie 24c0e09200SDave Airlie **************************************************************************/ 25c0e09200SDave Airlie 26c0e09200SDave Airlie #ifndef _R300_REG_H 27c0e09200SDave Airlie #define _R300_REG_H 28c0e09200SDave Airlie 29c0e09200SDave Airlie #define R300_MC_INIT_MISC_LAT_TIMER 0x180 30c0e09200SDave Airlie # define R300_MC_MISC__MC_CPR_INIT_LAT_SHIFT 0 31c0e09200SDave Airlie # define R300_MC_MISC__MC_VF_INIT_LAT_SHIFT 4 32c0e09200SDave Airlie # define R300_MC_MISC__MC_DISP0R_INIT_LAT_SHIFT 8 33c0e09200SDave Airlie # define R300_MC_MISC__MC_DISP1R_INIT_LAT_SHIFT 12 34c0e09200SDave Airlie # define R300_MC_MISC__MC_FIXED_INIT_LAT_SHIFT 16 35c0e09200SDave Airlie # define R300_MC_MISC__MC_E2R_INIT_LAT_SHIFT 20 36c0e09200SDave Airlie # define R300_MC_MISC__MC_SAME_PAGE_PRIO_SHIFT 24 37c0e09200SDave Airlie # define R300_MC_MISC__MC_GLOBW_INIT_LAT_SHIFT 28 38c0e09200SDave Airlie 39c0e09200SDave Airlie #define R300_MC_INIT_GFX_LAT_TIMER 0x154 40c0e09200SDave Airlie # define R300_MC_MISC__MC_G3D0R_INIT_LAT_SHIFT 0 41c0e09200SDave Airlie # define R300_MC_MISC__MC_G3D1R_INIT_LAT_SHIFT 4 42c0e09200SDave Airlie # define R300_MC_MISC__MC_G3D2R_INIT_LAT_SHIFT 8 43c0e09200SDave Airlie # define R300_MC_MISC__MC_G3D3R_INIT_LAT_SHIFT 12 44c0e09200SDave Airlie # define R300_MC_MISC__MC_TX0R_INIT_LAT_SHIFT 16 45c0e09200SDave Airlie # define R300_MC_MISC__MC_TX1R_INIT_LAT_SHIFT 20 46c0e09200SDave Airlie # define R300_MC_MISC__MC_GLOBR_INIT_LAT_SHIFT 24 47c0e09200SDave Airlie # define R300_MC_MISC__MC_GLOBW_FULL_LAT_SHIFT 28 48c0e09200SDave Airlie 49c0e09200SDave Airlie /* 50c0e09200SDave Airlie * This file contains registers and constants for the R300. They have been 51c0e09200SDave Airlie * found mostly by examining command buffers captured using glxtest, as well 52c0e09200SDave Airlie * as by extrapolating some known registers and constants from the R200. 53c0e09200SDave Airlie * I am fairly certain that they are correct unless stated otherwise 54c0e09200SDave Airlie * in comments. 55c0e09200SDave Airlie */ 56c0e09200SDave Airlie 57c0e09200SDave Airlie #define R300_SE_VPORT_XSCALE 0x1D98 58c0e09200SDave Airlie #define R300_SE_VPORT_XOFFSET 0x1D9C 59c0e09200SDave Airlie #define R300_SE_VPORT_YSCALE 0x1DA0 60c0e09200SDave Airlie #define R300_SE_VPORT_YOFFSET 0x1DA4 61c0e09200SDave Airlie #define R300_SE_VPORT_ZSCALE 0x1DA8 62c0e09200SDave Airlie #define R300_SE_VPORT_ZOFFSET 0x1DAC 63c0e09200SDave Airlie 64c0e09200SDave Airlie 65c0e09200SDave Airlie /* 66c0e09200SDave Airlie * Vertex Array Processing (VAP) Control 67c0e09200SDave Airlie * Stolen from r200 code from Christoph Brill (It's a guess!) 68c0e09200SDave Airlie */ 69c0e09200SDave Airlie #define R300_VAP_CNTL 0x2080 70c0e09200SDave Airlie 71c0e09200SDave Airlie /* This register is written directly and also starts data section 72c0e09200SDave Airlie * in many 3d CP_PACKET3's 73c0e09200SDave Airlie */ 74c0e09200SDave Airlie #define R300_VAP_VF_CNTL 0x2084 75c0e09200SDave Airlie # define R300_VAP_VF_CNTL__PRIM_TYPE__SHIFT 0 76c0e09200SDave Airlie # define R300_VAP_VF_CNTL__PRIM_NONE (0<<0) 77c0e09200SDave Airlie # define R300_VAP_VF_CNTL__PRIM_POINTS (1<<0) 78c0e09200SDave Airlie # define R300_VAP_VF_CNTL__PRIM_LINES (2<<0) 79c0e09200SDave Airlie # define R300_VAP_VF_CNTL__PRIM_LINE_STRIP (3<<0) 80c0e09200SDave Airlie # define R300_VAP_VF_CNTL__PRIM_TRIANGLES (4<<0) 81c0e09200SDave Airlie # define R300_VAP_VF_CNTL__PRIM_TRIANGLE_FAN (5<<0) 82c0e09200SDave Airlie # define R300_VAP_VF_CNTL__PRIM_TRIANGLE_STRIP (6<<0) 83c0e09200SDave Airlie # define R300_VAP_VF_CNTL__PRIM_LINE_LOOP (12<<0) 84c0e09200SDave Airlie # define R300_VAP_VF_CNTL__PRIM_QUADS (13<<0) 85c0e09200SDave Airlie # define R300_VAP_VF_CNTL__PRIM_QUAD_STRIP (14<<0) 86c0e09200SDave Airlie # define R300_VAP_VF_CNTL__PRIM_POLYGON (15<<0) 87c0e09200SDave Airlie 88c0e09200SDave Airlie # define R300_VAP_VF_CNTL__PRIM_WALK__SHIFT 4 89c0e09200SDave Airlie /* State based - direct writes to registers trigger vertex 90c0e09200SDave Airlie generation */ 91c0e09200SDave Airlie # define R300_VAP_VF_CNTL__PRIM_WALK_STATE_BASED (0<<4) 92c0e09200SDave Airlie # define R300_VAP_VF_CNTL__PRIM_WALK_INDICES (1<<4) 93c0e09200SDave Airlie # define R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_LIST (2<<4) 94c0e09200SDave Airlie # define R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_EMBEDDED (3<<4) 95c0e09200SDave Airlie 96c0e09200SDave Airlie /* I don't think I saw these three used.. */ 97c0e09200SDave Airlie # define R300_VAP_VF_CNTL__COLOR_ORDER__SHIFT 6 98c0e09200SDave Airlie # define R300_VAP_VF_CNTL__TCL_OUTPUT_CTL_ENA__SHIFT 9 99c0e09200SDave Airlie # define R300_VAP_VF_CNTL__PROG_STREAM_ENA__SHIFT 10 100c0e09200SDave Airlie 101c0e09200SDave Airlie /* index size - when not set the indices are assumed to be 16 bit */ 102c0e09200SDave Airlie # define R300_VAP_VF_CNTL__INDEX_SIZE_32bit (1<<11) 103c0e09200SDave Airlie /* number of vertices */ 104c0e09200SDave Airlie # define R300_VAP_VF_CNTL__NUM_VERTICES__SHIFT 16 105c0e09200SDave Airlie 106c0e09200SDave Airlie /* BEGIN: Wild guesses */ 107c0e09200SDave Airlie #define R300_VAP_OUTPUT_VTX_FMT_0 0x2090 108c0e09200SDave Airlie # define R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT (1<<0) 109c0e09200SDave Airlie # define R300_VAP_OUTPUT_VTX_FMT_0__COLOR_PRESENT (1<<1) 110c0e09200SDave Airlie # define R300_VAP_OUTPUT_VTX_FMT_0__COLOR_1_PRESENT (1<<2) /* GUESS */ 111c0e09200SDave Airlie # define R300_VAP_OUTPUT_VTX_FMT_0__COLOR_2_PRESENT (1<<3) /* GUESS */ 112c0e09200SDave Airlie # define R300_VAP_OUTPUT_VTX_FMT_0__COLOR_3_PRESENT (1<<4) /* GUESS */ 113c0e09200SDave Airlie # define R300_VAP_OUTPUT_VTX_FMT_0__PT_SIZE_PRESENT (1<<16) /* GUESS */ 114c0e09200SDave Airlie 115c0e09200SDave Airlie #define R300_VAP_OUTPUT_VTX_FMT_1 0x2094 116c0e09200SDave Airlie /* each of the following is 3 bits wide, specifies number 117c0e09200SDave Airlie of components */ 118c0e09200SDave Airlie # define R300_VAP_OUTPUT_VTX_FMT_1__TEX_0_COMP_CNT_SHIFT 0 119c0e09200SDave Airlie # define R300_VAP_OUTPUT_VTX_FMT_1__TEX_1_COMP_CNT_SHIFT 3 120c0e09200SDave Airlie # define R300_VAP_OUTPUT_VTX_FMT_1__TEX_2_COMP_CNT_SHIFT 6 121c0e09200SDave Airlie # define R300_VAP_OUTPUT_VTX_FMT_1__TEX_3_COMP_CNT_SHIFT 9 122c0e09200SDave Airlie # define R300_VAP_OUTPUT_VTX_FMT_1__TEX_4_COMP_CNT_SHIFT 12 123c0e09200SDave Airlie # define R300_VAP_OUTPUT_VTX_FMT_1__TEX_5_COMP_CNT_SHIFT 15 124c0e09200SDave Airlie # define R300_VAP_OUTPUT_VTX_FMT_1__TEX_6_COMP_CNT_SHIFT 18 125c0e09200SDave Airlie # define R300_VAP_OUTPUT_VTX_FMT_1__TEX_7_COMP_CNT_SHIFT 21 126c0e09200SDave Airlie /* END: Wild guesses */ 127c0e09200SDave Airlie 128c0e09200SDave Airlie #define R300_SE_VTE_CNTL 0x20b0 129c0e09200SDave Airlie # define R300_VPORT_X_SCALE_ENA 0x00000001 130c0e09200SDave Airlie # define R300_VPORT_X_OFFSET_ENA 0x00000002 131c0e09200SDave Airlie # define R300_VPORT_Y_SCALE_ENA 0x00000004 132c0e09200SDave Airlie # define R300_VPORT_Y_OFFSET_ENA 0x00000008 133c0e09200SDave Airlie # define R300_VPORT_Z_SCALE_ENA 0x00000010 134c0e09200SDave Airlie # define R300_VPORT_Z_OFFSET_ENA 0x00000020 135c0e09200SDave Airlie # define R300_VTX_XY_FMT 0x00000100 136c0e09200SDave Airlie # define R300_VTX_Z_FMT 0x00000200 137c0e09200SDave Airlie # define R300_VTX_W0_FMT 0x00000400 138c0e09200SDave Airlie # define R300_VTX_W0_NORMALIZE 0x00000800 139c0e09200SDave Airlie # define R300_VTX_ST_DENORMALIZED 0x00001000 140c0e09200SDave Airlie 141c0e09200SDave Airlie /* BEGIN: Vertex data assembly - lots of uncertainties */ 142c0e09200SDave Airlie 143c0e09200SDave Airlie /* gap */ 144c0e09200SDave Airlie 145c0e09200SDave Airlie #define R300_VAP_CNTL_STATUS 0x2140 146c0e09200SDave Airlie # define R300_VC_NO_SWAP (0 << 0) 147c0e09200SDave Airlie # define R300_VC_16BIT_SWAP (1 << 0) 148c0e09200SDave Airlie # define R300_VC_32BIT_SWAP (2 << 0) 149c0e09200SDave Airlie # define R300_VAP_TCL_BYPASS (1 << 8) 150c0e09200SDave Airlie 151c0e09200SDave Airlie /* gap */ 152c0e09200SDave Airlie 153c0e09200SDave Airlie /* Where do we get our vertex data? 154c0e09200SDave Airlie * 155c0e09200SDave Airlie * Vertex data either comes either from immediate mode registers or from 156c0e09200SDave Airlie * vertex arrays. 157c0e09200SDave Airlie * There appears to be no mixed mode (though we can force the pitch of 158c0e09200SDave Airlie * vertex arrays to 0, effectively reusing the same element over and over 159c0e09200SDave Airlie * again). 160c0e09200SDave Airlie * 161c0e09200SDave Airlie * Immediate mode is controlled by the INPUT_CNTL registers. I am not sure 162c0e09200SDave Airlie * if these registers influence vertex array processing. 163c0e09200SDave Airlie * 164c0e09200SDave Airlie * Vertex arrays are controlled via the 3D_LOAD_VBPNTR packet3. 165c0e09200SDave Airlie * 166c0e09200SDave Airlie * In both cases, vertex attributes are then passed through INPUT_ROUTE. 167c0e09200SDave Airlie * 168c0e09200SDave Airlie * Beginning with INPUT_ROUTE_0_0 is a list of WORDs that route vertex data 169c0e09200SDave Airlie * into the vertex processor's input registers. 170c0e09200SDave Airlie * The first word routes the first input, the second word the second, etc. 171c0e09200SDave Airlie * The corresponding input is routed into the register with the given index. 172c0e09200SDave Airlie * The list is ended by a word with INPUT_ROUTE_END set. 173c0e09200SDave Airlie * 174c0e09200SDave Airlie * Always set COMPONENTS_4 in immediate mode. 175c0e09200SDave Airlie */ 176c0e09200SDave Airlie 177c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_0_0 0x2150 178c0e09200SDave Airlie # define R300_INPUT_ROUTE_COMPONENTS_1 (0 << 0) 179c0e09200SDave Airlie # define R300_INPUT_ROUTE_COMPONENTS_2 (1 << 0) 180c0e09200SDave Airlie # define R300_INPUT_ROUTE_COMPONENTS_3 (2 << 0) 181c0e09200SDave Airlie # define R300_INPUT_ROUTE_COMPONENTS_4 (3 << 0) 182c0e09200SDave Airlie # define R300_INPUT_ROUTE_COMPONENTS_RGBA (4 << 0) /* GUESS */ 183c0e09200SDave Airlie # define R300_VAP_INPUT_ROUTE_IDX_SHIFT 8 184c0e09200SDave Airlie # define R300_VAP_INPUT_ROUTE_IDX_MASK (31 << 8) /* GUESS */ 185c0e09200SDave Airlie # define R300_VAP_INPUT_ROUTE_END (1 << 13) 186c0e09200SDave Airlie # define R300_INPUT_ROUTE_IMMEDIATE_MODE (0 << 14) /* GUESS */ 187c0e09200SDave Airlie # define R300_INPUT_ROUTE_FLOAT (1 << 14) /* GUESS */ 188c0e09200SDave Airlie # define R300_INPUT_ROUTE_UNSIGNED_BYTE (2 << 14) /* GUESS */ 189c0e09200SDave Airlie # define R300_INPUT_ROUTE_FLOAT_COLOR (3 << 14) /* GUESS */ 190c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_0_1 0x2154 191c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_0_2 0x2158 192c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_0_3 0x215C 193c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_0_4 0x2160 194c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_0_5 0x2164 195c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_0_6 0x2168 196c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_0_7 0x216C 197c0e09200SDave Airlie 198c0e09200SDave Airlie /* gap */ 199c0e09200SDave Airlie 200c0e09200SDave Airlie /* Notes: 201c0e09200SDave Airlie * - always set up to produce at least two attributes: 202c0e09200SDave Airlie * if vertex program uses only position, fglrx will set normal, too 203c0e09200SDave Airlie * - INPUT_CNTL_0_COLOR and INPUT_CNTL_COLOR bits are always equal. 204c0e09200SDave Airlie */ 205c0e09200SDave Airlie #define R300_VAP_INPUT_CNTL_0 0x2180 206c0e09200SDave Airlie # define R300_INPUT_CNTL_0_COLOR 0x00000001 207c0e09200SDave Airlie #define R300_VAP_INPUT_CNTL_1 0x2184 208c0e09200SDave Airlie # define R300_INPUT_CNTL_POS 0x00000001 209c0e09200SDave Airlie # define R300_INPUT_CNTL_NORMAL 0x00000002 210c0e09200SDave Airlie # define R300_INPUT_CNTL_COLOR 0x00000004 211c0e09200SDave Airlie # define R300_INPUT_CNTL_TC0 0x00000400 212c0e09200SDave Airlie # define R300_INPUT_CNTL_TC1 0x00000800 213c0e09200SDave Airlie # define R300_INPUT_CNTL_TC2 0x00001000 /* GUESS */ 214c0e09200SDave Airlie # define R300_INPUT_CNTL_TC3 0x00002000 /* GUESS */ 215c0e09200SDave Airlie # define R300_INPUT_CNTL_TC4 0x00004000 /* GUESS */ 216c0e09200SDave Airlie # define R300_INPUT_CNTL_TC5 0x00008000 /* GUESS */ 217c0e09200SDave Airlie # define R300_INPUT_CNTL_TC6 0x00010000 /* GUESS */ 218c0e09200SDave Airlie # define R300_INPUT_CNTL_TC7 0x00020000 /* GUESS */ 219c0e09200SDave Airlie 220c0e09200SDave Airlie /* gap */ 221c0e09200SDave Airlie 222c0e09200SDave Airlie /* Words parallel to INPUT_ROUTE_0; All words that are active in INPUT_ROUTE_0 223c0e09200SDave Airlie * are set to a swizzling bit pattern, other words are 0. 224c0e09200SDave Airlie * 225c0e09200SDave Airlie * In immediate mode, the pattern is always set to xyzw. In vertex array 226c0e09200SDave Airlie * mode, the swizzling pattern is e.g. used to set zw components in texture 227c0e09200SDave Airlie * coordinates with only tweo components. 228c0e09200SDave Airlie */ 229c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_1_0 0x21E0 230c0e09200SDave Airlie # define R300_INPUT_ROUTE_SELECT_X 0 231c0e09200SDave Airlie # define R300_INPUT_ROUTE_SELECT_Y 1 232c0e09200SDave Airlie # define R300_INPUT_ROUTE_SELECT_Z 2 233c0e09200SDave Airlie # define R300_INPUT_ROUTE_SELECT_W 3 234c0e09200SDave Airlie # define R300_INPUT_ROUTE_SELECT_ZERO 4 235c0e09200SDave Airlie # define R300_INPUT_ROUTE_SELECT_ONE 5 236c0e09200SDave Airlie # define R300_INPUT_ROUTE_SELECT_MASK 7 237c0e09200SDave Airlie # define R300_INPUT_ROUTE_X_SHIFT 0 238c0e09200SDave Airlie # define R300_INPUT_ROUTE_Y_SHIFT 3 239c0e09200SDave Airlie # define R300_INPUT_ROUTE_Z_SHIFT 6 240c0e09200SDave Airlie # define R300_INPUT_ROUTE_W_SHIFT 9 241c0e09200SDave Airlie # define R300_INPUT_ROUTE_ENABLE (15 << 12) 242c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_1_1 0x21E4 243c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_1_2 0x21E8 244c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_1_3 0x21EC 245c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_1_4 0x21F0 246c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_1_5 0x21F4 247c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_1_6 0x21F8 248c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_1_7 0x21FC 249c0e09200SDave Airlie 250c0e09200SDave Airlie /* END: Vertex data assembly */ 251c0e09200SDave Airlie 252c0e09200SDave Airlie /* gap */ 253c0e09200SDave Airlie 254c0e09200SDave Airlie /* BEGIN: Upload vertex program and data */ 255c0e09200SDave Airlie 256c0e09200SDave Airlie /* 257c0e09200SDave Airlie * The programmable vertex shader unit has a memory bank of unknown size 258c0e09200SDave Airlie * that can be written to in 16 byte units by writing the address into 259c0e09200SDave Airlie * UPLOAD_ADDRESS, followed by data in UPLOAD_DATA (multiples of 4 DWORDs). 260c0e09200SDave Airlie * 261c0e09200SDave Airlie * Pointers into the memory bank are always in multiples of 16 bytes. 262c0e09200SDave Airlie * 263c0e09200SDave Airlie * The memory bank is divided into areas with fixed meaning. 264c0e09200SDave Airlie * 265c0e09200SDave Airlie * Starting at address UPLOAD_PROGRAM: Vertex program instructions. 266c0e09200SDave Airlie * Native limits reported by drivers from ATI suggest size 256 (i.e. 4KB), 267c0e09200SDave Airlie * whereas the difference between known addresses suggests size 512. 268c0e09200SDave Airlie * 269c0e09200SDave Airlie * Starting at address UPLOAD_PARAMETERS: Vertex program parameters. 270c0e09200SDave Airlie * Native reported limits and the VPI layout suggest size 256, whereas 271c0e09200SDave Airlie * difference between known addresses suggests size 512. 272c0e09200SDave Airlie * 273c0e09200SDave Airlie * At address UPLOAD_POINTSIZE is a vector (0, 0, ps, 0), where ps is the 274c0e09200SDave Airlie * floating point pointsize. The exact purpose of this state is uncertain, 275c0e09200SDave Airlie * as there is also the R300_RE_POINTSIZE register. 276c0e09200SDave Airlie * 277c0e09200SDave Airlie * Multiple vertex programs and parameter sets can be loaded at once, 278c0e09200SDave Airlie * which could explain the size discrepancy. 279c0e09200SDave Airlie */ 280c0e09200SDave Airlie #define R300_VAP_PVS_UPLOAD_ADDRESS 0x2200 281c0e09200SDave Airlie # define R300_PVS_UPLOAD_PROGRAM 0x00000000 282c0e09200SDave Airlie # define R300_PVS_UPLOAD_PARAMETERS 0x00000200 283c0e09200SDave Airlie # define R300_PVS_UPLOAD_POINTSIZE 0x00000406 284c0e09200SDave Airlie 285c0e09200SDave Airlie /* gap */ 286c0e09200SDave Airlie 287c0e09200SDave Airlie #define R300_VAP_PVS_UPLOAD_DATA 0x2208 288c0e09200SDave Airlie 289c0e09200SDave Airlie /* END: Upload vertex program and data */ 290c0e09200SDave Airlie 291c0e09200SDave Airlie /* gap */ 292c0e09200SDave Airlie 293c0e09200SDave Airlie /* I do not know the purpose of this register. However, I do know that 294c0e09200SDave Airlie * it is set to 221C_CLEAR for clear operations and to 221C_NORMAL 295c0e09200SDave Airlie * for normal rendering. 296c0e09200SDave Airlie */ 297c0e09200SDave Airlie #define R300_VAP_UNKNOWN_221C 0x221C 298c0e09200SDave Airlie # define R300_221C_NORMAL 0x00000000 299c0e09200SDave Airlie # define R300_221C_CLEAR 0x0001C000 300c0e09200SDave Airlie 301c0e09200SDave Airlie /* These seem to be per-pixel and per-vertex X and Y clipping planes. The first 302c0e09200SDave Airlie * plane is per-pixel and the second plane is per-vertex. 303c0e09200SDave Airlie * 304c0e09200SDave Airlie * This was determined by experimentation alone but I believe it is correct. 305c0e09200SDave Airlie * 306c0e09200SDave Airlie * These registers are called X_QUAD0_1_FL to X_QUAD0_4_FL by glxtest. 307c0e09200SDave Airlie */ 308c0e09200SDave Airlie #define R300_VAP_CLIP_X_0 0x2220 309c0e09200SDave Airlie #define R300_VAP_CLIP_X_1 0x2224 310c0e09200SDave Airlie #define R300_VAP_CLIP_Y_0 0x2228 311c0e09200SDave Airlie #define R300_VAP_CLIP_Y_1 0x2230 312c0e09200SDave Airlie 313c0e09200SDave Airlie /* gap */ 314c0e09200SDave Airlie 315c0e09200SDave Airlie /* Sometimes, END_OF_PKT and 0x2284=0 are the only commands sent between 316c0e09200SDave Airlie * rendering commands and overwriting vertex program parameters. 317c0e09200SDave Airlie * Therefore, I suspect writing zero to 0x2284 synchronizes the engine and 318c0e09200SDave Airlie * avoids bugs caused by still running shaders reading bad data from memory. 319c0e09200SDave Airlie */ 320*54f961a6SJerome Glisse #define R300_VAP_PVS_STATE_FLUSH_REG 0x2284 321c0e09200SDave Airlie 322c0e09200SDave Airlie /* Absolutely no clue what this register is about. */ 323c0e09200SDave Airlie #define R300_VAP_UNKNOWN_2288 0x2288 324c0e09200SDave Airlie # define R300_2288_R300 0x00750000 /* -- nh */ 325c0e09200SDave Airlie # define R300_2288_RV350 0x0000FFFF /* -- Vladimir */ 326c0e09200SDave Airlie 327c0e09200SDave Airlie /* gap */ 328c0e09200SDave Airlie 329c0e09200SDave Airlie /* Addresses are relative to the vertex program instruction area of the 330c0e09200SDave Airlie * memory bank. PROGRAM_END points to the last instruction of the active 331c0e09200SDave Airlie * program 332c0e09200SDave Airlie * 333c0e09200SDave Airlie * The meaning of the two UNKNOWN fields is obviously not known. However, 334c0e09200SDave Airlie * experiments so far have shown that both *must* point to an instruction 335c0e09200SDave Airlie * inside the vertex program, otherwise the GPU locks up. 336c0e09200SDave Airlie * 337c0e09200SDave Airlie * fglrx usually sets CNTL_3_UNKNOWN to the end of the program and 338c0e09200SDave Airlie * R300_PVS_CNTL_1_POS_END_SHIFT points to instruction where last write to 339c0e09200SDave Airlie * position takes place. 340c0e09200SDave Airlie * 341c0e09200SDave Airlie * Most likely this is used to ignore rest of the program in cases 342c0e09200SDave Airlie * where group of verts arent visible. For some reason this "section" 343c0e09200SDave Airlie * is sometimes accepted other instruction that have no relationship with 344c0e09200SDave Airlie * position calculations. 345c0e09200SDave Airlie */ 346c0e09200SDave Airlie #define R300_VAP_PVS_CNTL_1 0x22D0 347c0e09200SDave Airlie # define R300_PVS_CNTL_1_PROGRAM_START_SHIFT 0 348c0e09200SDave Airlie # define R300_PVS_CNTL_1_POS_END_SHIFT 10 349c0e09200SDave Airlie # define R300_PVS_CNTL_1_PROGRAM_END_SHIFT 20 350c0e09200SDave Airlie /* Addresses are relative the the vertex program parameters area. */ 351c0e09200SDave Airlie #define R300_VAP_PVS_CNTL_2 0x22D4 352c0e09200SDave Airlie # define R300_PVS_CNTL_2_PARAM_OFFSET_SHIFT 0 353c0e09200SDave Airlie # define R300_PVS_CNTL_2_PARAM_COUNT_SHIFT 16 354c0e09200SDave Airlie #define R300_VAP_PVS_CNTL_3 0x22D8 355c0e09200SDave Airlie # define R300_PVS_CNTL_3_PROGRAM_UNKNOWN_SHIFT 10 356c0e09200SDave Airlie # define R300_PVS_CNTL_3_PROGRAM_UNKNOWN2_SHIFT 0 357c0e09200SDave Airlie 358c0e09200SDave Airlie /* The entire range from 0x2300 to 0x2AC inclusive seems to be used for 359c0e09200SDave Airlie * immediate vertices 360c0e09200SDave Airlie */ 361c0e09200SDave Airlie #define R300_VAP_VTX_COLOR_R 0x2464 362c0e09200SDave Airlie #define R300_VAP_VTX_COLOR_G 0x2468 363c0e09200SDave Airlie #define R300_VAP_VTX_COLOR_B 0x246C 364c0e09200SDave Airlie #define R300_VAP_VTX_POS_0_X_1 0x2490 /* used for glVertex2*() */ 365c0e09200SDave Airlie #define R300_VAP_VTX_POS_0_Y_1 0x2494 366c0e09200SDave Airlie #define R300_VAP_VTX_COLOR_PKD 0x249C /* RGBA */ 367c0e09200SDave Airlie #define R300_VAP_VTX_POS_0_X_2 0x24A0 /* used for glVertex3*() */ 368c0e09200SDave Airlie #define R300_VAP_VTX_POS_0_Y_2 0x24A4 369c0e09200SDave Airlie #define R300_VAP_VTX_POS_0_Z_2 0x24A8 370c0e09200SDave Airlie /* write 0 to indicate end of packet? */ 371c0e09200SDave Airlie #define R300_VAP_VTX_END_OF_PKT 0x24AC 372c0e09200SDave Airlie 373c0e09200SDave Airlie /* gap */ 374c0e09200SDave Airlie 375c0e09200SDave Airlie /* These are values from r300_reg/r300_reg.h - they are known to be correct 376c0e09200SDave Airlie * and are here so we can use one register file instead of several 377c0e09200SDave Airlie * - Vladimir 378c0e09200SDave Airlie */ 379c0e09200SDave Airlie #define R300_GB_VAP_RASTER_VTX_FMT_0 0x4000 380c0e09200SDave Airlie # define R300_GB_VAP_RASTER_VTX_FMT_0__POS_PRESENT (1<<0) 381c0e09200SDave Airlie # define R300_GB_VAP_RASTER_VTX_FMT_0__COLOR_0_PRESENT (1<<1) 382c0e09200SDave Airlie # define R300_GB_VAP_RASTER_VTX_FMT_0__COLOR_1_PRESENT (1<<2) 383c0e09200SDave Airlie # define R300_GB_VAP_RASTER_VTX_FMT_0__COLOR_2_PRESENT (1<<3) 384c0e09200SDave Airlie # define R300_GB_VAP_RASTER_VTX_FMT_0__COLOR_3_PRESENT (1<<4) 385c0e09200SDave Airlie # define R300_GB_VAP_RASTER_VTX_FMT_0__COLOR_SPACE (0xf<<5) 386c0e09200SDave Airlie # define R300_GB_VAP_RASTER_VTX_FMT_0__PT_SIZE_PRESENT (0x1<<16) 387c0e09200SDave Airlie 388c0e09200SDave Airlie #define R300_GB_VAP_RASTER_VTX_FMT_1 0x4004 389c0e09200SDave Airlie /* each of the following is 3 bits wide, specifies number 390c0e09200SDave Airlie of components */ 391c0e09200SDave Airlie # define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_0_COMP_CNT_SHIFT 0 392c0e09200SDave Airlie # define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_1_COMP_CNT_SHIFT 3 393c0e09200SDave Airlie # define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_2_COMP_CNT_SHIFT 6 394c0e09200SDave Airlie # define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_3_COMP_CNT_SHIFT 9 395c0e09200SDave Airlie # define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_4_COMP_CNT_SHIFT 12 396c0e09200SDave Airlie # define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_5_COMP_CNT_SHIFT 15 397c0e09200SDave Airlie # define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_6_COMP_CNT_SHIFT 18 398c0e09200SDave Airlie # define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_7_COMP_CNT_SHIFT 21 399c0e09200SDave Airlie 400c0e09200SDave Airlie /* UNK30 seems to enables point to quad transformation on textures 401c0e09200SDave Airlie * (or something closely related to that). 402c0e09200SDave Airlie * This bit is rather fatal at the time being due to lackings at pixel 403c0e09200SDave Airlie * shader side 404c0e09200SDave Airlie */ 405c0e09200SDave Airlie #define R300_GB_ENABLE 0x4008 406c0e09200SDave Airlie # define R300_GB_POINT_STUFF_ENABLE (1<<0) 407c0e09200SDave Airlie # define R300_GB_LINE_STUFF_ENABLE (1<<1) 408c0e09200SDave Airlie # define R300_GB_TRIANGLE_STUFF_ENABLE (1<<2) 409c0e09200SDave Airlie # define R300_GB_STENCIL_AUTO_ENABLE (1<<4) 410c0e09200SDave Airlie # define R300_GB_UNK31 (1<<31) 411c0e09200SDave Airlie /* each of the following is 2 bits wide */ 412c0e09200SDave Airlie #define R300_GB_TEX_REPLICATE 0 413c0e09200SDave Airlie #define R300_GB_TEX_ST 1 414c0e09200SDave Airlie #define R300_GB_TEX_STR 2 415c0e09200SDave Airlie # define R300_GB_TEX0_SOURCE_SHIFT 16 416c0e09200SDave Airlie # define R300_GB_TEX1_SOURCE_SHIFT 18 417c0e09200SDave Airlie # define R300_GB_TEX2_SOURCE_SHIFT 20 418c0e09200SDave Airlie # define R300_GB_TEX3_SOURCE_SHIFT 22 419c0e09200SDave Airlie # define R300_GB_TEX4_SOURCE_SHIFT 24 420c0e09200SDave Airlie # define R300_GB_TEX5_SOURCE_SHIFT 26 421c0e09200SDave Airlie # define R300_GB_TEX6_SOURCE_SHIFT 28 422c0e09200SDave Airlie # define R300_GB_TEX7_SOURCE_SHIFT 30 423c0e09200SDave Airlie 424c0e09200SDave Airlie /* MSPOS - positions for multisample antialiasing (?) */ 425c0e09200SDave Airlie #define R300_GB_MSPOS0 0x4010 426c0e09200SDave Airlie /* shifts - each of the fields is 4 bits */ 427c0e09200SDave Airlie # define R300_GB_MSPOS0__MS_X0_SHIFT 0 428c0e09200SDave Airlie # define R300_GB_MSPOS0__MS_Y0_SHIFT 4 429c0e09200SDave Airlie # define R300_GB_MSPOS0__MS_X1_SHIFT 8 430c0e09200SDave Airlie # define R300_GB_MSPOS0__MS_Y1_SHIFT 12 431c0e09200SDave Airlie # define R300_GB_MSPOS0__MS_X2_SHIFT 16 432c0e09200SDave Airlie # define R300_GB_MSPOS0__MS_Y2_SHIFT 20 433c0e09200SDave Airlie # define R300_GB_MSPOS0__MSBD0_Y 24 434c0e09200SDave Airlie # define R300_GB_MSPOS0__MSBD0_X 28 435c0e09200SDave Airlie 436c0e09200SDave Airlie #define R300_GB_MSPOS1 0x4014 437c0e09200SDave Airlie # define R300_GB_MSPOS1__MS_X3_SHIFT 0 438c0e09200SDave Airlie # define R300_GB_MSPOS1__MS_Y3_SHIFT 4 439c0e09200SDave Airlie # define R300_GB_MSPOS1__MS_X4_SHIFT 8 440c0e09200SDave Airlie # define R300_GB_MSPOS1__MS_Y4_SHIFT 12 441c0e09200SDave Airlie # define R300_GB_MSPOS1__MS_X5_SHIFT 16 442c0e09200SDave Airlie # define R300_GB_MSPOS1__MS_Y5_SHIFT 20 443c0e09200SDave Airlie # define R300_GB_MSPOS1__MSBD1 24 444c0e09200SDave Airlie 445c0e09200SDave Airlie 446c0e09200SDave Airlie #define R300_GB_TILE_CONFIG 0x4018 447c0e09200SDave Airlie # define R300_GB_TILE_ENABLE (1<<0) 448c0e09200SDave Airlie # define R300_GB_TILE_PIPE_COUNT_RV300 0 449c0e09200SDave Airlie # define R300_GB_TILE_PIPE_COUNT_R300 (3<<1) 450c0e09200SDave Airlie # define R300_GB_TILE_PIPE_COUNT_R420 (7<<1) 451c0e09200SDave Airlie # define R300_GB_TILE_PIPE_COUNT_RV410 (3<<1) 452c0e09200SDave Airlie # define R300_GB_TILE_SIZE_8 0 453c0e09200SDave Airlie # define R300_GB_TILE_SIZE_16 (1<<4) 454c0e09200SDave Airlie # define R300_GB_TILE_SIZE_32 (2<<4) 455c0e09200SDave Airlie # define R300_GB_SUPER_SIZE_1 (0<<6) 456c0e09200SDave Airlie # define R300_GB_SUPER_SIZE_2 (1<<6) 457c0e09200SDave Airlie # define R300_GB_SUPER_SIZE_4 (2<<6) 458c0e09200SDave Airlie # define R300_GB_SUPER_SIZE_8 (3<<6) 459c0e09200SDave Airlie # define R300_GB_SUPER_SIZE_16 (4<<6) 460c0e09200SDave Airlie # define R300_GB_SUPER_SIZE_32 (5<<6) 461c0e09200SDave Airlie # define R300_GB_SUPER_SIZE_64 (6<<6) 462c0e09200SDave Airlie # define R300_GB_SUPER_SIZE_128 (7<<6) 463c0e09200SDave Airlie # define R300_GB_SUPER_X_SHIFT 9 /* 3 bits wide */ 464c0e09200SDave Airlie # define R300_GB_SUPER_Y_SHIFT 12 /* 3 bits wide */ 465c0e09200SDave Airlie # define R300_GB_SUPER_TILE_A 0 466c0e09200SDave Airlie # define R300_GB_SUPER_TILE_B (1<<15) 467c0e09200SDave Airlie # define R300_GB_SUBPIXEL_1_12 0 468c0e09200SDave Airlie # define R300_GB_SUBPIXEL_1_16 (1<<16) 469c0e09200SDave Airlie 470c0e09200SDave Airlie #define R300_GB_FIFO_SIZE 0x4024 471c0e09200SDave Airlie /* each of the following is 2 bits wide */ 472c0e09200SDave Airlie #define R300_GB_FIFO_SIZE_32 0 473c0e09200SDave Airlie #define R300_GB_FIFO_SIZE_64 1 474c0e09200SDave Airlie #define R300_GB_FIFO_SIZE_128 2 475c0e09200SDave Airlie #define R300_GB_FIFO_SIZE_256 3 476c0e09200SDave Airlie # define R300_SC_IFIFO_SIZE_SHIFT 0 477c0e09200SDave Airlie # define R300_SC_TZFIFO_SIZE_SHIFT 2 478c0e09200SDave Airlie # define R300_SC_BFIFO_SIZE_SHIFT 4 479c0e09200SDave Airlie 480c0e09200SDave Airlie # define R300_US_OFIFO_SIZE_SHIFT 12 481c0e09200SDave Airlie # define R300_US_WFIFO_SIZE_SHIFT 14 482c0e09200SDave Airlie /* the following use the same constants as above, but meaning is 483c0e09200SDave Airlie is times 2 (i.e. instead of 32 words it means 64 */ 484c0e09200SDave Airlie # define R300_RS_TFIFO_SIZE_SHIFT 6 485c0e09200SDave Airlie # define R300_RS_CFIFO_SIZE_SHIFT 8 486c0e09200SDave Airlie # define R300_US_RAM_SIZE_SHIFT 10 487c0e09200SDave Airlie /* watermarks, 3 bits wide */ 488c0e09200SDave Airlie # define R300_RS_HIGHWATER_COL_SHIFT 16 489c0e09200SDave Airlie # define R300_RS_HIGHWATER_TEX_SHIFT 19 490c0e09200SDave Airlie # define R300_OFIFO_HIGHWATER_SHIFT 22 /* two bits only */ 491c0e09200SDave Airlie # define R300_CUBE_FIFO_HIGHWATER_COL_SHIFT 24 492c0e09200SDave Airlie 493c0e09200SDave Airlie #define R300_GB_SELECT 0x401C 494c0e09200SDave Airlie # define R300_GB_FOG_SELECT_C0A 0 495c0e09200SDave Airlie # define R300_GB_FOG_SELECT_C1A 1 496c0e09200SDave Airlie # define R300_GB_FOG_SELECT_C2A 2 497c0e09200SDave Airlie # define R300_GB_FOG_SELECT_C3A 3 498c0e09200SDave Airlie # define R300_GB_FOG_SELECT_1_1_W 4 499c0e09200SDave Airlie # define R300_GB_FOG_SELECT_Z 5 500c0e09200SDave Airlie # define R300_GB_DEPTH_SELECT_Z 0 501c0e09200SDave Airlie # define R300_GB_DEPTH_SELECT_1_1_W (1<<3) 502c0e09200SDave Airlie # define R300_GB_W_SELECT_1_W 0 503c0e09200SDave Airlie # define R300_GB_W_SELECT_1 (1<<4) 504c0e09200SDave Airlie 505c0e09200SDave Airlie #define R300_GB_AA_CONFIG 0x4020 506c0e09200SDave Airlie # define R300_AA_DISABLE 0x00 507c0e09200SDave Airlie # define R300_AA_ENABLE 0x01 508c0e09200SDave Airlie # define R300_AA_SUBSAMPLES_2 0 509c0e09200SDave Airlie # define R300_AA_SUBSAMPLES_3 (1<<1) 510c0e09200SDave Airlie # define R300_AA_SUBSAMPLES_4 (2<<1) 511c0e09200SDave Airlie # define R300_AA_SUBSAMPLES_6 (3<<1) 512c0e09200SDave Airlie 513c0e09200SDave Airlie /* gap */ 514c0e09200SDave Airlie 515c0e09200SDave Airlie /* Zero to flush caches. */ 516*54f961a6SJerome Glisse #define R300_TX_INVALTAGS 0x4100 517c0e09200SDave Airlie #define R300_TX_FLUSH 0x0 518c0e09200SDave Airlie 519c0e09200SDave Airlie /* The upper enable bits are guessed, based on fglrx reported limits. */ 520c0e09200SDave Airlie #define R300_TX_ENABLE 0x4104 521c0e09200SDave Airlie # define R300_TX_ENABLE_0 (1 << 0) 522c0e09200SDave Airlie # define R300_TX_ENABLE_1 (1 << 1) 523c0e09200SDave Airlie # define R300_TX_ENABLE_2 (1 << 2) 524c0e09200SDave Airlie # define R300_TX_ENABLE_3 (1 << 3) 525c0e09200SDave Airlie # define R300_TX_ENABLE_4 (1 << 4) 526c0e09200SDave Airlie # define R300_TX_ENABLE_5 (1 << 5) 527c0e09200SDave Airlie # define R300_TX_ENABLE_6 (1 << 6) 528c0e09200SDave Airlie # define R300_TX_ENABLE_7 (1 << 7) 529c0e09200SDave Airlie # define R300_TX_ENABLE_8 (1 << 8) 530c0e09200SDave Airlie # define R300_TX_ENABLE_9 (1 << 9) 531c0e09200SDave Airlie # define R300_TX_ENABLE_10 (1 << 10) 532c0e09200SDave Airlie # define R300_TX_ENABLE_11 (1 << 11) 533c0e09200SDave Airlie # define R300_TX_ENABLE_12 (1 << 12) 534c0e09200SDave Airlie # define R300_TX_ENABLE_13 (1 << 13) 535c0e09200SDave Airlie # define R300_TX_ENABLE_14 (1 << 14) 536c0e09200SDave Airlie # define R300_TX_ENABLE_15 (1 << 15) 537c0e09200SDave Airlie 538c0e09200SDave Airlie /* The pointsize is given in multiples of 6. The pointsize can be 539c0e09200SDave Airlie * enormous: Clear() renders a single point that fills the entire 540c0e09200SDave Airlie * framebuffer. 541c0e09200SDave Airlie */ 542c0e09200SDave Airlie #define R300_RE_POINTSIZE 0x421C 543c0e09200SDave Airlie # define R300_POINTSIZE_Y_SHIFT 0 544c0e09200SDave Airlie # define R300_POINTSIZE_Y_MASK (0xFFFF << 0) /* GUESS */ 545c0e09200SDave Airlie # define R300_POINTSIZE_X_SHIFT 16 546c0e09200SDave Airlie # define R300_POINTSIZE_X_MASK (0xFFFF << 16) /* GUESS */ 547c0e09200SDave Airlie # define R300_POINTSIZE_MAX (R300_POINTSIZE_Y_MASK / 6) 548c0e09200SDave Airlie 549c0e09200SDave Airlie /* The line width is given in multiples of 6. 550c0e09200SDave Airlie * In default mode lines are classified as vertical lines. 551c0e09200SDave Airlie * HO: horizontal 552c0e09200SDave Airlie * VE: vertical or horizontal 553c0e09200SDave Airlie * HO & VE: no classification 554c0e09200SDave Airlie */ 555c0e09200SDave Airlie #define R300_RE_LINE_CNT 0x4234 556c0e09200SDave Airlie # define R300_LINESIZE_SHIFT 0 557c0e09200SDave Airlie # define R300_LINESIZE_MASK (0xFFFF << 0) /* GUESS */ 558c0e09200SDave Airlie # define R300_LINESIZE_MAX (R300_LINESIZE_MASK / 6) 559c0e09200SDave Airlie # define R300_LINE_CNT_HO (1 << 16) 560c0e09200SDave Airlie # define R300_LINE_CNT_VE (1 << 17) 561c0e09200SDave Airlie 562c0e09200SDave Airlie /* Some sort of scale or clamp value for texcoordless textures. */ 563c0e09200SDave Airlie #define R300_RE_UNK4238 0x4238 564c0e09200SDave Airlie 565c0e09200SDave Airlie /* Something shade related */ 566c0e09200SDave Airlie #define R300_RE_SHADE 0x4274 567c0e09200SDave Airlie 568c0e09200SDave Airlie #define R300_RE_SHADE_MODEL 0x4278 569c0e09200SDave Airlie # define R300_RE_SHADE_MODEL_SMOOTH 0x3aaaa 570c0e09200SDave Airlie # define R300_RE_SHADE_MODEL_FLAT 0x39595 571c0e09200SDave Airlie 572c0e09200SDave Airlie /* Dangerous */ 573c0e09200SDave Airlie #define R300_RE_POLYGON_MODE 0x4288 574c0e09200SDave Airlie # define R300_PM_ENABLED (1 << 0) 575c0e09200SDave Airlie # define R300_PM_FRONT_POINT (0 << 0) 576c0e09200SDave Airlie # define R300_PM_BACK_POINT (0 << 0) 577c0e09200SDave Airlie # define R300_PM_FRONT_LINE (1 << 4) 578c0e09200SDave Airlie # define R300_PM_FRONT_FILL (1 << 5) 579c0e09200SDave Airlie # define R300_PM_BACK_LINE (1 << 7) 580c0e09200SDave Airlie # define R300_PM_BACK_FILL (1 << 8) 581c0e09200SDave Airlie 582c0e09200SDave Airlie /* Fog parameters */ 583c0e09200SDave Airlie #define R300_RE_FOG_SCALE 0x4294 584c0e09200SDave Airlie #define R300_RE_FOG_START 0x4298 585c0e09200SDave Airlie 586c0e09200SDave Airlie /* Not sure why there are duplicate of factor and constant values. 587c0e09200SDave Airlie * My best guess so far is that there are separate zbiases for test and write. 588c0e09200SDave Airlie * Ordering might be wrong. 589c0e09200SDave Airlie * Some of the tests indicate that fgl has a fallback implementation of zbias 590c0e09200SDave Airlie * via pixel shaders. 591c0e09200SDave Airlie */ 592c0e09200SDave Airlie #define R300_RE_ZBIAS_CNTL 0x42A0 /* GUESS */ 593c0e09200SDave Airlie #define R300_RE_ZBIAS_T_FACTOR 0x42A4 594c0e09200SDave Airlie #define R300_RE_ZBIAS_T_CONSTANT 0x42A8 595c0e09200SDave Airlie #define R300_RE_ZBIAS_W_FACTOR 0x42AC 596c0e09200SDave Airlie #define R300_RE_ZBIAS_W_CONSTANT 0x42B0 597c0e09200SDave Airlie 598c0e09200SDave Airlie /* This register needs to be set to (1<<1) for RV350 to correctly 599c0e09200SDave Airlie * perform depth test (see --vb-triangles in r300_demo) 600c0e09200SDave Airlie * Don't know about other chips. - Vladimir 601c0e09200SDave Airlie * This is set to 3 when GL_POLYGON_OFFSET_FILL is on. 602c0e09200SDave Airlie * My guess is that there are two bits for each zbias primitive 603c0e09200SDave Airlie * (FILL, LINE, POINT). 604c0e09200SDave Airlie * One to enable depth test and one for depth write. 605c0e09200SDave Airlie * Yet this doesnt explain why depth writes work ... 606c0e09200SDave Airlie */ 607c0e09200SDave Airlie #define R300_RE_OCCLUSION_CNTL 0x42B4 608c0e09200SDave Airlie # define R300_OCCLUSION_ON (1<<1) 609c0e09200SDave Airlie 610c0e09200SDave Airlie #define R300_RE_CULL_CNTL 0x42B8 611c0e09200SDave Airlie # define R300_CULL_FRONT (1 << 0) 612c0e09200SDave Airlie # define R300_CULL_BACK (1 << 1) 613c0e09200SDave Airlie # define R300_FRONT_FACE_CCW (0 << 2) 614c0e09200SDave Airlie # define R300_FRONT_FACE_CW (1 << 2) 615c0e09200SDave Airlie 616c0e09200SDave Airlie 617c0e09200SDave Airlie /* BEGIN: Rasterization / Interpolators - many guesses */ 618c0e09200SDave Airlie 619c0e09200SDave Airlie /* 0_UNKNOWN_18 has always been set except for clear operations. 620c0e09200SDave Airlie * TC_CNT is the number of incoming texture coordinate sets (i.e. it depends 621c0e09200SDave Airlie * on the vertex program, *not* the fragment program) 622c0e09200SDave Airlie */ 623c0e09200SDave Airlie #define R300_RS_CNTL_0 0x4300 624c0e09200SDave Airlie # define R300_RS_CNTL_TC_CNT_SHIFT 2 625c0e09200SDave Airlie # define R300_RS_CNTL_TC_CNT_MASK (7 << 2) 626c0e09200SDave Airlie /* number of color interpolators used */ 627c0e09200SDave Airlie # define R300_RS_CNTL_CI_CNT_SHIFT 7 628c0e09200SDave Airlie # define R300_RS_CNTL_0_UNKNOWN_18 (1 << 18) 629c0e09200SDave Airlie /* Guess: RS_CNTL_1 holds the index of the highest used RS_ROUTE_n 630c0e09200SDave Airlie register. */ 631c0e09200SDave Airlie #define R300_RS_CNTL_1 0x4304 632c0e09200SDave Airlie 633c0e09200SDave Airlie /* gap */ 634c0e09200SDave Airlie 635c0e09200SDave Airlie /* Only used for texture coordinates. 636c0e09200SDave Airlie * Use the source field to route texture coordinate input from the 637c0e09200SDave Airlie * vertex program to the desired interpolator. Note that the source 638c0e09200SDave Airlie * field is relative to the outputs the vertex program *actually* 639c0e09200SDave Airlie * writes. If a vertex program only writes texcoord[1], this will 640c0e09200SDave Airlie * be source index 0. 641c0e09200SDave Airlie * Set INTERP_USED on all interpolators that produce data used by 642c0e09200SDave Airlie * the fragment program. INTERP_USED looks like a swizzling mask, 643c0e09200SDave Airlie * but I haven't seen it used that way. 644c0e09200SDave Airlie * 645c0e09200SDave Airlie * Note: The _UNKNOWN constants are always set in their respective 646c0e09200SDave Airlie * register. I don't know if this is necessary. 647c0e09200SDave Airlie */ 648c0e09200SDave Airlie #define R300_RS_INTERP_0 0x4310 649c0e09200SDave Airlie #define R300_RS_INTERP_1 0x4314 650c0e09200SDave Airlie # define R300_RS_INTERP_1_UNKNOWN 0x40 651c0e09200SDave Airlie #define R300_RS_INTERP_2 0x4318 652c0e09200SDave Airlie # define R300_RS_INTERP_2_UNKNOWN 0x80 653c0e09200SDave Airlie #define R300_RS_INTERP_3 0x431C 654c0e09200SDave Airlie # define R300_RS_INTERP_3_UNKNOWN 0xC0 655c0e09200SDave Airlie #define R300_RS_INTERP_4 0x4320 656c0e09200SDave Airlie #define R300_RS_INTERP_5 0x4324 657c0e09200SDave Airlie #define R300_RS_INTERP_6 0x4328 658c0e09200SDave Airlie #define R300_RS_INTERP_7 0x432C 659c0e09200SDave Airlie # define R300_RS_INTERP_SRC_SHIFT 2 660c0e09200SDave Airlie # define R300_RS_INTERP_SRC_MASK (7 << 2) 661c0e09200SDave Airlie # define R300_RS_INTERP_USED 0x00D10000 662c0e09200SDave Airlie 663c0e09200SDave Airlie /* These DWORDs control how vertex data is routed into fragment program 664c0e09200SDave Airlie * registers, after interpolators. 665c0e09200SDave Airlie */ 666c0e09200SDave Airlie #define R300_RS_ROUTE_0 0x4330 667c0e09200SDave Airlie #define R300_RS_ROUTE_1 0x4334 668c0e09200SDave Airlie #define R300_RS_ROUTE_2 0x4338 669c0e09200SDave Airlie #define R300_RS_ROUTE_3 0x433C /* GUESS */ 670c0e09200SDave Airlie #define R300_RS_ROUTE_4 0x4340 /* GUESS */ 671c0e09200SDave Airlie #define R300_RS_ROUTE_5 0x4344 /* GUESS */ 672c0e09200SDave Airlie #define R300_RS_ROUTE_6 0x4348 /* GUESS */ 673c0e09200SDave Airlie #define R300_RS_ROUTE_7 0x434C /* GUESS */ 674c0e09200SDave Airlie # define R300_RS_ROUTE_SOURCE_INTERP_0 0 675c0e09200SDave Airlie # define R300_RS_ROUTE_SOURCE_INTERP_1 1 676c0e09200SDave Airlie # define R300_RS_ROUTE_SOURCE_INTERP_2 2 677c0e09200SDave Airlie # define R300_RS_ROUTE_SOURCE_INTERP_3 3 678c0e09200SDave Airlie # define R300_RS_ROUTE_SOURCE_INTERP_4 4 679c0e09200SDave Airlie # define R300_RS_ROUTE_SOURCE_INTERP_5 5 /* GUESS */ 680c0e09200SDave Airlie # define R300_RS_ROUTE_SOURCE_INTERP_6 6 /* GUESS */ 681c0e09200SDave Airlie # define R300_RS_ROUTE_SOURCE_INTERP_7 7 /* GUESS */ 682c0e09200SDave Airlie # define R300_RS_ROUTE_ENABLE (1 << 3) /* GUESS */ 683c0e09200SDave Airlie # define R300_RS_ROUTE_DEST_SHIFT 6 684c0e09200SDave Airlie # define R300_RS_ROUTE_DEST_MASK (31 << 6) /* GUESS */ 685c0e09200SDave Airlie 686c0e09200SDave Airlie /* Special handling for color: When the fragment program uses color, 687c0e09200SDave Airlie * the ROUTE_0_COLOR bit is set and ROUTE_0_COLOR_DEST contains the 688c0e09200SDave Airlie * color register index. 689c0e09200SDave Airlie * 690c0e09200SDave Airlie * Apperently you may set the R300_RS_ROUTE_0_COLOR bit, but not provide any 691c0e09200SDave Airlie * R300_RS_ROUTE_0_COLOR_DEST value; this setup is used for clearing the state. 692c0e09200SDave Airlie * See r300_ioctl.c:r300EmitClearState. I'm not sure if this setup is strictly 693c0e09200SDave Airlie * correct or not. - Oliver. 694c0e09200SDave Airlie */ 695c0e09200SDave Airlie # define R300_RS_ROUTE_0_COLOR (1 << 14) 696c0e09200SDave Airlie # define R300_RS_ROUTE_0_COLOR_DEST_SHIFT 17 697c0e09200SDave Airlie # define R300_RS_ROUTE_0_COLOR_DEST_MASK (31 << 17) /* GUESS */ 698c0e09200SDave Airlie /* As above, but for secondary color */ 699c0e09200SDave Airlie # define R300_RS_ROUTE_1_COLOR1 (1 << 14) 700c0e09200SDave Airlie # define R300_RS_ROUTE_1_COLOR1_DEST_SHIFT 17 701c0e09200SDave Airlie # define R300_RS_ROUTE_1_COLOR1_DEST_MASK (31 << 17) 702c0e09200SDave Airlie # define R300_RS_ROUTE_1_UNKNOWN11 (1 << 11) 703c0e09200SDave Airlie /* END: Rasterization / Interpolators - many guesses */ 704c0e09200SDave Airlie 705c0e09200SDave Airlie /* Hierarchical Z Enable */ 706c0e09200SDave Airlie #define R300_SC_HYPERZ 0x43a4 707c0e09200SDave Airlie # define R300_SC_HYPERZ_DISABLE (0 << 0) 708c0e09200SDave Airlie # define R300_SC_HYPERZ_ENABLE (1 << 0) 709c0e09200SDave Airlie # define R300_SC_HYPERZ_MIN (0 << 1) 710c0e09200SDave Airlie # define R300_SC_HYPERZ_MAX (1 << 1) 711c0e09200SDave Airlie # define R300_SC_HYPERZ_ADJ_256 (0 << 2) 712c0e09200SDave Airlie # define R300_SC_HYPERZ_ADJ_128 (1 << 2) 713c0e09200SDave Airlie # define R300_SC_HYPERZ_ADJ_64 (2 << 2) 714c0e09200SDave Airlie # define R300_SC_HYPERZ_ADJ_32 (3 << 2) 715c0e09200SDave Airlie # define R300_SC_HYPERZ_ADJ_16 (4 << 2) 716c0e09200SDave Airlie # define R300_SC_HYPERZ_ADJ_8 (5 << 2) 717c0e09200SDave Airlie # define R300_SC_HYPERZ_ADJ_4 (6 << 2) 718c0e09200SDave Airlie # define R300_SC_HYPERZ_ADJ_2 (7 << 2) 719c0e09200SDave Airlie # define R300_SC_HYPERZ_HZ_Z0MIN_NO (0 << 5) 720c0e09200SDave Airlie # define R300_SC_HYPERZ_HZ_Z0MIN (1 << 5) 721c0e09200SDave Airlie # define R300_SC_HYPERZ_HZ_Z0MAX_NO (0 << 6) 722c0e09200SDave Airlie # define R300_SC_HYPERZ_HZ_Z0MAX (1 << 6) 723c0e09200SDave Airlie 724c0e09200SDave Airlie #define R300_SC_EDGERULE 0x43a8 725c0e09200SDave Airlie 726c0e09200SDave Airlie /* BEGIN: Scissors and cliprects */ 727c0e09200SDave Airlie 728c0e09200SDave Airlie /* There are four clipping rectangles. Their corner coordinates are inclusive. 729c0e09200SDave Airlie * Every pixel is assigned a number from 0 and 15 by setting bits 0-3 depending 730c0e09200SDave Airlie * on whether the pixel is inside cliprects 0-3, respectively. For example, 731c0e09200SDave Airlie * if a pixel is inside cliprects 0 and 1, but outside 2 and 3, it is assigned 732c0e09200SDave Airlie * the number 3 (binary 0011). 733c0e09200SDave Airlie * Iff the bit corresponding to the pixel's number in RE_CLIPRECT_CNTL is set, 734c0e09200SDave Airlie * the pixel is rasterized. 735c0e09200SDave Airlie * 736c0e09200SDave Airlie * In addition to this, there is a scissors rectangle. Only pixels inside the 737c0e09200SDave Airlie * scissors rectangle are drawn. (coordinates are inclusive) 738c0e09200SDave Airlie * 739c0e09200SDave Airlie * For some reason, the top-left corner of the framebuffer is at (1440, 1440) 740c0e09200SDave Airlie * for the purpose of clipping and scissors. 741c0e09200SDave Airlie */ 742c0e09200SDave Airlie #define R300_RE_CLIPRECT_TL_0 0x43B0 743c0e09200SDave Airlie #define R300_RE_CLIPRECT_BR_0 0x43B4 744c0e09200SDave Airlie #define R300_RE_CLIPRECT_TL_1 0x43B8 745c0e09200SDave Airlie #define R300_RE_CLIPRECT_BR_1 0x43BC 746c0e09200SDave Airlie #define R300_RE_CLIPRECT_TL_2 0x43C0 747c0e09200SDave Airlie #define R300_RE_CLIPRECT_BR_2 0x43C4 748c0e09200SDave Airlie #define R300_RE_CLIPRECT_TL_3 0x43C8 749c0e09200SDave Airlie #define R300_RE_CLIPRECT_BR_3 0x43CC 750c0e09200SDave Airlie # define R300_CLIPRECT_OFFSET 1440 751c0e09200SDave Airlie # define R300_CLIPRECT_MASK 0x1FFF 752c0e09200SDave Airlie # define R300_CLIPRECT_X_SHIFT 0 753c0e09200SDave Airlie # define R300_CLIPRECT_X_MASK (0x1FFF << 0) 754c0e09200SDave Airlie # define R300_CLIPRECT_Y_SHIFT 13 755c0e09200SDave Airlie # define R300_CLIPRECT_Y_MASK (0x1FFF << 13) 756c0e09200SDave Airlie #define R300_RE_CLIPRECT_CNTL 0x43D0 757c0e09200SDave Airlie # define R300_CLIP_OUT (1 << 0) 758c0e09200SDave Airlie # define R300_CLIP_0 (1 << 1) 759c0e09200SDave Airlie # define R300_CLIP_1 (1 << 2) 760c0e09200SDave Airlie # define R300_CLIP_10 (1 << 3) 761c0e09200SDave Airlie # define R300_CLIP_2 (1 << 4) 762c0e09200SDave Airlie # define R300_CLIP_20 (1 << 5) 763c0e09200SDave Airlie # define R300_CLIP_21 (1 << 6) 764c0e09200SDave Airlie # define R300_CLIP_210 (1 << 7) 765c0e09200SDave Airlie # define R300_CLIP_3 (1 << 8) 766c0e09200SDave Airlie # define R300_CLIP_30 (1 << 9) 767c0e09200SDave Airlie # define R300_CLIP_31 (1 << 10) 768c0e09200SDave Airlie # define R300_CLIP_310 (1 << 11) 769c0e09200SDave Airlie # define R300_CLIP_32 (1 << 12) 770c0e09200SDave Airlie # define R300_CLIP_320 (1 << 13) 771c0e09200SDave Airlie # define R300_CLIP_321 (1 << 14) 772c0e09200SDave Airlie # define R300_CLIP_3210 (1 << 15) 773c0e09200SDave Airlie 774c0e09200SDave Airlie /* gap */ 775c0e09200SDave Airlie 776c0e09200SDave Airlie #define R300_RE_SCISSORS_TL 0x43E0 777c0e09200SDave Airlie #define R300_RE_SCISSORS_BR 0x43E4 778c0e09200SDave Airlie # define R300_SCISSORS_OFFSET 1440 779c0e09200SDave Airlie # define R300_SCISSORS_X_SHIFT 0 780c0e09200SDave Airlie # define R300_SCISSORS_X_MASK (0x1FFF << 0) 781c0e09200SDave Airlie # define R300_SCISSORS_Y_SHIFT 13 782c0e09200SDave Airlie # define R300_SCISSORS_Y_MASK (0x1FFF << 13) 783c0e09200SDave Airlie /* END: Scissors and cliprects */ 784c0e09200SDave Airlie 785c0e09200SDave Airlie /* BEGIN: Texture specification */ 786c0e09200SDave Airlie 787c0e09200SDave Airlie /* 788c0e09200SDave Airlie * The texture specification dwords are grouped by meaning and not by texture 789c0e09200SDave Airlie * unit. This means that e.g. the offset for texture image unit N is found in 790c0e09200SDave Airlie * register TX_OFFSET_0 + (4*N) 791c0e09200SDave Airlie */ 792c0e09200SDave Airlie #define R300_TX_FILTER_0 0x4400 793c0e09200SDave Airlie # define R300_TX_REPEAT 0 794c0e09200SDave Airlie # define R300_TX_MIRRORED 1 795c0e09200SDave Airlie # define R300_TX_CLAMP 4 796c0e09200SDave Airlie # define R300_TX_CLAMP_TO_EDGE 2 797c0e09200SDave Airlie # define R300_TX_CLAMP_TO_BORDER 6 798c0e09200SDave Airlie # define R300_TX_WRAP_S_SHIFT 0 799c0e09200SDave Airlie # define R300_TX_WRAP_S_MASK (7 << 0) 800c0e09200SDave Airlie # define R300_TX_WRAP_T_SHIFT 3 801c0e09200SDave Airlie # define R300_TX_WRAP_T_MASK (7 << 3) 802c0e09200SDave Airlie # define R300_TX_WRAP_Q_SHIFT 6 803c0e09200SDave Airlie # define R300_TX_WRAP_Q_MASK (7 << 6) 804c0e09200SDave Airlie # define R300_TX_MAG_FILTER_NEAREST (1 << 9) 805c0e09200SDave Airlie # define R300_TX_MAG_FILTER_LINEAR (2 << 9) 806c0e09200SDave Airlie # define R300_TX_MAG_FILTER_MASK (3 << 9) 807c0e09200SDave Airlie # define R300_TX_MIN_FILTER_NEAREST (1 << 11) 808c0e09200SDave Airlie # define R300_TX_MIN_FILTER_LINEAR (2 << 11) 809c0e09200SDave Airlie # define R300_TX_MIN_FILTER_NEAREST_MIP_NEAREST (5 << 11) 810c0e09200SDave Airlie # define R300_TX_MIN_FILTER_NEAREST_MIP_LINEAR (9 << 11) 811c0e09200SDave Airlie # define R300_TX_MIN_FILTER_LINEAR_MIP_NEAREST (6 << 11) 812c0e09200SDave Airlie # define R300_TX_MIN_FILTER_LINEAR_MIP_LINEAR (10 << 11) 813c0e09200SDave Airlie 814c0e09200SDave Airlie /* NOTE: NEAREST doesnt seem to exist. 815c0e09200SDave Airlie * Im not seting MAG_FILTER_MASK and (3 << 11) on for all 816c0e09200SDave Airlie * anisotropy modes because that would void selected mag filter 817c0e09200SDave Airlie */ 818c0e09200SDave Airlie # define R300_TX_MIN_FILTER_ANISO_NEAREST (0 << 13) 819c0e09200SDave Airlie # define R300_TX_MIN_FILTER_ANISO_LINEAR (0 << 13) 820c0e09200SDave Airlie # define R300_TX_MIN_FILTER_ANISO_NEAREST_MIP_NEAREST (1 << 13) 821c0e09200SDave Airlie # define R300_TX_MIN_FILTER_ANISO_NEAREST_MIP_LINEAR (2 << 13) 822c0e09200SDave Airlie # define R300_TX_MIN_FILTER_MASK ( (15 << 11) | (3 << 13) ) 823c0e09200SDave Airlie # define R300_TX_MAX_ANISO_1_TO_1 (0 << 21) 824c0e09200SDave Airlie # define R300_TX_MAX_ANISO_2_TO_1 (2 << 21) 825c0e09200SDave Airlie # define R300_TX_MAX_ANISO_4_TO_1 (4 << 21) 826c0e09200SDave Airlie # define R300_TX_MAX_ANISO_8_TO_1 (6 << 21) 827c0e09200SDave Airlie # define R300_TX_MAX_ANISO_16_TO_1 (8 << 21) 828c0e09200SDave Airlie # define R300_TX_MAX_ANISO_MASK (14 << 21) 829c0e09200SDave Airlie 830c0e09200SDave Airlie #define R300_TX_FILTER1_0 0x4440 831c0e09200SDave Airlie # define R300_CHROMA_KEY_MODE_DISABLE 0 832c0e09200SDave Airlie # define R300_CHROMA_KEY_FORCE 1 833c0e09200SDave Airlie # define R300_CHROMA_KEY_BLEND 2 834c0e09200SDave Airlie # define R300_MC_ROUND_NORMAL (0<<2) 835c0e09200SDave Airlie # define R300_MC_ROUND_MPEG4 (1<<2) 836c0e09200SDave Airlie # define R300_LOD_BIAS_MASK 0x1fff 837c0e09200SDave Airlie # define R300_EDGE_ANISO_EDGE_DIAG (0<<13) 838c0e09200SDave Airlie # define R300_EDGE_ANISO_EDGE_ONLY (1<<13) 839c0e09200SDave Airlie # define R300_MC_COORD_TRUNCATE_DISABLE (0<<14) 840c0e09200SDave Airlie # define R300_MC_COORD_TRUNCATE_MPEG (1<<14) 841c0e09200SDave Airlie # define R300_TX_TRI_PERF_0_8 (0<<15) 842c0e09200SDave Airlie # define R300_TX_TRI_PERF_1_8 (1<<15) 843c0e09200SDave Airlie # define R300_TX_TRI_PERF_1_4 (2<<15) 844c0e09200SDave Airlie # define R300_TX_TRI_PERF_3_8 (3<<15) 845c0e09200SDave Airlie # define R300_ANISO_THRESHOLD_MASK (7<<17) 846c0e09200SDave Airlie 847c0e09200SDave Airlie #define R300_TX_SIZE_0 0x4480 848c0e09200SDave Airlie # define R300_TX_WIDTHMASK_SHIFT 0 849c0e09200SDave Airlie # define R300_TX_WIDTHMASK_MASK (2047 << 0) 850c0e09200SDave Airlie # define R300_TX_HEIGHTMASK_SHIFT 11 851c0e09200SDave Airlie # define R300_TX_HEIGHTMASK_MASK (2047 << 11) 852c0e09200SDave Airlie # define R300_TX_UNK23 (1 << 23) 853c0e09200SDave Airlie # define R300_TX_MAX_MIP_LEVEL_SHIFT 26 854c0e09200SDave Airlie # define R300_TX_MAX_MIP_LEVEL_MASK (0xf << 26) 855c0e09200SDave Airlie # define R300_TX_SIZE_PROJECTED (1<<30) 856c0e09200SDave Airlie # define R300_TX_SIZE_TXPITCH_EN (1<<31) 857c0e09200SDave Airlie #define R300_TX_FORMAT_0 0x44C0 858c0e09200SDave Airlie /* The interpretation of the format word by Wladimir van der Laan */ 859c0e09200SDave Airlie /* The X, Y, Z and W refer to the layout of the components. 860c0e09200SDave Airlie They are given meanings as R, G, B and Alpha by the swizzle 861c0e09200SDave Airlie specification */ 862c0e09200SDave Airlie # define R300_TX_FORMAT_X8 0x0 863c0e09200SDave Airlie # define R300_TX_FORMAT_X16 0x1 864c0e09200SDave Airlie # define R300_TX_FORMAT_Y4X4 0x2 865c0e09200SDave Airlie # define R300_TX_FORMAT_Y8X8 0x3 866c0e09200SDave Airlie # define R300_TX_FORMAT_Y16X16 0x4 867c0e09200SDave Airlie # define R300_TX_FORMAT_Z3Y3X2 0x5 868c0e09200SDave Airlie # define R300_TX_FORMAT_Z5Y6X5 0x6 869c0e09200SDave Airlie # define R300_TX_FORMAT_Z6Y5X5 0x7 870c0e09200SDave Airlie # define R300_TX_FORMAT_Z11Y11X10 0x8 871c0e09200SDave Airlie # define R300_TX_FORMAT_Z10Y11X11 0x9 872c0e09200SDave Airlie # define R300_TX_FORMAT_W4Z4Y4X4 0xA 873c0e09200SDave Airlie # define R300_TX_FORMAT_W1Z5Y5X5 0xB 874c0e09200SDave Airlie # define R300_TX_FORMAT_W8Z8Y8X8 0xC 875c0e09200SDave Airlie # define R300_TX_FORMAT_W2Z10Y10X10 0xD 876c0e09200SDave Airlie # define R300_TX_FORMAT_W16Z16Y16X16 0xE 877c0e09200SDave Airlie # define R300_TX_FORMAT_DXT1 0xF 878c0e09200SDave Airlie # define R300_TX_FORMAT_DXT3 0x10 879c0e09200SDave Airlie # define R300_TX_FORMAT_DXT5 0x11 880c0e09200SDave Airlie # define R300_TX_FORMAT_D3DMFT_CxV8U8 0x12 /* no swizzle */ 881c0e09200SDave Airlie # define R300_TX_FORMAT_A8R8G8B8 0x13 /* no swizzle */ 882c0e09200SDave Airlie # define R300_TX_FORMAT_B8G8_B8G8 0x14 /* no swizzle */ 883c0e09200SDave Airlie # define R300_TX_FORMAT_G8R8_G8B8 0x15 /* no swizzle */ 884c0e09200SDave Airlie /* 0x16 - some 16 bit green format.. ?? */ 885c0e09200SDave Airlie # define R300_TX_FORMAT_UNK25 (1 << 25) /* no swizzle */ 886c0e09200SDave Airlie # define R300_TX_FORMAT_CUBIC_MAP (1 << 26) 887c0e09200SDave Airlie 888c0e09200SDave Airlie /* gap */ 889c0e09200SDave Airlie /* Floating point formats */ 890c0e09200SDave Airlie /* Note - hardware supports both 16 and 32 bit floating point */ 891c0e09200SDave Airlie # define R300_TX_FORMAT_FL_I16 0x18 892c0e09200SDave Airlie # define R300_TX_FORMAT_FL_I16A16 0x19 893c0e09200SDave Airlie # define R300_TX_FORMAT_FL_R16G16B16A16 0x1A 894c0e09200SDave Airlie # define R300_TX_FORMAT_FL_I32 0x1B 895c0e09200SDave Airlie # define R300_TX_FORMAT_FL_I32A32 0x1C 896c0e09200SDave Airlie # define R300_TX_FORMAT_FL_R32G32B32A32 0x1D 897c0e09200SDave Airlie /* alpha modes, convenience mostly */ 898c0e09200SDave Airlie /* if you have alpha, pick constant appropriate to the 899c0e09200SDave Airlie number of channels (1 for I8, 2 for I8A8, 4 for R8G8B8A8, etc */ 900c0e09200SDave Airlie # define R300_TX_FORMAT_ALPHA_1CH 0x000 901c0e09200SDave Airlie # define R300_TX_FORMAT_ALPHA_2CH 0x200 902c0e09200SDave Airlie # define R300_TX_FORMAT_ALPHA_4CH 0x600 903c0e09200SDave Airlie # define R300_TX_FORMAT_ALPHA_NONE 0xA00 904c0e09200SDave Airlie /* Swizzling */ 905c0e09200SDave Airlie /* constants */ 906c0e09200SDave Airlie # define R300_TX_FORMAT_X 0 907c0e09200SDave Airlie # define R300_TX_FORMAT_Y 1 908c0e09200SDave Airlie # define R300_TX_FORMAT_Z 2 909c0e09200SDave Airlie # define R300_TX_FORMAT_W 3 910c0e09200SDave Airlie # define R300_TX_FORMAT_ZERO 4 911c0e09200SDave Airlie # define R300_TX_FORMAT_ONE 5 912c0e09200SDave Airlie /* 2.0*Z, everything above 1.0 is set to 0.0 */ 913c0e09200SDave Airlie # define R300_TX_FORMAT_CUT_Z 6 914c0e09200SDave Airlie /* 2.0*W, everything above 1.0 is set to 0.0 */ 915c0e09200SDave Airlie # define R300_TX_FORMAT_CUT_W 7 916c0e09200SDave Airlie 917c0e09200SDave Airlie # define R300_TX_FORMAT_B_SHIFT 18 918c0e09200SDave Airlie # define R300_TX_FORMAT_G_SHIFT 15 919c0e09200SDave Airlie # define R300_TX_FORMAT_R_SHIFT 12 920c0e09200SDave Airlie # define R300_TX_FORMAT_A_SHIFT 9 921c0e09200SDave Airlie /* Convenience macro to take care of layout and swizzling */ 922c0e09200SDave Airlie # define R300_EASY_TX_FORMAT(B, G, R, A, FMT) ( \ 923c0e09200SDave Airlie ((R300_TX_FORMAT_##B)<<R300_TX_FORMAT_B_SHIFT) \ 924c0e09200SDave Airlie | ((R300_TX_FORMAT_##G)<<R300_TX_FORMAT_G_SHIFT) \ 925c0e09200SDave Airlie | ((R300_TX_FORMAT_##R)<<R300_TX_FORMAT_R_SHIFT) \ 926c0e09200SDave Airlie | ((R300_TX_FORMAT_##A)<<R300_TX_FORMAT_A_SHIFT) \ 927c0e09200SDave Airlie | (R300_TX_FORMAT_##FMT) \ 928c0e09200SDave Airlie ) 929c0e09200SDave Airlie /* These can be ORed with result of R300_EASY_TX_FORMAT() 930c0e09200SDave Airlie We don't really know what they do. Take values from a 931c0e09200SDave Airlie constant color ? */ 932c0e09200SDave Airlie # define R300_TX_FORMAT_CONST_X (1<<5) 933c0e09200SDave Airlie # define R300_TX_FORMAT_CONST_Y (2<<5) 934c0e09200SDave Airlie # define R300_TX_FORMAT_CONST_Z (4<<5) 935c0e09200SDave Airlie # define R300_TX_FORMAT_CONST_W (8<<5) 936c0e09200SDave Airlie 937c0e09200SDave Airlie # define R300_TX_FORMAT_YUV_MODE 0x00800000 938c0e09200SDave Airlie 939c0e09200SDave Airlie #define R300_TX_PITCH_0 0x4500 /* obvious missing in gap */ 940c0e09200SDave Airlie #define R300_TX_OFFSET_0 0x4540 941c0e09200SDave Airlie /* BEGIN: Guess from R200 */ 942c0e09200SDave Airlie # define R300_TXO_ENDIAN_NO_SWAP (0 << 0) 943c0e09200SDave Airlie # define R300_TXO_ENDIAN_BYTE_SWAP (1 << 0) 944c0e09200SDave Airlie # define R300_TXO_ENDIAN_WORD_SWAP (2 << 0) 945c0e09200SDave Airlie # define R300_TXO_ENDIAN_HALFDW_SWAP (3 << 0) 946c0e09200SDave Airlie # define R300_TXO_MACRO_TILE (1 << 2) 947c0e09200SDave Airlie # define R300_TXO_MICRO_TILE (1 << 3) 948c0e09200SDave Airlie # define R300_TXO_OFFSET_MASK 0xffffffe0 949c0e09200SDave Airlie # define R300_TXO_OFFSET_SHIFT 5 950c0e09200SDave Airlie /* END: Guess from R200 */ 951c0e09200SDave Airlie 952c0e09200SDave Airlie /* 32 bit chroma key */ 953c0e09200SDave Airlie #define R300_TX_CHROMA_KEY_0 0x4580 954c0e09200SDave Airlie /* ff00ff00 == { 0, 1.0, 0, 1.0 } */ 955c0e09200SDave Airlie #define R300_TX_BORDER_COLOR_0 0x45C0 956c0e09200SDave Airlie 957c0e09200SDave Airlie /* END: Texture specification */ 958c0e09200SDave Airlie 959c0e09200SDave Airlie /* BEGIN: Fragment program instruction set */ 960c0e09200SDave Airlie 961c0e09200SDave Airlie /* Fragment programs are written directly into register space. 962c0e09200SDave Airlie * There are separate instruction streams for texture instructions and ALU 963c0e09200SDave Airlie * instructions. 964c0e09200SDave Airlie * In order to synchronize these streams, the program is divided into up 965c0e09200SDave Airlie * to 4 nodes. Each node begins with a number of TEX operations, followed 966c0e09200SDave Airlie * by a number of ALU operations. 967c0e09200SDave Airlie * The first node can have zero TEX ops, all subsequent nodes must have at 968c0e09200SDave Airlie * least 969c0e09200SDave Airlie * one TEX ops. 970c0e09200SDave Airlie * All nodes must have at least one ALU op. 971c0e09200SDave Airlie * 972c0e09200SDave Airlie * The index of the last node is stored in PFS_CNTL_0: A value of 0 means 973c0e09200SDave Airlie * 1 node, a value of 3 means 4 nodes. 974c0e09200SDave Airlie * The total amount of instructions is defined in PFS_CNTL_2. The offsets are 975c0e09200SDave Airlie * offsets into the respective instruction streams, while *_END points to the 976c0e09200SDave Airlie * last instruction relative to this offset. 977c0e09200SDave Airlie */ 978c0e09200SDave Airlie #define R300_PFS_CNTL_0 0x4600 979c0e09200SDave Airlie # define R300_PFS_CNTL_LAST_NODES_SHIFT 0 980c0e09200SDave Airlie # define R300_PFS_CNTL_LAST_NODES_MASK (3 << 0) 981c0e09200SDave Airlie # define R300_PFS_CNTL_FIRST_NODE_HAS_TEX (1 << 3) 982c0e09200SDave Airlie #define R300_PFS_CNTL_1 0x4604 983c0e09200SDave Airlie /* There is an unshifted value here which has so far always been equal to the 984c0e09200SDave Airlie * index of the highest used temporary register. 985c0e09200SDave Airlie */ 986c0e09200SDave Airlie #define R300_PFS_CNTL_2 0x4608 987c0e09200SDave Airlie # define R300_PFS_CNTL_ALU_OFFSET_SHIFT 0 988c0e09200SDave Airlie # define R300_PFS_CNTL_ALU_OFFSET_MASK (63 << 0) 989c0e09200SDave Airlie # define R300_PFS_CNTL_ALU_END_SHIFT 6 990c0e09200SDave Airlie # define R300_PFS_CNTL_ALU_END_MASK (63 << 6) 991c0e09200SDave Airlie # define R300_PFS_CNTL_TEX_OFFSET_SHIFT 12 992c0e09200SDave Airlie # define R300_PFS_CNTL_TEX_OFFSET_MASK (31 << 12) /* GUESS */ 993c0e09200SDave Airlie # define R300_PFS_CNTL_TEX_END_SHIFT 18 994c0e09200SDave Airlie # define R300_PFS_CNTL_TEX_END_MASK (31 << 18) /* GUESS */ 995c0e09200SDave Airlie 996c0e09200SDave Airlie /* gap */ 997c0e09200SDave Airlie 998c0e09200SDave Airlie /* Nodes are stored backwards. The last active node is always stored in 999c0e09200SDave Airlie * PFS_NODE_3. 1000c0e09200SDave Airlie * Example: In a 2-node program, NODE_0 and NODE_1 are set to 0. The 1001c0e09200SDave Airlie * first node is stored in NODE_2, the second node is stored in NODE_3. 1002c0e09200SDave Airlie * 1003c0e09200SDave Airlie * Offsets are relative to the master offset from PFS_CNTL_2. 1004c0e09200SDave Airlie */ 1005c0e09200SDave Airlie #define R300_PFS_NODE_0 0x4610 1006c0e09200SDave Airlie #define R300_PFS_NODE_1 0x4614 1007c0e09200SDave Airlie #define R300_PFS_NODE_2 0x4618 1008c0e09200SDave Airlie #define R300_PFS_NODE_3 0x461C 1009c0e09200SDave Airlie # define R300_PFS_NODE_ALU_OFFSET_SHIFT 0 1010c0e09200SDave Airlie # define R300_PFS_NODE_ALU_OFFSET_MASK (63 << 0) 1011c0e09200SDave Airlie # define R300_PFS_NODE_ALU_END_SHIFT 6 1012c0e09200SDave Airlie # define R300_PFS_NODE_ALU_END_MASK (63 << 6) 1013c0e09200SDave Airlie # define R300_PFS_NODE_TEX_OFFSET_SHIFT 12 1014c0e09200SDave Airlie # define R300_PFS_NODE_TEX_OFFSET_MASK (31 << 12) 1015c0e09200SDave Airlie # define R300_PFS_NODE_TEX_END_SHIFT 17 1016c0e09200SDave Airlie # define R300_PFS_NODE_TEX_END_MASK (31 << 17) 1017c0e09200SDave Airlie # define R300_PFS_NODE_OUTPUT_COLOR (1 << 22) 1018c0e09200SDave Airlie # define R300_PFS_NODE_OUTPUT_DEPTH (1 << 23) 1019c0e09200SDave Airlie 1020c0e09200SDave Airlie /* TEX 1021c0e09200SDave Airlie * As far as I can tell, texture instructions cannot write into output 1022c0e09200SDave Airlie * registers directly. A subsequent ALU instruction is always necessary, 1023c0e09200SDave Airlie * even if it's just MAD o0, r0, 1, 0 1024c0e09200SDave Airlie */ 1025c0e09200SDave Airlie #define R300_PFS_TEXI_0 0x4620 1026c0e09200SDave Airlie # define R300_FPITX_SRC_SHIFT 0 1027c0e09200SDave Airlie # define R300_FPITX_SRC_MASK (31 << 0) 1028c0e09200SDave Airlie /* GUESS */ 1029c0e09200SDave Airlie # define R300_FPITX_SRC_CONST (1 << 5) 1030c0e09200SDave Airlie # define R300_FPITX_DST_SHIFT 6 1031c0e09200SDave Airlie # define R300_FPITX_DST_MASK (31 << 6) 1032c0e09200SDave Airlie # define R300_FPITX_IMAGE_SHIFT 11 1033c0e09200SDave Airlie /* GUESS based on layout and native limits */ 1034c0e09200SDave Airlie # define R300_FPITX_IMAGE_MASK (15 << 11) 1035c0e09200SDave Airlie /* Unsure if these are opcodes, or some kind of bitfield, but this is how 1036c0e09200SDave Airlie * they were set when I checked 1037c0e09200SDave Airlie */ 1038c0e09200SDave Airlie # define R300_FPITX_OPCODE_SHIFT 15 1039c0e09200SDave Airlie # define R300_FPITX_OP_TEX 1 1040c0e09200SDave Airlie # define R300_FPITX_OP_KIL 2 1041c0e09200SDave Airlie # define R300_FPITX_OP_TXP 3 1042c0e09200SDave Airlie # define R300_FPITX_OP_TXB 4 1043c0e09200SDave Airlie # define R300_FPITX_OPCODE_MASK (7 << 15) 1044c0e09200SDave Airlie 1045c0e09200SDave Airlie /* ALU 1046c0e09200SDave Airlie * The ALU instructions register blocks are enumerated according to the order 1047c0e09200SDave Airlie * in which fglrx. I assume there is space for 64 instructions, since 1048c0e09200SDave Airlie * each block has space for a maximum of 64 DWORDs, and this matches reported 1049c0e09200SDave Airlie * native limits. 1050c0e09200SDave Airlie * 1051c0e09200SDave Airlie * The basic functional block seems to be one MAD for each color and alpha, 1052c0e09200SDave Airlie * and an adder that adds all components after the MUL. 1053c0e09200SDave Airlie * - ADD, MUL, MAD etc.: use MAD with appropriate neutral operands 1054c0e09200SDave Airlie * - DP4: Use OUTC_DP4, OUTA_DP4 1055c0e09200SDave Airlie * - DP3: Use OUTC_DP3, OUTA_DP4, appropriate alpha operands 1056c0e09200SDave Airlie * - DPH: Use OUTC_DP4, OUTA_DP4, appropriate alpha operands 1057c0e09200SDave Airlie * - CMPH: If ARG2 > 0.5, return ARG0, else return ARG1 1058c0e09200SDave Airlie * - CMP: If ARG2 < 0, return ARG1, else return ARG0 1059c0e09200SDave Airlie * - FLR: use FRC+MAD 1060c0e09200SDave Airlie * - XPD: use MAD+MAD 1061c0e09200SDave Airlie * - SGE, SLT: use MAD+CMP 1062c0e09200SDave Airlie * - RSQ: use ABS modifier for argument 1063c0e09200SDave Airlie * - Use OUTC_REPL_ALPHA to write results of an alpha-only operation 1064c0e09200SDave Airlie * (e.g. RCP) into color register 1065c0e09200SDave Airlie * - apparently, there's no quick DST operation 1066c0e09200SDave Airlie * - fglrx set FPI2_UNKNOWN_31 on a "MAD fragment.color, tmp0, tmp1, tmp2" 1067c0e09200SDave Airlie * - fglrx set FPI2_UNKNOWN_31 on a "MAX r2, r1, c0" 1068c0e09200SDave Airlie * - fglrx once set FPI0_UNKNOWN_31 on a "FRC r1, r1" 1069c0e09200SDave Airlie * 1070c0e09200SDave Airlie * Operand selection 1071c0e09200SDave Airlie * First stage selects three sources from the available registers and 1072c0e09200SDave Airlie * constant parameters. This is defined in INSTR1 (color) and INSTR3 (alpha). 1073c0e09200SDave Airlie * fglrx sorts the three source fields: Registers before constants, 1074c0e09200SDave Airlie * lower indices before higher indices; I do not know whether this is 1075c0e09200SDave Airlie * necessary. 1076c0e09200SDave Airlie * 1077c0e09200SDave Airlie * fglrx fills unused sources with "read constant 0" 1078c0e09200SDave Airlie * According to specs, you cannot select more than two different constants. 1079c0e09200SDave Airlie * 1080c0e09200SDave Airlie * Second stage selects the operands from the sources. This is defined in 1081c0e09200SDave Airlie * INSTR0 (color) and INSTR2 (alpha). You can also select the special constants 1082c0e09200SDave Airlie * zero and one. 1083c0e09200SDave Airlie * Swizzling and negation happens in this stage, as well. 1084c0e09200SDave Airlie * 1085c0e09200SDave Airlie * Important: Color and alpha seem to be mostly separate, i.e. their sources 1086c0e09200SDave Airlie * selection appears to be fully independent (the register storage is probably 1087c0e09200SDave Airlie * physically split into a color and an alpha section). 1088c0e09200SDave Airlie * However (because of the apparent physical split), there is some interaction 1089c0e09200SDave Airlie * WRT swizzling. If, for example, you want to load an R component into an 1090c0e09200SDave Airlie * Alpha operand, this R component is taken from a *color* source, not from 1091c0e09200SDave Airlie * an alpha source. The corresponding register doesn't even have to appear in 1092c0e09200SDave Airlie * the alpha sources list. (I hope this all makes sense to you) 1093c0e09200SDave Airlie * 1094c0e09200SDave Airlie * Destination selection 1095c0e09200SDave Airlie * The destination register index is in FPI1 (color) and FPI3 (alpha) 1096c0e09200SDave Airlie * together with enable bits. 1097c0e09200SDave Airlie * There are separate enable bits for writing into temporary registers 1098c0e09200SDave Airlie * (DSTC_REG_* /DSTA_REG) and and program output registers (DSTC_OUTPUT_* 1099c0e09200SDave Airlie * /DSTA_OUTPUT). You can write to both at once, or not write at all (the 1100c0e09200SDave Airlie * same index must be used for both). 1101c0e09200SDave Airlie * 1102c0e09200SDave Airlie * Note: There is a special form for LRP 1103c0e09200SDave Airlie * - Argument order is the same as in ARB_fragment_program. 1104c0e09200SDave Airlie * - Operation is MAD 1105c0e09200SDave Airlie * - ARG1 is set to ARGC_SRC1C_LRP/ARGC_SRC1A_LRP 1106c0e09200SDave Airlie * - Set FPI0/FPI2_SPECIAL_LRP 1107c0e09200SDave Airlie * Arbitrary LRP (including support for swizzling) requires vanilla MAD+MAD 1108c0e09200SDave Airlie */ 1109c0e09200SDave Airlie #define R300_PFS_INSTR1_0 0x46C0 1110c0e09200SDave Airlie # define R300_FPI1_SRC0C_SHIFT 0 1111c0e09200SDave Airlie # define R300_FPI1_SRC0C_MASK (31 << 0) 1112c0e09200SDave Airlie # define R300_FPI1_SRC0C_CONST (1 << 5) 1113c0e09200SDave Airlie # define R300_FPI1_SRC1C_SHIFT 6 1114c0e09200SDave Airlie # define R300_FPI1_SRC1C_MASK (31 << 6) 1115c0e09200SDave Airlie # define R300_FPI1_SRC1C_CONST (1 << 11) 1116c0e09200SDave Airlie # define R300_FPI1_SRC2C_SHIFT 12 1117c0e09200SDave Airlie # define R300_FPI1_SRC2C_MASK (31 << 12) 1118c0e09200SDave Airlie # define R300_FPI1_SRC2C_CONST (1 << 17) 1119c0e09200SDave Airlie # define R300_FPI1_SRC_MASK 0x0003ffff 1120c0e09200SDave Airlie # define R300_FPI1_DSTC_SHIFT 18 1121c0e09200SDave Airlie # define R300_FPI1_DSTC_MASK (31 << 18) 1122c0e09200SDave Airlie # define R300_FPI1_DSTC_REG_MASK_SHIFT 23 1123c0e09200SDave Airlie # define R300_FPI1_DSTC_REG_X (1 << 23) 1124c0e09200SDave Airlie # define R300_FPI1_DSTC_REG_Y (1 << 24) 1125c0e09200SDave Airlie # define R300_FPI1_DSTC_REG_Z (1 << 25) 1126c0e09200SDave Airlie # define R300_FPI1_DSTC_OUTPUT_MASK_SHIFT 26 1127c0e09200SDave Airlie # define R300_FPI1_DSTC_OUTPUT_X (1 << 26) 1128c0e09200SDave Airlie # define R300_FPI1_DSTC_OUTPUT_Y (1 << 27) 1129c0e09200SDave Airlie # define R300_FPI1_DSTC_OUTPUT_Z (1 << 28) 1130c0e09200SDave Airlie 1131c0e09200SDave Airlie #define R300_PFS_INSTR3_0 0x47C0 1132c0e09200SDave Airlie # define R300_FPI3_SRC0A_SHIFT 0 1133c0e09200SDave Airlie # define R300_FPI3_SRC0A_MASK (31 << 0) 1134c0e09200SDave Airlie # define R300_FPI3_SRC0A_CONST (1 << 5) 1135c0e09200SDave Airlie # define R300_FPI3_SRC1A_SHIFT 6 1136c0e09200SDave Airlie # define R300_FPI3_SRC1A_MASK (31 << 6) 1137c0e09200SDave Airlie # define R300_FPI3_SRC1A_CONST (1 << 11) 1138c0e09200SDave Airlie # define R300_FPI3_SRC2A_SHIFT 12 1139c0e09200SDave Airlie # define R300_FPI3_SRC2A_MASK (31 << 12) 1140c0e09200SDave Airlie # define R300_FPI3_SRC2A_CONST (1 << 17) 1141c0e09200SDave Airlie # define R300_FPI3_SRC_MASK 0x0003ffff 1142c0e09200SDave Airlie # define R300_FPI3_DSTA_SHIFT 18 1143c0e09200SDave Airlie # define R300_FPI3_DSTA_MASK (31 << 18) 1144c0e09200SDave Airlie # define R300_FPI3_DSTA_REG (1 << 23) 1145c0e09200SDave Airlie # define R300_FPI3_DSTA_OUTPUT (1 << 24) 1146c0e09200SDave Airlie # define R300_FPI3_DSTA_DEPTH (1 << 27) 1147c0e09200SDave Airlie 1148c0e09200SDave Airlie #define R300_PFS_INSTR0_0 0x48C0 1149c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC0C_XYZ 0 1150c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC0C_XXX 1 1151c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC0C_YYY 2 1152c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC0C_ZZZ 3 1153c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC1C_XYZ 4 1154c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC1C_XXX 5 1155c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC1C_YYY 6 1156c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC1C_ZZZ 7 1157c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC2C_XYZ 8 1158c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC2C_XXX 9 1159c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC2C_YYY 10 1160c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC2C_ZZZ 11 1161c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC0A 12 1162c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC1A 13 1163c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC2A 14 1164c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC1C_LRP 15 1165c0e09200SDave Airlie # define R300_FPI0_ARGC_ZERO 20 1166c0e09200SDave Airlie # define R300_FPI0_ARGC_ONE 21 1167c0e09200SDave Airlie /* GUESS */ 1168c0e09200SDave Airlie # define R300_FPI0_ARGC_HALF 22 1169c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC0C_YZX 23 1170c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC1C_YZX 24 1171c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC2C_YZX 25 1172c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC0C_ZXY 26 1173c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC1C_ZXY 27 1174c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC2C_ZXY 28 1175c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC0CA_WZY 29 1176c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC1CA_WZY 30 1177c0e09200SDave Airlie # define R300_FPI0_ARGC_SRC2CA_WZY 31 1178c0e09200SDave Airlie 1179c0e09200SDave Airlie # define R300_FPI0_ARG0C_SHIFT 0 1180c0e09200SDave Airlie # define R300_FPI0_ARG0C_MASK (31 << 0) 1181c0e09200SDave Airlie # define R300_FPI0_ARG0C_NEG (1 << 5) 1182c0e09200SDave Airlie # define R300_FPI0_ARG0C_ABS (1 << 6) 1183c0e09200SDave Airlie # define R300_FPI0_ARG1C_SHIFT 7 1184c0e09200SDave Airlie # define R300_FPI0_ARG1C_MASK (31 << 7) 1185c0e09200SDave Airlie # define R300_FPI0_ARG1C_NEG (1 << 12) 1186c0e09200SDave Airlie # define R300_FPI0_ARG1C_ABS (1 << 13) 1187c0e09200SDave Airlie # define R300_FPI0_ARG2C_SHIFT 14 1188c0e09200SDave Airlie # define R300_FPI0_ARG2C_MASK (31 << 14) 1189c0e09200SDave Airlie # define R300_FPI0_ARG2C_NEG (1 << 19) 1190c0e09200SDave Airlie # define R300_FPI0_ARG2C_ABS (1 << 20) 1191c0e09200SDave Airlie # define R300_FPI0_SPECIAL_LRP (1 << 21) 1192c0e09200SDave Airlie # define R300_FPI0_OUTC_MAD (0 << 23) 1193c0e09200SDave Airlie # define R300_FPI0_OUTC_DP3 (1 << 23) 1194c0e09200SDave Airlie # define R300_FPI0_OUTC_DP4 (2 << 23) 1195c0e09200SDave Airlie # define R300_FPI0_OUTC_MIN (4 << 23) 1196c0e09200SDave Airlie # define R300_FPI0_OUTC_MAX (5 << 23) 1197c0e09200SDave Airlie # define R300_FPI0_OUTC_CMPH (7 << 23) 1198c0e09200SDave Airlie # define R300_FPI0_OUTC_CMP (8 << 23) 1199c0e09200SDave Airlie # define R300_FPI0_OUTC_FRC (9 << 23) 1200c0e09200SDave Airlie # define R300_FPI0_OUTC_REPL_ALPHA (10 << 23) 1201c0e09200SDave Airlie # define R300_FPI0_OUTC_SAT (1 << 30) 1202c0e09200SDave Airlie # define R300_FPI0_INSERT_NOP (1 << 31) 1203c0e09200SDave Airlie 1204c0e09200SDave Airlie #define R300_PFS_INSTR2_0 0x49C0 1205c0e09200SDave Airlie # define R300_FPI2_ARGA_SRC0C_X 0 1206c0e09200SDave Airlie # define R300_FPI2_ARGA_SRC0C_Y 1 1207c0e09200SDave Airlie # define R300_FPI2_ARGA_SRC0C_Z 2 1208c0e09200SDave Airlie # define R300_FPI2_ARGA_SRC1C_X 3 1209c0e09200SDave Airlie # define R300_FPI2_ARGA_SRC1C_Y 4 1210c0e09200SDave Airlie # define R300_FPI2_ARGA_SRC1C_Z 5 1211c0e09200SDave Airlie # define R300_FPI2_ARGA_SRC2C_X 6 1212c0e09200SDave Airlie # define R300_FPI2_ARGA_SRC2C_Y 7 1213c0e09200SDave Airlie # define R300_FPI2_ARGA_SRC2C_Z 8 1214c0e09200SDave Airlie # define R300_FPI2_ARGA_SRC0A 9 1215c0e09200SDave Airlie # define R300_FPI2_ARGA_SRC1A 10 1216c0e09200SDave Airlie # define R300_FPI2_ARGA_SRC2A 11 1217c0e09200SDave Airlie # define R300_FPI2_ARGA_SRC1A_LRP 15 1218c0e09200SDave Airlie # define R300_FPI2_ARGA_ZERO 16 1219c0e09200SDave Airlie # define R300_FPI2_ARGA_ONE 17 1220c0e09200SDave Airlie /* GUESS */ 1221c0e09200SDave Airlie # define R300_FPI2_ARGA_HALF 18 1222c0e09200SDave Airlie # define R300_FPI2_ARG0A_SHIFT 0 1223c0e09200SDave Airlie # define R300_FPI2_ARG0A_MASK (31 << 0) 1224c0e09200SDave Airlie # define R300_FPI2_ARG0A_NEG (1 << 5) 1225c0e09200SDave Airlie /* GUESS */ 1226c0e09200SDave Airlie # define R300_FPI2_ARG0A_ABS (1 << 6) 1227c0e09200SDave Airlie # define R300_FPI2_ARG1A_SHIFT 7 1228c0e09200SDave Airlie # define R300_FPI2_ARG1A_MASK (31 << 7) 1229c0e09200SDave Airlie # define R300_FPI2_ARG1A_NEG (1 << 12) 1230c0e09200SDave Airlie /* GUESS */ 1231c0e09200SDave Airlie # define R300_FPI2_ARG1A_ABS (1 << 13) 1232c0e09200SDave Airlie # define R300_FPI2_ARG2A_SHIFT 14 1233c0e09200SDave Airlie # define R300_FPI2_ARG2A_MASK (31 << 14) 1234c0e09200SDave Airlie # define R300_FPI2_ARG2A_NEG (1 << 19) 1235c0e09200SDave Airlie /* GUESS */ 1236c0e09200SDave Airlie # define R300_FPI2_ARG2A_ABS (1 << 20) 1237c0e09200SDave Airlie # define R300_FPI2_SPECIAL_LRP (1 << 21) 1238c0e09200SDave Airlie # define R300_FPI2_OUTA_MAD (0 << 23) 1239c0e09200SDave Airlie # define R300_FPI2_OUTA_DP4 (1 << 23) 1240c0e09200SDave Airlie # define R300_FPI2_OUTA_MIN (2 << 23) 1241c0e09200SDave Airlie # define R300_FPI2_OUTA_MAX (3 << 23) 1242c0e09200SDave Airlie # define R300_FPI2_OUTA_CMP (6 << 23) 1243c0e09200SDave Airlie # define R300_FPI2_OUTA_FRC (7 << 23) 1244c0e09200SDave Airlie # define R300_FPI2_OUTA_EX2 (8 << 23) 1245c0e09200SDave Airlie # define R300_FPI2_OUTA_LG2 (9 << 23) 1246c0e09200SDave Airlie # define R300_FPI2_OUTA_RCP (10 << 23) 1247c0e09200SDave Airlie # define R300_FPI2_OUTA_RSQ (11 << 23) 1248c0e09200SDave Airlie # define R300_FPI2_OUTA_SAT (1 << 30) 1249c0e09200SDave Airlie # define R300_FPI2_UNKNOWN_31 (1 << 31) 1250c0e09200SDave Airlie /* END: Fragment program instruction set */ 1251c0e09200SDave Airlie 1252c0e09200SDave Airlie /* Fog state and color */ 1253c0e09200SDave Airlie #define R300_RE_FOG_STATE 0x4BC0 1254c0e09200SDave Airlie # define R300_FOG_ENABLE (1 << 0) 1255c0e09200SDave Airlie # define R300_FOG_MODE_LINEAR (0 << 1) 1256c0e09200SDave Airlie # define R300_FOG_MODE_EXP (1 << 1) 1257c0e09200SDave Airlie # define R300_FOG_MODE_EXP2 (2 << 1) 1258c0e09200SDave Airlie # define R300_FOG_MODE_MASK (3 << 1) 1259c0e09200SDave Airlie #define R300_FOG_COLOR_R 0x4BC8 1260c0e09200SDave Airlie #define R300_FOG_COLOR_G 0x4BCC 1261c0e09200SDave Airlie #define R300_FOG_COLOR_B 0x4BD0 1262c0e09200SDave Airlie 1263c0e09200SDave Airlie #define R300_PP_ALPHA_TEST 0x4BD4 1264c0e09200SDave Airlie # define R300_REF_ALPHA_MASK 0x000000ff 1265c0e09200SDave Airlie # define R300_ALPHA_TEST_FAIL (0 << 8) 1266c0e09200SDave Airlie # define R300_ALPHA_TEST_LESS (1 << 8) 1267c0e09200SDave Airlie # define R300_ALPHA_TEST_LEQUAL (3 << 8) 1268c0e09200SDave Airlie # define R300_ALPHA_TEST_EQUAL (2 << 8) 1269c0e09200SDave Airlie # define R300_ALPHA_TEST_GEQUAL (6 << 8) 1270c0e09200SDave Airlie # define R300_ALPHA_TEST_GREATER (4 << 8) 1271c0e09200SDave Airlie # define R300_ALPHA_TEST_NEQUAL (5 << 8) 1272c0e09200SDave Airlie # define R300_ALPHA_TEST_PASS (7 << 8) 1273c0e09200SDave Airlie # define R300_ALPHA_TEST_OP_MASK (7 << 8) 1274c0e09200SDave Airlie # define R300_ALPHA_TEST_ENABLE (1 << 11) 1275c0e09200SDave Airlie 1276c0e09200SDave Airlie /* gap */ 1277c0e09200SDave Airlie 1278c0e09200SDave Airlie /* Fragment program parameters in 7.16 floating point */ 1279c0e09200SDave Airlie #define R300_PFS_PARAM_0_X 0x4C00 1280c0e09200SDave Airlie #define R300_PFS_PARAM_0_Y 0x4C04 1281c0e09200SDave Airlie #define R300_PFS_PARAM_0_Z 0x4C08 1282c0e09200SDave Airlie #define R300_PFS_PARAM_0_W 0x4C0C 1283c0e09200SDave Airlie /* GUESS: PARAM_31 is last, based on native limits reported by fglrx */ 1284c0e09200SDave Airlie #define R300_PFS_PARAM_31_X 0x4DF0 1285c0e09200SDave Airlie #define R300_PFS_PARAM_31_Y 0x4DF4 1286c0e09200SDave Airlie #define R300_PFS_PARAM_31_Z 0x4DF8 1287c0e09200SDave Airlie #define R300_PFS_PARAM_31_W 0x4DFC 1288c0e09200SDave Airlie 1289c0e09200SDave Airlie /* Notes: 1290c0e09200SDave Airlie * - AFAIK fglrx always sets BLEND_UNKNOWN when blending is used in 1291c0e09200SDave Airlie * the application 1292c0e09200SDave Airlie * - AFAIK fglrx always sets BLEND_NO_SEPARATE when CBLEND and ABLEND 1293c0e09200SDave Airlie * are set to the same 1294c0e09200SDave Airlie * function (both registers are always set up completely in any case) 1295c0e09200SDave Airlie * - Most blend flags are simply copied from R200 and not tested yet 1296c0e09200SDave Airlie */ 1297c0e09200SDave Airlie #define R300_RB3D_CBLEND 0x4E04 1298c0e09200SDave Airlie #define R300_RB3D_ABLEND 0x4E08 1299c0e09200SDave Airlie /* the following only appear in CBLEND */ 1300c0e09200SDave Airlie # define R300_BLEND_ENABLE (1 << 0) 1301c0e09200SDave Airlie # define R300_BLEND_UNKNOWN (3 << 1) 1302c0e09200SDave Airlie # define R300_BLEND_NO_SEPARATE (1 << 3) 1303c0e09200SDave Airlie /* the following are shared between CBLEND and ABLEND */ 1304c0e09200SDave Airlie # define R300_FCN_MASK (3 << 12) 1305c0e09200SDave Airlie # define R300_COMB_FCN_ADD_CLAMP (0 << 12) 1306c0e09200SDave Airlie # define R300_COMB_FCN_ADD_NOCLAMP (1 << 12) 1307c0e09200SDave Airlie # define R300_COMB_FCN_SUB_CLAMP (2 << 12) 1308c0e09200SDave Airlie # define R300_COMB_FCN_SUB_NOCLAMP (3 << 12) 1309c0e09200SDave Airlie # define R300_COMB_FCN_MIN (4 << 12) 1310c0e09200SDave Airlie # define R300_COMB_FCN_MAX (5 << 12) 1311c0e09200SDave Airlie # define R300_COMB_FCN_RSUB_CLAMP (6 << 12) 1312c0e09200SDave Airlie # define R300_COMB_FCN_RSUB_NOCLAMP (7 << 12) 1313c0e09200SDave Airlie # define R300_BLEND_GL_ZERO (32) 1314c0e09200SDave Airlie # define R300_BLEND_GL_ONE (33) 1315c0e09200SDave Airlie # define R300_BLEND_GL_SRC_COLOR (34) 1316c0e09200SDave Airlie # define R300_BLEND_GL_ONE_MINUS_SRC_COLOR (35) 1317c0e09200SDave Airlie # define R300_BLEND_GL_DST_COLOR (36) 1318c0e09200SDave Airlie # define R300_BLEND_GL_ONE_MINUS_DST_COLOR (37) 1319c0e09200SDave Airlie # define R300_BLEND_GL_SRC_ALPHA (38) 1320c0e09200SDave Airlie # define R300_BLEND_GL_ONE_MINUS_SRC_ALPHA (39) 1321c0e09200SDave Airlie # define R300_BLEND_GL_DST_ALPHA (40) 1322c0e09200SDave Airlie # define R300_BLEND_GL_ONE_MINUS_DST_ALPHA (41) 1323c0e09200SDave Airlie # define R300_BLEND_GL_SRC_ALPHA_SATURATE (42) 1324c0e09200SDave Airlie # define R300_BLEND_GL_CONST_COLOR (43) 1325c0e09200SDave Airlie # define R300_BLEND_GL_ONE_MINUS_CONST_COLOR (44) 1326c0e09200SDave Airlie # define R300_BLEND_GL_CONST_ALPHA (45) 1327c0e09200SDave Airlie # define R300_BLEND_GL_ONE_MINUS_CONST_ALPHA (46) 1328c0e09200SDave Airlie # define R300_BLEND_MASK (63) 1329c0e09200SDave Airlie # define R300_SRC_BLEND_SHIFT (16) 1330c0e09200SDave Airlie # define R300_DST_BLEND_SHIFT (24) 1331c0e09200SDave Airlie #define R300_RB3D_BLEND_COLOR 0x4E10 1332c0e09200SDave Airlie #define R300_RB3D_COLORMASK 0x4E0C 1333c0e09200SDave Airlie # define R300_COLORMASK0_B (1<<0) 1334c0e09200SDave Airlie # define R300_COLORMASK0_G (1<<1) 1335c0e09200SDave Airlie # define R300_COLORMASK0_R (1<<2) 1336c0e09200SDave Airlie # define R300_COLORMASK0_A (1<<3) 1337c0e09200SDave Airlie 1338c0e09200SDave Airlie /* gap */ 1339c0e09200SDave Airlie 1340c0e09200SDave Airlie #define R300_RB3D_COLOROFFSET0 0x4E28 1341c0e09200SDave Airlie # define R300_COLOROFFSET_MASK 0xFFFFFFF0 /* GUESS */ 1342c0e09200SDave Airlie #define R300_RB3D_COLOROFFSET1 0x4E2C /* GUESS */ 1343c0e09200SDave Airlie #define R300_RB3D_COLOROFFSET2 0x4E30 /* GUESS */ 1344c0e09200SDave Airlie #define R300_RB3D_COLOROFFSET3 0x4E34 /* GUESS */ 1345c0e09200SDave Airlie 1346c0e09200SDave Airlie /* gap */ 1347c0e09200SDave Airlie 1348c0e09200SDave Airlie /* Bit 16: Larger tiles 1349c0e09200SDave Airlie * Bit 17: 4x2 tiles 1350c0e09200SDave Airlie * Bit 18: Extremely weird tile like, but some pixels duplicated? 1351c0e09200SDave Airlie */ 1352c0e09200SDave Airlie #define R300_RB3D_COLORPITCH0 0x4E38 1353c0e09200SDave Airlie # define R300_COLORPITCH_MASK 0x00001FF8 /* GUESS */ 1354c0e09200SDave Airlie # define R300_COLOR_TILE_ENABLE (1 << 16) /* GUESS */ 1355c0e09200SDave Airlie # define R300_COLOR_MICROTILE_ENABLE (1 << 17) /* GUESS */ 1356c0e09200SDave Airlie # define R300_COLOR_ENDIAN_NO_SWAP (0 << 18) /* GUESS */ 1357c0e09200SDave Airlie # define R300_COLOR_ENDIAN_WORD_SWAP (1 << 18) /* GUESS */ 1358c0e09200SDave Airlie # define R300_COLOR_ENDIAN_DWORD_SWAP (2 << 18) /* GUESS */ 1359c0e09200SDave Airlie # define R300_COLOR_FORMAT_RGB565 (2 << 22) 1360c0e09200SDave Airlie # define R300_COLOR_FORMAT_ARGB8888 (3 << 22) 1361c0e09200SDave Airlie #define R300_RB3D_COLORPITCH1 0x4E3C /* GUESS */ 1362c0e09200SDave Airlie #define R300_RB3D_COLORPITCH2 0x4E40 /* GUESS */ 1363c0e09200SDave Airlie #define R300_RB3D_COLORPITCH3 0x4E44 /* GUESS */ 1364c0e09200SDave Airlie 1365*54f961a6SJerome Glisse #define R300_RB3D_AARESOLVE_CTL 0x4E88 1366c0e09200SDave Airlie /* gap */ 1367c0e09200SDave Airlie 1368c0e09200SDave Airlie /* Guess by Vladimir. 1369c0e09200SDave Airlie * Set to 0A before 3D operations, set to 02 afterwards. 1370c0e09200SDave Airlie */ 1371c0e09200SDave Airlie /*#define R300_RB3D_DSTCACHE_CTLSTAT 0x4E4C*/ 1372c0e09200SDave Airlie # define R300_RB3D_DSTCACHE_UNKNOWN_02 0x00000002 1373c0e09200SDave Airlie # define R300_RB3D_DSTCACHE_UNKNOWN_0A 0x0000000A 1374c0e09200SDave Airlie 1375c0e09200SDave Airlie /* gap */ 1376c0e09200SDave Airlie /* There seems to be no "write only" setting, so use Z-test = ALWAYS 1377c0e09200SDave Airlie * for this. 1378c0e09200SDave Airlie * Bit (1<<8) is the "test" bit. so plain write is 6 - vd 1379c0e09200SDave Airlie */ 1380c0e09200SDave Airlie #define R300_ZB_CNTL 0x4F00 1381c0e09200SDave Airlie # define R300_STENCIL_ENABLE (1 << 0) 1382c0e09200SDave Airlie # define R300_Z_ENABLE (1 << 1) 1383c0e09200SDave Airlie # define R300_Z_WRITE_ENABLE (1 << 2) 1384c0e09200SDave Airlie # define R300_Z_SIGNED_COMPARE (1 << 3) 1385c0e09200SDave Airlie # define R300_STENCIL_FRONT_BACK (1 << 4) 1386c0e09200SDave Airlie 1387c0e09200SDave Airlie #define R300_ZB_ZSTENCILCNTL 0x4f04 1388c0e09200SDave Airlie /* functions */ 1389c0e09200SDave Airlie # define R300_ZS_NEVER 0 1390c0e09200SDave Airlie # define R300_ZS_LESS 1 1391c0e09200SDave Airlie # define R300_ZS_LEQUAL 2 1392c0e09200SDave Airlie # define R300_ZS_EQUAL 3 1393c0e09200SDave Airlie # define R300_ZS_GEQUAL 4 1394c0e09200SDave Airlie # define R300_ZS_GREATER 5 1395c0e09200SDave Airlie # define R300_ZS_NOTEQUAL 6 1396c0e09200SDave Airlie # define R300_ZS_ALWAYS 7 1397c0e09200SDave Airlie # define R300_ZS_MASK 7 1398c0e09200SDave Airlie /* operations */ 1399c0e09200SDave Airlie # define R300_ZS_KEEP 0 1400c0e09200SDave Airlie # define R300_ZS_ZERO 1 1401c0e09200SDave Airlie # define R300_ZS_REPLACE 2 1402c0e09200SDave Airlie # define R300_ZS_INCR 3 1403c0e09200SDave Airlie # define R300_ZS_DECR 4 1404c0e09200SDave Airlie # define R300_ZS_INVERT 5 1405c0e09200SDave Airlie # define R300_ZS_INCR_WRAP 6 1406c0e09200SDave Airlie # define R300_ZS_DECR_WRAP 7 1407c0e09200SDave Airlie # define R300_Z_FUNC_SHIFT 0 1408c0e09200SDave Airlie /* front and back refer to operations done for front 1409c0e09200SDave Airlie and back faces, i.e. separate stencil function support */ 1410c0e09200SDave Airlie # define R300_S_FRONT_FUNC_SHIFT 3 1411c0e09200SDave Airlie # define R300_S_FRONT_SFAIL_OP_SHIFT 6 1412c0e09200SDave Airlie # define R300_S_FRONT_ZPASS_OP_SHIFT 9 1413c0e09200SDave Airlie # define R300_S_FRONT_ZFAIL_OP_SHIFT 12 1414c0e09200SDave Airlie # define R300_S_BACK_FUNC_SHIFT 15 1415c0e09200SDave Airlie # define R300_S_BACK_SFAIL_OP_SHIFT 18 1416c0e09200SDave Airlie # define R300_S_BACK_ZPASS_OP_SHIFT 21 1417c0e09200SDave Airlie # define R300_S_BACK_ZFAIL_OP_SHIFT 24 1418c0e09200SDave Airlie 1419c0e09200SDave Airlie #define R300_ZB_STENCILREFMASK 0x4f08 1420c0e09200SDave Airlie # define R300_STENCILREF_SHIFT 0 1421c0e09200SDave Airlie # define R300_STENCILREF_MASK 0x000000ff 1422c0e09200SDave Airlie # define R300_STENCILMASK_SHIFT 8 1423c0e09200SDave Airlie # define R300_STENCILMASK_MASK 0x0000ff00 1424c0e09200SDave Airlie # define R300_STENCILWRITEMASK_SHIFT 16 1425c0e09200SDave Airlie # define R300_STENCILWRITEMASK_MASK 0x00ff0000 1426c0e09200SDave Airlie 1427c0e09200SDave Airlie /* gap */ 1428c0e09200SDave Airlie 1429c0e09200SDave Airlie #define R300_ZB_FORMAT 0x4f10 1430c0e09200SDave Airlie # define R300_DEPTHFORMAT_16BIT_INT_Z (0 << 0) 1431c0e09200SDave Airlie # define R300_DEPTHFORMAT_16BIT_13E3 (1 << 0) 1432c0e09200SDave Airlie # define R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL (2 << 0) 1433c0e09200SDave Airlie /* reserved up to (15 << 0) */ 1434c0e09200SDave Airlie # define R300_INVERT_13E3_LEADING_ONES (0 << 4) 1435c0e09200SDave Airlie # define R300_INVERT_13E3_LEADING_ZEROS (1 << 4) 1436c0e09200SDave Airlie 1437c0e09200SDave Airlie #define R300_ZB_ZTOP 0x4F14 1438c0e09200SDave Airlie # define R300_ZTOP_DISABLE (0 << 0) 1439c0e09200SDave Airlie # define R300_ZTOP_ENABLE (1 << 0) 1440c0e09200SDave Airlie 1441c0e09200SDave Airlie /* gap */ 1442c0e09200SDave Airlie 1443c0e09200SDave Airlie #define R300_ZB_ZCACHE_CTLSTAT 0x4f18 1444c0e09200SDave Airlie # define R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_NO_EFFECT (0 << 0) 1445c0e09200SDave Airlie # define R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE (1 << 0) 1446c0e09200SDave Airlie # define R300_ZB_ZCACHE_CTLSTAT_ZC_FREE_NO_EFFECT (0 << 1) 1447c0e09200SDave Airlie # define R300_ZB_ZCACHE_CTLSTAT_ZC_FREE_FREE (1 << 1) 1448c0e09200SDave Airlie # define R300_ZB_ZCACHE_CTLSTAT_ZC_BUSY_IDLE (0 << 31) 1449c0e09200SDave Airlie # define R300_ZB_ZCACHE_CTLSTAT_ZC_BUSY_BUSY (1 << 31) 1450c0e09200SDave Airlie 1451c0e09200SDave Airlie #define R300_ZB_BW_CNTL 0x4f1c 1452c0e09200SDave Airlie # define R300_HIZ_DISABLE (0 << 0) 1453c0e09200SDave Airlie # define R300_HIZ_ENABLE (1 << 0) 1454c0e09200SDave Airlie # define R300_HIZ_MIN (0 << 1) 1455c0e09200SDave Airlie # define R300_HIZ_MAX (1 << 1) 1456c0e09200SDave Airlie # define R300_FAST_FILL_DISABLE (0 << 2) 1457c0e09200SDave Airlie # define R300_FAST_FILL_ENABLE (1 << 2) 1458c0e09200SDave Airlie # define R300_RD_COMP_DISABLE (0 << 3) 1459c0e09200SDave Airlie # define R300_RD_COMP_ENABLE (1 << 3) 1460c0e09200SDave Airlie # define R300_WR_COMP_DISABLE (0 << 4) 1461c0e09200SDave Airlie # define R300_WR_COMP_ENABLE (1 << 4) 1462c0e09200SDave Airlie # define R300_ZB_CB_CLEAR_RMW (0 << 5) 1463c0e09200SDave Airlie # define R300_ZB_CB_CLEAR_CACHE_LINEAR (1 << 5) 1464c0e09200SDave Airlie # define R300_FORCE_COMPRESSED_STENCIL_VALUE_DISABLE (0 << 6) 1465c0e09200SDave Airlie # define R300_FORCE_COMPRESSED_STENCIL_VALUE_ENABLE (1 << 6) 1466c0e09200SDave Airlie 1467c0e09200SDave Airlie # define R500_ZEQUAL_OPTIMIZE_ENABLE (0 << 7) 1468c0e09200SDave Airlie # define R500_ZEQUAL_OPTIMIZE_DISABLE (1 << 7) 1469c0e09200SDave Airlie # define R500_SEQUAL_OPTIMIZE_ENABLE (0 << 8) 1470c0e09200SDave Airlie # define R500_SEQUAL_OPTIMIZE_DISABLE (1 << 8) 1471c0e09200SDave Airlie 1472c0e09200SDave Airlie # define R500_BMASK_ENABLE (0 << 10) 1473c0e09200SDave Airlie # define R500_BMASK_DISABLE (1 << 10) 1474c0e09200SDave Airlie # define R500_HIZ_EQUAL_REJECT_DISABLE (0 << 11) 1475c0e09200SDave Airlie # define R500_HIZ_EQUAL_REJECT_ENABLE (1 << 11) 1476c0e09200SDave Airlie # define R500_HIZ_FP_EXP_BITS_DISABLE (0 << 12) 1477c0e09200SDave Airlie # define R500_HIZ_FP_EXP_BITS_1 (1 << 12) 1478c0e09200SDave Airlie # define R500_HIZ_FP_EXP_BITS_2 (2 << 12) 1479c0e09200SDave Airlie # define R500_HIZ_FP_EXP_BITS_3 (3 << 12) 1480c0e09200SDave Airlie # define R500_HIZ_FP_EXP_BITS_4 (4 << 12) 1481c0e09200SDave Airlie # define R500_HIZ_FP_EXP_BITS_5 (5 << 12) 1482c0e09200SDave Airlie # define R500_HIZ_FP_INVERT_LEADING_ONES (0 << 15) 1483c0e09200SDave Airlie # define R500_HIZ_FP_INVERT_LEADING_ZEROS (1 << 15) 1484c0e09200SDave Airlie # define R500_TILE_OVERWRITE_RECOMPRESSION_ENABLE (0 << 16) 1485c0e09200SDave Airlie # define R500_TILE_OVERWRITE_RECOMPRESSION_DISABLE (1 << 16) 1486c0e09200SDave Airlie # define R500_CONTIGUOUS_6XAA_SAMPLES_ENABLE (0 << 17) 1487c0e09200SDave Airlie # define R500_CONTIGUOUS_6XAA_SAMPLES_DISABLE (1 << 17) 1488c0e09200SDave Airlie # define R500_PEQ_PACKING_DISABLE (0 << 18) 1489c0e09200SDave Airlie # define R500_PEQ_PACKING_ENABLE (1 << 18) 1490c0e09200SDave Airlie # define R500_COVERED_PTR_MASKING_DISABLE (0 << 18) 1491c0e09200SDave Airlie # define R500_COVERED_PTR_MASKING_ENABLE (1 << 18) 1492c0e09200SDave Airlie 1493c0e09200SDave Airlie 1494c0e09200SDave Airlie /* gap */ 1495c0e09200SDave Airlie 1496c0e09200SDave Airlie /* Z Buffer Address Offset. 1497c0e09200SDave Airlie * Bits 31 to 5 are used for aligned Z buffer address offset for macro tiles. 1498c0e09200SDave Airlie */ 1499c0e09200SDave Airlie #define R300_ZB_DEPTHOFFSET 0x4f20 1500c0e09200SDave Airlie 1501c0e09200SDave Airlie /* Z Buffer Pitch and Endian Control */ 1502c0e09200SDave Airlie #define R300_ZB_DEPTHPITCH 0x4f24 1503c0e09200SDave Airlie # define R300_DEPTHPITCH_MASK 0x00003FFC 1504c0e09200SDave Airlie # define R300_DEPTHMACROTILE_DISABLE (0 << 16) 1505c0e09200SDave Airlie # define R300_DEPTHMACROTILE_ENABLE (1 << 16) 1506c0e09200SDave Airlie # define R300_DEPTHMICROTILE_LINEAR (0 << 17) 1507c0e09200SDave Airlie # define R300_DEPTHMICROTILE_TILED (1 << 17) 1508c0e09200SDave Airlie # define R300_DEPTHMICROTILE_TILED_SQUARE (2 << 17) 1509c0e09200SDave Airlie # define R300_DEPTHENDIAN_NO_SWAP (0 << 18) 1510c0e09200SDave Airlie # define R300_DEPTHENDIAN_WORD_SWAP (1 << 18) 1511c0e09200SDave Airlie # define R300_DEPTHENDIAN_DWORD_SWAP (2 << 18) 1512c0e09200SDave Airlie # define R300_DEPTHENDIAN_HALF_DWORD_SWAP (3 << 18) 1513c0e09200SDave Airlie 1514c0e09200SDave Airlie /* Z Buffer Clear Value */ 1515c0e09200SDave Airlie #define R300_ZB_DEPTHCLEARVALUE 0x4f28 1516c0e09200SDave Airlie 1517c0e09200SDave Airlie #define R300_ZB_ZMASK_OFFSET 0x4f30 1518c0e09200SDave Airlie #define R300_ZB_ZMASK_PITCH 0x4f34 1519c0e09200SDave Airlie #define R300_ZB_ZMASK_WRINDEX 0x4f38 1520c0e09200SDave Airlie #define R300_ZB_ZMASK_DWORD 0x4f3c 1521c0e09200SDave Airlie #define R300_ZB_ZMASK_RDINDEX 0x4f40 1522c0e09200SDave Airlie 1523c0e09200SDave Airlie /* Hierarchical Z Memory Offset */ 1524c0e09200SDave Airlie #define R300_ZB_HIZ_OFFSET 0x4f44 1525c0e09200SDave Airlie 1526c0e09200SDave Airlie /* Hierarchical Z Write Index */ 1527c0e09200SDave Airlie #define R300_ZB_HIZ_WRINDEX 0x4f48 1528c0e09200SDave Airlie 1529c0e09200SDave Airlie /* Hierarchical Z Data */ 1530c0e09200SDave Airlie #define R300_ZB_HIZ_DWORD 0x4f4c 1531c0e09200SDave Airlie 1532c0e09200SDave Airlie /* Hierarchical Z Read Index */ 1533c0e09200SDave Airlie #define R300_ZB_HIZ_RDINDEX 0x4f50 1534c0e09200SDave Airlie 1535c0e09200SDave Airlie /* Hierarchical Z Pitch */ 1536c0e09200SDave Airlie #define R300_ZB_HIZ_PITCH 0x4f54 1537c0e09200SDave Airlie 1538c0e09200SDave Airlie /* Z Buffer Z Pass Counter Data */ 1539c0e09200SDave Airlie #define R300_ZB_ZPASS_DATA 0x4f58 1540c0e09200SDave Airlie 1541c0e09200SDave Airlie /* Z Buffer Z Pass Counter Address */ 1542c0e09200SDave Airlie #define R300_ZB_ZPASS_ADDR 0x4f5c 1543c0e09200SDave Airlie 1544c0e09200SDave Airlie /* Depth buffer X and Y coordinate offset */ 1545c0e09200SDave Airlie #define R300_ZB_DEPTHXY_OFFSET 0x4f60 1546c0e09200SDave Airlie # define R300_DEPTHX_OFFSET_SHIFT 1 1547c0e09200SDave Airlie # define R300_DEPTHX_OFFSET_MASK 0x000007FE 1548c0e09200SDave Airlie # define R300_DEPTHY_OFFSET_SHIFT 17 1549c0e09200SDave Airlie # define R300_DEPTHY_OFFSET_MASK 0x07FE0000 1550c0e09200SDave Airlie 1551c0e09200SDave Airlie /* Sets the fifo sizes */ 1552c0e09200SDave Airlie #define R500_ZB_FIFO_SIZE 0x4fd0 1553c0e09200SDave Airlie # define R500_OP_FIFO_SIZE_FULL (0 << 0) 1554c0e09200SDave Airlie # define R500_OP_FIFO_SIZE_HALF (1 << 0) 1555c0e09200SDave Airlie # define R500_OP_FIFO_SIZE_QUATER (2 << 0) 1556c0e09200SDave Airlie # define R500_OP_FIFO_SIZE_EIGTHS (4 << 0) 1557c0e09200SDave Airlie 1558c0e09200SDave Airlie /* Stencil Reference Value and Mask for backfacing quads */ 1559c0e09200SDave Airlie /* R300_ZB_STENCILREFMASK handles front face */ 1560c0e09200SDave Airlie #define R500_ZB_STENCILREFMASK_BF 0x4fd4 1561c0e09200SDave Airlie # define R500_STENCILREF_SHIFT 0 1562c0e09200SDave Airlie # define R500_STENCILREF_MASK 0x000000ff 1563c0e09200SDave Airlie # define R500_STENCILMASK_SHIFT 8 1564c0e09200SDave Airlie # define R500_STENCILMASK_MASK 0x0000ff00 1565c0e09200SDave Airlie # define R500_STENCILWRITEMASK_SHIFT 16 1566c0e09200SDave Airlie # define R500_STENCILWRITEMASK_MASK 0x00ff0000 1567c0e09200SDave Airlie 1568c0e09200SDave Airlie /* BEGIN: Vertex program instruction set */ 1569c0e09200SDave Airlie 1570c0e09200SDave Airlie /* Every instruction is four dwords long: 1571c0e09200SDave Airlie * DWORD 0: output and opcode 1572c0e09200SDave Airlie * DWORD 1: first argument 1573c0e09200SDave Airlie * DWORD 2: second argument 1574c0e09200SDave Airlie * DWORD 3: third argument 1575c0e09200SDave Airlie * 1576c0e09200SDave Airlie * Notes: 1577c0e09200SDave Airlie * - ABS r, a is implemented as MAX r, a, -a 1578c0e09200SDave Airlie * - MOV is implemented as ADD to zero 1579c0e09200SDave Airlie * - XPD is implemented as MUL + MAD 1580c0e09200SDave Airlie * - FLR is implemented as FRC + ADD 1581c0e09200SDave Airlie * - apparently, fglrx tries to schedule instructions so that there is at 1582c0e09200SDave Airlie * least one instruction between the write to a temporary and the first 1583c0e09200SDave Airlie * read from said temporary; however, violations of this scheduling are 1584c0e09200SDave Airlie * allowed 1585c0e09200SDave Airlie * - register indices seem to be unrelated with OpenGL aliasing to 1586c0e09200SDave Airlie * conventional state 1587c0e09200SDave Airlie * - only one attribute and one parameter can be loaded at a time; however, 1588c0e09200SDave Airlie * the same attribute/parameter can be used for more than one argument 1589c0e09200SDave Airlie * - the second software argument for POW is the third hardware argument 1590c0e09200SDave Airlie * (no idea why) 1591c0e09200SDave Airlie * - MAD with only temporaries as input seems to use VPI_OUT_SELECT_MAD_2 1592c0e09200SDave Airlie * 1593c0e09200SDave Airlie * There is some magic surrounding LIT: 1594c0e09200SDave Airlie * The single argument is replicated across all three inputs, but swizzled: 1595c0e09200SDave Airlie * First argument: xyzy 1596c0e09200SDave Airlie * Second argument: xyzx 1597c0e09200SDave Airlie * Third argument: xyzw 1598c0e09200SDave Airlie * Whenever the result is used later in the fragment program, fglrx forces 1599c0e09200SDave Airlie * x and w to be 1.0 in the input selection; I don't know whether this is 1600c0e09200SDave Airlie * strictly necessary 1601c0e09200SDave Airlie */ 1602c0e09200SDave Airlie #define R300_VPI_OUT_OP_DOT (1 << 0) 1603c0e09200SDave Airlie #define R300_VPI_OUT_OP_MUL (2 << 0) 1604c0e09200SDave Airlie #define R300_VPI_OUT_OP_ADD (3 << 0) 1605c0e09200SDave Airlie #define R300_VPI_OUT_OP_MAD (4 << 0) 1606c0e09200SDave Airlie #define R300_VPI_OUT_OP_DST (5 << 0) 1607c0e09200SDave Airlie #define R300_VPI_OUT_OP_FRC (6 << 0) 1608c0e09200SDave Airlie #define R300_VPI_OUT_OP_MAX (7 << 0) 1609c0e09200SDave Airlie #define R300_VPI_OUT_OP_MIN (8 << 0) 1610c0e09200SDave Airlie #define R300_VPI_OUT_OP_SGE (9 << 0) 1611c0e09200SDave Airlie #define R300_VPI_OUT_OP_SLT (10 << 0) 1612c0e09200SDave Airlie /* Used in GL_POINT_DISTANCE_ATTENUATION_ARB, vector(scalar, vector) */ 1613c0e09200SDave Airlie #define R300_VPI_OUT_OP_UNK12 (12 << 0) 1614c0e09200SDave Airlie #define R300_VPI_OUT_OP_ARL (13 << 0) 1615c0e09200SDave Airlie #define R300_VPI_OUT_OP_EXP (65 << 0) 1616c0e09200SDave Airlie #define R300_VPI_OUT_OP_LOG (66 << 0) 1617c0e09200SDave Airlie /* Used in fog computations, scalar(scalar) */ 1618c0e09200SDave Airlie #define R300_VPI_OUT_OP_UNK67 (67 << 0) 1619c0e09200SDave Airlie #define R300_VPI_OUT_OP_LIT (68 << 0) 1620c0e09200SDave Airlie #define R300_VPI_OUT_OP_POW (69 << 0) 1621c0e09200SDave Airlie #define R300_VPI_OUT_OP_RCP (70 << 0) 1622c0e09200SDave Airlie #define R300_VPI_OUT_OP_RSQ (72 << 0) 1623c0e09200SDave Airlie /* Used in GL_POINT_DISTANCE_ATTENUATION_ARB, scalar(scalar) */ 1624c0e09200SDave Airlie #define R300_VPI_OUT_OP_UNK73 (73 << 0) 1625c0e09200SDave Airlie #define R300_VPI_OUT_OP_EX2 (75 << 0) 1626c0e09200SDave Airlie #define R300_VPI_OUT_OP_LG2 (76 << 0) 1627c0e09200SDave Airlie #define R300_VPI_OUT_OP_MAD_2 (128 << 0) 1628c0e09200SDave Airlie /* all temps, vector(scalar, vector, vector) */ 1629c0e09200SDave Airlie #define R300_VPI_OUT_OP_UNK129 (129 << 0) 1630c0e09200SDave Airlie 1631c0e09200SDave Airlie #define R300_VPI_OUT_REG_CLASS_TEMPORARY (0 << 8) 1632c0e09200SDave Airlie #define R300_VPI_OUT_REG_CLASS_ADDR (1 << 8) 1633c0e09200SDave Airlie #define R300_VPI_OUT_REG_CLASS_RESULT (2 << 8) 1634c0e09200SDave Airlie #define R300_VPI_OUT_REG_CLASS_MASK (31 << 8) 1635c0e09200SDave Airlie 1636c0e09200SDave Airlie #define R300_VPI_OUT_REG_INDEX_SHIFT 13 1637c0e09200SDave Airlie /* GUESS based on fglrx native limits */ 1638c0e09200SDave Airlie #define R300_VPI_OUT_REG_INDEX_MASK (31 << 13) 1639c0e09200SDave Airlie 1640c0e09200SDave Airlie #define R300_VPI_OUT_WRITE_X (1 << 20) 1641c0e09200SDave Airlie #define R300_VPI_OUT_WRITE_Y (1 << 21) 1642c0e09200SDave Airlie #define R300_VPI_OUT_WRITE_Z (1 << 22) 1643c0e09200SDave Airlie #define R300_VPI_OUT_WRITE_W (1 << 23) 1644c0e09200SDave Airlie 1645c0e09200SDave Airlie #define R300_VPI_IN_REG_CLASS_TEMPORARY (0 << 0) 1646c0e09200SDave Airlie #define R300_VPI_IN_REG_CLASS_ATTRIBUTE (1 << 0) 1647c0e09200SDave Airlie #define R300_VPI_IN_REG_CLASS_PARAMETER (2 << 0) 1648c0e09200SDave Airlie #define R300_VPI_IN_REG_CLASS_NONE (9 << 0) 1649c0e09200SDave Airlie #define R300_VPI_IN_REG_CLASS_MASK (31 << 0) 1650c0e09200SDave Airlie 1651c0e09200SDave Airlie #define R300_VPI_IN_REG_INDEX_SHIFT 5 1652c0e09200SDave Airlie /* GUESS based on fglrx native limits */ 1653c0e09200SDave Airlie #define R300_VPI_IN_REG_INDEX_MASK (255 << 5) 1654c0e09200SDave Airlie 1655c0e09200SDave Airlie /* The R300 can select components from the input register arbitrarily. 1656c0e09200SDave Airlie * Use the following constants, shifted by the component shift you 1657c0e09200SDave Airlie * want to select 1658c0e09200SDave Airlie */ 1659c0e09200SDave Airlie #define R300_VPI_IN_SELECT_X 0 1660c0e09200SDave Airlie #define R300_VPI_IN_SELECT_Y 1 1661c0e09200SDave Airlie #define R300_VPI_IN_SELECT_Z 2 1662c0e09200SDave Airlie #define R300_VPI_IN_SELECT_W 3 1663c0e09200SDave Airlie #define R300_VPI_IN_SELECT_ZERO 4 1664c0e09200SDave Airlie #define R300_VPI_IN_SELECT_ONE 5 1665c0e09200SDave Airlie #define R300_VPI_IN_SELECT_MASK 7 1666c0e09200SDave Airlie 1667c0e09200SDave Airlie #define R300_VPI_IN_X_SHIFT 13 1668c0e09200SDave Airlie #define R300_VPI_IN_Y_SHIFT 16 1669c0e09200SDave Airlie #define R300_VPI_IN_Z_SHIFT 19 1670c0e09200SDave Airlie #define R300_VPI_IN_W_SHIFT 22 1671c0e09200SDave Airlie 1672c0e09200SDave Airlie #define R300_VPI_IN_NEG_X (1 << 25) 1673c0e09200SDave Airlie #define R300_VPI_IN_NEG_Y (1 << 26) 1674c0e09200SDave Airlie #define R300_VPI_IN_NEG_Z (1 << 27) 1675c0e09200SDave Airlie #define R300_VPI_IN_NEG_W (1 << 28) 1676c0e09200SDave Airlie /* END: Vertex program instruction set */ 1677c0e09200SDave Airlie 1678c0e09200SDave Airlie /* BEGIN: Packet 3 commands */ 1679c0e09200SDave Airlie 1680c0e09200SDave Airlie /* A primitive emission dword. */ 1681c0e09200SDave Airlie #define R300_PRIM_TYPE_NONE (0 << 0) 1682c0e09200SDave Airlie #define R300_PRIM_TYPE_POINT (1 << 0) 1683c0e09200SDave Airlie #define R300_PRIM_TYPE_LINE (2 << 0) 1684c0e09200SDave Airlie #define R300_PRIM_TYPE_LINE_STRIP (3 << 0) 1685c0e09200SDave Airlie #define R300_PRIM_TYPE_TRI_LIST (4 << 0) 1686c0e09200SDave Airlie #define R300_PRIM_TYPE_TRI_FAN (5 << 0) 1687c0e09200SDave Airlie #define R300_PRIM_TYPE_TRI_STRIP (6 << 0) 1688c0e09200SDave Airlie #define R300_PRIM_TYPE_TRI_TYPE2 (7 << 0) 1689c0e09200SDave Airlie #define R300_PRIM_TYPE_RECT_LIST (8 << 0) 1690c0e09200SDave Airlie #define R300_PRIM_TYPE_3VRT_POINT_LIST (9 << 0) 1691c0e09200SDave Airlie #define R300_PRIM_TYPE_3VRT_LINE_LIST (10 << 0) 1692c0e09200SDave Airlie /* GUESS (based on r200) */ 1693c0e09200SDave Airlie #define R300_PRIM_TYPE_POINT_SPRITES (11 << 0) 1694c0e09200SDave Airlie #define R300_PRIM_TYPE_LINE_LOOP (12 << 0) 1695c0e09200SDave Airlie #define R300_PRIM_TYPE_QUADS (13 << 0) 1696c0e09200SDave Airlie #define R300_PRIM_TYPE_QUAD_STRIP (14 << 0) 1697c0e09200SDave Airlie #define R300_PRIM_TYPE_POLYGON (15 << 0) 1698c0e09200SDave Airlie #define R300_PRIM_TYPE_MASK 0xF 1699c0e09200SDave Airlie #define R300_PRIM_WALK_IND (1 << 4) 1700c0e09200SDave Airlie #define R300_PRIM_WALK_LIST (2 << 4) 1701c0e09200SDave Airlie #define R300_PRIM_WALK_RING (3 << 4) 1702c0e09200SDave Airlie #define R300_PRIM_WALK_MASK (3 << 4) 1703c0e09200SDave Airlie /* GUESS (based on r200) */ 1704c0e09200SDave Airlie #define R300_PRIM_COLOR_ORDER_BGRA (0 << 6) 1705c0e09200SDave Airlie #define R300_PRIM_COLOR_ORDER_RGBA (1 << 6) 1706c0e09200SDave Airlie #define R300_PRIM_NUM_VERTICES_SHIFT 16 1707c0e09200SDave Airlie #define R300_PRIM_NUM_VERTICES_MASK 0xffff 1708c0e09200SDave Airlie 1709c0e09200SDave Airlie /* Draw a primitive from vertex data in arrays loaded via 3D_LOAD_VBPNTR. 1710c0e09200SDave Airlie * Two parameter dwords: 1711c0e09200SDave Airlie * 0. The first parameter appears to be always 0 1712c0e09200SDave Airlie * 1. The second parameter is a standard primitive emission dword. 1713c0e09200SDave Airlie */ 1714c0e09200SDave Airlie #define R300_PACKET3_3D_DRAW_VBUF 0x00002800 1715c0e09200SDave Airlie 1716c0e09200SDave Airlie /* Specify the full set of vertex arrays as (address, stride). 1717c0e09200SDave Airlie * The first parameter is the number of vertex arrays specified. 1718c0e09200SDave Airlie * The rest of the command is a variable length list of blocks, where 1719c0e09200SDave Airlie * each block is three dwords long and specifies two arrays. 1720c0e09200SDave Airlie * The first dword of a block is split into two words, the lower significant 1721c0e09200SDave Airlie * word refers to the first array, the more significant word to the second 1722c0e09200SDave Airlie * array in the block. 1723c0e09200SDave Airlie * The low byte of each word contains the size of an array entry in dwords, 1724c0e09200SDave Airlie * the high byte contains the stride of the array. 1725c0e09200SDave Airlie * The second dword of a block contains the pointer to the first array, 1726c0e09200SDave Airlie * the third dword of a block contains the pointer to the second array. 1727c0e09200SDave Airlie * Note that if the total number of arrays is odd, the third dword of 1728c0e09200SDave Airlie * the last block is omitted. 1729c0e09200SDave Airlie */ 1730c0e09200SDave Airlie #define R300_PACKET3_3D_LOAD_VBPNTR 0x00002F00 1731c0e09200SDave Airlie 1732c0e09200SDave Airlie #define R300_PACKET3_INDX_BUFFER 0x00003300 1733c0e09200SDave Airlie # define R300_EB_UNK1_SHIFT 24 1734c0e09200SDave Airlie # define R300_EB_UNK1 (0x80<<24) 1735c0e09200SDave Airlie # define R300_EB_UNK2 0x0810 1736c0e09200SDave Airlie #define R300_PACKET3_3D_DRAW_VBUF_2 0x00003400 1737c0e09200SDave Airlie #define R300_PACKET3_3D_DRAW_INDX_2 0x00003600 1738c0e09200SDave Airlie 1739c0e09200SDave Airlie /* END: Packet 3 commands */ 1740c0e09200SDave Airlie 1741c0e09200SDave Airlie 1742c0e09200SDave Airlie /* Color formats for 2d packets 1743c0e09200SDave Airlie */ 1744c0e09200SDave Airlie #define R300_CP_COLOR_FORMAT_CI8 2 1745c0e09200SDave Airlie #define R300_CP_COLOR_FORMAT_ARGB1555 3 1746c0e09200SDave Airlie #define R300_CP_COLOR_FORMAT_RGB565 4 1747c0e09200SDave Airlie #define R300_CP_COLOR_FORMAT_ARGB8888 6 1748c0e09200SDave Airlie #define R300_CP_COLOR_FORMAT_RGB332 7 1749c0e09200SDave Airlie #define R300_CP_COLOR_FORMAT_RGB8 9 1750c0e09200SDave Airlie #define R300_CP_COLOR_FORMAT_ARGB4444 15 1751c0e09200SDave Airlie 1752c0e09200SDave Airlie /* 1753c0e09200SDave Airlie * CP type-3 packets 1754c0e09200SDave Airlie */ 1755c0e09200SDave Airlie #define R300_CP_CMD_BITBLT_MULTI 0xC0009B00 1756c0e09200SDave Airlie 1757c0e09200SDave Airlie #define R500_VAP_INDEX_OFFSET 0x208c 1758c0e09200SDave Airlie 1759c0e09200SDave Airlie #define R500_GA_US_VECTOR_INDEX 0x4250 1760c0e09200SDave Airlie #define R500_GA_US_VECTOR_DATA 0x4254 1761c0e09200SDave Airlie 1762c0e09200SDave Airlie #define R500_RS_IP_0 0x4074 1763c0e09200SDave Airlie #define R500_RS_INST_0 0x4320 1764c0e09200SDave Airlie 1765c0e09200SDave Airlie #define R500_US_CONFIG 0x4600 1766c0e09200SDave Airlie 1767c0e09200SDave Airlie #define R500_US_FC_CTRL 0x4624 1768c0e09200SDave Airlie #define R500_US_CODE_ADDR 0x4630 1769c0e09200SDave Airlie 1770c0e09200SDave Airlie #define R500_RB3D_COLOR_CLEAR_VALUE_AR 0x46c0 1771c0e09200SDave Airlie #define R500_RB3D_CONSTANT_COLOR_AR 0x4ef8 1772c0e09200SDave Airlie 1773c0e09200SDave Airlie #endif /* _R300_REG_H */ 1774