2 Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
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.
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:
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.
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.
31 * Keith Whitwell <keith@tungstengraphics.com>
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"
40 #include "swrast/swrast.h"
43 #include "tnl/t_pipeline.h"
44 #include "swrast_setup/swrast_setup.h"
46 #include "radeon_common.h"
47 #include "radeon_mipmap_tree.h"
48 #include "r200_context.h"
49 #include "r200_ioctl.h"
50 #include "r200_state.h"
53 #include "r200_swtcl.h"
57 /* New (1.3) state mechanism. 3 commands (packet, scalar, vector) in
58 * 1.3 cmdbuffers allow all previous state to be updated as well as
59 * the tcl scalar and vector areas.
65 } packet
[RADEON_MAX_STATE_PACKETS
] = {
66 {RADEON_PP_MISC
, 7, "RADEON_PP_MISC"},
67 {RADEON_PP_CNTL
, 3, "RADEON_PP_CNTL"},
68 {RADEON_RB3D_COLORPITCH
, 1, "RADEON_RB3D_COLORPITCH"},
69 {RADEON_RE_LINE_PATTERN
, 2, "RADEON_RE_LINE_PATTERN"},
70 {RADEON_SE_LINE_WIDTH
, 1, "RADEON_SE_LINE_WIDTH"},
71 {RADEON_PP_LUM_MATRIX
, 1, "RADEON_PP_LUM_MATRIX"},
72 {RADEON_PP_ROT_MATRIX_0
, 2, "RADEON_PP_ROT_MATRIX_0"},
73 {RADEON_RB3D_STENCILREFMASK
, 3, "RADEON_RB3D_STENCILREFMASK"},
74 {RADEON_SE_VPORT_XSCALE
, 6, "RADEON_SE_VPORT_XSCALE"},
75 {RADEON_SE_CNTL
, 2, "RADEON_SE_CNTL"},
76 {RADEON_SE_CNTL_STATUS
, 1, "RADEON_SE_CNTL_STATUS"},
77 {RADEON_RE_MISC
, 1, "RADEON_RE_MISC"},
78 {RADEON_PP_TXFILTER_0
, 6, "RADEON_PP_TXFILTER_0"},
79 {RADEON_PP_BORDER_COLOR_0
, 1, "RADEON_PP_BORDER_COLOR_0"},
80 {RADEON_PP_TXFILTER_1
, 6, "RADEON_PP_TXFILTER_1"},
81 {RADEON_PP_BORDER_COLOR_1
, 1, "RADEON_PP_BORDER_COLOR_1"},
82 {RADEON_PP_TXFILTER_2
, 6, "RADEON_PP_TXFILTER_2"},
83 {RADEON_PP_BORDER_COLOR_2
, 1, "RADEON_PP_BORDER_COLOR_2"},
84 {RADEON_SE_ZBIAS_FACTOR
, 2, "RADEON_SE_ZBIAS_FACTOR"},
85 {RADEON_SE_TCL_OUTPUT_VTX_FMT
, 11, "RADEON_SE_TCL_OUTPUT_VTX_FMT"},
86 {RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED
, 17,
87 "RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED"},
88 {R200_PP_TXCBLEND_0
, 4, "R200_PP_TXCBLEND_0"},
89 {R200_PP_TXCBLEND_1
, 4, "R200_PP_TXCBLEND_1"},
90 {R200_PP_TXCBLEND_2
, 4, "R200_PP_TXCBLEND_2"},
91 {R200_PP_TXCBLEND_3
, 4, "R200_PP_TXCBLEND_3"},
92 {R200_PP_TXCBLEND_4
, 4, "R200_PP_TXCBLEND_4"},
93 {R200_PP_TXCBLEND_5
, 4, "R200_PP_TXCBLEND_5"},
94 {R200_PP_TXCBLEND_6
, 4, "R200_PP_TXCBLEND_6"},
95 {R200_PP_TXCBLEND_7
, 4, "R200_PP_TXCBLEND_7"},
96 {R200_SE_TCL_LIGHT_MODEL_CTL_0
, 6, "R200_SE_TCL_LIGHT_MODEL_CTL_0"},
97 {R200_PP_TFACTOR_0
, 6, "R200_PP_TFACTOR_0"},
98 {R200_SE_VTX_FMT_0
, 4, "R200_SE_VTX_FMT_0"},
99 {R200_SE_VAP_CNTL
, 1, "R200_SE_VAP_CNTL"},
100 {R200_SE_TCL_MATRIX_SEL_0
, 5, "R200_SE_TCL_MATRIX_SEL_0"},
101 {R200_SE_TCL_TEX_PROC_CTL_2
, 5, "R200_SE_TCL_TEX_PROC_CTL_2"},
102 {R200_SE_TCL_UCP_VERT_BLEND_CTL
, 1, "R200_SE_TCL_UCP_VERT_BLEND_CTL"},
103 {R200_PP_TXFILTER_0
, 6, "R200_PP_TXFILTER_0"},
104 {R200_PP_TXFILTER_1
, 6, "R200_PP_TXFILTER_1"},
105 {R200_PP_TXFILTER_2
, 6, "R200_PP_TXFILTER_2"},
106 {R200_PP_TXFILTER_3
, 6, "R200_PP_TXFILTER_3"},
107 {R200_PP_TXFILTER_4
, 6, "R200_PP_TXFILTER_4"},
108 {R200_PP_TXFILTER_5
, 6, "R200_PP_TXFILTER_5"},
109 {R200_PP_TXOFFSET_0
, 1, "R200_PP_TXOFFSET_0"},
110 {R200_PP_TXOFFSET_1
, 1, "R200_PP_TXOFFSET_1"},
111 {R200_PP_TXOFFSET_2
, 1, "R200_PP_TXOFFSET_2"},
112 {R200_PP_TXOFFSET_3
, 1, "R200_PP_TXOFFSET_3"},
113 {R200_PP_TXOFFSET_4
, 1, "R200_PP_TXOFFSET_4"},
114 {R200_PP_TXOFFSET_5
, 1, "R200_PP_TXOFFSET_5"},
115 {R200_SE_VTE_CNTL
, 1, "R200_SE_VTE_CNTL"},
116 {R200_SE_TCL_OUTPUT_VTX_COMP_SEL
, 1,
117 "R200_SE_TCL_OUTPUT_VTX_COMP_SEL"},
118 {R200_PP_TAM_DEBUG3
, 1, "R200_PP_TAM_DEBUG3"},
119 {R200_PP_CNTL_X
, 1, "R200_PP_CNTL_X"},
120 {R200_RB3D_DEPTHXY_OFFSET
, 1, "R200_RB3D_DEPTHXY_OFFSET"},
121 {R200_RE_AUX_SCISSOR_CNTL
, 1, "R200_RE_AUX_SCISSOR_CNTL"},
122 {R200_RE_SCISSOR_TL_0
, 2, "R200_RE_SCISSOR_TL_0"},
123 {R200_RE_SCISSOR_TL_1
, 2, "R200_RE_SCISSOR_TL_1"},
124 {R200_RE_SCISSOR_TL_2
, 2, "R200_RE_SCISSOR_TL_2"},
125 {R200_SE_VAP_CNTL_STATUS
, 1, "R200_SE_VAP_CNTL_STATUS"},
126 {R200_SE_VTX_STATE_CNTL
, 1, "R200_SE_VTX_STATE_CNTL"},
127 {R200_RE_POINTSIZE
, 1, "R200_RE_POINTSIZE"},
128 {R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_0
, 4,
129 "R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_0"},
130 {R200_PP_CUBIC_FACES_0
, 1, "R200_PP_CUBIC_FACES_0"}, /* 61 */
131 {R200_PP_CUBIC_OFFSET_F1_0
, 5, "R200_PP_CUBIC_OFFSET_F1_0"}, /* 62 */
132 {R200_PP_CUBIC_FACES_1
, 1, "R200_PP_CUBIC_FACES_1"},
133 {R200_PP_CUBIC_OFFSET_F1_1
, 5, "R200_PP_CUBIC_OFFSET_F1_1"},
134 {R200_PP_CUBIC_FACES_2
, 1, "R200_PP_CUBIC_FACES_2"},
135 {R200_PP_CUBIC_OFFSET_F1_2
, 5, "R200_PP_CUBIC_OFFSET_F1_2"},
136 {R200_PP_CUBIC_FACES_3
, 1, "R200_PP_CUBIC_FACES_3"},
137 {R200_PP_CUBIC_OFFSET_F1_3
, 5, "R200_PP_CUBIC_OFFSET_F1_3"},
138 {R200_PP_CUBIC_FACES_4
, 1, "R200_PP_CUBIC_FACES_4"},
139 {R200_PP_CUBIC_OFFSET_F1_4
, 5, "R200_PP_CUBIC_OFFSET_F1_4"},
140 {R200_PP_CUBIC_FACES_5
, 1, "R200_PP_CUBIC_FACES_5"},
141 {R200_PP_CUBIC_OFFSET_F1_5
, 5, "R200_PP_CUBIC_OFFSET_F1_5"},
142 {RADEON_PP_TEX_SIZE_0
, 2, "RADEON_PP_TEX_SIZE_0"},
143 {RADEON_PP_TEX_SIZE_1
, 2, "RADEON_PP_TEX_SIZE_1"},
144 {RADEON_PP_TEX_SIZE_2
, 2, "RADEON_PP_TEX_SIZE_2"},
145 {R200_RB3D_BLENDCOLOR
, 3, "R200_RB3D_BLENDCOLOR"},
146 {R200_SE_TCL_POINT_SPRITE_CNTL
, 1, "R200_SE_TCL_POINT_SPRITE_CNTL"},
147 {RADEON_PP_CUBIC_FACES_0
, 1, "RADEON_PP_CUBIC_FACES_0"},
148 {RADEON_PP_CUBIC_OFFSET_T0_0
, 5, "RADEON_PP_CUBIC_OFFSET_T0_0"},
149 {RADEON_PP_CUBIC_FACES_1
, 1, "RADEON_PP_CUBIC_FACES_1"},
150 {RADEON_PP_CUBIC_OFFSET_T1_0
, 5, "RADEON_PP_CUBIC_OFFSET_T1_0"},
151 {RADEON_PP_CUBIC_FACES_2
, 1, "RADEON_PP_CUBIC_FACES_2"},
152 {RADEON_PP_CUBIC_OFFSET_T2_0
, 5, "RADEON_PP_CUBIC_OFFSET_T2_0"},
153 {R200_PP_TRI_PERF
, 2, "R200_PP_TRI_PERF"},
154 {R200_PP_TXCBLEND_8
, 32, "R200_PP_AFS_0"}, /* 85 */
155 {R200_PP_TXCBLEND_0
, 32, "R200_PP_AFS_1"},
156 {R200_PP_TFACTOR_0
, 8, "R200_ATF_TFACTOR"},
157 {R200_PP_TXFILTER_0
, 8, "R200_PP_TXCTLALL_0"},
158 {R200_PP_TXFILTER_1
, 8, "R200_PP_TXCTLALL_1"},
159 {R200_PP_TXFILTER_2
, 8, "R200_PP_TXCTLALL_2"},
160 {R200_PP_TXFILTER_3
, 8, "R200_PP_TXCTLALL_3"},
161 {R200_PP_TXFILTER_4
, 8, "R200_PP_TXCTLALL_4"},
162 {R200_PP_TXFILTER_5
, 8, "R200_PP_TXCTLALL_5"},
163 {R200_VAP_PVS_CNTL_1
, 2, "R200_VAP_PVS_CNTL"},
166 /* =============================================================
167 * State initialization
170 void r200PrintDirty( r200ContextPtr rmesa
, const char *msg
)
172 struct radeon_state_atom
*l
;
174 fprintf(stderr
, msg
);
175 fprintf(stderr
, ": ");
177 foreach(l
, &rmesa
->radeon
.hw
.atomlist
) {
178 if (l
->dirty
|| rmesa
->radeon
.hw
.all_dirty
)
179 fprintf(stderr
, "%s, ", l
->name
);
182 fprintf(stderr
, "\n");
185 static int cmdpkt( r200ContextPtr rmesa
, int id
)
187 drm_radeon_cmd_header_t h
;
189 if (rmesa
->radeon
.radeonScreen
->kernel_mm
) {
190 return CP_PACKET0(packet
[id
].start
, packet
[id
].len
- 1);
193 h
.packet
.cmd_type
= RADEON_CMD_PACKET
;
194 h
.packet
.packet_id
= id
;
199 static int cmdvec( int offset
, int stride
, int count
)
201 drm_radeon_cmd_header_t h
;
203 h
.vectors
.cmd_type
= RADEON_CMD_VECTORS
;
204 h
.vectors
.offset
= offset
;
205 h
.vectors
.stride
= stride
;
206 h
.vectors
.count
= count
;
210 /* warning: the count here is divided by 4 compared to other cmds
211 (so it doesn't exceed the char size)! */
212 static int cmdveclinear( int offset
, int count
)
214 drm_radeon_cmd_header_t h
;
216 h
.veclinear
.cmd_type
= RADEON_CMD_VECLINEAR
;
217 h
.veclinear
.addr_lo
= offset
& 0xff;
218 h
.veclinear
.addr_hi
= (offset
& 0xff00) >> 8;
219 h
.veclinear
.count
= count
;
223 static int cmdscl( int offset
, int stride
, int count
)
225 drm_radeon_cmd_header_t h
;
227 h
.scalars
.cmd_type
= RADEON_CMD_SCALARS
;
228 h
.scalars
.offset
= offset
;
229 h
.scalars
.stride
= stride
;
230 h
.scalars
.count
= count
;
234 static int cmdscl2( int offset
, int stride
, int count
)
236 drm_radeon_cmd_header_t h
;
238 h
.scalars
.cmd_type
= RADEON_CMD_SCALARS2
;
239 h
.scalars
.offset
= offset
- 0x100;
240 h
.scalars
.stride
= stride
;
241 h
.scalars
.count
= count
;
245 #define CHECK( NM, FLAG ) \
246 static int check_##NM( GLcontext *ctx, struct radeon_state_atom *atom) \
248 r200ContextPtr rmesa = R200_CONTEXT(ctx); \
250 return (FLAG) ? atom->cmd_size : 0; \
253 #define TCL_CHECK( NM, FLAG ) \
254 static int check_##NM( GLcontext *ctx, struct radeon_state_atom *atom) \
256 r200ContextPtr rmesa = R200_CONTEXT(ctx); \
257 return (!rmesa->radeon.TclFallback && !ctx->VertexProgram._Enabled && (FLAG)) ? atom->cmd_size : 0; \
260 #define TCL_OR_VP_CHECK( NM, FLAG ) \
261 static int check_##NM( GLcontext *ctx, struct radeon_state_atom *atom ) \
263 r200ContextPtr rmesa = R200_CONTEXT(ctx); \
264 return (!rmesa->radeon.TclFallback && (FLAG)) ? atom->cmd_size : 0; \
267 #define VP_CHECK( NM, FLAG ) \
268 static int check_##NM( GLcontext *ctx, struct radeon_state_atom *atom ) \
270 r200ContextPtr rmesa = R200_CONTEXT(ctx); \
272 return (!rmesa->radeon.TclFallback && ctx->VertexProgram._Enabled && (FLAG)) ? atom->cmd_size : 0; \
275 CHECK( always
, GL_TRUE
)
276 CHECK( never
, GL_FALSE
)
277 CHECK( tex_any
, ctx
->Texture
._EnabledUnits
)
278 CHECK( tf
, (ctx
->Texture
._EnabledUnits
&& !ctx
->ATIFragmentShader
._Enabled
) );
279 CHECK( tex_pair
, (rmesa
->state
.texture
.unit
[atom
->idx
].unitneeded
| rmesa
->state
.texture
.unit
[atom
->idx
& ~1].unitneeded
) )
280 CHECK( tex
, rmesa
->state
.texture
.unit
[atom
->idx
].unitneeded
)
281 CHECK( pix_zero
, !ctx
->ATIFragmentShader
._Enabled
)
282 CHECK( texenv
, (rmesa
->state
.envneeded
& (1 << (atom
->idx
)) && !ctx
->ATIFragmentShader
._Enabled
) )
283 CHECK( afs_pass1
, (ctx
->ATIFragmentShader
._Enabled
&& (ctx
->ATIFragmentShader
.Current
->NumPasses
> 1)) )
284 CHECK( afs
, ctx
->ATIFragmentShader
._Enabled
)
285 CHECK( tex_cube
, rmesa
->state
.texture
.unit
[atom
->idx
].unitneeded
& TEXTURE_CUBE_BIT
)
286 TCL_CHECK( tcl_fog
, ctx
->Fog
.Enabled
)
287 TCL_CHECK( tcl
, GL_TRUE
)
288 TCL_CHECK( tcl_tex
, rmesa
->state
.texture
.unit
[atom
->idx
].unitneeded
)
289 TCL_CHECK( tcl_lighting
, ctx
->Light
.Enabled
)
290 TCL_CHECK( tcl_light
, ctx
->Light
.Enabled
&& ctx
->Light
.Light
[atom
->idx
].Enabled
)
291 TCL_OR_VP_CHECK( tcl_ucp
, (ctx
->Transform
.ClipPlanesEnabled
& (1 << (atom
->idx
))) )
292 TCL_OR_VP_CHECK( tcl_or_vp
, GL_TRUE
)
293 VP_CHECK( tcl_vp
, GL_TRUE
)
294 VP_CHECK( tcl_vp_size
, ctx
->VertexProgram
.Current
->Base
.NumNativeInstructions
> 64 )
295 VP_CHECK( tcl_vpp_size
, ctx
->VertexProgram
.Current
->Base
.NumNativeParameters
> 96 )
297 #define OUT_VEC(hdr, data) do { \
298 drm_radeon_cmd_header_t h; \
300 OUT_BATCH(CP_PACKET0(RADEON_SE_TCL_STATE_FLUSH, 0)); \
302 OUT_BATCH(CP_PACKET0(R200_SE_TCL_VECTOR_INDX_REG, 0)); \
303 OUT_BATCH(h.vectors.offset | (h.vectors.stride << RADEON_VEC_INDX_OCTWORD_STRIDE_SHIFT)); \
304 OUT_BATCH(CP_PACKET0_ONE(R200_SE_TCL_VECTOR_DATA_REG, h.vectors.count - 1)); \
305 OUT_BATCH_TABLE((data), h.vectors.count); \
308 #define OUT_VECLINEAR(hdr, data) do { \
309 drm_radeon_cmd_header_t h; \
310 uint32_t _start = h.veclinear.addr_lo | (h.veclinear.addr_hi << 8); \
311 uint32_t _sz = h.veclinear.count * 4; \
313 OUT_BATCH(CP_PACKET0(RADEON_SE_TCL_STATE_FLUSH, 0)); \
315 OUT_BATCH(CP_PACKET0(R200_SE_TCL_VECTOR_INDX_REG, 0)); \
316 OUT_BATCH(_start | (1 << RADEON_VEC_INDX_OCTWORD_STRIDE_SHIFT)); \
317 OUT_BATCH(CP_PACKET0_ONE(R200_SE_TCL_VECTOR_DATA_REG, _sz - 1)); \
318 OUT_BATCH_TABLE((data), _sz); \
321 #define OUT_SCL(hdr, data) do { \
322 drm_radeon_cmd_header_t h; \
324 OUT_BATCH(CP_PACKET0(R200_SE_TCL_SCALAR_INDX_REG, 0)); \
325 OUT_BATCH((h.scalars.offset) | (h.scalars.stride << RADEON_SCAL_INDX_DWORD_STRIDE_SHIFT)); \
326 OUT_BATCH(CP_PACKET0_ONE(R200_SE_TCL_SCALAR_DATA_REG, h.scalars.count - 1)); \
327 OUT_BATCH_TABLE((data), h.scalars.count); \
330 #define OUT_SCL2(hdr, data) do { \
331 drm_radeon_cmd_header_t h; \
333 OUT_BATCH(CP_PACKET0(R200_SE_TCL_SCALAR_INDX_REG, 0)); \
334 OUT_BATCH((h.scalars.offset + 0x100) | (h.scalars.stride << RADEON_SCAL_INDX_DWORD_STRIDE_SHIFT)); \
335 OUT_BATCH(CP_PACKET0_ONE(R200_SE_TCL_SCALAR_DATA_REG, h.scalars.count - 1)); \
336 OUT_BATCH_TABLE((data), h.scalars.count); \
339 static void mtl_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
341 r200ContextPtr r200
= R200_CONTEXT(ctx
);
342 BATCH_LOCALS(&r200
->radeon
);
343 uint32_t dwords
= atom
->cmd_size
;
345 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
346 OUT_VEC(atom
->cmd
[MTL_CMD_0
], (atom
->cmd
+1));
347 OUT_SCL2(atom
->cmd
[MTL_CMD_1
], (atom
->cmd
+ 18));
351 static void lit_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
353 r200ContextPtr r200
= R200_CONTEXT(ctx
);
354 BATCH_LOCALS(&r200
->radeon
);
355 uint32_t dwords
= atom
->cmd_size
;
357 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
358 OUT_VEC(atom
->cmd
[LIT_CMD_0
], atom
->cmd
+1);
359 OUT_VEC(atom
->cmd
[LIT_CMD_1
], atom
->cmd
+LIT_CMD_1
+1);
363 static void ptp_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
365 r200ContextPtr r200
= R200_CONTEXT(ctx
);
366 BATCH_LOCALS(&r200
->radeon
);
367 uint32_t dwords
= atom
->cmd_size
;
369 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
370 OUT_VEC(atom
->cmd
[PTP_CMD_0
], atom
->cmd
+1);
371 OUT_VEC(atom
->cmd
[PTP_CMD_1
], atom
->cmd
+PTP_CMD_1
+1);
375 static void veclinear_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
377 r200ContextPtr r200
= R200_CONTEXT(ctx
);
378 BATCH_LOCALS(&r200
->radeon
);
379 uint32_t dwords
= atom
->cmd_size
;
381 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
382 OUT_VECLINEAR(atom
->cmd
[0], atom
->cmd
+1);
386 static void scl_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
388 r200ContextPtr r200
= R200_CONTEXT(ctx
);
389 BATCH_LOCALS(&r200
->radeon
);
390 uint32_t dwords
= atom
->cmd_size
;
392 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
393 OUT_SCL(atom
->cmd
[0], atom
->cmd
+1);
398 static void vec_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
400 r200ContextPtr r200
= R200_CONTEXT(ctx
);
401 BATCH_LOCALS(&r200
->radeon
);
402 uint32_t dwords
= atom
->cmd_size
;
404 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
405 OUT_VEC(atom
->cmd
[0], atom
->cmd
+1);
409 static void ctx_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
411 r200ContextPtr r200
= R200_CONTEXT(ctx
);
412 BATCH_LOCALS(&r200
->radeon
);
413 struct radeon_renderbuffer
*rrb
;
415 uint32_t zbpitch
, depth_fmt
;
416 uint32_t dwords
= atom
->cmd_size
;
418 /* output the first 7 bytes of context */
419 BEGIN_BATCH_NO_AUTOSTATE(dwords
+2+2);
420 OUT_BATCH_TABLE(atom
->cmd
, 5);
422 rrb
= radeon_get_depthbuffer(&r200
->radeon
);
427 zbpitch
= (rrb
->pitch
/ rrb
->cpp
);
428 if (r200
->using_hyperz
)
429 zbpitch
|= RADEON_DEPTH_HYPERZ
;
430 OUT_BATCH_RELOC(0, rrb
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
433 depth_fmt
= RADEON_DEPTH_FORMAT_24BIT_INT_Z
;
435 depth_fmt
= RADEON_DEPTH_FORMAT_16BIT_INT_Z
;
436 atom
->cmd
[CTX_RB3D_ZSTENCILCNTL
] &= ~RADEON_DEPTH_FORMAT_MASK
;
437 atom
->cmd
[CTX_RB3D_ZSTENCILCNTL
] |= depth_fmt
;
440 OUT_BATCH(atom
->cmd
[CTX_RB3D_ZSTENCILCNTL
]);
441 OUT_BATCH(atom
->cmd
[CTX_CMD_1
]);
442 OUT_BATCH(atom
->cmd
[CTX_PP_CNTL
]);
444 rrb
= radeon_get_colorbuffer(&r200
->radeon
);
445 if (!rrb
|| !rrb
->bo
) {
446 OUT_BATCH(atom
->cmd
[CTX_RB3D_CNTL
]);
447 OUT_BATCH(atom
->cmd
[CTX_RB3D_COLOROFFSET
]);
449 atom
->cmd
[CTX_RB3D_CNTL
] &= ~(0xf << 10);
451 atom
->cmd
[CTX_RB3D_CNTL
] |= RADEON_COLOR_FORMAT_ARGB8888
;
453 atom
->cmd
[CTX_RB3D_CNTL
] |= RADEON_COLOR_FORMAT_RGB565
;
455 OUT_BATCH(atom
->cmd
[CTX_RB3D_CNTL
]);
456 OUT_BATCH_RELOC(0, rrb
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
459 OUT_BATCH(atom
->cmd
[CTX_CMD_2
]);
461 if (!rrb
|| !rrb
->bo
) {
462 OUT_BATCH(atom
->cmd
[CTX_RB3D_COLORPITCH
]);
464 cbpitch
= (rrb
->pitch
/ rrb
->cpp
);
465 if (rrb
->bo
->flags
& RADEON_BO_FLAGS_MACRO_TILE
)
466 cbpitch
|= R200_COLOR_TILE_ENABLE
;
470 if (atom
->cmd_size
== CTX_STATE_SIZE_NEWDRM
)
471 OUT_BATCH_TABLE((atom
->cmd
+ 14), 4);
476 static void ctx_emit_cs(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
478 r200ContextPtr r200
= R200_CONTEXT(ctx
);
479 BATCH_LOCALS(&r200
->radeon
);
480 struct radeon_renderbuffer
*rrb
, *drb
;
481 uint32_t cbpitch
= 0;
482 uint32_t zbpitch
= 0;
483 uint32_t dwords
= atom
->cmd_size
;
486 rrb
= radeon_get_colorbuffer(&r200
->radeon
);
487 if (!rrb
|| !rrb
->bo
) {
491 atom
->cmd
[CTX_RB3D_CNTL
] &= ~(0xf << 10);
493 atom
->cmd
[CTX_RB3D_CNTL
] |= RADEON_COLOR_FORMAT_ARGB8888
;
495 atom
->cmd
[CTX_RB3D_CNTL
] |= RADEON_COLOR_FORMAT_RGB565
;
497 cbpitch
= (rrb
->pitch
/ rrb
->cpp
);
498 if (rrb
->bo
->flags
& RADEON_BO_FLAGS_MACRO_TILE
)
499 cbpitch
|= R200_COLOR_TILE_ENABLE
;
501 drb
= radeon_get_depthbuffer(&r200
->radeon
);
503 zbpitch
= (drb
->pitch
/ drb
->cpp
);
505 depth_fmt
= RADEON_DEPTH_FORMAT_24BIT_INT_Z
;
507 depth_fmt
= RADEON_DEPTH_FORMAT_16BIT_INT_Z
;
508 atom
->cmd
[CTX_RB3D_ZSTENCILCNTL
] &= ~RADEON_DEPTH_FORMAT_MASK
;
509 atom
->cmd
[CTX_RB3D_ZSTENCILCNTL
] |= depth_fmt
;
517 /* output the first 7 bytes of context */
518 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
520 /* In the CS case we need to split this up */
521 OUT_BATCH(CP_PACKET0(packet
[0].start
, 3));
522 OUT_BATCH_TABLE((atom
->cmd
+ 1), 4);
525 OUT_BATCH(CP_PACKET0(RADEON_RB3D_DEPTHOFFSET
, 0));
526 OUT_BATCH_RELOC(0, rrb
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
528 OUT_BATCH(CP_PACKET0(RADEON_RB3D_DEPTHPITCH
, 0));
532 OUT_BATCH(CP_PACKET0(RADEON_RB3D_ZSTENCILCNTL
, 0));
533 OUT_BATCH(atom
->cmd
[CTX_RB3D_ZSTENCILCNTL
]);
534 OUT_BATCH(CP_PACKET0(RADEON_PP_CNTL
, 1));
535 OUT_BATCH(atom
->cmd
[CTX_PP_CNTL
]);
536 OUT_BATCH(atom
->cmd
[CTX_RB3D_CNTL
]);
540 OUT_BATCH(CP_PACKET0(RADEON_RB3D_COLOROFFSET
, 0));
541 OUT_BATCH_RELOC(0, rrb
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
545 OUT_BATCH(CP_PACKET0(RADEON_RB3D_COLORPITCH
, 0));
549 if (atom
->cmd_size
== CTX_STATE_SIZE_NEWDRM
) {
550 OUT_BATCH_TABLE((atom
->cmd
+ 14), 4);
556 static void tex_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
558 r200ContextPtr r200
= R200_CONTEXT(ctx
);
559 BATCH_LOCALS(&r200
->radeon
);
560 uint32_t dwords
= atom
->cmd_size
;
562 radeonTexObj
*t
= r200
->state
.texture
.unit
[i
].texobj
;
564 if (t
&& t
->mt
&& !t
->image_override
)
566 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
567 OUT_BATCH_TABLE(atom
->cmd
, 10);
568 if (t
&& !t
->image_override
) {
569 OUT_BATCH_RELOC(t
->tile_bits
, t
->mt
->bo
, 0,
570 RADEON_GEM_DOMAIN_VRAM
, 0, 0);
572 /* workaround for old CS mechanism */
573 OUT_BATCH(r200
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
]);
574 } else if (t
->image_override
)
575 OUT_BATCH(t
->override_offset
);
580 static void cube_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
582 r200ContextPtr r200
= R200_CONTEXT(ctx
);
583 BATCH_LOCALS(&r200
->radeon
);
584 uint32_t dwords
= atom
->cmd_size
;
586 radeonTexObj
*t
= r200
->state
.texture
.unit
[i
].texobj
;
589 BEGIN_BATCH_NO_AUTOSTATE(dwords
+ (2 * 5));
590 OUT_BATCH_TABLE(atom
->cmd
, 3);
592 if (t
&& !t
->image_override
) {
593 size
= t
->mt
->totalsize
/ 6;
594 OUT_BATCH_RELOC(0, t
->mt
->bo
, size
, RADEON_GEM_DOMAIN_VRAM
, 0, 0);
595 OUT_BATCH_RELOC(0, t
->mt
->bo
, size
* 2, RADEON_GEM_DOMAIN_VRAM
, 0, 0);
596 OUT_BATCH_RELOC(0, t
->mt
->bo
, size
* 3, RADEON_GEM_DOMAIN_VRAM
, 0, 0);
597 OUT_BATCH_RELOC(0, t
->mt
->bo
, size
* 4, RADEON_GEM_DOMAIN_VRAM
, 0, 0);
598 OUT_BATCH_RELOC(0, t
->mt
->bo
, size
* 5, RADEON_GEM_DOMAIN_VRAM
, 0, 0);
603 /* Initialize the context's hardware state.
605 void r200InitState( r200ContextPtr rmesa
)
607 GLcontext
*ctx
= rmesa
->radeon
.glCtx
;
610 rmesa
->radeon
.state
.color
.clear
= 0x00000000;
612 switch ( ctx
->Visual
.depthBits
) {
614 rmesa
->radeon
.state
.depth
.clear
= 0x0000ffff;
615 rmesa
->radeon
.state
.depth
.scale
= 1.0 / (GLfloat
)0xffff;
616 rmesa
->radeon
.state
.stencil
.clear
= 0x00000000;
619 rmesa
->radeon
.state
.depth
.clear
= 0x00ffffff;
620 rmesa
->radeon
.state
.depth
.scale
= 1.0 / (GLfloat
)0xffffff;
621 rmesa
->radeon
.state
.stencil
.clear
= 0xffff0000;
624 fprintf( stderr
, "Error: Unsupported depth %d... exiting\n",
625 ctx
->Visual
.depthBits
);
629 /* Only have hw stencil when depth buffer is 24 bits deep */
630 rmesa
->radeon
.state
.stencil
.hwBuffer
= ( ctx
->Visual
.stencilBits
> 0 &&
631 ctx
->Visual
.depthBits
== 24 );
633 rmesa
->radeon
.Fallback
= 0;
635 rmesa
->radeon
.hw
.max_state_size
= 0;
637 #define ALLOC_STATE( ATOM, CHK, SZ, NM, IDX ) \
639 rmesa->hw.ATOM.cmd_size = SZ; \
640 rmesa->hw.ATOM.cmd = (GLuint *)CALLOC(SZ * sizeof(int)); \
641 rmesa->hw.ATOM.lastcmd = (GLuint *)CALLOC(SZ * sizeof(int)); \
642 rmesa->hw.ATOM.name = NM; \
643 rmesa->hw.ATOM.idx = IDX; \
644 rmesa->hw.ATOM.check = check_##CHK; \
645 rmesa->hw.ATOM.dirty = GL_FALSE; \
646 rmesa->radeon.hw.max_state_size += SZ * sizeof(int); \
650 /* Allocate state buffers:
652 if (rmesa
->radeon
.radeonScreen
->drmSupportsBlendColor
)
653 ALLOC_STATE( ctx
, always
, CTX_STATE_SIZE_NEWDRM
, "CTX/context", 0 );
655 ALLOC_STATE( ctx
, always
, CTX_STATE_SIZE_OLDDRM
, "CTX/context", 0 );
657 if (rmesa
->radeon
.radeonScreen
->kernel_mm
)
658 rmesa
->hw
.ctx
.emit
= ctx_emit_cs
;
660 rmesa
->hw
.ctx
.emit
= ctx_emit
;
661 ALLOC_STATE( set
, always
, SET_STATE_SIZE
, "SET/setup", 0 );
662 ALLOC_STATE( lin
, always
, LIN_STATE_SIZE
, "LIN/line", 0 );
663 ALLOC_STATE( msk
, always
, MSK_STATE_SIZE
, "MSK/mask", 0 );
664 ALLOC_STATE( vpt
, always
, VPT_STATE_SIZE
, "VPT/viewport", 0 );
665 ALLOC_STATE( vtx
, always
, VTX_STATE_SIZE
, "VTX/vertex", 0 );
666 ALLOC_STATE( vap
, always
, VAP_STATE_SIZE
, "VAP/vap", 0 );
667 ALLOC_STATE( vte
, always
, VTE_STATE_SIZE
, "VTE/vte", 0 );
668 ALLOC_STATE( msc
, always
, MSC_STATE_SIZE
, "MSC/misc", 0 );
669 ALLOC_STATE( cst
, always
, CST_STATE_SIZE
, "CST/constant", 0 );
670 ALLOC_STATE( zbs
, always
, ZBS_STATE_SIZE
, "ZBS/zbias", 0 );
671 ALLOC_STATE( tf
, tf
, TF_STATE_SIZE
, "TF/tfactor", 0 );
672 if (rmesa
->radeon
.radeonScreen
->drmSupportsFragShader
) {
673 if (rmesa
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_R200
) {
674 /* make sure texture units 0/1 are emitted pair-wise for r200 t0 hang workaround */
675 ALLOC_STATE( tex
[0], tex_pair
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-0", 0 );
676 ALLOC_STATE( tex
[1], tex_pair
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-1", 1 );
677 ALLOC_STATE( tam
, tex_any
, TAM_STATE_SIZE
, "TAM/tam", 0 );
680 ALLOC_STATE( tex
[0], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-0", 0 );
681 ALLOC_STATE( tex
[1], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-1", 1 );
682 ALLOC_STATE( tam
, never
, TAM_STATE_SIZE
, "TAM/tam", 0 );
684 ALLOC_STATE( tex
[2], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-2", 2 );
685 ALLOC_STATE( tex
[3], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-3", 3 );
686 ALLOC_STATE( tex
[4], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-4", 4 );
687 ALLOC_STATE( tex
[5], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-5", 5 );
688 ALLOC_STATE( atf
, afs
, ATF_STATE_SIZE
, "ATF/tfactor", 0 );
689 ALLOC_STATE( afs
[0], afs_pass1
, AFS_STATE_SIZE
, "AFS/afsinst-0", 0 );
690 ALLOC_STATE( afs
[1], afs
, AFS_STATE_SIZE
, "AFS/afsinst-1", 1 );
693 if (rmesa
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_R200
) {
694 ALLOC_STATE( tex
[0], tex_pair
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-0", 0 );
695 ALLOC_STATE( tex
[1], tex_pair
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-1", 1 );
696 ALLOC_STATE( tam
, tex_any
, TAM_STATE_SIZE
, "TAM/tam", 0 );
699 ALLOC_STATE( tex
[0], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-0", 0 );
700 ALLOC_STATE( tex
[1], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-1", 1 );
701 ALLOC_STATE( tam
, never
, TAM_STATE_SIZE
, "TAM/tam", 0 );
703 ALLOC_STATE( tex
[2], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-2", 2 );
704 ALLOC_STATE( tex
[3], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-3", 3 );
705 ALLOC_STATE( tex
[4], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-4", 4 );
706 ALLOC_STATE( tex
[5], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-5", 5 );
707 ALLOC_STATE( atf
, never
, ATF_STATE_SIZE
, "TF/tfactor", 0 );
708 ALLOC_STATE( afs
[0], never
, AFS_STATE_SIZE
, "AFS/afsinst-0", 0 );
709 ALLOC_STATE( afs
[1], never
, AFS_STATE_SIZE
, "AFS/afsinst-1", 1 );
712 for (i
= 0; i
< 5; i
++)
713 rmesa
->hw
.tex
[i
].emit
= tex_emit
;
714 if (rmesa
->radeon
.radeonScreen
->drmSupportsCubeMapsR200
) {
715 ALLOC_STATE( cube
[0], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-0", 0 );
716 ALLOC_STATE( cube
[1], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-1", 1 );
717 ALLOC_STATE( cube
[2], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-2", 2 );
718 ALLOC_STATE( cube
[3], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-3", 3 );
719 ALLOC_STATE( cube
[4], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-4", 4 );
720 ALLOC_STATE( cube
[5], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-5", 5 );
721 for (i
= 0; i
< 5; i
++)
722 rmesa
->hw
.cube
[i
].emit
= cube_emit
;
725 ALLOC_STATE( cube
[0], never
, CUBE_STATE_SIZE
, "CUBE/tex-0", 0 );
726 ALLOC_STATE( cube
[1], never
, CUBE_STATE_SIZE
, "CUBE/tex-1", 1 );
727 ALLOC_STATE( cube
[2], never
, CUBE_STATE_SIZE
, "CUBE/tex-2", 2 );
728 ALLOC_STATE( cube
[3], never
, CUBE_STATE_SIZE
, "CUBE/tex-3", 3 );
729 ALLOC_STATE( cube
[4], never
, CUBE_STATE_SIZE
, "CUBE/tex-4", 4 );
730 ALLOC_STATE( cube
[5], never
, CUBE_STATE_SIZE
, "CUBE/tex-5", 5 );
733 if (rmesa
->radeon
.radeonScreen
->drmSupportsVertexProgram
) {
734 ALLOC_STATE( pvs
, tcl_vp
, PVS_STATE_SIZE
, "PVS/pvscntl", 0 );
735 ALLOC_STATE( vpi
[0], tcl_vp
, VPI_STATE_SIZE
, "VP/vertexprog-0", 0 );
736 ALLOC_STATE( vpi
[1], tcl_vp_size
, VPI_STATE_SIZE
, "VP/vertexprog-1", 1 );
737 ALLOC_STATE( vpp
[0], tcl_vp
, VPP_STATE_SIZE
, "VPP/vertexparam-0", 0 );
738 ALLOC_STATE( vpp
[1], tcl_vpp_size
, VPP_STATE_SIZE
, "VPP/vertexparam-1", 1 );
741 ALLOC_STATE( pvs
, never
, PVS_STATE_SIZE
, "PVS/pvscntl", 0 );
742 ALLOC_STATE( vpi
[0], never
, VPI_STATE_SIZE
, "VP/vertexprog-0", 0 );
743 ALLOC_STATE( vpi
[1], never
, VPI_STATE_SIZE
, "VP/vertexprog-1", 1 );
744 ALLOC_STATE( vpp
[0], never
, VPP_STATE_SIZE
, "VPP/vertexparam-0", 0 );
745 ALLOC_STATE( vpp
[1], never
, VPP_STATE_SIZE
, "VPP/vertexparam-1", 1 );
747 /* FIXME: this atom has two commands, we need only one (ucp_vert_blend) for vp */
748 ALLOC_STATE( tcl
, tcl_or_vp
, TCL_STATE_SIZE
, "TCL/tcl", 0 );
749 ALLOC_STATE( msl
, tcl
, MSL_STATE_SIZE
, "MSL/matrix-select", 0 );
750 ALLOC_STATE( tcg
, tcl
, TCG_STATE_SIZE
, "TCG/texcoordgen", 0 );
751 ALLOC_STATE( mtl
[0], tcl_lighting
, MTL_STATE_SIZE
, "MTL0/material0", 0 );
752 ALLOC_STATE( mtl
[1], tcl_lighting
, MTL_STATE_SIZE
, "MTL1/material1", 1 );
753 ALLOC_STATE( grd
, tcl_or_vp
, GRD_STATE_SIZE
, "GRD/guard-band", 0 );
754 ALLOC_STATE( fog
, tcl_fog
, FOG_STATE_SIZE
, "FOG/fog", 0 );
755 ALLOC_STATE( glt
, tcl_lighting
, GLT_STATE_SIZE
, "GLT/light-global", 0 );
756 ALLOC_STATE( eye
, tcl_lighting
, EYE_STATE_SIZE
, "EYE/eye-vector", 0 );
757 ALLOC_STATE( mat
[R200_MTX_MV
], tcl
, MAT_STATE_SIZE
, "MAT/modelview", 0 );
758 ALLOC_STATE( mat
[R200_MTX_IMV
], tcl
, MAT_STATE_SIZE
, "MAT/it-modelview", 0 );
759 ALLOC_STATE( mat
[R200_MTX_MVP
], tcl
, MAT_STATE_SIZE
, "MAT/modelproject", 0 );
760 ALLOC_STATE( mat
[R200_MTX_TEX0
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat0", 0 );
761 ALLOC_STATE( mat
[R200_MTX_TEX1
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat1", 1 );
762 ALLOC_STATE( mat
[R200_MTX_TEX2
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat2", 2 );
763 ALLOC_STATE( mat
[R200_MTX_TEX3
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat3", 3 );
764 ALLOC_STATE( mat
[R200_MTX_TEX4
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat4", 4 );
765 ALLOC_STATE( mat
[R200_MTX_TEX5
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat5", 5 );
766 ALLOC_STATE( ucp
[0], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-0", 0 );
767 ALLOC_STATE( ucp
[1], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-1", 1 );
768 ALLOC_STATE( ucp
[2], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-2", 2 );
769 ALLOC_STATE( ucp
[3], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-3", 3 );
770 ALLOC_STATE( ucp
[4], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-4", 4 );
771 ALLOC_STATE( ucp
[5], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-5", 5 );
772 ALLOC_STATE( lit
[0], tcl_light
, LIT_STATE_SIZE
, "LIT/light-0", 0 );
773 ALLOC_STATE( lit
[1], tcl_light
, LIT_STATE_SIZE
, "LIT/light-1", 1 );
774 ALLOC_STATE( lit
[2], tcl_light
, LIT_STATE_SIZE
, "LIT/light-2", 2 );
775 ALLOC_STATE( lit
[3], tcl_light
, LIT_STATE_SIZE
, "LIT/light-3", 3 );
776 ALLOC_STATE( lit
[4], tcl_light
, LIT_STATE_SIZE
, "LIT/light-4", 4 );
777 ALLOC_STATE( lit
[5], tcl_light
, LIT_STATE_SIZE
, "LIT/light-5", 5 );
778 ALLOC_STATE( lit
[6], tcl_light
, LIT_STATE_SIZE
, "LIT/light-6", 6 );
779 ALLOC_STATE( lit
[7], tcl_light
, LIT_STATE_SIZE
, "LIT/light-7", 7 );
780 ALLOC_STATE( pix
[0], pix_zero
, PIX_STATE_SIZE
, "PIX/pixstage-0", 0 );
781 ALLOC_STATE( pix
[1], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-1", 1 );
782 ALLOC_STATE( pix
[2], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-2", 2 );
783 ALLOC_STATE( pix
[3], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-3", 3 );
784 ALLOC_STATE( pix
[4], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-4", 4 );
785 ALLOC_STATE( pix
[5], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-5", 5 );
786 if (rmesa
->radeon
.radeonScreen
->drmSupportsTriPerf
) {
787 ALLOC_STATE( prf
, always
, PRF_STATE_SIZE
, "PRF/performance-tri", 0 );
790 ALLOC_STATE( prf
, never
, PRF_STATE_SIZE
, "PRF/performance-tri", 0 );
792 if (rmesa
->radeon
.radeonScreen
->drmSupportsPointSprites
) {
793 ALLOC_STATE( spr
, always
, SPR_STATE_SIZE
, "SPR/pointsprite", 0 );
794 ALLOC_STATE( ptp
, tcl
, PTP_STATE_SIZE
, "PTP/pointparams", 0 );
797 ALLOC_STATE (spr
, never
, SPR_STATE_SIZE
, "SPR/pointsprite", 0 );
798 ALLOC_STATE (ptp
, never
, PTP_STATE_SIZE
, "PTP/pointparams", 0 );
801 r200SetUpAtomList( rmesa
);
803 /* Fill in the packet headers:
805 rmesa
->hw
.ctx
.cmd
[CTX_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_PP_MISC
);
806 rmesa
->hw
.ctx
.cmd
[CTX_CMD_1
] = cmdpkt(rmesa
, RADEON_EMIT_PP_CNTL
);
807 rmesa
->hw
.ctx
.cmd
[CTX_CMD_2
] = cmdpkt(rmesa
, RADEON_EMIT_RB3D_COLORPITCH
);
808 if (rmesa
->radeon
.radeonScreen
->drmSupportsBlendColor
)
809 rmesa
->hw
.ctx
.cmd
[CTX_CMD_3
] = cmdpkt(rmesa
, R200_EMIT_RB3D_BLENDCOLOR
);
810 rmesa
->hw
.lin
.cmd
[LIN_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_RE_LINE_PATTERN
);
811 rmesa
->hw
.lin
.cmd
[LIN_CMD_1
] = cmdpkt(rmesa
, RADEON_EMIT_SE_LINE_WIDTH
);
812 rmesa
->hw
.msk
.cmd
[MSK_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_RB3D_STENCILREFMASK
);
813 rmesa
->hw
.vpt
.cmd
[VPT_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_SE_VPORT_XSCALE
);
814 rmesa
->hw
.set
.cmd
[SET_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_SE_CNTL
);
815 rmesa
->hw
.msc
.cmd
[MSC_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_RE_MISC
);
816 rmesa
->hw
.cst
.cmd
[CST_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CNTL_X
);
817 rmesa
->hw
.cst
.cmd
[CST_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_RB3D_DEPTHXY_OFFSET
);
818 rmesa
->hw
.cst
.cmd
[CST_CMD_2
] = cmdpkt(rmesa
, R200_EMIT_RE_AUX_SCISSOR_CNTL
);
819 rmesa
->hw
.cst
.cmd
[CST_CMD_3
] = cmdpkt(rmesa
, R200_EMIT_RE_SCISSOR_TL_0
);
820 rmesa
->hw
.cst
.cmd
[CST_CMD_4
] = cmdpkt(rmesa
, R200_EMIT_SE_VAP_CNTL_STATUS
);
821 rmesa
->hw
.cst
.cmd
[CST_CMD_5
] = cmdpkt(rmesa
, R200_EMIT_RE_POINTSIZE
);
822 rmesa
->hw
.cst
.cmd
[CST_CMD_6
] = cmdpkt(rmesa
, R200_EMIT_TCL_INPUT_VTX_VECTOR_ADDR_0
);
823 rmesa
->hw
.tam
.cmd
[TAM_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TAM_DEBUG3
);
824 rmesa
->hw
.tf
.cmd
[TF_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_TFACTOR_0
);
825 if (rmesa
->radeon
.radeonScreen
->drmSupportsFragShader
) {
826 rmesa
->hw
.atf
.cmd
[ATF_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_ATF_TFACTOR
);
827 rmesa
->hw
.tex
[0].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCTLALL_0
);
828 rmesa
->hw
.tex
[0].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_0
);
829 rmesa
->hw
.tex
[1].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCTLALL_1
);
830 rmesa
->hw
.tex
[1].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_1
);
831 rmesa
->hw
.tex
[2].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCTLALL_2
);
832 rmesa
->hw
.tex
[2].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_2
);
833 rmesa
->hw
.tex
[3].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCTLALL_3
);
834 rmesa
->hw
.tex
[3].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_3
);
835 rmesa
->hw
.tex
[4].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCTLALL_4
);
836 rmesa
->hw
.tex
[4].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_4
);
837 rmesa
->hw
.tex
[5].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCTLALL_5
);
838 rmesa
->hw
.tex
[5].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_5
);
840 rmesa
->hw
.tex
[0].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXFILTER_0
);
841 rmesa
->hw
.tex
[0].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_0
);
842 rmesa
->hw
.tex
[1].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXFILTER_1
);
843 rmesa
->hw
.tex
[1].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_1
);
844 rmesa
->hw
.tex
[2].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXFILTER_2
);
845 rmesa
->hw
.tex
[2].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_2
);
846 rmesa
->hw
.tex
[3].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXFILTER_3
);
847 rmesa
->hw
.tex
[3].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_3
);
848 rmesa
->hw
.tex
[4].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXFILTER_4
);
849 rmesa
->hw
.tex
[4].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_4
);
850 rmesa
->hw
.tex
[5].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXFILTER_5
);
851 rmesa
->hw
.tex
[5].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_5
);
853 rmesa
->hw
.afs
[0].cmd
[AFS_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_AFS_0
);
854 rmesa
->hw
.afs
[1].cmd
[AFS_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_AFS_1
);
855 rmesa
->hw
.pvs
.cmd
[PVS_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_VAP_PVS_CNTL
);
856 rmesa
->hw
.cube
[0].cmd
[CUBE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_FACES_0
);
857 rmesa
->hw
.cube
[0].cmd
[CUBE_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_OFFSETS_0
);
858 rmesa
->hw
.cube
[1].cmd
[CUBE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_FACES_1
);
859 rmesa
->hw
.cube
[1].cmd
[CUBE_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_OFFSETS_1
);
860 rmesa
->hw
.cube
[2].cmd
[CUBE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_FACES_2
);
861 rmesa
->hw
.cube
[2].cmd
[CUBE_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_OFFSETS_2
);
862 rmesa
->hw
.cube
[3].cmd
[CUBE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_FACES_3
);
863 rmesa
->hw
.cube
[3].cmd
[CUBE_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_OFFSETS_3
);
864 rmesa
->hw
.cube
[4].cmd
[CUBE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_FACES_4
);
865 rmesa
->hw
.cube
[4].cmd
[CUBE_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_OFFSETS_4
);
866 rmesa
->hw
.cube
[5].cmd
[CUBE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_FACES_5
);
867 rmesa
->hw
.cube
[5].cmd
[CUBE_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_OFFSETS_5
);
868 rmesa
->hw
.pix
[0].cmd
[PIX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCBLEND_0
);
869 rmesa
->hw
.pix
[1].cmd
[PIX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCBLEND_1
);
870 rmesa
->hw
.pix
[2].cmd
[PIX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCBLEND_2
);
871 rmesa
->hw
.pix
[3].cmd
[PIX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCBLEND_3
);
872 rmesa
->hw
.pix
[4].cmd
[PIX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCBLEND_4
);
873 rmesa
->hw
.pix
[5].cmd
[PIX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCBLEND_5
);
874 rmesa
->hw
.zbs
.cmd
[ZBS_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_SE_ZBIAS_FACTOR
);
875 rmesa
->hw
.tcl
.cmd
[TCL_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_TCL_LIGHT_MODEL_CTL_0
);
876 rmesa
->hw
.tcl
.cmd
[TCL_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_TCL_UCP_VERT_BLEND_CTL
);
877 rmesa
->hw
.tcg
.cmd
[TCG_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_TEX_PROC_CTL_2
);
878 rmesa
->hw
.msl
.cmd
[MSL_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_MATRIX_SELECT_0
);
879 rmesa
->hw
.vap
.cmd
[VAP_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_VAP_CTL
);
880 rmesa
->hw
.vtx
.cmd
[VTX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_VTX_FMT_0
);
881 rmesa
->hw
.vtx
.cmd
[VTX_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_OUTPUT_VTX_COMP_SEL
);
882 rmesa
->hw
.vtx
.cmd
[VTX_CMD_2
] = cmdpkt(rmesa
, R200_EMIT_SE_VTX_STATE_CNTL
);
883 rmesa
->hw
.vte
.cmd
[VTE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_VTE_CNTL
);
884 rmesa
->hw
.prf
.cmd
[PRF_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TRI_PERF_CNTL
);
885 rmesa
->hw
.spr
.cmd
[SPR_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_TCL_POINT_SPRITE_CNTL
);
886 if (rmesa
->radeon
.radeonScreen
->kernel_mm
) {
887 rmesa
->hw
.mtl
[0].emit
= mtl_emit
;
888 rmesa
->hw
.mtl
[1].emit
= mtl_emit
;
890 rmesa
->hw
.vpi
[0].emit
= veclinear_emit
;
891 rmesa
->hw
.vpi
[1].emit
= veclinear_emit
;
892 rmesa
->hw
.vpp
[0].emit
= veclinear_emit
;
893 rmesa
->hw
.vpp
[1].emit
= veclinear_emit
;
895 rmesa
->hw
.grd
.emit
= scl_emit
;
896 rmesa
->hw
.fog
.emit
= vec_emit
;
897 rmesa
->hw
.glt
.emit
= vec_emit
;
898 rmesa
->hw
.eye
.emit
= vec_emit
;
900 for (i
= R200_MTX_MV
; i
<= R200_MTX_TEX5
; i
++)
901 rmesa
->hw
.mat
[i
].emit
= vec_emit
;
903 for (i
= 0; i
< 8; i
++)
904 rmesa
->hw
.lit
[i
].emit
= lit_emit
;
906 for (i
= 0; i
< 6; i
++)
907 rmesa
->hw
.ucp
[i
].emit
= vec_emit
;
909 rmesa
->hw
.ptp
.emit
= ptp_emit
;
914 rmesa
->hw
.mtl
[0].cmd
[MTL_CMD_0
] =
915 cmdvec( R200_VS_MAT_0_EMISS
, 1, 16 );
916 rmesa
->hw
.mtl
[0].cmd
[MTL_CMD_1
] =
917 cmdscl2( R200_SS_MAT_0_SHININESS
, 1, 1 );
918 rmesa
->hw
.mtl
[1].cmd
[MTL_CMD_0
] =
919 cmdvec( R200_VS_MAT_1_EMISS
, 1, 16 );
920 rmesa
->hw
.mtl
[1].cmd
[MTL_CMD_1
] =
921 cmdscl2( R200_SS_MAT_1_SHININESS
, 1, 1 );
923 rmesa
->hw
.vpi
[0].cmd
[VPI_CMD_0
] =
924 cmdveclinear( R200_PVS_PROG0
, 64 );
925 rmesa
->hw
.vpi
[1].cmd
[VPI_CMD_0
] =
926 cmdveclinear( R200_PVS_PROG1
, 64 );
927 rmesa
->hw
.vpp
[0].cmd
[VPP_CMD_0
] =
928 cmdveclinear( R200_PVS_PARAM0
, 96 );
929 rmesa
->hw
.vpp
[1].cmd
[VPP_CMD_0
] =
930 cmdveclinear( R200_PVS_PARAM1
, 96 );
932 rmesa
->hw
.grd
.cmd
[GRD_CMD_0
] =
933 cmdscl( R200_SS_VERT_GUARD_CLIP_ADJ_ADDR
, 1, 4 );
934 rmesa
->hw
.fog
.cmd
[FOG_CMD_0
] =
935 cmdvec( R200_VS_FOG_PARAM_ADDR
, 1, 4 );
936 rmesa
->hw
.glt
.cmd
[GLT_CMD_0
] =
937 cmdvec( R200_VS_GLOBAL_AMBIENT_ADDR
, 1, 4 );
938 rmesa
->hw
.eye
.cmd
[EYE_CMD_0
] =
939 cmdvec( R200_VS_EYE_VECTOR_ADDR
, 1, 4 );
941 rmesa
->hw
.mat
[R200_MTX_MV
].cmd
[MAT_CMD_0
] =
942 cmdvec( R200_VS_MATRIX_0_MV
, 1, 16);
943 rmesa
->hw
.mat
[R200_MTX_IMV
].cmd
[MAT_CMD_0
] =
944 cmdvec( R200_VS_MATRIX_1_INV_MV
, 1, 16);
945 rmesa
->hw
.mat
[R200_MTX_MVP
].cmd
[MAT_CMD_0
] =
946 cmdvec( R200_VS_MATRIX_2_MVP
, 1, 16);
947 rmesa
->hw
.mat
[R200_MTX_TEX0
].cmd
[MAT_CMD_0
] =
948 cmdvec( R200_VS_MATRIX_3_TEX0
, 1, 16);
949 rmesa
->hw
.mat
[R200_MTX_TEX1
].cmd
[MAT_CMD_0
] =
950 cmdvec( R200_VS_MATRIX_4_TEX1
, 1, 16);
951 rmesa
->hw
.mat
[R200_MTX_TEX2
].cmd
[MAT_CMD_0
] =
952 cmdvec( R200_VS_MATRIX_5_TEX2
, 1, 16);
953 rmesa
->hw
.mat
[R200_MTX_TEX3
].cmd
[MAT_CMD_0
] =
954 cmdvec( R200_VS_MATRIX_6_TEX3
, 1, 16);
955 rmesa
->hw
.mat
[R200_MTX_TEX4
].cmd
[MAT_CMD_0
] =
956 cmdvec( R200_VS_MATRIX_7_TEX4
, 1, 16);
957 rmesa
->hw
.mat
[R200_MTX_TEX5
].cmd
[MAT_CMD_0
] =
958 cmdvec( R200_VS_MATRIX_8_TEX5
, 1, 16);
960 for (i
= 0 ; i
< 8; i
++) {
961 rmesa
->hw
.lit
[i
].cmd
[LIT_CMD_0
] =
962 cmdvec( R200_VS_LIGHT_AMBIENT_ADDR
+ i
, 8, 24 );
963 rmesa
->hw
.lit
[i
].cmd
[LIT_CMD_1
] =
964 cmdscl( R200_SS_LIGHT_DCD_ADDR
+ i
, 8, 7 );
967 for (i
= 0 ; i
< 6; i
++) {
968 rmesa
->hw
.ucp
[i
].cmd
[UCP_CMD_0
] =
969 cmdvec( R200_VS_UCP_ADDR
+ i
, 1, 4 );
972 rmesa
->hw
.ptp
.cmd
[PTP_CMD_0
] =
973 cmdvec( R200_VS_PNT_SPRITE_VPORT_SCALE
, 1, 4 );
974 rmesa
->hw
.ptp
.cmd
[PTP_CMD_1
] =
975 cmdvec( R200_VS_PNT_SPRITE_ATT_CONST
, 1, 12 );
977 /* Initial Harware state:
979 rmesa
->hw
.ctx
.cmd
[CTX_PP_MISC
] = (R200_ALPHA_TEST_PASS
980 /* | R200_RIGHT_HAND_CUBE_OGL*/);
982 rmesa
->hw
.ctx
.cmd
[CTX_PP_FOG_COLOR
] = (R200_FOG_VERTEX
|
983 R200_FOG_USE_SPEC_ALPHA
);
985 rmesa
->hw
.ctx
.cmd
[CTX_RE_SOLID_COLOR
] = 0x00000000;
987 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_BLENDCNTL
] = (R200_COMB_FCN_ADD_CLAMP
|
988 (R200_BLEND_GL_ONE
<< R200_SRC_BLEND_SHIFT
) |
989 (R200_BLEND_GL_ZERO
<< R200_DST_BLEND_SHIFT
));
991 if (rmesa
->radeon
.radeonScreen
->drmSupportsBlendColor
) {
992 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_BLENDCOLOR
] = 0x00000000;
993 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ABLENDCNTL
] = (R200_COMB_FCN_ADD_CLAMP
|
994 (R200_BLEND_GL_ONE
<< R200_SRC_BLEND_SHIFT
) |
995 (R200_BLEND_GL_ZERO
<< R200_DST_BLEND_SHIFT
));
996 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CBLENDCNTL
] = (R200_COMB_FCN_ADD_CLAMP
|
997 (R200_BLEND_GL_ONE
<< R200_SRC_BLEND_SHIFT
) |
998 (R200_BLEND_GL_ZERO
<< R200_DST_BLEND_SHIFT
));
1001 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_DEPTHOFFSET
] =
1002 rmesa
->radeon
.radeonScreen
->depthOffset
+ rmesa
->radeon
.radeonScreen
->fbLocation
;
1004 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_DEPTHPITCH
] =
1005 ((rmesa
->radeon
.radeonScreen
->depthPitch
&
1006 R200_DEPTHPITCH_MASK
) |
1007 R200_DEPTH_ENDIAN_NO_SWAP
);
1009 if (rmesa
->using_hyperz
)
1010 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_DEPTHPITCH
] |= R200_DEPTH_HYPERZ
;
1012 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] = (R200_Z_TEST_LESS
|
1013 R200_STENCIL_TEST_ALWAYS
|
1014 R200_STENCIL_FAIL_KEEP
|
1015 R200_STENCIL_ZPASS_KEEP
|
1016 R200_STENCIL_ZFAIL_KEEP
|
1017 R200_Z_WRITE_ENABLE
);
1019 if (rmesa
->using_hyperz
) {
1020 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= R200_Z_COMPRESSION_ENABLE
|
1021 R200_Z_DECOMPRESSION_ENABLE
;
1022 /* if (rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_R200)
1023 rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_HIERARCHY_ENABLE;*/
1026 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] = (R200_ANTI_ALIAS_NONE
1027 | R200_TEX_BLEND_0_ENABLE
);
1029 switch ( driQueryOptioni( &rmesa
->radeon
.optionCache
, "dither_mode" ) ) {
1030 case DRI_CONF_DITHER_XERRORDIFFRESET
:
1031 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= R200_DITHER_INIT
;
1033 case DRI_CONF_DITHER_ORDERED
:
1034 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= R200_SCALE_DITHER_ENABLE
;
1037 if ( driQueryOptioni( &rmesa
->radeon
.optionCache
, "round_mode" ) ==
1038 DRI_CONF_ROUND_ROUND
)
1039 rmesa
->radeon
.state
.color
.roundEnable
= R200_ROUND_ENABLE
;
1041 rmesa
->radeon
.state
.color
.roundEnable
= 0;
1042 if ( driQueryOptioni (&rmesa
->radeon
.optionCache
, "color_reduction" ) ==
1043 DRI_CONF_COLOR_REDUCTION_DITHER
)
1044 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= R200_DITHER_ENABLE
;
1046 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= rmesa
->radeon
.state
.color
.roundEnable
;
1048 rmesa
->hw
.prf
.cmd
[PRF_PP_TRI_PERF
] = R200_TRI_CUTOFF_MASK
- R200_TRI_CUTOFF_MASK
*
1049 driQueryOptionf (&rmesa
->radeon
.optionCache
,"texture_blend_quality");
1050 rmesa
->hw
.prf
.cmd
[PRF_PP_PERF_CNTL
] = 0;
1052 rmesa
->hw
.set
.cmd
[SET_SE_CNTL
] = (R200_FFACE_CULL_CCW
|
1055 R200_FLAT_SHADE_VTX_LAST
|
1056 R200_DIFFUSE_SHADE_GOURAUD
|
1057 R200_ALPHA_SHADE_GOURAUD
|
1058 R200_SPECULAR_SHADE_GOURAUD
|
1059 R200_FOG_SHADE_GOURAUD
|
1060 R200_DISC_FOG_SHADE_GOURAUD
|
1061 R200_VTX_PIX_CENTER_OGL
|
1062 R200_ROUND_MODE_TRUNC
|
1063 R200_ROUND_PREC_8TH_PIX
);
1065 rmesa
->hw
.set
.cmd
[SET_RE_CNTL
] = (R200_PERSPECTIVE_ENABLE
|
1066 R200_SCISSOR_ENABLE
);
1068 rmesa
->hw
.lin
.cmd
[LIN_RE_LINE_PATTERN
] = ((1 << 16) | 0xffff);
1070 rmesa
->hw
.lin
.cmd
[LIN_RE_LINE_STATE
] =
1071 ((0 << R200_LINE_CURRENT_PTR_SHIFT
) |
1072 (1 << R200_LINE_CURRENT_COUNT_SHIFT
));
1074 rmesa
->hw
.lin
.cmd
[LIN_SE_LINE_WIDTH
] = (1 << 4);
1076 rmesa
->hw
.msk
.cmd
[MSK_RB3D_STENCILREFMASK
] =
1077 ((0x00 << R200_STENCIL_REF_SHIFT
) |
1078 (0xff << R200_STENCIL_MASK_SHIFT
) |
1079 (0xff << R200_STENCIL_WRITEMASK_SHIFT
));
1081 rmesa
->hw
.msk
.cmd
[MSK_RB3D_ROPCNTL
] = R200_ROP_COPY
;
1082 rmesa
->hw
.msk
.cmd
[MSK_RB3D_PLANEMASK
] = 0xffffffff;
1084 rmesa
->hw
.tam
.cmd
[TAM_DEBUG3
] = 0;
1086 rmesa
->hw
.msc
.cmd
[MSC_RE_MISC
] =
1087 ((0 << R200_STIPPLE_X_OFFSET_SHIFT
) |
1088 (0 << R200_STIPPLE_Y_OFFSET_SHIFT
) |
1089 R200_STIPPLE_BIG_BIT_ORDER
);
1092 rmesa
->hw
.cst
.cmd
[CST_PP_CNTL_X
] = 0;
1093 rmesa
->hw
.cst
.cmd
[CST_RB3D_DEPTHXY_OFFSET
] = 0;
1094 rmesa
->hw
.cst
.cmd
[CST_RE_AUX_SCISSOR_CNTL
] = 0x0;
1095 rmesa
->hw
.cst
.cmd
[CST_RE_SCISSOR_TL_0
] = 0;
1096 rmesa
->hw
.cst
.cmd
[CST_RE_SCISSOR_BR_0
] = 0;
1097 rmesa
->hw
.cst
.cmd
[CST_SE_VAP_CNTL_STATUS
] =
1098 #ifdef MESA_BIG_ENDIAN
1104 if (!(rmesa
->radeon
.radeonScreen
->chip_flags
& RADEON_CHIPSET_TCL
)) {
1106 rmesa
->hw
.cst
.cmd
[CST_SE_VAP_CNTL_STATUS
] |= (1<<8);
1109 rmesa
->hw
.cst
.cmd
[CST_RE_POINTSIZE
] =
1110 (((GLuint
)(ctx
->Const
.MaxPointSize
* 16.0)) << R200_MAXPOINTSIZE_SHIFT
) | 0x10;
1111 rmesa
->hw
.cst
.cmd
[CST_SE_TCL_INPUT_VTX_0
] =
1112 (0x0 << R200_VERTEX_POSITION_ADDR__SHIFT
);
1113 rmesa
->hw
.cst
.cmd
[CST_SE_TCL_INPUT_VTX_1
] =
1114 (0x02 << R200_VTX_COLOR_0_ADDR__SHIFT
) |
1115 (0x03 << R200_VTX_COLOR_1_ADDR__SHIFT
);
1116 rmesa
->hw
.cst
.cmd
[CST_SE_TCL_INPUT_VTX_2
] =
1117 (0x06 << R200_VTX_TEX_0_ADDR__SHIFT
) |
1118 (0x07 << R200_VTX_TEX_1_ADDR__SHIFT
) |
1119 (0x08 << R200_VTX_TEX_2_ADDR__SHIFT
) |
1120 (0x09 << R200_VTX_TEX_3_ADDR__SHIFT
);
1121 rmesa
->hw
.cst
.cmd
[CST_SE_TCL_INPUT_VTX_3
] =
1122 (0x0A << R200_VTX_TEX_4_ADDR__SHIFT
) |
1123 (0x0B << R200_VTX_TEX_5_ADDR__SHIFT
);
1126 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_XSCALE
] = 0x00000000;
1127 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_XOFFSET
] = 0x00000000;
1128 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_YSCALE
] = 0x00000000;
1129 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_YOFFSET
] = 0x00000000;
1130 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_ZSCALE
] = 0x00000000;
1131 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_ZOFFSET
] = 0x00000000;
1133 for ( i
= 0 ; i
< ctx
->Const
.MaxTextureUnits
; i
++ ) {
1134 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXFILTER
] = R200_BORDER_MODE_OGL
;
1135 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXFORMAT
] =
1136 ((i
<< R200_TXFORMAT_ST_ROUTE_SHIFT
) | /* <-- note i */
1137 (2 << R200_TXFORMAT_WIDTH_SHIFT
) |
1138 (2 << R200_TXFORMAT_HEIGHT_SHIFT
));
1139 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_BORDER_COLOR
] = 0;
1140 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXFORMAT_X
] =
1141 (/* R200_TEXCOORD_PROJ | */
1142 0x100000); /* Small default bias */
1143 if (rmesa
->radeon
.radeonScreen
->drmSupportsFragShader
) {
1144 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXOFFSET_NEWDRM
] =
1145 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1146 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_CUBIC_FACES
] = 0;
1147 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXMULTI_CTL
] = 0;
1150 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXOFFSET_OLDDRM
] =
1151 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1154 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_FACES
] = 0;
1155 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F1
] =
1156 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1157 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F2
] =
1158 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1159 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F3
] =
1160 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1161 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F4
] =
1162 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1163 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F5
] =
1164 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1166 rmesa
->hw
.pix
[i
].cmd
[PIX_PP_TXCBLEND
] =
1167 (R200_TXC_ARG_A_ZERO
|
1168 R200_TXC_ARG_B_ZERO
|
1169 R200_TXC_ARG_C_DIFFUSE_COLOR
|
1172 rmesa
->hw
.pix
[i
].cmd
[PIX_PP_TXCBLEND2
] =
1173 ((i
<< R200_TXC_TFACTOR_SEL_SHIFT
) |
1175 R200_TXC_CLAMP_0_1
|
1176 R200_TXC_OUTPUT_REG_R0
);
1178 rmesa
->hw
.pix
[i
].cmd
[PIX_PP_TXABLEND
] =
1179 (R200_TXA_ARG_A_ZERO
|
1180 R200_TXA_ARG_B_ZERO
|
1181 R200_TXA_ARG_C_DIFFUSE_ALPHA
|
1184 rmesa
->hw
.pix
[i
].cmd
[PIX_PP_TXABLEND2
] =
1185 ((i
<< R200_TXA_TFACTOR_SEL_SHIFT
) |
1187 R200_TXA_CLAMP_0_1
|
1188 R200_TXA_OUTPUT_REG_R0
);
1191 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_0
] = 0;
1192 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_1
] = 0;
1193 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_2
] = 0;
1194 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_3
] = 0;
1195 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_4
] = 0;
1196 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_5
] = 0;
1198 rmesa
->hw
.vap
.cmd
[VAP_SE_VAP_CNTL
] =
1199 (R200_VAP_TCL_ENABLE
|
1200 (0x9 << R200_VAP_VF_MAX_VTX_NUM__SHIFT
));
1202 rmesa
->hw
.vte
.cmd
[VTE_SE_VTE_CNTL
] =
1203 (R200_VPORT_X_SCALE_ENA
|
1204 R200_VPORT_Y_SCALE_ENA
|
1205 R200_VPORT_Z_SCALE_ENA
|
1206 R200_VPORT_X_OFFSET_ENA
|
1207 R200_VPORT_Y_OFFSET_ENA
|
1208 R200_VPORT_Z_OFFSET_ENA
|
1209 /* FIXME: Turn on for tex rect only */
1210 R200_VTX_ST_DENORMALIZED
|
1214 rmesa
->hw
.vtx
.cmd
[VTX_VTXFMT_0
] = 0;
1215 rmesa
->hw
.vtx
.cmd
[VTX_VTXFMT_1
] = 0;
1216 rmesa
->hw
.vtx
.cmd
[VTX_TCL_OUTPUT_VTXFMT_0
] =
1217 ((R200_VTX_Z0
| R200_VTX_W0
|
1218 (R200_VTX_FP_RGBA
<< R200_VTX_COLOR_0_SHIFT
)));
1219 rmesa
->hw
.vtx
.cmd
[VTX_TCL_OUTPUT_VTXFMT_1
] = 0;
1220 rmesa
->hw
.vtx
.cmd
[VTX_TCL_OUTPUT_COMPSEL
] = (R200_OUTPUT_XYZW
);
1221 rmesa
->hw
.vtx
.cmd
[VTX_STATE_CNTL
] = R200_VSC_UPDATE_USER_COLOR_0_ENABLE
;
1224 /* Matrix selection */
1225 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_0
] =
1226 (R200_MTX_MV
<< R200_MODELVIEW_0_SHIFT
);
1228 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_1
] =
1229 (R200_MTX_IMV
<< R200_IT_MODELVIEW_0_SHIFT
);
1231 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_2
] =
1232 (R200_MTX_MVP
<< R200_MODELPROJECT_0_SHIFT
);
1234 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_3
] =
1235 ((R200_MTX_TEX0
<< R200_TEXMAT_0_SHIFT
) |
1236 (R200_MTX_TEX1
<< R200_TEXMAT_1_SHIFT
) |
1237 (R200_MTX_TEX2
<< R200_TEXMAT_2_SHIFT
) |
1238 (R200_MTX_TEX3
<< R200_TEXMAT_3_SHIFT
));
1240 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_4
] =
1241 ((R200_MTX_TEX4
<< R200_TEXMAT_4_SHIFT
) |
1242 (R200_MTX_TEX5
<< R200_TEXMAT_5_SHIFT
));
1245 /* General TCL state */
1246 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL_0
] =
1247 (R200_SPECULAR_LIGHTS
|
1248 R200_DIFFUSE_SPECULAR_COMBINE
|
1249 R200_LOCAL_LIGHT_VEC_GL
|
1250 R200_LM0_SOURCE_MATERIAL_0
<< R200_FRONT_SHININESS_SOURCE_SHIFT
|
1251 R200_LM0_SOURCE_MATERIAL_1
<< R200_BACK_SHININESS_SOURCE_SHIFT
);
1253 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL_1
] =
1254 ((R200_LM1_SOURCE_MATERIAL_0
<< R200_FRONT_EMISSIVE_SOURCE_SHIFT
) |
1255 (R200_LM1_SOURCE_MATERIAL_0
<< R200_FRONT_AMBIENT_SOURCE_SHIFT
) |
1256 (R200_LM1_SOURCE_MATERIAL_0
<< R200_FRONT_DIFFUSE_SOURCE_SHIFT
) |
1257 (R200_LM1_SOURCE_MATERIAL_0
<< R200_FRONT_SPECULAR_SOURCE_SHIFT
) |
1258 (R200_LM1_SOURCE_MATERIAL_1
<< R200_BACK_EMISSIVE_SOURCE_SHIFT
) |
1259 (R200_LM1_SOURCE_MATERIAL_1
<< R200_BACK_AMBIENT_SOURCE_SHIFT
) |
1260 (R200_LM1_SOURCE_MATERIAL_1
<< R200_BACK_DIFFUSE_SOURCE_SHIFT
) |
1261 (R200_LM1_SOURCE_MATERIAL_1
<< R200_BACK_SPECULAR_SOURCE_SHIFT
));
1263 rmesa
->hw
.tcl
.cmd
[TCL_PER_LIGHT_CTL_0
] = 0; /* filled in via callbacks */
1264 rmesa
->hw
.tcl
.cmd
[TCL_PER_LIGHT_CTL_1
] = 0;
1265 rmesa
->hw
.tcl
.cmd
[TCL_PER_LIGHT_CTL_2
] = 0;
1266 rmesa
->hw
.tcl
.cmd
[TCL_PER_LIGHT_CTL_3
] = 0;
1268 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] =
1269 (R200_UCP_IN_CLIP_SPACE
|
1270 R200_CULL_FRONT_IS_CCW
);
1272 /* Texgen/Texmat state */
1273 rmesa
->hw
.tcg
.cmd
[TCG_TEX_PROC_CTL_2
] = 0x00ffffff;
1274 rmesa
->hw
.tcg
.cmd
[TCG_TEX_PROC_CTL_3
] =
1275 ((0 << R200_TEXGEN_0_INPUT_TEX_SHIFT
) |
1276 (1 << R200_TEXGEN_1_INPUT_TEX_SHIFT
) |
1277 (2 << R200_TEXGEN_2_INPUT_TEX_SHIFT
) |
1278 (3 << R200_TEXGEN_3_INPUT_TEX_SHIFT
) |
1279 (4 << R200_TEXGEN_4_INPUT_TEX_SHIFT
) |
1280 (5 << R200_TEXGEN_5_INPUT_TEX_SHIFT
));
1281 rmesa
->hw
.tcg
.cmd
[TCG_TEX_PROC_CTL_0
] = 0;
1282 rmesa
->hw
.tcg
.cmd
[TCG_TEX_PROC_CTL_1
] =
1283 ((0 << R200_TEXGEN_0_INPUT_SHIFT
) |
1284 (1 << R200_TEXGEN_1_INPUT_SHIFT
) |
1285 (2 << R200_TEXGEN_2_INPUT_SHIFT
) |
1286 (3 << R200_TEXGEN_3_INPUT_SHIFT
) |
1287 (4 << R200_TEXGEN_4_INPUT_SHIFT
) |
1288 (5 << R200_TEXGEN_5_INPUT_SHIFT
));
1289 rmesa
->hw
.tcg
.cmd
[TCG_TEX_CYL_WRAP_CTL
] = 0;
1292 for (i
= 0 ; i
< 8; i
++) {
1293 struct gl_light
*l
= &ctx
->Light
.Light
[i
];
1294 GLenum p
= GL_LIGHT0
+ i
;
1295 *(float *)&(rmesa
->hw
.lit
[i
].cmd
[LIT_RANGE_CUTOFF
]) = FLT_MAX
;
1297 ctx
->Driver
.Lightfv( ctx
, p
, GL_AMBIENT
, l
->Ambient
);
1298 ctx
->Driver
.Lightfv( ctx
, p
, GL_DIFFUSE
, l
->Diffuse
);
1299 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPECULAR
, l
->Specular
);
1300 ctx
->Driver
.Lightfv( ctx
, p
, GL_POSITION
, NULL
);
1301 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPOT_DIRECTION
, NULL
);
1302 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPOT_EXPONENT
, &l
->SpotExponent
);
1303 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPOT_CUTOFF
, &l
->SpotCutoff
);
1304 ctx
->Driver
.Lightfv( ctx
, p
, GL_CONSTANT_ATTENUATION
,
1305 &l
->ConstantAttenuation
);
1306 ctx
->Driver
.Lightfv( ctx
, p
, GL_LINEAR_ATTENUATION
,
1307 &l
->LinearAttenuation
);
1308 ctx
->Driver
.Lightfv( ctx
, p
, GL_QUADRATIC_ATTENUATION
,
1309 &l
->QuadraticAttenuation
);
1310 *(float *)&(rmesa
->hw
.lit
[i
].cmd
[LIT_ATTEN_XXX
]) = 0.0;
1313 ctx
->Driver
.LightModelfv( ctx
, GL_LIGHT_MODEL_AMBIENT
,
1314 ctx
->Light
.Model
.Ambient
);
1316 TNL_CONTEXT(ctx
)->Driver
.NotifyMaterialChange( ctx
);
1318 for (i
= 0 ; i
< 6; i
++) {
1319 ctx
->Driver
.ClipPlane( ctx
, GL_CLIP_PLANE0
+ i
, NULL
);
1322 ctx
->Driver
.Fogfv( ctx
, GL_FOG_MODE
, NULL
);
1323 ctx
->Driver
.Fogfv( ctx
, GL_FOG_DENSITY
, &ctx
->Fog
.Density
);
1324 ctx
->Driver
.Fogfv( ctx
, GL_FOG_START
, &ctx
->Fog
.Start
);
1325 ctx
->Driver
.Fogfv( ctx
, GL_FOG_END
, &ctx
->Fog
.End
);
1326 ctx
->Driver
.Fogfv( ctx
, GL_FOG_COLOR
, ctx
->Fog
.Color
);
1327 ctx
->Driver
.Fogfv( ctx
, GL_FOG_COORDINATE_SOURCE_EXT
, NULL
);
1329 rmesa
->hw
.grd
.cmd
[GRD_VERT_GUARD_CLIP_ADJ
] = IEEE_ONE
;
1330 rmesa
->hw
.grd
.cmd
[GRD_VERT_GUARD_DISCARD_ADJ
] = IEEE_ONE
;
1331 rmesa
->hw
.grd
.cmd
[GRD_HORZ_GUARD_CLIP_ADJ
] = IEEE_ONE
;
1332 rmesa
->hw
.grd
.cmd
[GRD_HORZ_GUARD_DISCARD_ADJ
] = IEEE_ONE
;
1334 rmesa
->hw
.eye
.cmd
[EYE_X
] = 0;
1335 rmesa
->hw
.eye
.cmd
[EYE_Y
] = 0;
1336 rmesa
->hw
.eye
.cmd
[EYE_Z
] = IEEE_ONE
;
1337 rmesa
->hw
.eye
.cmd
[EYE_RESCALE_FACTOR
] = IEEE_ONE
;
1339 rmesa
->hw
.spr
.cmd
[SPR_POINT_SPRITE_CNTL
] =
1340 R200_PS_SE_SEL_STATE
| R200_PS_MULT_CONST
;
1342 /* ptp_eye is presumably used to calculate the attenuation wrt a different
1343 location? In any case, since point attenuation triggers _needeyecoords,
1344 it is constant. Probably ignored as long as R200_PS_USE_MODEL_EYE_VEC
1346 rmesa
->hw
.ptp
.cmd
[PTP_EYE_X
] = 0;
1347 rmesa
->hw
.ptp
.cmd
[PTP_EYE_Y
] = 0;
1348 rmesa
->hw
.ptp
.cmd
[PTP_EYE_Z
] = IEEE_ONE
| 0x80000000; /* -1.0 */
1349 rmesa
->hw
.ptp
.cmd
[PTP_EYE_3
] = 0;
1350 /* no idea what the ptp_vport_scale values are good for, except the
1351 PTSIZE one - hopefully doesn't matter */
1352 rmesa
->hw
.ptp
.cmd
[PTP_VPORT_SCALE_0
] = IEEE_ONE
;
1353 rmesa
->hw
.ptp
.cmd
[PTP_VPORT_SCALE_1
] = IEEE_ONE
;
1354 rmesa
->hw
.ptp
.cmd
[PTP_VPORT_SCALE_PTSIZE
] = IEEE_ONE
;
1355 rmesa
->hw
.ptp
.cmd
[PTP_VPORT_SCALE_3
] = IEEE_ONE
;
1356 rmesa
->hw
.ptp
.cmd
[PTP_ATT_CONST_QUAD
] = 0;
1357 rmesa
->hw
.ptp
.cmd
[PTP_ATT_CONST_LIN
] = 0;
1358 rmesa
->hw
.ptp
.cmd
[PTP_ATT_CONST_CON
] = IEEE_ONE
;
1359 rmesa
->hw
.ptp
.cmd
[PTP_ATT_CONST_3
] = 0;
1360 rmesa
->hw
.ptp
.cmd
[PTP_CLAMP_MIN
] = IEEE_ONE
;
1361 rmesa
->hw
.ptp
.cmd
[PTP_CLAMP_MAX
] = 0x44ffe000; /* 2047 */
1362 rmesa
->hw
.ptp
.cmd
[PTP_CLAMP_2
] = 0;
1363 rmesa
->hw
.ptp
.cmd
[PTP_CLAMP_3
] = 0;
1365 r200LightingSpaceChange( ctx
);
1367 rmesa
->radeon
.hw
.all_dirty
= GL_TRUE
;
1369 rcommonInitCmdBuf(&rmesa
->radeon
);