1 /* 2 Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. 3 4 The Weather Channel (TM) funded Tungsten Graphics to develop the 5 initial release of the Radeon 8500 driver under the XFree86 license. 6 This notice must be preserved. 7 8 Permission is hereby granted, free of charge, to any person obtaining 9 a copy of this software and associated documentation files (the 10 "Software"), to deal in the Software without restriction, including 11 without limitation the rights to use, copy, modify, merge, publish, 12 distribute, sublicense, and/or sell copies of the Software, and to 13 permit persons to whom the Software is furnished to do so, subject to 14 the following conditions: 15 16 The above copyright notice and this permission notice (including the 17 next paragraph) shall be included in all copies or substantial 18 portions of the Software. 19 20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 23 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 24 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 25 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 26 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 */ 28 29 /* 30 * Authors: 31 * Keith Whitwell <keith (at) tungstengraphics.com> 32 */ 33 34 #include "main/glheader.h" 35 #include "main/imports.h" 36 #include "main/enums.h" 37 #include "main/colormac.h" 38 #include "main/api_arrayelt.h" 39 40 #include "swrast/swrast.h" 41 #include "vbo/vbo.h" 42 #include "tnl/t_pipeline.h" 43 #include "swrast_setup/swrast_setup.h" 44 45 #include "radeon_common.h" 46 #include "radeon_mipmap_tree.h" 47 #include "r200_context.h" 48 #include "r200_ioctl.h" 49 #include "r200_state.h" 50 #include "radeon_queryobj.h" 51 52 #include "xmlpool.h" 53 54 /* New (1.3) state mechanism. 3 commands (packet, scalar, vector) in 55 * 1.3 cmdbuffers allow all previous state to be updated as well as 56 * the tcl scalar and vector areas. 57 */ 58 static struct { 59 int start; 60 int len; 61 const char *name; 62 } packet[RADEON_MAX_STATE_PACKETS] = { 63 {RADEON_PP_MISC, 7, "RADEON_PP_MISC"}, 64 {RADEON_PP_CNTL, 3, "RADEON_PP_CNTL"}, 65 {RADEON_RB3D_COLORPITCH, 1, "RADEON_RB3D_COLORPITCH"}, 66 {RADEON_RE_LINE_PATTERN, 2, "RADEON_RE_LINE_PATTERN"}, 67 {RADEON_SE_LINE_WIDTH, 1, "RADEON_SE_LINE_WIDTH"}, 68 {RADEON_PP_LUM_MATRIX, 1, "RADEON_PP_LUM_MATRIX"}, 69 {RADEON_PP_ROT_MATRIX_0, 2, "RADEON_PP_ROT_MATRIX_0"}, 70 {RADEON_RB3D_STENCILREFMASK, 3, "RADEON_RB3D_STENCILREFMASK"}, 71 {RADEON_SE_VPORT_XSCALE, 6, "RADEON_SE_VPORT_XSCALE"}, 72 {RADEON_SE_CNTL, 2, "RADEON_SE_CNTL"}, 73 {RADEON_SE_CNTL_STATUS, 1, "RADEON_SE_CNTL_STATUS"}, 74 {RADEON_RE_MISC, 1, "RADEON_RE_MISC"}, 75 {RADEON_PP_TXFILTER_0, 6, "RADEON_PP_TXFILTER_0"}, 76 {RADEON_PP_BORDER_COLOR_0, 1, "RADEON_PP_BORDER_COLOR_0"}, 77 {RADEON_PP_TXFILTER_1, 6, "RADEON_PP_TXFILTER_1"}, 78 {RADEON_PP_BORDER_COLOR_1, 1, "RADEON_PP_BORDER_COLOR_1"}, 79 {RADEON_PP_TXFILTER_2, 6, "RADEON_PP_TXFILTER_2"}, 80 {RADEON_PP_BORDER_COLOR_2, 1, "RADEON_PP_BORDER_COLOR_2"}, 81 {RADEON_SE_ZBIAS_FACTOR, 2, "RADEON_SE_ZBIAS_FACTOR"}, 82 {RADEON_SE_TCL_OUTPUT_VTX_FMT, 11, "RADEON_SE_TCL_OUTPUT_VTX_FMT"}, 83 {RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED, 17, 84 "RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED"}, 85 {R200_PP_TXCBLEND_0, 4, "R200_PP_TXCBLEND_0"}, 86 {R200_PP_TXCBLEND_1, 4, "R200_PP_TXCBLEND_1"}, 87 {R200_PP_TXCBLEND_2, 4, "R200_PP_TXCBLEND_2"}, 88 {R200_PP_TXCBLEND_3, 4, "R200_PP_TXCBLEND_3"}, 89 {R200_PP_TXCBLEND_4, 4, "R200_PP_TXCBLEND_4"}, 90 {R200_PP_TXCBLEND_5, 4, "R200_PP_TXCBLEND_5"}, 91 {R200_PP_TXCBLEND_6, 4, "R200_PP_TXCBLEND_6"}, 92 {R200_PP_TXCBLEND_7, 4, "R200_PP_TXCBLEND_7"}, 93 {R200_SE_TCL_LIGHT_MODEL_CTL_0, 6, "R200_SE_TCL_LIGHT_MODEL_CTL_0"}, 94 {R200_PP_TFACTOR_0, 6, "R200_PP_TFACTOR_0"}, 95 {R200_SE_VTX_FMT_0, 4, "R200_SE_VTX_FMT_0"}, 96 {R200_SE_VAP_CNTL, 1, "R200_SE_VAP_CNTL"}, 97 {R200_SE_TCL_MATRIX_SEL_0, 5, "R200_SE_TCL_MATRIX_SEL_0"}, 98 {R200_SE_TCL_TEX_PROC_CTL_2, 5, "R200_SE_TCL_TEX_PROC_CTL_2"}, 99 {R200_SE_TCL_UCP_VERT_BLEND_CTL, 1, "R200_SE_TCL_UCP_VERT_BLEND_CTL"}, 100 {R200_PP_TXFILTER_0, 6, "R200_PP_TXFILTER_0"}, 101 {R200_PP_TXFILTER_1, 6, "R200_PP_TXFILTER_1"}, 102 {R200_PP_TXFILTER_2, 6, "R200_PP_TXFILTER_2"}, 103 {R200_PP_TXFILTER_3, 6, "R200_PP_TXFILTER_3"}, 104 {R200_PP_TXFILTER_4, 6, "R200_PP_TXFILTER_4"}, 105 {R200_PP_TXFILTER_5, 6, "R200_PP_TXFILTER_5"}, 106 {R200_PP_TXOFFSET_0, 1, "R200_PP_TXOFFSET_0"}, 107 {R200_PP_TXOFFSET_1, 1, "R200_PP_TXOFFSET_1"}, 108 {R200_PP_TXOFFSET_2, 1, "R200_PP_TXOFFSET_2"}, 109 {R200_PP_TXOFFSET_3, 1, "R200_PP_TXOFFSET_3"}, 110 {R200_PP_TXOFFSET_4, 1, "R200_PP_TXOFFSET_4"}, 111 {R200_PP_TXOFFSET_5, 1, "R200_PP_TXOFFSET_5"}, 112 {R200_SE_VTE_CNTL, 1, "R200_SE_VTE_CNTL"}, 113 {R200_SE_TCL_OUTPUT_VTX_COMP_SEL, 1, 114 "R200_SE_TCL_OUTPUT_VTX_COMP_SEL"}, 115 {R200_PP_TAM_DEBUG3, 1, "R200_PP_TAM_DEBUG3"}, 116 {R200_PP_CNTL_X, 1, "R200_PP_CNTL_X"}, 117 {R200_RB3D_DEPTHXY_OFFSET, 1, "R200_RB3D_DEPTHXY_OFFSET"}, 118 {R200_RE_AUX_SCISSOR_CNTL, 1, "R200_RE_AUX_SCISSOR_CNTL"}, 119 {R200_RE_SCISSOR_TL_0, 2, "R200_RE_SCISSOR_TL_0"}, 120 {R200_RE_SCISSOR_TL_1, 2, "R200_RE_SCISSOR_TL_1"}, 121 {R200_RE_SCISSOR_TL_2, 2, "R200_RE_SCISSOR_TL_2"}, 122 {R200_SE_VAP_CNTL_STATUS, 1, "R200_SE_VAP_CNTL_STATUS"}, 123 {R200_SE_VTX_STATE_CNTL, 1, "R200_SE_VTX_STATE_CNTL"}, 124 {R200_RE_POINTSIZE, 1, "R200_RE_POINTSIZE"}, 125 {R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_0, 4, 126 "R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_0"}, 127 {R200_PP_CUBIC_FACES_0, 1, "R200_PP_CUBIC_FACES_0"}, /* 61 */ 128 {R200_PP_CUBIC_OFFSET_F1_0, 5, "R200_PP_CUBIC_OFFSET_F1_0"}, /* 62 */ 129 {R200_PP_CUBIC_FACES_1, 1, "R200_PP_CUBIC_FACES_1"}, 130 {R200_PP_CUBIC_OFFSET_F1_1, 5, "R200_PP_CUBIC_OFFSET_F1_1"}, 131 {R200_PP_CUBIC_FACES_2, 1, "R200_PP_CUBIC_FACES_2"}, 132 {R200_PP_CUBIC_OFFSET_F1_2, 5, "R200_PP_CUBIC_OFFSET_F1_2"}, 133 {R200_PP_CUBIC_FACES_3, 1, "R200_PP_CUBIC_FACES_3"}, 134 {R200_PP_CUBIC_OFFSET_F1_3, 5, "R200_PP_CUBIC_OFFSET_F1_3"}, 135 {R200_PP_CUBIC_FACES_4, 1, "R200_PP_CUBIC_FACES_4"}, 136 {R200_PP_CUBIC_OFFSET_F1_4, 5, "R200_PP_CUBIC_OFFSET_F1_4"}, 137 {R200_PP_CUBIC_FACES_5, 1, "R200_PP_CUBIC_FACES_5"}, 138 {R200_PP_CUBIC_OFFSET_F1_5, 5, "R200_PP_CUBIC_OFFSET_F1_5"}, 139 {RADEON_PP_TEX_SIZE_0, 2, "RADEON_PP_TEX_SIZE_0"}, 140 {RADEON_PP_TEX_SIZE_1, 2, "RADEON_PP_TEX_SIZE_1"}, 141 {RADEON_PP_TEX_SIZE_2, 2, "RADEON_PP_TEX_SIZE_2"}, 142 {R200_RB3D_BLENDCOLOR, 3, "R200_RB3D_BLENDCOLOR"}, 143 {R200_SE_TCL_POINT_SPRITE_CNTL, 1, "R200_SE_TCL_POINT_SPRITE_CNTL"}, 144 {RADEON_PP_CUBIC_FACES_0, 1, "RADEON_PP_CUBIC_FACES_0"}, 145 {RADEON_PP_CUBIC_OFFSET_T0_0, 5, "RADEON_PP_CUBIC_OFFSET_T0_0"}, 146 {RADEON_PP_CUBIC_FACES_1, 1, "RADEON_PP_CUBIC_FACES_1"}, 147 {RADEON_PP_CUBIC_OFFSET_T1_0, 5, "RADEON_PP_CUBIC_OFFSET_T1_0"}, 148 {RADEON_PP_CUBIC_FACES_2, 1, "RADEON_PP_CUBIC_FACES_2"}, 149 {RADEON_PP_CUBIC_OFFSET_T2_0, 5, "RADEON_PP_CUBIC_OFFSET_T2_0"}, 150 {R200_PP_TRI_PERF, 2, "R200_PP_TRI_PERF"}, 151 {R200_PP_TXCBLEND_8, 32, "R200_PP_AFS_0"}, /* 85 */ 152 {R200_PP_TXCBLEND_0, 32, "R200_PP_AFS_1"}, 153 {R200_PP_TFACTOR_0, 8, "R200_ATF_TFACTOR"}, 154 {R200_PP_TXFILTER_0, 8, "R200_PP_TXCTLALL_0"}, 155 {R200_PP_TXFILTER_1, 8, "R200_PP_TXCTLALL_1"}, 156 {R200_PP_TXFILTER_2, 8, "R200_PP_TXCTLALL_2"}, 157 {R200_PP_TXFILTER_3, 8, "R200_PP_TXCTLALL_3"}, 158 {R200_PP_TXFILTER_4, 8, "R200_PP_TXCTLALL_4"}, 159 {R200_PP_TXFILTER_5, 8, "R200_PP_TXCTLALL_5"}, 160 {R200_VAP_PVS_CNTL_1, 2, "R200_VAP_PVS_CNTL"}, 161 }; 162 163 /* ============================================================= 164 * State initialization 165 */ 166 static int cmdpkt( r200ContextPtr rmesa, int id ) 167 { 168 return CP_PACKET0(packet[id].start, packet[id].len - 1); 169 } 170 171 static int cmdvec( int offset, int stride, int count ) 172 { 173 drm_radeon_cmd_header_t h; 174 h.i = 0; 175 h.vectors.cmd_type = RADEON_CMD_VECTORS; 176 h.vectors.offset = offset; 177 h.vectors.stride = stride; 178 h.vectors.count = count; 179 return h.i; 180 } 181 182 /* warning: the count here is divided by 4 compared to other cmds 183 (so it doesn't exceed the char size)! */ 184 static int cmdveclinear( int offset, int count ) 185 { 186 drm_radeon_cmd_header_t h; 187 h.i = 0; 188 h.veclinear.cmd_type = RADEON_CMD_VECLINEAR; 189 h.veclinear.addr_lo = offset & 0xff; 190 h.veclinear.addr_hi = (offset & 0xff00) >> 8; 191 h.veclinear.count = count; 192 return h.i; 193 } 194 195 static int cmdscl( int offset, int stride, int count ) 196 { 197 drm_radeon_cmd_header_t h; 198 h.i = 0; 199 h.scalars.cmd_type = RADEON_CMD_SCALARS; 200 h.scalars.offset = offset; 201 h.scalars.stride = stride; 202 h.scalars.count = count; 203 return h.i; 204 } 205 206 static int cmdscl2( int offset, int stride, int count ) 207 { 208 drm_radeon_cmd_header_t h; 209 h.i = 0; 210 h.scalars.cmd_type = RADEON_CMD_SCALARS2; 211 h.scalars.offset = offset - 0x100; 212 h.scalars.stride = stride; 213 h.scalars.count = count; 214 return h.i; 215 } 216 217 /** 218 * Check functions are used to check if state is active. 219 * If it is active check function returns maximum emit size. 220 */ 221 #define CHECK( NM, FLAG, ADD ) \ 222 static int check_##NM( struct gl_context *ctx, struct radeon_state_atom *atom) \ 223 { \ 224 r200ContextPtr rmesa = R200_CONTEXT(ctx); \ 225 (void) rmesa; \ 226 return (FLAG) ? atom->cmd_size + (ADD) : 0; \ 227 } 228 229 #define TCL_CHECK( NM, FLAG, ADD ) \ 230 static int check_##NM( struct gl_context *ctx, struct radeon_state_atom *atom) \ 231 { \ 232 r200ContextPtr rmesa = R200_CONTEXT(ctx); \ 233 return (!rmesa->radeon.TclFallback && !ctx->VertexProgram._Enabled && (FLAG)) ? atom->cmd_size + (ADD) : 0; \ 234 } 235 236 #define TCL_OR_VP_CHECK( NM, FLAG, ADD ) \ 237 static int check_##NM( struct gl_context *ctx, struct radeon_state_atom *atom ) \ 238 { \ 239 r200ContextPtr rmesa = R200_CONTEXT(ctx); \ 240 return (!rmesa->radeon.TclFallback && (FLAG)) ? atom->cmd_size + (ADD) : 0; \ 241 } 242 243 #define VP_CHECK( NM, FLAG, ADD ) \ 244 static int check_##NM( struct gl_context *ctx, struct radeon_state_atom *atom ) \ 245 { \ 246 r200ContextPtr rmesa = R200_CONTEXT(ctx); \ 247 (void) atom; \ 248 return (!rmesa->radeon.TclFallback && ctx->VertexProgram._Enabled && (FLAG)) ? atom->cmd_size + (ADD) : 0; \ 249 } 250 251 CHECK( always, GL_TRUE, 0 ) 252 CHECK( always_add4, GL_TRUE, 4 ) 253 CHECK( never, GL_FALSE, 0 ) 254 CHECK( tex_any, ctx->Texture._EnabledUnits, 0 ) 255 CHECK( tf, (ctx->Texture._EnabledUnits && !ctx->ATIFragmentShader._Enabled), 0 ); 256 CHECK( pix_zero, !ctx->ATIFragmentShader._Enabled, 0 ) 257 CHECK( texenv, (rmesa->state.envneeded & (1 << (atom->idx)) && !ctx->ATIFragmentShader._Enabled), 0 ) 258 CHECK( afs_pass1, (ctx->ATIFragmentShader._Enabled && (ctx->ATIFragmentShader.Current->NumPasses > 1)), 0 ) 259 CHECK( afs, ctx->ATIFragmentShader._Enabled, 0 ) 260 CHECK( tex_cube, rmesa->state.texture.unit[atom->idx].unitneeded & TEXTURE_CUBE_BIT, 3 + 3*5 - CUBE_STATE_SIZE ) 261 CHECK( tex_cube_cs, rmesa->state.texture.unit[atom->idx].unitneeded & TEXTURE_CUBE_BIT, 2 + 4*5 - CUBE_STATE_SIZE ) 262 TCL_CHECK( tcl_fog_add4, ctx->Fog.Enabled, 4 ) 263 TCL_CHECK( tcl, GL_TRUE, 0 ) 264 TCL_CHECK( tcl_add8, GL_TRUE, 8 ) 265 TCL_CHECK( tcl_add4, GL_TRUE, 4 ) 266 TCL_CHECK( tcl_tex_add4, rmesa->state.texture.unit[atom->idx].unitneeded, 4 ) 267 TCL_CHECK( tcl_lighting_add4, ctx->Light.Enabled, 4 ) 268 TCL_CHECK( tcl_lighting_add6, ctx->Light.Enabled, 6 ) 269 TCL_CHECK( tcl_light_add6, ctx->Light.Enabled && ctx->Light.Light[atom->idx].Enabled, 6 ) 270 TCL_OR_VP_CHECK( tcl_ucp_add4, (ctx->Transform.ClipPlanesEnabled & (1 << (atom->idx))), 4 ) 271 TCL_OR_VP_CHECK( tcl_or_vp, GL_TRUE, 0 ) 272 TCL_OR_VP_CHECK( tcl_or_vp_add2, GL_TRUE, 2 ) 273 VP_CHECK( tcl_vp, GL_TRUE, 0 ) 274 VP_CHECK( tcl_vp_add4, GL_TRUE, 4 ) 275 VP_CHECK( tcl_vp_size_add4, ctx->VertexProgram.Current->Base.NumNativeInstructions > 64, 4 ) 276 VP_CHECK( tcl_vpp_size_add4, ctx->VertexProgram.Current->Base.NumNativeParameters > 96, 4 ) 277 278 #define OUT_VEC(hdr, data) do { \ 279 drm_radeon_cmd_header_t h; \ 280 h.i = hdr; \ 281 OUT_BATCH(CP_PACKET0(RADEON_SE_TCL_STATE_FLUSH, 0)); \ 282 OUT_BATCH(0); \ 283 OUT_BATCH(CP_PACKET0(R200_SE_TCL_VECTOR_INDX_REG, 0)); \ 284 OUT_BATCH(h.vectors.offset | (h.vectors.stride << RADEON_VEC_INDX_OCTWORD_STRIDE_SHIFT)); \ 285 OUT_BATCH(CP_PACKET0_ONE(R200_SE_TCL_VECTOR_DATA_REG, h.vectors.count - 1)); \ 286 OUT_BATCH_TABLE((data), h.vectors.count); \ 287 } while(0) 288 289 #define OUT_VECLINEAR(hdr, data) do { \ 290 drm_radeon_cmd_header_t h; \ 291 uint32_t _start, _sz; \ 292 h.i = hdr; \ 293 _start = h.veclinear.addr_lo | (h.veclinear.addr_hi << 8); \ 294 _sz = h.veclinear.count * 4; \ 295 if (_sz) { \ 296 BEGIN_BATCH_NO_AUTOSTATE(dwords); \ 297 OUT_BATCH(CP_PACKET0(RADEON_SE_TCL_STATE_FLUSH, 0)); \ 298 OUT_BATCH(0); \ 299 OUT_BATCH(CP_PACKET0(R200_SE_TCL_VECTOR_INDX_REG, 0)); \ 300 OUT_BATCH(_start | (1 << RADEON_VEC_INDX_OCTWORD_STRIDE_SHIFT)); \ 301 OUT_BATCH(CP_PACKET0_ONE(R200_SE_TCL_VECTOR_DATA_REG, _sz - 1)); \ 302 OUT_BATCH_TABLE((data), _sz); \ 303 END_BATCH(); \ 304 } \ 305 } while(0) 306 307 #define OUT_SCL(hdr, data) do { \ 308 drm_radeon_cmd_header_t h; \ 309 h.i = hdr; \ 310 OUT_BATCH(CP_PACKET0(R200_SE_TCL_SCALAR_INDX_REG, 0)); \ 311 OUT_BATCH((h.scalars.offset) | (h.scalars.stride << RADEON_SCAL_INDX_DWORD_STRIDE_SHIFT)); \ 312 OUT_BATCH(CP_PACKET0_ONE(R200_SE_TCL_SCALAR_DATA_REG, h.scalars.count - 1)); \ 313 OUT_BATCH_TABLE((data), h.scalars.count); \ 314 } while(0) 315 316 #define OUT_SCL2(hdr, data) do { \ 317 drm_radeon_cmd_header_t h; \ 318 h.i = hdr; \ 319 OUT_BATCH(CP_PACKET0(R200_SE_TCL_SCALAR_INDX_REG, 0)); \ 320 OUT_BATCH((h.scalars.offset + 0x100) | (h.scalars.stride << RADEON_SCAL_INDX_DWORD_STRIDE_SHIFT)); \ 321 OUT_BATCH(CP_PACKET0_ONE(R200_SE_TCL_SCALAR_DATA_REG, h.scalars.count - 1)); \ 322 OUT_BATCH_TABLE((data), h.scalars.count); \ 323 } while(0) 324 static int check_rrb(struct gl_context *ctx, struct radeon_state_atom *atom) 325 { 326 r200ContextPtr r200 = R200_CONTEXT(ctx); 327 struct radeon_renderbuffer *rrb; 328 rrb = radeon_get_colorbuffer(&r200->radeon); 329 if (!rrb || !rrb->bo) 330 return 0; 331 return atom->cmd_size; 332 } 333 334 static int check_polygon_stipple(struct gl_context *ctx, 335 struct radeon_state_atom *atom) 336 { 337 r200ContextPtr r200 = R200_CONTEXT(ctx); 338 if (r200->hw.set.cmd[SET_RE_CNTL] & R200_STIPPLE_ENABLE) 339 return atom->cmd_size; 340 return 0; 341 } 342 343 static void mtl_emit(struct gl_context *ctx, struct radeon_state_atom *atom) 344 { 345 r200ContextPtr r200 = R200_CONTEXT(ctx); 346 BATCH_LOCALS(&r200->radeon); 347 uint32_t dwords = atom->check(ctx, atom); 348 349 BEGIN_BATCH_NO_AUTOSTATE(dwords); 350 OUT_VEC(atom->cmd[MTL_CMD_0], (atom->cmd+1)); 351 OUT_SCL2(atom->cmd[MTL_CMD_1], (atom->cmd + 18)); 352 END_BATCH(); 353 } 354 355 static void lit_emit(struct gl_context *ctx, struct radeon_state_atom *atom) 356 { 357 r200ContextPtr r200 = R200_CONTEXT(ctx); 358 BATCH_LOCALS(&r200->radeon); 359 uint32_t dwords = atom->check(ctx, atom); 360 361 BEGIN_BATCH_NO_AUTOSTATE(dwords); 362 OUT_VEC(atom->cmd[LIT_CMD_0], atom->cmd+1); 363 OUT_SCL(atom->cmd[LIT_CMD_1], atom->cmd+LIT_CMD_1+1); 364 END_BATCH(); 365 } 366 367 static void ptp_emit(struct gl_context *ctx, struct radeon_state_atom *atom) 368 { 369 r200ContextPtr r200 = R200_CONTEXT(ctx); 370 BATCH_LOCALS(&r200->radeon); 371 uint32_t dwords = atom->check(ctx, atom); 372 373 BEGIN_BATCH_NO_AUTOSTATE(dwords); 374 OUT_VEC(atom->cmd[PTP_CMD_0], atom->cmd+1); 375 OUT_VEC(atom->cmd[PTP_CMD_1], atom->cmd+PTP_CMD_1+1); 376 END_BATCH(); 377 } 378 379 static void veclinear_emit(struct gl_context *ctx, struct radeon_state_atom *atom) 380 { 381 r200ContextPtr r200 = R200_CONTEXT(ctx); 382 BATCH_LOCALS(&r200->radeon); 383 uint32_t dwords = atom->check(ctx, atom); 384 385 OUT_VECLINEAR(atom->cmd[0], atom->cmd+1); 386 } 387 388 static void scl_emit(struct gl_context *ctx, struct radeon_state_atom *atom) 389 { 390 r200ContextPtr r200 = R200_CONTEXT(ctx); 391 BATCH_LOCALS(&r200->radeon); 392 uint32_t dwords = atom->check(ctx, atom); 393 394 BEGIN_BATCH_NO_AUTOSTATE(dwords); 395 OUT_SCL(atom->cmd[0], atom->cmd+1); 396 END_BATCH(); 397 } 398 399 400 static void vec_emit(struct gl_context *ctx, struct radeon_state_atom *atom) 401 { 402 r200ContextPtr r200 = R200_CONTEXT(ctx); 403 BATCH_LOCALS(&r200->radeon); 404 uint32_t dwords = atom->check(ctx, atom); 405 406 BEGIN_BATCH_NO_AUTOSTATE(dwords); 407 OUT_VEC(atom->cmd[0], atom->cmd+1); 408 END_BATCH(); 409 } 410 411 static int check_always_ctx( struct gl_context *ctx, struct radeon_state_atom *atom) 412 { 413 r200ContextPtr r200 = R200_CONTEXT(ctx); 414 struct radeon_renderbuffer *rrb, *drb; 415 uint32_t dwords; 416 417 rrb = radeon_get_colorbuffer(&r200->radeon); 418 if (!rrb || !rrb->bo) { 419 return 0; 420 } 421 422 drb = radeon_get_depthbuffer(&r200->radeon); 423 424 dwords = 10; 425 if (drb) 426 dwords += 6; 427 if (rrb) 428 dwords += 8; 429 if (atom->cmd_size == CTX_STATE_SIZE_NEWDRM) 430 dwords += 4; 431 432 433 return dwords; 434 } 435 436 static void ctx_emit_cs(struct gl_context *ctx, struct radeon_state_atom *atom) 437 { 438 r200ContextPtr r200 = R200_CONTEXT(ctx); 439 BATCH_LOCALS(&r200->radeon); 440 struct radeon_renderbuffer *rrb, *drb; 441 uint32_t cbpitch = 0; 442 uint32_t zbpitch = 0; 443 uint32_t dwords = atom->check(ctx, atom); 444 uint32_t depth_fmt; 445 446 rrb = radeon_get_colorbuffer(&r200->radeon); 447 if (!rrb || !rrb->bo) { 448 return; 449 } 450 451 atom->cmd[CTX_RB3D_CNTL] &= ~(0xf << 10); 452 if (rrb->cpp == 4) 453 atom->cmd[CTX_RB3D_CNTL] |= RADEON_COLOR_FORMAT_ARGB8888; 454 else switch (rrb->base.Base.Format) { 455 case MESA_FORMAT_RGB565: 456 atom->cmd[CTX_RB3D_CNTL] |= RADEON_COLOR_FORMAT_RGB565; 457 break; 458 case MESA_FORMAT_ARGB4444: 459 atom->cmd[CTX_RB3D_CNTL] |= RADEON_COLOR_FORMAT_ARGB4444; 460 break; 461 case MESA_FORMAT_ARGB1555: 462 atom->cmd[CTX_RB3D_CNTL] |= RADEON_COLOR_FORMAT_ARGB1555; 463 break; 464 default: 465 _mesa_problem(ctx, "Unexpected format in ctx_emit_cs"); 466 } 467 468 cbpitch = (rrb->pitch / rrb->cpp); 469 if (rrb->bo->flags & RADEON_BO_FLAGS_MACRO_TILE) 470 cbpitch |= R200_COLOR_TILE_ENABLE; 471 if (rrb->bo->flags & RADEON_BO_FLAGS_MICRO_TILE) 472 cbpitch |= R200_COLOR_MICROTILE_ENABLE; 473 474 475 drb = radeon_get_depthbuffer(&r200->radeon); 476 if (drb) { 477 zbpitch = (drb->pitch / drb->cpp); 478 if (drb->cpp == 4) 479 depth_fmt = RADEON_DEPTH_FORMAT_24BIT_INT_Z; 480 else 481 depth_fmt = RADEON_DEPTH_FORMAT_16BIT_INT_Z; 482 atom->cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_DEPTH_FORMAT_MASK; 483 atom->cmd[CTX_RB3D_ZSTENCILCNTL] |= depth_fmt; 484 } 485 486 /* output the first 7 bytes of context */ 487 BEGIN_BATCH_NO_AUTOSTATE(dwords); 488 489 /* In the CS case we need to split this up */ 490 OUT_BATCH(CP_PACKET0(packet[0].start, 3)); 491 OUT_BATCH_TABLE((atom->cmd + 1), 4); 492 493 if (drb) { 494 OUT_BATCH(CP_PACKET0(RADEON_RB3D_DEPTHOFFSET, 0)); 495 OUT_BATCH_RELOC(0, drb->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0); 496 497 OUT_BATCH(CP_PACKET0(RADEON_RB3D_DEPTHPITCH, 0)); 498 OUT_BATCH(zbpitch); 499 } 500 501 OUT_BATCH(CP_PACKET0(RADEON_RB3D_ZSTENCILCNTL, 0)); 502 OUT_BATCH(atom->cmd[CTX_RB3D_ZSTENCILCNTL]); 503 OUT_BATCH(CP_PACKET0(RADEON_PP_CNTL, 1)); 504 OUT_BATCH(atom->cmd[CTX_PP_CNTL]); 505 OUT_BATCH(atom->cmd[CTX_RB3D_CNTL]); 506 507 508 if (rrb) { 509 OUT_BATCH(CP_PACKET0(RADEON_RB3D_COLOROFFSET, 0)); 510 OUT_BATCH_RELOC(rrb->draw_offset, rrb->bo, rrb->draw_offset, 0, RADEON_GEM_DOMAIN_VRAM, 0); 511 512 OUT_BATCH(CP_PACKET0(RADEON_RB3D_COLORPITCH, 0)); 513 OUT_BATCH_RELOC(cbpitch, rrb->bo, cbpitch, 0, RADEON_GEM_DOMAIN_VRAM, 0); 514 } 515 516 if (atom->cmd_size == CTX_STATE_SIZE_NEWDRM) { 517 OUT_BATCH_TABLE((atom->cmd + 14), 4); 518 } 519 520 END_BATCH(); 521 } 522 523 static int get_tex_mm_size(struct gl_context* ctx, struct radeon_state_atom *atom) 524 { 525 r200ContextPtr r200 = R200_CONTEXT(ctx); 526 uint32_t dwords = atom->cmd_size + 2; 527 int hastexture = 1; 528 int i = atom->idx; 529 radeonTexObj *t = r200->state.texture.unit[i].texobj; 530 if (!t) 531 hastexture = 0; 532 else { 533 if (!t->mt && !t->bo) 534 hastexture = 0; 535 } 536 537 if (!hastexture) 538 dwords -= 4; 539 return dwords; 540 } 541 542 static int check_tex_pair_mm(struct gl_context* ctx, struct radeon_state_atom *atom) 543 { 544 r200ContextPtr r200 = R200_CONTEXT(ctx); 545 /** XOR is bit flip operation so use it for finding pair */ 546 if (!(r200->state.texture.unit[atom->idx].unitneeded | r200->state.texture.unit[atom->idx ^ 1].unitneeded)) 547 return 0; 548 549 return get_tex_mm_size(ctx, atom); 550 } 551 552 static int check_tex_mm(struct gl_context* ctx, struct radeon_state_atom *atom) 553 { 554 r200ContextPtr r200 = R200_CONTEXT(ctx); 555 if (!(r200->state.texture.unit[atom->idx].unitneeded)) 556 return 0; 557 558 return get_tex_mm_size(ctx, atom); 559 } 560 561 562 static void tex_emit_mm(struct gl_context *ctx, struct radeon_state_atom *atom) 563 { 564 r200ContextPtr r200 = R200_CONTEXT(ctx); 565 BATCH_LOCALS(&r200->radeon); 566 uint32_t dwords = atom->check(ctx, atom); 567 int i = atom->idx; 568 radeonTexObj *t = r200->state.texture.unit[i].texobj; 569 570 if (!r200->state.texture.unit[i].unitneeded && !(dwords <= atom->cmd_size)) 571 dwords -= 4; 572 BEGIN_BATCH_NO_AUTOSTATE(dwords); 573 574 OUT_BATCH(CP_PACKET0(R200_PP_TXFILTER_0 + (32 * i), 7)); 575 OUT_BATCH_TABLE((atom->cmd + 1), 8); 576 577 if (dwords > atom->cmd_size) { 578 OUT_BATCH(CP_PACKET0(R200_PP_TXOFFSET_0 + (24 * i), 0)); 579 if (t->mt && !t->image_override) { 580 OUT_BATCH_RELOC(t->tile_bits, t->mt->bo, 0, 581 RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0); 582 } else { 583 if (t->bo) 584 OUT_BATCH_RELOC(t->tile_bits, t->bo, 0, 585 RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0); 586 } 587 } 588 END_BATCH(); 589 } 590 591 static void cube_emit_cs(struct gl_context *ctx, struct radeon_state_atom *atom) 592 { 593 r200ContextPtr r200 = R200_CONTEXT(ctx); 594 BATCH_LOCALS(&r200->radeon); 595 uint32_t dwords = atom->check(ctx, atom); 596 int i = atom->idx, j; 597 radeonTexObj *t = r200->state.texture.unit[i].texobj; 598 radeon_mipmap_level *lvl; 599 if (!(t && !t->image_override)) 600 dwords = 2; 601 602 BEGIN_BATCH_NO_AUTOSTATE(dwords); 603 OUT_BATCH_TABLE(atom->cmd, 2); 604 605 if (t && !t->image_override) { 606 lvl = &t->mt->levels[0]; 607 for (j = 1; j <= 5; j++) { 608 OUT_BATCH(CP_PACKET0(R200_PP_CUBIC_OFFSET_F1_0 + (24*i) + (4 * (j-1)), 0)); 609 OUT_BATCH_RELOC(lvl->faces[j].offset, t->mt->bo, lvl->faces[j].offset, 610 RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0); 611 } 612 } 613 END_BATCH(); 614 } 615 616 /* Initialize the context's hardware state. 617 */ 618 void r200InitState( r200ContextPtr rmesa ) 619 { 620 struct gl_context *ctx = rmesa->radeon.glCtx; 621 GLuint i; 622 623 rmesa->radeon.Fallback = 0; 624 625 rmesa->radeon.hw.max_state_size = 0; 626 627 #define ALLOC_STATE( ATOM, CHK, SZ, NM, IDX ) \ 628 do { \ 629 rmesa->hw.ATOM.cmd_size = SZ; \ 630 rmesa->hw.ATOM.cmd = (GLuint *)CALLOC(SZ * sizeof(int)); \ 631 rmesa->hw.ATOM.lastcmd = (GLuint *)CALLOC(SZ * sizeof(int)); \ 632 rmesa->hw.ATOM.name = NM; \ 633 rmesa->hw.ATOM.idx = IDX; \ 634 if (check_##CHK != check_never) { \ 635 rmesa->hw.ATOM.check = check_##CHK; \ 636 rmesa->radeon.hw.max_state_size += SZ * sizeof(int); \ 637 } else { \ 638 rmesa->hw.ATOM.check = NULL; \ 639 } \ 640 rmesa->hw.ATOM.dirty = GL_FALSE; \ 641 } while (0) 642 643 644 /* Allocate state buffers: 645 */ 646 ALLOC_STATE( ctx, always_add4, CTX_STATE_SIZE_NEWDRM, "CTX/context", 0 ); 647 648 rmesa->hw.ctx.emit = ctx_emit_cs; 649 rmesa->hw.ctx.check = check_always_ctx; 650 ALLOC_STATE( set, always, SET_STATE_SIZE, "SET/setup", 0 ); 651 ALLOC_STATE( lin, always, LIN_STATE_SIZE, "LIN/line", 0 ); 652 ALLOC_STATE( msk, always, MSK_STATE_SIZE, "MSK/mask", 0 ); 653 ALLOC_STATE( vpt, always, VPT_STATE_SIZE, "VPT/viewport", 0 ); 654 ALLOC_STATE( vtx, always, VTX_STATE_SIZE, "VTX/vertex", 0 ); 655 ALLOC_STATE( vap, always, VAP_STATE_SIZE, "VAP/vap", 0 ); 656 ALLOC_STATE( vte, always, VTE_STATE_SIZE, "VTE/vte", 0 ); 657 ALLOC_STATE( msc, always, MSC_STATE_SIZE, "MSC/misc", 0 ); 658 ALLOC_STATE( cst, always, CST_STATE_SIZE, "CST/constant", 0 ); 659 ALLOC_STATE( zbs, always, ZBS_STATE_SIZE, "ZBS/zbias", 0 ); 660 ALLOC_STATE( tf, tf, TF_STATE_SIZE, "TF/tfactor", 0 ); 661 { 662 int state_size = TEX_STATE_SIZE_NEWDRM; 663 if (rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_R200) { 664 /* make sure texture units 0/1 are emitted pair-wise for r200 t0 hang workaround */ 665 ALLOC_STATE( tex[0], tex_pair_mm, state_size, "TEX/tex-0", 0 ); 666 ALLOC_STATE( tex[1], tex_pair_mm, state_size, "TEX/tex-1", 1 ); 667 ALLOC_STATE( tam, tex_any, TAM_STATE_SIZE, "TAM/tam", 0 ); 668 } 669 else { 670 ALLOC_STATE( tex[0], tex_mm, state_size, "TEX/tex-0", 0 ); 671 ALLOC_STATE( tex[1], tex_mm, state_size, "TEX/tex-1", 1 ); 672 ALLOC_STATE( tam, never, TAM_STATE_SIZE, "TAM/tam", 0 ); 673 } 674 ALLOC_STATE( tex[2], tex_mm, state_size, "TEX/tex-2", 2 ); 675 ALLOC_STATE( tex[3], tex_mm, state_size, "TEX/tex-3", 3 ); 676 ALLOC_STATE( tex[4], tex_mm, state_size, "TEX/tex-4", 4 ); 677 ALLOC_STATE( tex[5], tex_mm, state_size, "TEX/tex-5", 5 ); 678 ALLOC_STATE( atf, afs, ATF_STATE_SIZE, "ATF/tfactor", 0 ); 679 ALLOC_STATE( afs[0], afs_pass1, AFS_STATE_SIZE, "AFS/afsinst-0", 0 ); 680 ALLOC_STATE( afs[1], afs, AFS_STATE_SIZE, "AFS/afsinst-1", 1 ); 681 } 682 683 ALLOC_STATE( stp, polygon_stipple, STP_STATE_SIZE, "STP/stp", 0 ); 684 685 for (i = 0; i < 6; i++) 686 rmesa->hw.tex[i].emit = tex_emit_mm; 687 ALLOC_STATE( cube[0], tex_cube, CUBE_STATE_SIZE, "CUBE/tex-0", 0 ); 688 ALLOC_STATE( cube[1], tex_cube, CUBE_STATE_SIZE, "CUBE/tex-1", 1 ); 689 ALLOC_STATE( cube[2], tex_cube, CUBE_STATE_SIZE, "CUBE/tex-2", 2 ); 690 ALLOC_STATE( cube[3], tex_cube, CUBE_STATE_SIZE, "CUBE/tex-3", 3 ); 691 ALLOC_STATE( cube[4], tex_cube, CUBE_STATE_SIZE, "CUBE/tex-4", 4 ); 692 ALLOC_STATE( cube[5], tex_cube, CUBE_STATE_SIZE, "CUBE/tex-5", 5 ); 693 for (i = 0; i < 6; i++) { 694 rmesa->hw.cube[i].emit = cube_emit_cs; 695 rmesa->hw.cube[i].check = check_tex_cube_cs; 696 } 697 698 ALLOC_STATE( pvs, tcl_vp, PVS_STATE_SIZE, "PVS/pvscntl", 0 ); 699 ALLOC_STATE( vpi[0], tcl_vp_add4, VPI_STATE_SIZE, "VP/vertexprog-0", 0 ); 700 ALLOC_STATE( vpi[1], tcl_vp_size_add4, VPI_STATE_SIZE, "VP/vertexprog-1", 1 ); 701 ALLOC_STATE( vpp[0], tcl_vp_add4, VPP_STATE_SIZE, "VPP/vertexparam-0", 0 ); 702 ALLOC_STATE( vpp[1], tcl_vpp_size_add4, VPP_STATE_SIZE, "VPP/vertexparam-1", 1 ); 703 704 /* FIXME: this atom has two commands, we need only one (ucp_vert_blend) for vp */ 705 ALLOC_STATE( tcl, tcl_or_vp, TCL_STATE_SIZE, "TCL/tcl", 0 ); 706 ALLOC_STATE( msl, tcl, MSL_STATE_SIZE, "MSL/matrix-select", 0 ); 707 ALLOC_STATE( tcg, tcl, TCG_STATE_SIZE, "TCG/texcoordgen", 0 ); 708 ALLOC_STATE( mtl[0], tcl_lighting_add6, MTL_STATE_SIZE, "MTL0/material0", 0 ); 709 ALLOC_STATE( mtl[1], tcl_lighting_add6, MTL_STATE_SIZE, "MTL1/material1", 1 ); 710 ALLOC_STATE( grd, tcl_or_vp_add2, GRD_STATE_SIZE, "GRD/guard-band", 0 ); 711 ALLOC_STATE( fog, tcl_fog_add4, FOG_STATE_SIZE, "FOG/fog", 0 ); 712 ALLOC_STATE( glt, tcl_lighting_add4, GLT_STATE_SIZE, "GLT/light-global", 0 ); 713 ALLOC_STATE( eye, tcl_lighting_add4, EYE_STATE_SIZE, "EYE/eye-vector", 0 ); 714 ALLOC_STATE( mat[R200_MTX_MV], tcl_add4, MAT_STATE_SIZE, "MAT/modelview", 0 ); 715 ALLOC_STATE( mat[R200_MTX_IMV], tcl_add4, MAT_STATE_SIZE, "MAT/it-modelview", 0 ); 716 ALLOC_STATE( mat[R200_MTX_MVP], tcl_add4, MAT_STATE_SIZE, "MAT/modelproject", 0 ); 717 ALLOC_STATE( mat[R200_MTX_TEX0], tcl_tex_add4, MAT_STATE_SIZE, "MAT/texmat0", 0 ); 718 ALLOC_STATE( mat[R200_MTX_TEX1], tcl_tex_add4, MAT_STATE_SIZE, "MAT/texmat1", 1 ); 719 ALLOC_STATE( mat[R200_MTX_TEX2], tcl_tex_add4, MAT_STATE_SIZE, "MAT/texmat2", 2 ); 720 ALLOC_STATE( mat[R200_MTX_TEX3], tcl_tex_add4, MAT_STATE_SIZE, "MAT/texmat3", 3 ); 721 ALLOC_STATE( mat[R200_MTX_TEX4], tcl_tex_add4, MAT_STATE_SIZE, "MAT/texmat4", 4 ); 722 ALLOC_STATE( mat[R200_MTX_TEX5], tcl_tex_add4, MAT_STATE_SIZE, "MAT/texmat5", 5 ); 723 ALLOC_STATE( ucp[0], tcl_ucp_add4, UCP_STATE_SIZE, "UCP/userclip-0", 0 ); 724 ALLOC_STATE( ucp[1], tcl_ucp_add4, UCP_STATE_SIZE, "UCP/userclip-1", 1 ); 725 ALLOC_STATE( ucp[2], tcl_ucp_add4, UCP_STATE_SIZE, "UCP/userclip-2", 2 ); 726 ALLOC_STATE( ucp[3], tcl_ucp_add4, UCP_STATE_SIZE, "UCP/userclip-3", 3 ); 727 ALLOC_STATE( ucp[4], tcl_ucp_add4, UCP_STATE_SIZE, "UCP/userclip-4", 4 ); 728 ALLOC_STATE( ucp[5], tcl_ucp_add4, UCP_STATE_SIZE, "UCP/userclip-5", 5 ); 729 ALLOC_STATE( lit[0], tcl_light_add6, LIT_STATE_SIZE, "LIT/light-0", 0 ); 730 ALLOC_STATE( lit[1], tcl_light_add6, LIT_STATE_SIZE, "LIT/light-1", 1 ); 731 ALLOC_STATE( lit[2], tcl_light_add6, LIT_STATE_SIZE, "LIT/light-2", 2 ); 732 ALLOC_STATE( lit[3], tcl_light_add6, LIT_STATE_SIZE, "LIT/light-3", 3 ); 733 ALLOC_STATE( lit[4], tcl_light_add6, LIT_STATE_SIZE, "LIT/light-4", 4 ); 734 ALLOC_STATE( lit[5], tcl_light_add6, LIT_STATE_SIZE, "LIT/light-5", 5 ); 735 ALLOC_STATE( lit[6], tcl_light_add6, LIT_STATE_SIZE, "LIT/light-6", 6 ); 736 ALLOC_STATE( lit[7], tcl_light_add6, LIT_STATE_SIZE, "LIT/light-7", 7 ); 737 ALLOC_STATE( sci, rrb, SCI_STATE_SIZE, "SCI/scissor", 0 ); 738 ALLOC_STATE( pix[0], pix_zero, PIX_STATE_SIZE, "PIX/pixstage-0", 0 ); 739 ALLOC_STATE( pix[1], texenv, PIX_STATE_SIZE, "PIX/pixstage-1", 1 ); 740 ALLOC_STATE( pix[2], texenv, PIX_STATE_SIZE, "PIX/pixstage-2", 2 ); 741 ALLOC_STATE( pix[3], texenv, PIX_STATE_SIZE, "PIX/pixstage-3", 3 ); 742 ALLOC_STATE( pix[4], texenv, PIX_STATE_SIZE, "PIX/pixstage-4", 4 ); 743 ALLOC_STATE( pix[5], texenv, PIX_STATE_SIZE, "PIX/pixstage-5", 5 ); 744 ALLOC_STATE( prf, always, PRF_STATE_SIZE, "PRF/performance-tri", 0 ); 745 ALLOC_STATE( spr, always, SPR_STATE_SIZE, "SPR/pointsprite", 0 ); 746 ALLOC_STATE( ptp, tcl_add8, PTP_STATE_SIZE, "PTP/pointparams", 0 ); 747 748 r200SetUpAtomList( rmesa ); 749 750 /* Fill in the packet headers: 751 */ 752 rmesa->hw.ctx.cmd[CTX_CMD_0] = cmdpkt(rmesa, RADEON_EMIT_PP_MISC); 753 rmesa->hw.ctx.cmd[CTX_CMD_1] = cmdpkt(rmesa, RADEON_EMIT_PP_CNTL); 754 rmesa->hw.ctx.cmd[CTX_CMD_2] = cmdpkt(rmesa, RADEON_EMIT_RB3D_COLORPITCH); 755 rmesa->hw.ctx.cmd[CTX_CMD_3] = cmdpkt(rmesa, R200_EMIT_RB3D_BLENDCOLOR); 756 rmesa->hw.lin.cmd[LIN_CMD_0] = cmdpkt(rmesa, RADEON_EMIT_RE_LINE_PATTERN); 757 rmesa->hw.lin.cmd[LIN_CMD_1] = cmdpkt(rmesa, RADEON_EMIT_SE_LINE_WIDTH); 758 rmesa->hw.msk.cmd[MSK_CMD_0] = cmdpkt(rmesa, RADEON_EMIT_RB3D_STENCILREFMASK); 759 rmesa->hw.vpt.cmd[VPT_CMD_0] = cmdpkt(rmesa, RADEON_EMIT_SE_VPORT_XSCALE); 760 rmesa->hw.set.cmd[SET_CMD_0] = cmdpkt(rmesa, RADEON_EMIT_SE_CNTL); 761 rmesa->hw.msc.cmd[MSC_CMD_0] = cmdpkt(rmesa, RADEON_EMIT_RE_MISC); 762 rmesa->hw.cst.cmd[CST_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_CNTL_X); 763 rmesa->hw.cst.cmd[CST_CMD_1] = cmdpkt(rmesa, R200_EMIT_RB3D_DEPTHXY_OFFSET); 764 rmesa->hw.cst.cmd[CST_CMD_2] = cmdpkt(rmesa, R200_EMIT_RE_AUX_SCISSOR_CNTL); 765 rmesa->hw.cst.cmd[CST_CMD_4] = cmdpkt(rmesa, R200_EMIT_SE_VAP_CNTL_STATUS); 766 rmesa->hw.cst.cmd[CST_CMD_5] = cmdpkt(rmesa, R200_EMIT_RE_POINTSIZE); 767 rmesa->hw.cst.cmd[CST_CMD_6] = cmdpkt(rmesa, R200_EMIT_TCL_INPUT_VTX_VECTOR_ADDR_0); 768 rmesa->hw.tam.cmd[TAM_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_TAM_DEBUG3); 769 rmesa->hw.tf.cmd[TF_CMD_0] = cmdpkt(rmesa, R200_EMIT_TFACTOR_0); 770 rmesa->hw.atf.cmd[ATF_CMD_0] = cmdpkt(rmesa, R200_EMIT_ATF_TFACTOR); 771 rmesa->hw.tex[0].cmd[TEX_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_TXCTLALL_0); 772 rmesa->hw.tex[0].cmd[TEX_CMD_1_NEWDRM] = cmdpkt(rmesa, R200_EMIT_PP_TXOFFSET_0); 773 rmesa->hw.tex[1].cmd[TEX_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_TXCTLALL_1); 774 rmesa->hw.tex[1].cmd[TEX_CMD_1_NEWDRM] = cmdpkt(rmesa, R200_EMIT_PP_TXOFFSET_1); 775 rmesa->hw.tex[2].cmd[TEX_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_TXCTLALL_2); 776 rmesa->hw.tex[2].cmd[TEX_CMD_1_NEWDRM] = cmdpkt(rmesa, R200_EMIT_PP_TXOFFSET_2); 777 rmesa->hw.tex[3].cmd[TEX_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_TXCTLALL_3); 778 rmesa->hw.tex[3].cmd[TEX_CMD_1_NEWDRM] = cmdpkt(rmesa, R200_EMIT_PP_TXOFFSET_3); 779 rmesa->hw.tex[4].cmd[TEX_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_TXCTLALL_4); 780 rmesa->hw.tex[4].cmd[TEX_CMD_1_NEWDRM] = cmdpkt(rmesa, R200_EMIT_PP_TXOFFSET_4); 781 rmesa->hw.tex[5].cmd[TEX_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_TXCTLALL_5); 782 rmesa->hw.tex[5].cmd[TEX_CMD_1_NEWDRM] = cmdpkt(rmesa, R200_EMIT_PP_TXOFFSET_5); 783 rmesa->hw.afs[0].cmd[AFS_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_AFS_0); 784 rmesa->hw.afs[1].cmd[AFS_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_AFS_1); 785 rmesa->hw.pvs.cmd[PVS_CMD_0] = cmdpkt(rmesa, R200_EMIT_VAP_PVS_CNTL); 786 rmesa->hw.cube[0].cmd[CUBE_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_CUBIC_FACES_0); 787 rmesa->hw.cube[0].cmd[CUBE_CMD_1] = cmdpkt(rmesa, R200_EMIT_PP_CUBIC_OFFSETS_0); 788 rmesa->hw.cube[1].cmd[CUBE_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_CUBIC_FACES_1); 789 rmesa->hw.cube[1].cmd[CUBE_CMD_1] = cmdpkt(rmesa, R200_EMIT_PP_CUBIC_OFFSETS_1); 790 rmesa->hw.cube[2].cmd[CUBE_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_CUBIC_FACES_2); 791 rmesa->hw.cube[2].cmd[CUBE_CMD_1] = cmdpkt(rmesa, R200_EMIT_PP_CUBIC_OFFSETS_2); 792 rmesa->hw.cube[3].cmd[CUBE_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_CUBIC_FACES_3); 793 rmesa->hw.cube[3].cmd[CUBE_CMD_1] = cmdpkt(rmesa, R200_EMIT_PP_CUBIC_OFFSETS_3); 794 rmesa->hw.cube[4].cmd[CUBE_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_CUBIC_FACES_4); 795 rmesa->hw.cube[4].cmd[CUBE_CMD_1] = cmdpkt(rmesa, R200_EMIT_PP_CUBIC_OFFSETS_4); 796 rmesa->hw.cube[5].cmd[CUBE_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_CUBIC_FACES_5); 797 rmesa->hw.cube[5].cmd[CUBE_CMD_1] = cmdpkt(rmesa, R200_EMIT_PP_CUBIC_OFFSETS_5); 798 rmesa->hw.pix[0].cmd[PIX_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_TXCBLEND_0); 799 rmesa->hw.pix[1].cmd[PIX_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_TXCBLEND_1); 800 rmesa->hw.pix[2].cmd[PIX_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_TXCBLEND_2); 801 rmesa->hw.pix[3].cmd[PIX_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_TXCBLEND_3); 802 rmesa->hw.pix[4].cmd[PIX_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_TXCBLEND_4); 803 rmesa->hw.pix[5].cmd[PIX_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_TXCBLEND_5); 804 rmesa->hw.zbs.cmd[ZBS_CMD_0] = cmdpkt(rmesa, RADEON_EMIT_SE_ZBIAS_FACTOR); 805 rmesa->hw.tcl.cmd[TCL_CMD_0] = cmdpkt(rmesa, R200_EMIT_TCL_LIGHT_MODEL_CTL_0); 806 rmesa->hw.tcl.cmd[TCL_CMD_1] = cmdpkt(rmesa, R200_EMIT_TCL_UCP_VERT_BLEND_CTL); 807 rmesa->hw.tcg.cmd[TCG_CMD_0] = cmdpkt(rmesa, R200_EMIT_TEX_PROC_CTL_2); 808 rmesa->hw.msl.cmd[MSL_CMD_0] = cmdpkt(rmesa, R200_EMIT_MATRIX_SELECT_0); 809 rmesa->hw.vap.cmd[VAP_CMD_0] = cmdpkt(rmesa, R200_EMIT_VAP_CTL); 810 rmesa->hw.vtx.cmd[VTX_CMD_0] = cmdpkt(rmesa, R200_EMIT_VTX_FMT_0); 811 rmesa->hw.vtx.cmd[VTX_CMD_1] = cmdpkt(rmesa, R200_EMIT_OUTPUT_VTX_COMP_SEL); 812 rmesa->hw.vtx.cmd[VTX_CMD_2] = cmdpkt(rmesa, R200_EMIT_SE_VTX_STATE_CNTL); 813 rmesa->hw.vte.cmd[VTE_CMD_0] = cmdpkt(rmesa, R200_EMIT_VTE_CNTL); 814 rmesa->hw.prf.cmd[PRF_CMD_0] = cmdpkt(rmesa, R200_EMIT_PP_TRI_PERF_CNTL); 815 rmesa->hw.spr.cmd[SPR_CMD_0] = cmdpkt(rmesa, R200_EMIT_TCL_POINT_SPRITE_CNTL); 816 817 rmesa->hw.sci.cmd[SCI_CMD_1] = CP_PACKET0(R200_RE_TOP_LEFT, 0); 818 rmesa->hw.sci.cmd[SCI_CMD_2] = CP_PACKET0(R200_RE_WIDTH_HEIGHT, 0); 819 820 rmesa->hw.stp.cmd[STP_CMD_0] = CP_PACKET0(RADEON_RE_STIPPLE_ADDR, 0); 821 rmesa->hw.stp.cmd[STP_DATA_0] = 0; 822 rmesa->hw.stp.cmd[STP_CMD_1] = CP_PACKET0_ONE(RADEON_RE_STIPPLE_DATA, 31); 823 824 rmesa->hw.mtl[0].emit = mtl_emit; 825 rmesa->hw.mtl[1].emit = mtl_emit; 826 827 rmesa->hw.vpi[0].emit = veclinear_emit; 828 rmesa->hw.vpi[1].emit = veclinear_emit; 829 rmesa->hw.vpp[0].emit = veclinear_emit; 830 rmesa->hw.vpp[1].emit = veclinear_emit; 831 832 rmesa->hw.grd.emit = scl_emit; 833 rmesa->hw.fog.emit = vec_emit; 834 rmesa->hw.glt.emit = vec_emit; 835 rmesa->hw.eye.emit = vec_emit; 836 837 for (i = R200_MTX_MV; i <= R200_MTX_TEX5; i++) 838 rmesa->hw.mat[i].emit = vec_emit; 839 840 for (i = 0; i < 8; i++) 841 rmesa->hw.lit[i].emit = lit_emit; 842 843 for (i = 0; i < 6; i++) 844 rmesa->hw.ucp[i].emit = vec_emit; 845 846 rmesa->hw.ptp.emit = ptp_emit; 847 848 rmesa->hw.mtl[0].cmd[MTL_CMD_0] = 849 cmdvec( R200_VS_MAT_0_EMISS, 1, 16 ); 850 rmesa->hw.mtl[0].cmd[MTL_CMD_1] = 851 cmdscl2( R200_SS_MAT_0_SHININESS, 1, 1 ); 852 rmesa->hw.mtl[1].cmd[MTL_CMD_0] = 853 cmdvec( R200_VS_MAT_1_EMISS, 1, 16 ); 854 rmesa->hw.mtl[1].cmd[MTL_CMD_1] = 855 cmdscl2( R200_SS_MAT_1_SHININESS, 1, 1 ); 856 857 rmesa->hw.vpi[0].cmd[VPI_CMD_0] = 858 cmdveclinear( R200_PVS_PROG0, 64 ); 859 rmesa->hw.vpi[1].cmd[VPI_CMD_0] = 860 cmdveclinear( R200_PVS_PROG1, 64 ); 861 rmesa->hw.vpp[0].cmd[VPP_CMD_0] = 862 cmdveclinear( R200_PVS_PARAM0, 96 ); 863 rmesa->hw.vpp[1].cmd[VPP_CMD_0] = 864 cmdveclinear( R200_PVS_PARAM1, 96 ); 865 866 rmesa->hw.grd.cmd[GRD_CMD_0] = 867 cmdscl( R200_SS_VERT_GUARD_CLIP_ADJ_ADDR, 1, 4 ); 868 rmesa->hw.fog.cmd[FOG_CMD_0] = 869 cmdvec( R200_VS_FOG_PARAM_ADDR, 1, 4 ); 870 rmesa->hw.glt.cmd[GLT_CMD_0] = 871 cmdvec( R200_VS_GLOBAL_AMBIENT_ADDR, 1, 4 ); 872 rmesa->hw.eye.cmd[EYE_CMD_0] = 873 cmdvec( R200_VS_EYE_VECTOR_ADDR, 1, 4 ); 874 875 rmesa->hw.mat[R200_MTX_MV].cmd[MAT_CMD_0] = 876 cmdvec( R200_VS_MATRIX_0_MV, 1, 16); 877 rmesa->hw.mat[R200_MTX_IMV].cmd[MAT_CMD_0] = 878 cmdvec( R200_VS_MATRIX_1_INV_MV, 1, 16); 879 rmesa->hw.mat[R200_MTX_MVP].cmd[MAT_CMD_0] = 880 cmdvec( R200_VS_MATRIX_2_MVP, 1, 16); 881 rmesa->hw.mat[R200_MTX_TEX0].cmd[MAT_CMD_0] = 882 cmdvec( R200_VS_MATRIX_3_TEX0, 1, 16); 883 rmesa->hw.mat[R200_MTX_TEX1].cmd[MAT_CMD_0] = 884 cmdvec( R200_VS_MATRIX_4_TEX1, 1, 16); 885 rmesa->hw.mat[R200_MTX_TEX2].cmd[MAT_CMD_0] = 886 cmdvec( R200_VS_MATRIX_5_TEX2, 1, 16); 887 rmesa->hw.mat[R200_MTX_TEX3].cmd[MAT_CMD_0] = 888 cmdvec( R200_VS_MATRIX_6_TEX3, 1, 16); 889 rmesa->hw.mat[R200_MTX_TEX4].cmd[MAT_CMD_0] = 890 cmdvec( R200_VS_MATRIX_7_TEX4, 1, 16); 891 rmesa->hw.mat[R200_MTX_TEX5].cmd[MAT_CMD_0] = 892 cmdvec( R200_VS_MATRIX_8_TEX5, 1, 16); 893 894 for (i = 0 ; i < 8; i++) { 895 rmesa->hw.lit[i].cmd[LIT_CMD_0] = 896 cmdvec( R200_VS_LIGHT_AMBIENT_ADDR + i, 8, 24 ); 897 rmesa->hw.lit[i].cmd[LIT_CMD_1] = 898 cmdscl( R200_SS_LIGHT_DCD_ADDR + i, 8, 7 ); 899 } 900 901 for (i = 0 ; i < 6; i++) { 902 rmesa->hw.ucp[i].cmd[UCP_CMD_0] = 903 cmdvec( R200_VS_UCP_ADDR + i, 1, 4 ); 904 } 905 906 rmesa->hw.ptp.cmd[PTP_CMD_0] = 907 cmdvec( R200_VS_PNT_SPRITE_VPORT_SCALE, 1, 4 ); 908 rmesa->hw.ptp.cmd[PTP_CMD_1] = 909 cmdvec( R200_VS_PNT_SPRITE_ATT_CONST, 1, 12 ); 910 911 /* Initial Harware state: 912 */ 913 rmesa->hw.ctx.cmd[CTX_PP_MISC] = (R200_ALPHA_TEST_PASS 914 /* | R200_RIGHT_HAND_CUBE_OGL*/); 915 916 rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] = (R200_FOG_VERTEX | 917 R200_FOG_USE_SPEC_ALPHA); 918 919 rmesa->hw.ctx.cmd[CTX_RE_SOLID_COLOR] = 0x00000000; 920 921 rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = (R200_COMB_FCN_ADD_CLAMP | 922 (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) | 923 (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT)); 924 925 rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCOLOR] = 0x00000000; 926 rmesa->hw.ctx.cmd[CTX_RB3D_ABLENDCNTL] = (R200_COMB_FCN_ADD_CLAMP | 927 (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) | 928 (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT)); 929 rmesa->hw.ctx.cmd[CTX_RB3D_CBLENDCNTL] = (R200_COMB_FCN_ADD_CLAMP | 930 (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) | 931 (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT)); 932 933 rmesa->hw.ctx.cmd[CTX_RB3D_DEPTHOFFSET] = 934 rmesa->radeon.radeonScreen->depthOffset + rmesa->radeon.radeonScreen->fbLocation; 935 936 rmesa->hw.ctx.cmd[CTX_RB3D_DEPTHPITCH] = 937 ((rmesa->radeon.radeonScreen->depthPitch & 938 R200_DEPTHPITCH_MASK) | 939 R200_DEPTH_ENDIAN_NO_SWAP); 940 941 if (rmesa->using_hyperz) 942 rmesa->hw.ctx.cmd[CTX_RB3D_DEPTHPITCH] |= R200_DEPTH_HYPERZ; 943 944 rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] = (R200_Z_TEST_LESS | 945 R200_STENCIL_TEST_ALWAYS | 946 R200_STENCIL_FAIL_KEEP | 947 R200_STENCIL_ZPASS_KEEP | 948 R200_STENCIL_ZFAIL_KEEP | 949 R200_Z_WRITE_ENABLE); 950 951 if (rmesa->using_hyperz) { 952 rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_COMPRESSION_ENABLE | 953 R200_Z_DECOMPRESSION_ENABLE; 954 /* if (rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_R200) 955 rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_HIERARCHY_ENABLE;*/ 956 } 957 958 rmesa->hw.ctx.cmd[CTX_PP_CNTL] = (R200_ANTI_ALIAS_NONE 959 | R200_TEX_BLEND_0_ENABLE); 960 961 switch ( driQueryOptioni( &rmesa->radeon.optionCache, "dither_mode" ) ) { 962 case DRI_CONF_DITHER_XERRORDIFFRESET: 963 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_DITHER_INIT; 964 break; 965 case DRI_CONF_DITHER_ORDERED: 966 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_SCALE_DITHER_ENABLE; 967 break; 968 } 969 if ( driQueryOptioni( &rmesa->radeon.optionCache, "round_mode" ) == 970 DRI_CONF_ROUND_ROUND ) 971 rmesa->radeon.state.color.roundEnable = R200_ROUND_ENABLE; 972 else 973 rmesa->radeon.state.color.roundEnable = 0; 974 if ( driQueryOptioni (&rmesa->radeon.optionCache, "color_reduction" ) == 975 DRI_CONF_COLOR_REDUCTION_DITHER ) 976 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_DITHER_ENABLE; 977 else 978 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= rmesa->radeon.state.color.roundEnable; 979 980 rmesa->hw.prf.cmd[PRF_PP_TRI_PERF] = R200_TRI_CUTOFF_MASK - R200_TRI_CUTOFF_MASK * 981 driQueryOptionf (&rmesa->radeon.optionCache,"texture_blend_quality"); 982 rmesa->hw.prf.cmd[PRF_PP_PERF_CNTL] = 0; 983 984 rmesa->hw.set.cmd[SET_SE_CNTL] = (R200_FFACE_CULL_CCW | 985 R200_BFACE_SOLID | 986 R200_FFACE_SOLID | 987 R200_FLAT_SHADE_VTX_LAST | 988 R200_DIFFUSE_SHADE_GOURAUD | 989 R200_ALPHA_SHADE_GOURAUD | 990 R200_SPECULAR_SHADE_GOURAUD | 991 R200_FOG_SHADE_GOURAUD | 992 R200_DISC_FOG_SHADE_GOURAUD | 993 R200_VTX_PIX_CENTER_OGL | 994 R200_ROUND_MODE_TRUNC | 995 R200_ROUND_PREC_8TH_PIX); 996 997 rmesa->hw.set.cmd[SET_RE_CNTL] = (R200_PERSPECTIVE_ENABLE | 998 R200_SCISSOR_ENABLE); 999 1000 rmesa->hw.lin.cmd[LIN_RE_LINE_PATTERN] = ((1 << 16) | 0xffff); 1001 1002 rmesa->hw.lin.cmd[LIN_RE_LINE_STATE] = 1003 ((0 << R200_LINE_CURRENT_PTR_SHIFT) | 1004 (1 << R200_LINE_CURRENT_COUNT_SHIFT)); 1005 1006 rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] = (1 << 4); 1007 1008 rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] = 1009 ((0x00 << R200_STENCIL_REF_SHIFT) | 1010 (0xff << R200_STENCIL_MASK_SHIFT) | 1011 (0xff << R200_STENCIL_WRITEMASK_SHIFT)); 1012 1013 rmesa->hw.msk.cmd[MSK_RB3D_ROPCNTL] = R200_ROP_COPY; 1014 rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] = 0xffffffff; 1015 1016 rmesa->hw.tam.cmd[TAM_DEBUG3] = 0; 1017 1018 rmesa->hw.msc.cmd[MSC_RE_MISC] = 1019 ((0 << R200_STIPPLE_X_OFFSET_SHIFT) | 1020 (0 << R200_STIPPLE_Y_OFFSET_SHIFT) | 1021 R200_STIPPLE_BIG_BIT_ORDER); 1022 1023 1024 rmesa->hw.cst.cmd[CST_PP_CNTL_X] = 0; 1025 rmesa->hw.cst.cmd[CST_RB3D_DEPTHXY_OFFSET] = 0; 1026 rmesa->hw.cst.cmd[CST_RE_AUX_SCISSOR_CNTL] = 0x0; 1027 rmesa->hw.cst.cmd[CST_SE_VAP_CNTL_STATUS] = 1028 #ifdef MESA_BIG_ENDIAN 1029 R200_VC_32BIT_SWAP; 1030 #else 1031 R200_VC_NO_SWAP; 1032 #endif 1033 1034 if (!(rmesa->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL)) { 1035 /* Bypass TCL */ 1036 rmesa->hw.cst.cmd[CST_SE_VAP_CNTL_STATUS] |= (1<<8); 1037 } 1038 1039 rmesa->hw.cst.cmd[CST_RE_POINTSIZE] = 1040 (((GLuint)(ctx->Const.MaxPointSize * 16.0)) << R200_MAXPOINTSIZE_SHIFT) | 0x10; 1041 rmesa->hw.cst.cmd[CST_SE_TCL_INPUT_VTX_0] = 1042 (0x0 << R200_VERTEX_POSITION_ADDR__SHIFT); 1043 rmesa->hw.cst.cmd[CST_SE_TCL_INPUT_VTX_1] = 1044 (0x02 << R200_VTX_COLOR_0_ADDR__SHIFT) | 1045 (0x03 << R200_VTX_COLOR_1_ADDR__SHIFT); 1046 rmesa->hw.cst.cmd[CST_SE_TCL_INPUT_VTX_2] = 1047 (0x06 << R200_VTX_TEX_0_ADDR__SHIFT) | 1048 (0x07 << R200_VTX_TEX_1_ADDR__SHIFT) | 1049 (0x08 << R200_VTX_TEX_2_ADDR__SHIFT) | 1050 (0x09 << R200_VTX_TEX_3_ADDR__SHIFT); 1051 rmesa->hw.cst.cmd[CST_SE_TCL_INPUT_VTX_3] = 1052 (0x0A << R200_VTX_TEX_4_ADDR__SHIFT) | 1053 (0x0B << R200_VTX_TEX_5_ADDR__SHIFT); 1054 1055 1056 rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE] = 0x00000000; 1057 rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = 0x00000000; 1058 rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE] = 0x00000000; 1059 rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = 0x00000000; 1060 rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE] = 0x00000000; 1061 rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = 0x00000000; 1062 1063 for ( i = 0 ; i < ctx->Const.MaxTextureUnits ; i++ ) { 1064 rmesa->hw.tex[i].cmd[TEX_PP_TXFILTER] = R200_BORDER_MODE_OGL; 1065 rmesa->hw.tex[i].cmd[TEX_PP_TXFORMAT] = 1066 ((i << R200_TXFORMAT_ST_ROUTE_SHIFT) | /* <-- note i */ 1067 (2 << R200_TXFORMAT_WIDTH_SHIFT) | 1068 (2 << R200_TXFORMAT_HEIGHT_SHIFT)); 1069 rmesa->hw.tex[i].cmd[TEX_PP_BORDER_COLOR] = 0; 1070 rmesa->hw.tex[i].cmd[TEX_PP_TXFORMAT_X] = 1071 (/* R200_TEXCOORD_PROJ | */ 1072 R200_LOD_BIAS_CORRECTION); /* Small default bias */ 1073 rmesa->hw.tex[i].cmd[TEX_PP_TXOFFSET_NEWDRM] = 1074 rmesa->radeon.radeonScreen->texOffset[RADEON_LOCAL_TEX_HEAP]; 1075 rmesa->hw.tex[i].cmd[TEX_PP_CUBIC_FACES] = 0; 1076 rmesa->hw.tex[i].cmd[TEX_PP_TXMULTI_CTL] = 0; 1077 1078 rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_FACES] = 0; 1079 rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_OFFSET_F1] = 1080 rmesa->radeon.radeonScreen->texOffset[RADEON_LOCAL_TEX_HEAP]; 1081 rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_OFFSET_F2] = 1082 rmesa->radeon.radeonScreen->texOffset[RADEON_LOCAL_TEX_HEAP]; 1083 rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_OFFSET_F3] = 1084 rmesa->radeon.radeonScreen->texOffset[RADEON_LOCAL_TEX_HEAP]; 1085 rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_OFFSET_F4] = 1086 rmesa->radeon.radeonScreen->texOffset[RADEON_LOCAL_TEX_HEAP]; 1087 rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_OFFSET_F5] = 1088 rmesa->radeon.radeonScreen->texOffset[RADEON_LOCAL_TEX_HEAP]; 1089 1090 rmesa->hw.pix[i].cmd[PIX_PP_TXCBLEND] = 1091 (R200_TXC_ARG_A_ZERO | 1092 R200_TXC_ARG_B_ZERO | 1093 R200_TXC_ARG_C_DIFFUSE_COLOR | 1094 R200_TXC_OP_MADD); 1095 1096 rmesa->hw.pix[i].cmd[PIX_PP_TXCBLEND2] = 1097 ((i << R200_TXC_TFACTOR_SEL_SHIFT) | 1098 R200_TXC_SCALE_1X | 1099 R200_TXC_CLAMP_0_1 | 1100 R200_TXC_OUTPUT_REG_R0); 1101 1102 rmesa->hw.pix[i].cmd[PIX_PP_TXABLEND] = 1103 (R200_TXA_ARG_A_ZERO | 1104 R200_TXA_ARG_B_ZERO | 1105 R200_TXA_ARG_C_DIFFUSE_ALPHA | 1106 R200_TXA_OP_MADD); 1107 1108 rmesa->hw.pix[i].cmd[PIX_PP_TXABLEND2] = 1109 ((i << R200_TXA_TFACTOR_SEL_SHIFT) | 1110 R200_TXA_SCALE_1X | 1111 R200_TXA_CLAMP_0_1 | 1112 R200_TXA_OUTPUT_REG_R0); 1113 } 1114 1115 rmesa->hw.tf.cmd[TF_TFACTOR_0] = 0; 1116 rmesa->hw.tf.cmd[TF_TFACTOR_1] = 0; 1117 rmesa->hw.tf.cmd[TF_TFACTOR_2] = 0; 1118 rmesa->hw.tf.cmd[TF_TFACTOR_3] = 0; 1119 rmesa->hw.tf.cmd[TF_TFACTOR_4] = 0; 1120 rmesa->hw.tf.cmd[TF_TFACTOR_5] = 0; 1121 1122 rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL] = 1123 (R200_VAP_TCL_ENABLE | 1124 (0x9 << R200_VAP_VF_MAX_VTX_NUM__SHIFT)); 1125 1126 rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL] = 1127 (R200_VPORT_X_SCALE_ENA | 1128 R200_VPORT_Y_SCALE_ENA | 1129 R200_VPORT_Z_SCALE_ENA | 1130 R200_VPORT_X_OFFSET_ENA | 1131 R200_VPORT_Y_OFFSET_ENA | 1132 R200_VPORT_Z_OFFSET_ENA | 1133 /* FIXME: Turn on for tex rect only */ 1134 R200_VTX_ST_DENORMALIZED | 1135 R200_VTX_W0_FMT); 1136 1137 1138 rmesa->hw.vtx.cmd[VTX_VTXFMT_0] = 0; 1139 rmesa->hw.vtx.cmd[VTX_VTXFMT_1] = 0; 1140 rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] = 1141 ((R200_VTX_Z0 | R200_VTX_W0 | 1142 (R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT))); 1143 rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_1] = 0; 1144 rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] = (R200_OUTPUT_XYZW); 1145 rmesa->hw.vtx.cmd[VTX_STATE_CNTL] = R200_VSC_UPDATE_USER_COLOR_0_ENABLE; 1146 1147 1148 /* Matrix selection */ 1149 rmesa->hw.msl.cmd[MSL_MATRIX_SELECT_0] = 1150 (R200_MTX_MV << R200_MODELVIEW_0_SHIFT); 1151 1152 rmesa->hw.msl.cmd[MSL_MATRIX_SELECT_1] = 1153 (R200_MTX_IMV << R200_IT_MODELVIEW_0_SHIFT); 1154 1155 rmesa->hw.msl.cmd[MSL_MATRIX_SELECT_2] = 1156 (R200_MTX_MVP << R200_MODELPROJECT_0_SHIFT); 1157 1158 rmesa->hw.msl.cmd[MSL_MATRIX_SELECT_3] = 1159 ((R200_MTX_TEX0 << R200_TEXMAT_0_SHIFT) | 1160 (R200_MTX_TEX1 << R200_TEXMAT_1_SHIFT) | 1161 (R200_MTX_TEX2 << R200_TEXMAT_2_SHIFT) | 1162 (R200_MTX_TEX3 << R200_TEXMAT_3_SHIFT)); 1163 1164 rmesa->hw.msl.cmd[MSL_MATRIX_SELECT_4] = 1165 ((R200_MTX_TEX4 << R200_TEXMAT_4_SHIFT) | 1166 (R200_MTX_TEX5 << R200_TEXMAT_5_SHIFT)); 1167 1168 1169 /* General TCL state */ 1170 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] = 1171 (R200_SPECULAR_LIGHTS | 1172 R200_DIFFUSE_SPECULAR_COMBINE | 1173 R200_LOCAL_LIGHT_VEC_GL | 1174 R200_LM0_SOURCE_MATERIAL_0 << R200_FRONT_SHININESS_SOURCE_SHIFT | 1175 R200_LM0_SOURCE_MATERIAL_1 << R200_BACK_SHININESS_SOURCE_SHIFT); 1176 1177 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1] = 1178 ((R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_EMISSIVE_SOURCE_SHIFT) | 1179 (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_AMBIENT_SOURCE_SHIFT) | 1180 (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_DIFFUSE_SOURCE_SHIFT) | 1181 (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_SPECULAR_SOURCE_SHIFT) | 1182 (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_EMISSIVE_SOURCE_SHIFT) | 1183 (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_AMBIENT_SOURCE_SHIFT) | 1184 (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_DIFFUSE_SOURCE_SHIFT) | 1185 (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_SPECULAR_SOURCE_SHIFT)); 1186 1187 rmesa->hw.tcl.cmd[TCL_PER_LIGHT_CTL_0] = 0; /* filled in via callbacks */ 1188 rmesa->hw.tcl.cmd[TCL_PER_LIGHT_CTL_1] = 0; 1189 rmesa->hw.tcl.cmd[TCL_PER_LIGHT_CTL_2] = 0; 1190 rmesa->hw.tcl.cmd[TCL_PER_LIGHT_CTL_3] = 0; 1191 1192 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] = 1193 (R200_UCP_IN_CLIP_SPACE | 1194 R200_CULL_FRONT_IS_CCW); 1195 1196 /* Texgen/Texmat state */ 1197 rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_2] = 0x00ffffff; 1198 rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_3] = 1199 ((0 << R200_TEXGEN_0_INPUT_TEX_SHIFT) | 1200 (1 << R200_TEXGEN_1_INPUT_TEX_SHIFT) | 1201 (2 << R200_TEXGEN_2_INPUT_TEX_SHIFT) | 1202 (3 << R200_TEXGEN_3_INPUT_TEX_SHIFT) | 1203 (4 << R200_TEXGEN_4_INPUT_TEX_SHIFT) | 1204 (5 << R200_TEXGEN_5_INPUT_TEX_SHIFT)); 1205 rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_0] = 0; 1206 rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_1] = 1207 ((0 << R200_TEXGEN_0_INPUT_SHIFT) | 1208 (1 << R200_TEXGEN_1_INPUT_SHIFT) | 1209 (2 << R200_TEXGEN_2_INPUT_SHIFT) | 1210 (3 << R200_TEXGEN_3_INPUT_SHIFT) | 1211 (4 << R200_TEXGEN_4_INPUT_SHIFT) | 1212 (5 << R200_TEXGEN_5_INPUT_SHIFT)); 1213 rmesa->hw.tcg.cmd[TCG_TEX_CYL_WRAP_CTL] = 0; 1214 1215 1216 for (i = 0 ; i < 8; i++) { 1217 struct gl_light *l = &ctx->Light.Light[i]; 1218 GLenum p = GL_LIGHT0 + i; 1219 *(float *)&(rmesa->hw.lit[i].cmd[LIT_RANGE_CUTOFF]) = FLT_MAX; 1220 1221 ctx->Driver.Lightfv( ctx, p, GL_AMBIENT, l->Ambient ); 1222 ctx->Driver.Lightfv( ctx, p, GL_DIFFUSE, l->Diffuse ); 1223 ctx->Driver.Lightfv( ctx, p, GL_SPECULAR, l->Specular ); 1224 ctx->Driver.Lightfv( ctx, p, GL_POSITION, NULL ); 1225 ctx->Driver.Lightfv( ctx, p, GL_SPOT_DIRECTION, NULL ); 1226 ctx->Driver.Lightfv( ctx, p, GL_SPOT_EXPONENT, &l->SpotExponent ); 1227 ctx->Driver.Lightfv( ctx, p, GL_SPOT_CUTOFF, &l->SpotCutoff ); 1228 ctx->Driver.Lightfv( ctx, p, GL_CONSTANT_ATTENUATION, 1229 &l->ConstantAttenuation ); 1230 ctx->Driver.Lightfv( ctx, p, GL_LINEAR_ATTENUATION, 1231 &l->LinearAttenuation ); 1232 ctx->Driver.Lightfv( ctx, p, GL_QUADRATIC_ATTENUATION, 1233 &l->QuadraticAttenuation ); 1234 *(float *)&(rmesa->hw.lit[i].cmd[LIT_ATTEN_XXX]) = 0.0; 1235 } 1236 1237 ctx->Driver.LightModelfv( ctx, GL_LIGHT_MODEL_AMBIENT, 1238 ctx->Light.Model.Ambient ); 1239 1240 TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange( ctx ); 1241 1242 for (i = 0 ; i < 6; i++) { 1243 ctx->Driver.ClipPlane( ctx, GL_CLIP_PLANE0 + i, NULL ); 1244 } 1245 1246 ctx->Driver.Fogfv( ctx, GL_FOG_MODE, NULL ); 1247 ctx->Driver.Fogfv( ctx, GL_FOG_DENSITY, &ctx->Fog.Density ); 1248 ctx->Driver.Fogfv( ctx, GL_FOG_START, &ctx->Fog.Start ); 1249 ctx->Driver.Fogfv( ctx, GL_FOG_END, &ctx->Fog.End ); 1250 ctx->Driver.Fogfv( ctx, GL_FOG_COLOR, ctx->Fog.Color ); 1251 ctx->Driver.Fogfv( ctx, GL_FOG_COORDINATE_SOURCE_EXT, NULL ); 1252 1253 rmesa->hw.grd.cmd[GRD_VERT_GUARD_CLIP_ADJ] = IEEE_ONE; 1254 rmesa->hw.grd.cmd[GRD_VERT_GUARD_DISCARD_ADJ] = IEEE_ONE; 1255 rmesa->hw.grd.cmd[GRD_HORZ_GUARD_CLIP_ADJ] = IEEE_ONE; 1256 rmesa->hw.grd.cmd[GRD_HORZ_GUARD_DISCARD_ADJ] = IEEE_ONE; 1257 1258 rmesa->hw.eye.cmd[EYE_X] = 0; 1259 rmesa->hw.eye.cmd[EYE_Y] = 0; 1260 rmesa->hw.eye.cmd[EYE_Z] = IEEE_ONE; 1261 rmesa->hw.eye.cmd[EYE_RESCALE_FACTOR] = IEEE_ONE; 1262 1263 rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] = 1264 R200_PS_SE_SEL_STATE | R200_PS_MULT_CONST; 1265 1266 /* ptp_eye is presumably used to calculate the attenuation wrt a different 1267 location? In any case, since point attenuation triggers _needeyecoords, 1268 it is constant. Probably ignored as long as R200_PS_USE_MODEL_EYE_VEC 1269 isn't set */ 1270 rmesa->hw.ptp.cmd[PTP_EYE_X] = 0; 1271 rmesa->hw.ptp.cmd[PTP_EYE_Y] = 0; 1272 rmesa->hw.ptp.cmd[PTP_EYE_Z] = IEEE_ONE | 0x80000000; /* -1.0 */ 1273 rmesa->hw.ptp.cmd[PTP_EYE_3] = 0; 1274 /* no idea what the ptp_vport_scale values are good for, except the 1275 PTSIZE one - hopefully doesn't matter */ 1276 rmesa->hw.ptp.cmd[PTP_VPORT_SCALE_0] = IEEE_ONE; 1277 rmesa->hw.ptp.cmd[PTP_VPORT_SCALE_1] = IEEE_ONE; 1278 rmesa->hw.ptp.cmd[PTP_VPORT_SCALE_PTSIZE] = IEEE_ONE; 1279 rmesa->hw.ptp.cmd[PTP_VPORT_SCALE_3] = IEEE_ONE; 1280 rmesa->hw.ptp.cmd[PTP_ATT_CONST_QUAD] = 0; 1281 rmesa->hw.ptp.cmd[PTP_ATT_CONST_LIN] = 0; 1282 rmesa->hw.ptp.cmd[PTP_ATT_CONST_CON] = IEEE_ONE; 1283 rmesa->hw.ptp.cmd[PTP_ATT_CONST_3] = 0; 1284 rmesa->hw.ptp.cmd[PTP_CLAMP_MIN] = IEEE_ONE; 1285 rmesa->hw.ptp.cmd[PTP_CLAMP_MAX] = 0x44ffe000; /* 2047 */ 1286 rmesa->hw.ptp.cmd[PTP_CLAMP_2] = 0; 1287 rmesa->hw.ptp.cmd[PTP_CLAMP_3] = 0; 1288 1289 r200LightingSpaceChange( ctx ); 1290 1291 radeon_init_query_stateobj(&rmesa->radeon, R200_QUERYOBJ_CMDSIZE); 1292 rmesa->radeon.query.queryobj.cmd[R200_QUERYOBJ_CMD_0] = CP_PACKET0(RADEON_RB3D_ZPASS_DATA, 0); 1293 rmesa->radeon.query.queryobj.cmd[R200_QUERYOBJ_DATA_0] = 0; 1294 1295 rmesa->radeon.hw.all_dirty = GL_TRUE; 1296 1297 rcommonInitCmdBuf(&rmesa->radeon); 1298 } 1299