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
169 static int cmdpkt( r200ContextPtr rmesa
, int id
)
171 drm_radeon_cmd_header_t h
;
173 if (rmesa
->radeon
.radeonScreen
->kernel_mm
) {
174 return CP_PACKET0(packet
[id
].start
, packet
[id
].len
- 1);
177 h
.packet
.cmd_type
= RADEON_CMD_PACKET
;
178 h
.packet
.packet_id
= id
;
183 static int cmdvec( int offset
, int stride
, int count
)
185 drm_radeon_cmd_header_t h
;
187 h
.vectors
.cmd_type
= RADEON_CMD_VECTORS
;
188 h
.vectors
.offset
= offset
;
189 h
.vectors
.stride
= stride
;
190 h
.vectors
.count
= count
;
194 /* warning: the count here is divided by 4 compared to other cmds
195 (so it doesn't exceed the char size)! */
196 static int cmdveclinear( int offset
, int count
)
198 drm_radeon_cmd_header_t h
;
200 h
.veclinear
.cmd_type
= RADEON_CMD_VECLINEAR
;
201 h
.veclinear
.addr_lo
= offset
& 0xff;
202 h
.veclinear
.addr_hi
= (offset
& 0xff00) >> 8;
203 h
.veclinear
.count
= count
;
207 static int cmdscl( int offset
, int stride
, int count
)
209 drm_radeon_cmd_header_t h
;
211 h
.scalars
.cmd_type
= RADEON_CMD_SCALARS
;
212 h
.scalars
.offset
= offset
;
213 h
.scalars
.stride
= stride
;
214 h
.scalars
.count
= count
;
218 static int cmdscl2( int offset
, int stride
, int count
)
220 drm_radeon_cmd_header_t h
;
222 h
.scalars
.cmd_type
= RADEON_CMD_SCALARS2
;
223 h
.scalars
.offset
= offset
- 0x100;
224 h
.scalars
.stride
= stride
;
225 h
.scalars
.count
= count
;
229 #define CHECK( NM, FLAG ) \
230 static int check_##NM( GLcontext *ctx, struct radeon_state_atom *atom) \
232 r200ContextPtr rmesa = R200_CONTEXT(ctx); \
234 return (FLAG) ? atom->cmd_size : 0; \
237 #define TCL_CHECK( NM, FLAG ) \
238 static int check_##NM( GLcontext *ctx, struct radeon_state_atom *atom) \
240 r200ContextPtr rmesa = R200_CONTEXT(ctx); \
241 return (!rmesa->radeon.TclFallback && !ctx->VertexProgram._Enabled && (FLAG)) ? atom->cmd_size : 0; \
244 #define TCL_OR_VP_CHECK( NM, FLAG ) \
245 static int check_##NM( GLcontext *ctx, struct radeon_state_atom *atom ) \
247 r200ContextPtr rmesa = R200_CONTEXT(ctx); \
248 return (!rmesa->radeon.TclFallback && (FLAG)) ? atom->cmd_size : 0; \
251 #define VP_CHECK( NM, FLAG ) \
252 static int check_##NM( GLcontext *ctx, struct radeon_state_atom *atom ) \
254 r200ContextPtr rmesa = R200_CONTEXT(ctx); \
256 return (!rmesa->radeon.TclFallback && ctx->VertexProgram._Enabled && (FLAG)) ? atom->cmd_size : 0; \
259 CHECK( always
, GL_TRUE
)
260 CHECK( never
, GL_FALSE
)
261 CHECK( tex_any
, ctx
->Texture
._EnabledUnits
)
262 CHECK( tf
, (ctx
->Texture
._EnabledUnits
&& !ctx
->ATIFragmentShader
._Enabled
) );
263 CHECK( tex_pair
, (rmesa
->state
.texture
.unit
[atom
->idx
].unitneeded
| rmesa
->state
.texture
.unit
[atom
->idx
& ~1].unitneeded
) )
264 CHECK( tex
, rmesa
->state
.texture
.unit
[atom
->idx
].unitneeded
)
265 CHECK( pix_zero
, !ctx
->ATIFragmentShader
._Enabled
)
266 CHECK( texenv
, (rmesa
->state
.envneeded
& (1 << (atom
->idx
)) && !ctx
->ATIFragmentShader
._Enabled
) )
267 CHECK( afs_pass1
, (ctx
->ATIFragmentShader
._Enabled
&& (ctx
->ATIFragmentShader
.Current
->NumPasses
> 1)) )
268 CHECK( afs
, ctx
->ATIFragmentShader
._Enabled
)
269 CHECK( tex_cube
, rmesa
->state
.texture
.unit
[atom
->idx
].unitneeded
& TEXTURE_CUBE_BIT
)
270 TCL_CHECK( tcl_fog
, ctx
->Fog
.Enabled
)
271 TCL_CHECK( tcl
, GL_TRUE
)
272 TCL_CHECK( tcl_tex
, rmesa
->state
.texture
.unit
[atom
->idx
].unitneeded
)
273 TCL_CHECK( tcl_lighting
, ctx
->Light
.Enabled
)
274 TCL_CHECK( tcl_light
, ctx
->Light
.Enabled
&& ctx
->Light
.Light
[atom
->idx
].Enabled
)
275 TCL_OR_VP_CHECK( tcl_ucp
, (ctx
->Transform
.ClipPlanesEnabled
& (1 << (atom
->idx
))) )
276 TCL_OR_VP_CHECK( tcl_or_vp
, GL_TRUE
)
277 VP_CHECK( tcl_vp
, GL_TRUE
)
278 VP_CHECK( tcl_vp_size
, ctx
->VertexProgram
.Current
->Base
.NumNativeInstructions
> 64 )
279 VP_CHECK( tcl_vpp_size
, ctx
->VertexProgram
.Current
->Base
.NumNativeParameters
> 96 )
281 #define OUT_VEC(hdr, data) do { \
282 drm_radeon_cmd_header_t h; \
284 OUT_BATCH(CP_PACKET0(RADEON_SE_TCL_STATE_FLUSH, 0)); \
286 OUT_BATCH(CP_PACKET0(R200_SE_TCL_VECTOR_INDX_REG, 0)); \
287 OUT_BATCH(h.vectors.offset | (h.vectors.stride << RADEON_VEC_INDX_OCTWORD_STRIDE_SHIFT)); \
288 OUT_BATCH(CP_PACKET0_ONE(R200_SE_TCL_VECTOR_DATA_REG, h.vectors.count - 1)); \
289 OUT_BATCH_TABLE((data), h.vectors.count); \
292 #define OUT_VECLINEAR(hdr, data) do { \
293 drm_radeon_cmd_header_t h; \
294 uint32_t _start, _sz; \
296 _start = h.veclinear.addr_lo | (h.veclinear.addr_hi << 8); \
297 _sz = h.veclinear.count * 4; \
298 OUT_BATCH(CP_PACKET0(RADEON_SE_TCL_STATE_FLUSH, 0)); \
300 OUT_BATCH(CP_PACKET0(R200_SE_TCL_VECTOR_INDX_REG, 0)); \
301 OUT_BATCH(_start | (1 << RADEON_VEC_INDX_OCTWORD_STRIDE_SHIFT)); \
302 OUT_BATCH(CP_PACKET0_ONE(R200_SE_TCL_VECTOR_DATA_REG, _sz - 1)); \
303 OUT_BATCH_TABLE((data), _sz); \
306 #define OUT_SCL(hdr, data) do { \
307 drm_radeon_cmd_header_t h; \
309 OUT_BATCH(CP_PACKET0(R200_SE_TCL_SCALAR_INDX_REG, 0)); \
310 OUT_BATCH((h.scalars.offset) | (h.scalars.stride << RADEON_SCAL_INDX_DWORD_STRIDE_SHIFT)); \
311 OUT_BATCH(CP_PACKET0_ONE(R200_SE_TCL_SCALAR_DATA_REG, h.scalars.count - 1)); \
312 OUT_BATCH_TABLE((data), h.scalars.count); \
315 #define OUT_SCL2(hdr, data) do { \
316 drm_radeon_cmd_header_t h; \
318 OUT_BATCH(CP_PACKET0(R200_SE_TCL_SCALAR_INDX_REG, 0)); \
319 OUT_BATCH((h.scalars.offset + 0x100) | (h.scalars.stride << RADEON_SCAL_INDX_DWORD_STRIDE_SHIFT)); \
320 OUT_BATCH(CP_PACKET0_ONE(R200_SE_TCL_SCALAR_DATA_REG, h.scalars.count - 1)); \
321 OUT_BATCH_TABLE((data), h.scalars.count); \
324 static void mtl_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
326 r200ContextPtr r200
= R200_CONTEXT(ctx
);
327 BATCH_LOCALS(&r200
->radeon
);
328 uint32_t dwords
= atom
->cmd_size
;
331 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
332 OUT_VEC(atom
->cmd
[MTL_CMD_0
], (atom
->cmd
+1));
333 OUT_SCL2(atom
->cmd
[MTL_CMD_1
], (atom
->cmd
+ 18));
337 static void lit_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
339 r200ContextPtr r200
= R200_CONTEXT(ctx
);
340 BATCH_LOCALS(&r200
->radeon
);
341 uint32_t dwords
= atom
->cmd_size
;
344 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
345 OUT_VEC(atom
->cmd
[LIT_CMD_0
], atom
->cmd
+1);
346 OUT_VEC(atom
->cmd
[LIT_CMD_1
], atom
->cmd
+LIT_CMD_1
+1);
350 static void ptp_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
352 r200ContextPtr r200
= R200_CONTEXT(ctx
);
353 BATCH_LOCALS(&r200
->radeon
);
354 uint32_t dwords
= atom
->cmd_size
;
357 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
358 OUT_VEC(atom
->cmd
[PTP_CMD_0
], atom
->cmd
+1);
359 OUT_VEC(atom
->cmd
[PTP_CMD_1
], atom
->cmd
+PTP_CMD_1
+1);
363 static void veclinear_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
;
370 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
371 OUT_VECLINEAR(atom
->cmd
[0], atom
->cmd
+1);
375 static void scl_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
;
382 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
383 OUT_SCL(atom
->cmd
[0], atom
->cmd
+1);
388 static void vec_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
390 r200ContextPtr r200
= R200_CONTEXT(ctx
);
391 BATCH_LOCALS(&r200
->radeon
);
392 uint32_t dwords
= atom
->cmd_size
;
395 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
396 OUT_VEC(atom
->cmd
[0], atom
->cmd
+1);
400 static void ctx_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
402 r200ContextPtr r200
= R200_CONTEXT(ctx
);
403 BATCH_LOCALS(&r200
->radeon
);
404 struct radeon_renderbuffer
*rrb
;
406 uint32_t zbpitch
, depth_fmt
;
407 uint32_t dwords
= atom
->cmd_size
;
409 /* output the first 7 bytes of context */
410 BEGIN_BATCH_NO_AUTOSTATE(dwords
+2+2);
411 OUT_BATCH_TABLE(atom
->cmd
, 5);
413 rrb
= radeon_get_depthbuffer(&r200
->radeon
);
418 zbpitch
= (rrb
->pitch
/ rrb
->cpp
);
419 if (r200
->using_hyperz
)
420 zbpitch
|= RADEON_DEPTH_HYPERZ
;
421 OUT_BATCH_RELOC(0, rrb
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
424 depth_fmt
= RADEON_DEPTH_FORMAT_24BIT_INT_Z
;
426 depth_fmt
= RADEON_DEPTH_FORMAT_16BIT_INT_Z
;
427 atom
->cmd
[CTX_RB3D_ZSTENCILCNTL
] &= ~RADEON_DEPTH_FORMAT_MASK
;
428 atom
->cmd
[CTX_RB3D_ZSTENCILCNTL
] |= depth_fmt
;
431 OUT_BATCH(atom
->cmd
[CTX_RB3D_ZSTENCILCNTL
]);
432 OUT_BATCH(atom
->cmd
[CTX_CMD_1
]);
433 OUT_BATCH(atom
->cmd
[CTX_PP_CNTL
]);
435 rrb
= radeon_get_colorbuffer(&r200
->radeon
);
436 if (!rrb
|| !rrb
->bo
) {
437 OUT_BATCH(atom
->cmd
[CTX_RB3D_CNTL
]);
438 OUT_BATCH(atom
->cmd
[CTX_RB3D_COLOROFFSET
]);
440 atom
->cmd
[CTX_RB3D_CNTL
] &= ~(0xf << 10);
442 atom
->cmd
[CTX_RB3D_CNTL
] |= RADEON_COLOR_FORMAT_ARGB8888
;
444 atom
->cmd
[CTX_RB3D_CNTL
] |= RADEON_COLOR_FORMAT_RGB565
;
446 OUT_BATCH(atom
->cmd
[CTX_RB3D_CNTL
]);
447 OUT_BATCH_RELOC(0, rrb
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
450 OUT_BATCH(atom
->cmd
[CTX_CMD_2
]);
452 if (!rrb
|| !rrb
->bo
) {
453 OUT_BATCH(atom
->cmd
[CTX_RB3D_COLORPITCH
]);
455 cbpitch
= (rrb
->pitch
/ rrb
->cpp
);
456 if (rrb
->bo
->flags
& RADEON_BO_FLAGS_MACRO_TILE
)
457 cbpitch
|= R200_COLOR_TILE_ENABLE
;
461 if (atom
->cmd_size
== CTX_STATE_SIZE_NEWDRM
)
462 OUT_BATCH_TABLE((atom
->cmd
+ 14), 4);
467 static void ctx_emit_cs(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
469 r200ContextPtr r200
= R200_CONTEXT(ctx
);
470 BATCH_LOCALS(&r200
->radeon
);
471 struct radeon_renderbuffer
*rrb
, *drb
;
472 uint32_t cbpitch
= 0;
473 uint32_t zbpitch
= 0;
474 uint32_t dwords
= atom
->cmd_size
;
477 rrb
= radeon_get_colorbuffer(&r200
->radeon
);
478 if (!rrb
|| !rrb
->bo
) {
482 atom
->cmd
[CTX_RB3D_CNTL
] &= ~(0xf << 10);
484 atom
->cmd
[CTX_RB3D_CNTL
] |= RADEON_COLOR_FORMAT_ARGB8888
;
486 atom
->cmd
[CTX_RB3D_CNTL
] |= RADEON_COLOR_FORMAT_RGB565
;
488 cbpitch
= (rrb
->pitch
/ rrb
->cpp
);
489 if (rrb
->bo
->flags
& RADEON_BO_FLAGS_MACRO_TILE
)
490 cbpitch
|= R200_COLOR_TILE_ENABLE
;
492 drb
= radeon_get_depthbuffer(&r200
->radeon
);
494 zbpitch
= (drb
->pitch
/ drb
->cpp
);
496 depth_fmt
= RADEON_DEPTH_FORMAT_24BIT_INT_Z
;
498 depth_fmt
= RADEON_DEPTH_FORMAT_16BIT_INT_Z
;
499 atom
->cmd
[CTX_RB3D_ZSTENCILCNTL
] &= ~RADEON_DEPTH_FORMAT_MASK
;
500 atom
->cmd
[CTX_RB3D_ZSTENCILCNTL
] |= depth_fmt
;
508 if (atom
->cmd_size
== CTX_STATE_SIZE_NEWDRM
)
511 /* output the first 7 bytes of context */
512 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
514 /* In the CS case we need to split this up */
515 OUT_BATCH(CP_PACKET0(packet
[0].start
, 3));
516 OUT_BATCH_TABLE((atom
->cmd
+ 1), 4);
519 OUT_BATCH(CP_PACKET0(RADEON_RB3D_DEPTHOFFSET
, 0));
520 OUT_BATCH_RELOC(0, drb
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
522 OUT_BATCH(CP_PACKET0(RADEON_RB3D_DEPTHPITCH
, 0));
526 OUT_BATCH(CP_PACKET0(RADEON_RB3D_ZSTENCILCNTL
, 0));
527 OUT_BATCH(atom
->cmd
[CTX_RB3D_ZSTENCILCNTL
]);
528 OUT_BATCH(CP_PACKET0(RADEON_PP_CNTL
, 1));
529 OUT_BATCH(atom
->cmd
[CTX_PP_CNTL
]);
530 OUT_BATCH(atom
->cmd
[CTX_RB3D_CNTL
]);
534 OUT_BATCH(CP_PACKET0(RADEON_RB3D_COLOROFFSET
, 0));
535 OUT_BATCH_RELOC(0, rrb
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
537 OUT_BATCH(CP_PACKET0(RADEON_RB3D_COLORPITCH
, 0));
541 if (atom
->cmd_size
== CTX_STATE_SIZE_NEWDRM
) {
542 OUT_BATCH_TABLE((atom
->cmd
+ 14), 4);
548 static void tex_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
550 r200ContextPtr r200
= R200_CONTEXT(ctx
);
551 BATCH_LOCALS(&r200
->radeon
);
552 uint32_t dwords
= atom
->cmd_size
;
554 radeonTexObj
*t
= r200
->state
.texture
.unit
[i
].texobj
;
555 radeon_mipmap_level
*lvl
;
557 if (t
&& t
->mt
&& !t
->image_override
)
559 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
560 /* is this ok even with drm older than 1.18? */
561 OUT_BATCH_TABLE(atom
->cmd
, 10);
563 if (t
&& t
->mt
&& !t
->image_override
) {
564 OUT_BATCH_RELOC(t
->tile_bits
, t
->mt
->bo
, 0,
565 RADEON_GEM_DOMAIN_GTT
|RADEON_GEM_DOMAIN_VRAM
, 0, 0);
567 /* workaround for old CS mechanism */
568 OUT_BATCH(r200
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
]);
570 OUT_BATCH(t
->override_offset
);
576 static void tex_emit_cs(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
578 r200ContextPtr r200
= R200_CONTEXT(ctx
);
579 BATCH_LOCALS(&r200
->radeon
);
580 uint32_t dwords
= atom
->cmd_size
;
582 radeonTexObj
*t
= r200
->state
.texture
.unit
[i
].texobj
;
583 radeon_mipmap_level
*lvl
;
589 if (!t
->mt
&& !t
->bo
)
597 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
599 OUT_BATCH(CP_PACKET0(R200_PP_TXFILTER_0
+ (24 * i
), 7));
600 OUT_BATCH_TABLE((atom
->cmd
+ 1), 8);
603 OUT_BATCH(CP_PACKET0(R200_PP_TXOFFSET_0
+ (24 * i
), 0));
604 if (t
->mt
&& !t
->image_override
) {
605 OUT_BATCH_RELOC(t
->tile_bits
, t
->mt
->bo
, 0,
606 RADEON_GEM_DOMAIN_GTT
|RADEON_GEM_DOMAIN_VRAM
, 0, 0);
609 OUT_BATCH_RELOC(t
->tile_bits
, t
->bo
, 0,
610 RADEON_GEM_DOMAIN_GTT
|RADEON_GEM_DOMAIN_VRAM
, 0, 0);
617 static void cube_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
619 r200ContextPtr r200
= R200_CONTEXT(ctx
);
620 BATCH_LOCALS(&r200
->radeon
);
622 int i
= atom
->idx
, j
;
623 radeonTexObj
*t
= r200
->state
.texture
.unit
[i
].texobj
;
624 radeon_mipmap_level
*lvl
;
626 BEGIN_BATCH_NO_AUTOSTATE(dwords
+ (4 * 5));
627 OUT_BATCH_TABLE(atom
->cmd
, 2);
629 if (t
&& !t
->image_override
) {
630 lvl
= &t
->mt
->levels
[0];
631 for (j
= 1; j
<= 5; j
++) {
632 OUT_BATCH(CP_PACKET0(R200_PP_CUBIC_OFFSET_F1_0
+ (24*i
) + (4 * (j
-1)), 0));
633 OUT_BATCH_RELOC(lvl
->faces
[j
].offset
, t
->mt
->bo
, lvl
->faces
[j
].offset
,
634 RADEON_GEM_DOMAIN_VRAM
, 0, 0);
640 /* Initialize the context's hardware state.
642 void r200InitState( r200ContextPtr rmesa
)
644 GLcontext
*ctx
= rmesa
->radeon
.glCtx
;
647 rmesa
->radeon
.state
.color
.clear
= 0x00000000;
649 switch ( ctx
->Visual
.depthBits
) {
651 rmesa
->radeon
.state
.depth
.clear
= 0x0000ffff;
652 rmesa
->radeon
.state
.stencil
.clear
= 0x00000000;
656 rmesa
->radeon
.state
.depth
.clear
= 0x00ffffff;
657 rmesa
->radeon
.state
.stencil
.clear
= 0xffff0000;
661 rmesa
->radeon
.Fallback
= 0;
663 rmesa
->radeon
.hw
.max_state_size
= 0;
665 #define ALLOC_STATE( ATOM, CHK, SZ, NM, IDX ) \
667 rmesa->hw.ATOM.cmd_size = SZ; \
668 rmesa->hw.ATOM.cmd = (GLuint *)CALLOC(SZ * sizeof(int)); \
669 rmesa->hw.ATOM.lastcmd = (GLuint *)CALLOC(SZ * sizeof(int)); \
670 rmesa->hw.ATOM.name = NM; \
671 rmesa->hw.ATOM.idx = IDX; \
672 rmesa->hw.ATOM.check = check_##CHK; \
673 rmesa->hw.ATOM.dirty = GL_FALSE; \
674 rmesa->radeon.hw.max_state_size += SZ * sizeof(int); \
678 /* Allocate state buffers:
680 if (rmesa
->radeon
.radeonScreen
->drmSupportsBlendColor
)
681 ALLOC_STATE( ctx
, always
, CTX_STATE_SIZE_NEWDRM
, "CTX/context", 0 );
683 ALLOC_STATE( ctx
, always
, CTX_STATE_SIZE_OLDDRM
, "CTX/context", 0 );
685 if (rmesa
->radeon
.radeonScreen
->kernel_mm
)
686 rmesa
->hw
.ctx
.emit
= ctx_emit_cs
;
688 rmesa
->hw
.ctx
.emit
= ctx_emit
;
689 ALLOC_STATE( set
, always
, SET_STATE_SIZE
, "SET/setup", 0 );
690 ALLOC_STATE( lin
, always
, LIN_STATE_SIZE
, "LIN/line", 0 );
691 ALLOC_STATE( msk
, always
, MSK_STATE_SIZE
, "MSK/mask", 0 );
692 ALLOC_STATE( vpt
, always
, VPT_STATE_SIZE
, "VPT/viewport", 0 );
693 ALLOC_STATE( vtx
, always
, VTX_STATE_SIZE
, "VTX/vertex", 0 );
694 ALLOC_STATE( vap
, always
, VAP_STATE_SIZE
, "VAP/vap", 0 );
695 ALLOC_STATE( vte
, always
, VTE_STATE_SIZE
, "VTE/vte", 0 );
696 ALLOC_STATE( msc
, always
, MSC_STATE_SIZE
, "MSC/misc", 0 );
697 ALLOC_STATE( cst
, always
, CST_STATE_SIZE
, "CST/constant", 0 );
698 ALLOC_STATE( zbs
, always
, ZBS_STATE_SIZE
, "ZBS/zbias", 0 );
699 ALLOC_STATE( tf
, tf
, TF_STATE_SIZE
, "TF/tfactor", 0 );
700 if (rmesa
->radeon
.radeonScreen
->drmSupportsFragShader
) {
701 if (rmesa
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_R200
) {
702 /* make sure texture units 0/1 are emitted pair-wise for r200 t0 hang workaround */
703 ALLOC_STATE( tex
[0], tex_pair
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-0", 0 );
704 ALLOC_STATE( tex
[1], tex_pair
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-1", 1 );
705 ALLOC_STATE( tam
, tex_any
, TAM_STATE_SIZE
, "TAM/tam", 0 );
708 ALLOC_STATE( tex
[0], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-0", 0 );
709 ALLOC_STATE( tex
[1], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-1", 1 );
710 ALLOC_STATE( tam
, never
, TAM_STATE_SIZE
, "TAM/tam", 0 );
712 ALLOC_STATE( tex
[2], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-2", 2 );
713 ALLOC_STATE( tex
[3], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-3", 3 );
714 ALLOC_STATE( tex
[4], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-4", 4 );
715 ALLOC_STATE( tex
[5], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-5", 5 );
716 ALLOC_STATE( atf
, afs
, ATF_STATE_SIZE
, "ATF/tfactor", 0 );
717 ALLOC_STATE( afs
[0], afs_pass1
, AFS_STATE_SIZE
, "AFS/afsinst-0", 0 );
718 ALLOC_STATE( afs
[1], afs
, AFS_STATE_SIZE
, "AFS/afsinst-1", 1 );
721 if (rmesa
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_R200
) {
722 ALLOC_STATE( tex
[0], tex_pair
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-0", 0 );
723 ALLOC_STATE( tex
[1], tex_pair
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-1", 1 );
724 ALLOC_STATE( tam
, tex_any
, TAM_STATE_SIZE
, "TAM/tam", 0 );
727 ALLOC_STATE( tex
[0], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-0", 0 );
728 ALLOC_STATE( tex
[1], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-1", 1 );
729 ALLOC_STATE( tam
, never
, TAM_STATE_SIZE
, "TAM/tam", 0 );
731 ALLOC_STATE( tex
[2], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-2", 2 );
732 ALLOC_STATE( tex
[3], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-3", 3 );
733 ALLOC_STATE( tex
[4], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-4", 4 );
734 ALLOC_STATE( tex
[5], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-5", 5 );
735 ALLOC_STATE( atf
, never
, ATF_STATE_SIZE
, "TF/tfactor", 0 );
736 ALLOC_STATE( afs
[0], never
, AFS_STATE_SIZE
, "AFS/afsinst-0", 0 );
737 ALLOC_STATE( afs
[1], never
, AFS_STATE_SIZE
, "AFS/afsinst-1", 1 );
740 for (i
= 0; i
< 5; i
++)
741 if (rmesa
->radeon
.radeonScreen
->kernel_mm
)
742 rmesa
->hw
.tex
[i
].emit
= tex_emit_cs
;
744 rmesa
->hw
.tex
[i
].emit
= tex_emit
;
745 if (rmesa
->radeon
.radeonScreen
->drmSupportsCubeMapsR200
) {
746 ALLOC_STATE( cube
[0], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-0", 0 );
747 ALLOC_STATE( cube
[1], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-1", 1 );
748 ALLOC_STATE( cube
[2], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-2", 2 );
749 ALLOC_STATE( cube
[3], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-3", 3 );
750 ALLOC_STATE( cube
[4], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-4", 4 );
751 ALLOC_STATE( cube
[5], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-5", 5 );
752 for (i
= 0; i
< 5; i
++)
753 rmesa
->hw
.cube
[i
].emit
= cube_emit
;
756 ALLOC_STATE( cube
[0], never
, CUBE_STATE_SIZE
, "CUBE/tex-0", 0 );
757 ALLOC_STATE( cube
[1], never
, CUBE_STATE_SIZE
, "CUBE/tex-1", 1 );
758 ALLOC_STATE( cube
[2], never
, CUBE_STATE_SIZE
, "CUBE/tex-2", 2 );
759 ALLOC_STATE( cube
[3], never
, CUBE_STATE_SIZE
, "CUBE/tex-3", 3 );
760 ALLOC_STATE( cube
[4], never
, CUBE_STATE_SIZE
, "CUBE/tex-4", 4 );
761 ALLOC_STATE( cube
[5], never
, CUBE_STATE_SIZE
, "CUBE/tex-5", 5 );
764 if (rmesa
->radeon
.radeonScreen
->drmSupportsVertexProgram
) {
765 ALLOC_STATE( pvs
, tcl_vp
, PVS_STATE_SIZE
, "PVS/pvscntl", 0 );
766 ALLOC_STATE( vpi
[0], tcl_vp
, VPI_STATE_SIZE
, "VP/vertexprog-0", 0 );
767 ALLOC_STATE( vpi
[1], tcl_vp_size
, VPI_STATE_SIZE
, "VP/vertexprog-1", 1 );
768 ALLOC_STATE( vpp
[0], tcl_vp
, VPP_STATE_SIZE
, "VPP/vertexparam-0", 0 );
769 ALLOC_STATE( vpp
[1], tcl_vpp_size
, VPP_STATE_SIZE
, "VPP/vertexparam-1", 1 );
772 ALLOC_STATE( pvs
, never
, PVS_STATE_SIZE
, "PVS/pvscntl", 0 );
773 ALLOC_STATE( vpi
[0], never
, VPI_STATE_SIZE
, "VP/vertexprog-0", 0 );
774 ALLOC_STATE( vpi
[1], never
, VPI_STATE_SIZE
, "VP/vertexprog-1", 1 );
775 ALLOC_STATE( vpp
[0], never
, VPP_STATE_SIZE
, "VPP/vertexparam-0", 0 );
776 ALLOC_STATE( vpp
[1], never
, VPP_STATE_SIZE
, "VPP/vertexparam-1", 1 );
778 /* FIXME: this atom has two commands, we need only one (ucp_vert_blend) for vp */
779 ALLOC_STATE( tcl
, tcl_or_vp
, TCL_STATE_SIZE
, "TCL/tcl", 0 );
780 ALLOC_STATE( msl
, tcl
, MSL_STATE_SIZE
, "MSL/matrix-select", 0 );
781 ALLOC_STATE( tcg
, tcl
, TCG_STATE_SIZE
, "TCG/texcoordgen", 0 );
782 ALLOC_STATE( mtl
[0], tcl_lighting
, MTL_STATE_SIZE
, "MTL0/material0", 0 );
783 ALLOC_STATE( mtl
[1], tcl_lighting
, MTL_STATE_SIZE
, "MTL1/material1", 1 );
784 ALLOC_STATE( grd
, tcl_or_vp
, GRD_STATE_SIZE
, "GRD/guard-band", 0 );
785 ALLOC_STATE( fog
, tcl_fog
, FOG_STATE_SIZE
, "FOG/fog", 0 );
786 ALLOC_STATE( glt
, tcl_lighting
, GLT_STATE_SIZE
, "GLT/light-global", 0 );
787 ALLOC_STATE( eye
, tcl_lighting
, EYE_STATE_SIZE
, "EYE/eye-vector", 0 );
788 ALLOC_STATE( mat
[R200_MTX_MV
], tcl
, MAT_STATE_SIZE
, "MAT/modelview", 0 );
789 ALLOC_STATE( mat
[R200_MTX_IMV
], tcl
, MAT_STATE_SIZE
, "MAT/it-modelview", 0 );
790 ALLOC_STATE( mat
[R200_MTX_MVP
], tcl
, MAT_STATE_SIZE
, "MAT/modelproject", 0 );
791 ALLOC_STATE( mat
[R200_MTX_TEX0
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat0", 0 );
792 ALLOC_STATE( mat
[R200_MTX_TEX1
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat1", 1 );
793 ALLOC_STATE( mat
[R200_MTX_TEX2
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat2", 2 );
794 ALLOC_STATE( mat
[R200_MTX_TEX3
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat3", 3 );
795 ALLOC_STATE( mat
[R200_MTX_TEX4
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat4", 4 );
796 ALLOC_STATE( mat
[R200_MTX_TEX5
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat5", 5 );
797 ALLOC_STATE( ucp
[0], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-0", 0 );
798 ALLOC_STATE( ucp
[1], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-1", 1 );
799 ALLOC_STATE( ucp
[2], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-2", 2 );
800 ALLOC_STATE( ucp
[3], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-3", 3 );
801 ALLOC_STATE( ucp
[4], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-4", 4 );
802 ALLOC_STATE( ucp
[5], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-5", 5 );
803 ALLOC_STATE( lit
[0], tcl_light
, LIT_STATE_SIZE
, "LIT/light-0", 0 );
804 ALLOC_STATE( lit
[1], tcl_light
, LIT_STATE_SIZE
, "LIT/light-1", 1 );
805 ALLOC_STATE( lit
[2], tcl_light
, LIT_STATE_SIZE
, "LIT/light-2", 2 );
806 ALLOC_STATE( lit
[3], tcl_light
, LIT_STATE_SIZE
, "LIT/light-3", 3 );
807 ALLOC_STATE( lit
[4], tcl_light
, LIT_STATE_SIZE
, "LIT/light-4", 4 );
808 ALLOC_STATE( lit
[5], tcl_light
, LIT_STATE_SIZE
, "LIT/light-5", 5 );
809 ALLOC_STATE( lit
[6], tcl_light
, LIT_STATE_SIZE
, "LIT/light-6", 6 );
810 ALLOC_STATE( lit
[7], tcl_light
, LIT_STATE_SIZE
, "LIT/light-7", 7 );
811 ALLOC_STATE( pix
[0], pix_zero
, PIX_STATE_SIZE
, "PIX/pixstage-0", 0 );
812 ALLOC_STATE( pix
[1], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-1", 1 );
813 ALLOC_STATE( pix
[2], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-2", 2 );
814 ALLOC_STATE( pix
[3], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-3", 3 );
815 ALLOC_STATE( pix
[4], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-4", 4 );
816 ALLOC_STATE( pix
[5], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-5", 5 );
817 if (rmesa
->radeon
.radeonScreen
->drmSupportsTriPerf
) {
818 ALLOC_STATE( prf
, always
, PRF_STATE_SIZE
, "PRF/performance-tri", 0 );
821 ALLOC_STATE( prf
, never
, PRF_STATE_SIZE
, "PRF/performance-tri", 0 );
823 if (rmesa
->radeon
.radeonScreen
->drmSupportsPointSprites
) {
824 ALLOC_STATE( spr
, always
, SPR_STATE_SIZE
, "SPR/pointsprite", 0 );
825 ALLOC_STATE( ptp
, tcl
, PTP_STATE_SIZE
, "PTP/pointparams", 0 );
828 ALLOC_STATE (spr
, never
, SPR_STATE_SIZE
, "SPR/pointsprite", 0 );
829 ALLOC_STATE (ptp
, never
, PTP_STATE_SIZE
, "PTP/pointparams", 0 );
832 r200SetUpAtomList( rmesa
);
834 /* Fill in the packet headers:
836 rmesa
->hw
.ctx
.cmd
[CTX_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_PP_MISC
);
837 rmesa
->hw
.ctx
.cmd
[CTX_CMD_1
] = cmdpkt(rmesa
, RADEON_EMIT_PP_CNTL
);
838 rmesa
->hw
.ctx
.cmd
[CTX_CMD_2
] = cmdpkt(rmesa
, RADEON_EMIT_RB3D_COLORPITCH
);
839 if (rmesa
->radeon
.radeonScreen
->drmSupportsBlendColor
)
840 rmesa
->hw
.ctx
.cmd
[CTX_CMD_3
] = cmdpkt(rmesa
, R200_EMIT_RB3D_BLENDCOLOR
);
841 rmesa
->hw
.lin
.cmd
[LIN_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_RE_LINE_PATTERN
);
842 rmesa
->hw
.lin
.cmd
[LIN_CMD_1
] = cmdpkt(rmesa
, RADEON_EMIT_SE_LINE_WIDTH
);
843 rmesa
->hw
.msk
.cmd
[MSK_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_RB3D_STENCILREFMASK
);
844 rmesa
->hw
.vpt
.cmd
[VPT_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_SE_VPORT_XSCALE
);
845 rmesa
->hw
.set
.cmd
[SET_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_SE_CNTL
);
846 rmesa
->hw
.msc
.cmd
[MSC_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_RE_MISC
);
847 rmesa
->hw
.cst
.cmd
[CST_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CNTL_X
);
848 rmesa
->hw
.cst
.cmd
[CST_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_RB3D_DEPTHXY_OFFSET
);
849 rmesa
->hw
.cst
.cmd
[CST_CMD_2
] = cmdpkt(rmesa
, R200_EMIT_RE_AUX_SCISSOR_CNTL
);
850 rmesa
->hw
.cst
.cmd
[CST_CMD_3
] = cmdpkt(rmesa
, R200_EMIT_RE_SCISSOR_TL_0
);
851 rmesa
->hw
.cst
.cmd
[CST_CMD_4
] = cmdpkt(rmesa
, R200_EMIT_SE_VAP_CNTL_STATUS
);
852 rmesa
->hw
.cst
.cmd
[CST_CMD_5
] = cmdpkt(rmesa
, R200_EMIT_RE_POINTSIZE
);
853 rmesa
->hw
.cst
.cmd
[CST_CMD_6
] = cmdpkt(rmesa
, R200_EMIT_TCL_INPUT_VTX_VECTOR_ADDR_0
);
854 rmesa
->hw
.tam
.cmd
[TAM_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TAM_DEBUG3
);
855 rmesa
->hw
.tf
.cmd
[TF_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_TFACTOR_0
);
856 if (rmesa
->radeon
.radeonScreen
->drmSupportsFragShader
) {
857 rmesa
->hw
.atf
.cmd
[ATF_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_ATF_TFACTOR
);
858 rmesa
->hw
.tex
[0].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCTLALL_0
);
859 rmesa
->hw
.tex
[0].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_0
);
860 rmesa
->hw
.tex
[1].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCTLALL_1
);
861 rmesa
->hw
.tex
[1].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_1
);
862 rmesa
->hw
.tex
[2].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCTLALL_2
);
863 rmesa
->hw
.tex
[2].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_2
);
864 rmesa
->hw
.tex
[3].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCTLALL_3
);
865 rmesa
->hw
.tex
[3].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_3
);
866 rmesa
->hw
.tex
[4].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCTLALL_4
);
867 rmesa
->hw
.tex
[4].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_4
);
868 rmesa
->hw
.tex
[5].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCTLALL_5
);
869 rmesa
->hw
.tex
[5].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_5
);
871 rmesa
->hw
.tex
[0].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXFILTER_0
);
872 rmesa
->hw
.tex
[0].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_0
);
873 rmesa
->hw
.tex
[1].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXFILTER_1
);
874 rmesa
->hw
.tex
[1].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_1
);
875 rmesa
->hw
.tex
[2].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXFILTER_2
);
876 rmesa
->hw
.tex
[2].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_2
);
877 rmesa
->hw
.tex
[3].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXFILTER_3
);
878 rmesa
->hw
.tex
[3].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_3
);
879 rmesa
->hw
.tex
[4].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXFILTER_4
);
880 rmesa
->hw
.tex
[4].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_4
);
881 rmesa
->hw
.tex
[5].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXFILTER_5
);
882 rmesa
->hw
.tex
[5].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_5
);
884 rmesa
->hw
.afs
[0].cmd
[AFS_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_AFS_0
);
885 rmesa
->hw
.afs
[1].cmd
[AFS_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_AFS_1
);
886 rmesa
->hw
.pvs
.cmd
[PVS_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_VAP_PVS_CNTL
);
887 rmesa
->hw
.cube
[0].cmd
[CUBE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_FACES_0
);
888 rmesa
->hw
.cube
[0].cmd
[CUBE_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_OFFSETS_0
);
889 rmesa
->hw
.cube
[1].cmd
[CUBE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_FACES_1
);
890 rmesa
->hw
.cube
[1].cmd
[CUBE_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_OFFSETS_1
);
891 rmesa
->hw
.cube
[2].cmd
[CUBE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_FACES_2
);
892 rmesa
->hw
.cube
[2].cmd
[CUBE_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_OFFSETS_2
);
893 rmesa
->hw
.cube
[3].cmd
[CUBE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_FACES_3
);
894 rmesa
->hw
.cube
[3].cmd
[CUBE_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_OFFSETS_3
);
895 rmesa
->hw
.cube
[4].cmd
[CUBE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_FACES_4
);
896 rmesa
->hw
.cube
[4].cmd
[CUBE_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_OFFSETS_4
);
897 rmesa
->hw
.cube
[5].cmd
[CUBE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_FACES_5
);
898 rmesa
->hw
.cube
[5].cmd
[CUBE_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_OFFSETS_5
);
899 rmesa
->hw
.pix
[0].cmd
[PIX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCBLEND_0
);
900 rmesa
->hw
.pix
[1].cmd
[PIX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCBLEND_1
);
901 rmesa
->hw
.pix
[2].cmd
[PIX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCBLEND_2
);
902 rmesa
->hw
.pix
[3].cmd
[PIX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCBLEND_3
);
903 rmesa
->hw
.pix
[4].cmd
[PIX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCBLEND_4
);
904 rmesa
->hw
.pix
[5].cmd
[PIX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCBLEND_5
);
905 rmesa
->hw
.zbs
.cmd
[ZBS_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_SE_ZBIAS_FACTOR
);
906 rmesa
->hw
.tcl
.cmd
[TCL_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_TCL_LIGHT_MODEL_CTL_0
);
907 rmesa
->hw
.tcl
.cmd
[TCL_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_TCL_UCP_VERT_BLEND_CTL
);
908 rmesa
->hw
.tcg
.cmd
[TCG_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_TEX_PROC_CTL_2
);
909 rmesa
->hw
.msl
.cmd
[MSL_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_MATRIX_SELECT_0
);
910 rmesa
->hw
.vap
.cmd
[VAP_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_VAP_CTL
);
911 rmesa
->hw
.vtx
.cmd
[VTX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_VTX_FMT_0
);
912 rmesa
->hw
.vtx
.cmd
[VTX_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_OUTPUT_VTX_COMP_SEL
);
913 rmesa
->hw
.vtx
.cmd
[VTX_CMD_2
] = cmdpkt(rmesa
, R200_EMIT_SE_VTX_STATE_CNTL
);
914 rmesa
->hw
.vte
.cmd
[VTE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_VTE_CNTL
);
915 rmesa
->hw
.prf
.cmd
[PRF_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TRI_PERF_CNTL
);
916 rmesa
->hw
.spr
.cmd
[SPR_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_TCL_POINT_SPRITE_CNTL
);
917 if (rmesa
->radeon
.radeonScreen
->kernel_mm
) {
918 rmesa
->hw
.mtl
[0].emit
= mtl_emit
;
919 rmesa
->hw
.mtl
[1].emit
= mtl_emit
;
921 rmesa
->hw
.vpi
[0].emit
= veclinear_emit
;
922 rmesa
->hw
.vpi
[1].emit
= veclinear_emit
;
923 rmesa
->hw
.vpp
[0].emit
= veclinear_emit
;
924 rmesa
->hw
.vpp
[1].emit
= veclinear_emit
;
926 rmesa
->hw
.grd
.emit
= scl_emit
;
927 rmesa
->hw
.fog
.emit
= vec_emit
;
928 rmesa
->hw
.glt
.emit
= vec_emit
;
929 rmesa
->hw
.eye
.emit
= vec_emit
;
931 for (i
= R200_MTX_MV
; i
<= R200_MTX_TEX5
; i
++)
932 rmesa
->hw
.mat
[i
].emit
= vec_emit
;
934 for (i
= 0; i
< 8; i
++)
935 rmesa
->hw
.lit
[i
].emit
= lit_emit
;
937 for (i
= 0; i
< 6; i
++)
938 rmesa
->hw
.ucp
[i
].emit
= vec_emit
;
940 rmesa
->hw
.ptp
.emit
= ptp_emit
;
945 rmesa
->hw
.mtl
[0].cmd
[MTL_CMD_0
] =
946 cmdvec( R200_VS_MAT_0_EMISS
, 1, 16 );
947 rmesa
->hw
.mtl
[0].cmd
[MTL_CMD_1
] =
948 cmdscl2( R200_SS_MAT_0_SHININESS
, 1, 1 );
949 rmesa
->hw
.mtl
[1].cmd
[MTL_CMD_0
] =
950 cmdvec( R200_VS_MAT_1_EMISS
, 1, 16 );
951 rmesa
->hw
.mtl
[1].cmd
[MTL_CMD_1
] =
952 cmdscl2( R200_SS_MAT_1_SHININESS
, 1, 1 );
954 rmesa
->hw
.vpi
[0].cmd
[VPI_CMD_0
] =
955 cmdveclinear( R200_PVS_PROG0
, 64 );
956 rmesa
->hw
.vpi
[1].cmd
[VPI_CMD_0
] =
957 cmdveclinear( R200_PVS_PROG1
, 64 );
958 rmesa
->hw
.vpp
[0].cmd
[VPP_CMD_0
] =
959 cmdveclinear( R200_PVS_PARAM0
, 96 );
960 rmesa
->hw
.vpp
[1].cmd
[VPP_CMD_0
] =
961 cmdveclinear( R200_PVS_PARAM1
, 96 );
963 rmesa
->hw
.grd
.cmd
[GRD_CMD_0
] =
964 cmdscl( R200_SS_VERT_GUARD_CLIP_ADJ_ADDR
, 1, 4 );
965 rmesa
->hw
.fog
.cmd
[FOG_CMD_0
] =
966 cmdvec( R200_VS_FOG_PARAM_ADDR
, 1, 4 );
967 rmesa
->hw
.glt
.cmd
[GLT_CMD_0
] =
968 cmdvec( R200_VS_GLOBAL_AMBIENT_ADDR
, 1, 4 );
969 rmesa
->hw
.eye
.cmd
[EYE_CMD_0
] =
970 cmdvec( R200_VS_EYE_VECTOR_ADDR
, 1, 4 );
972 rmesa
->hw
.mat
[R200_MTX_MV
].cmd
[MAT_CMD_0
] =
973 cmdvec( R200_VS_MATRIX_0_MV
, 1, 16);
974 rmesa
->hw
.mat
[R200_MTX_IMV
].cmd
[MAT_CMD_0
] =
975 cmdvec( R200_VS_MATRIX_1_INV_MV
, 1, 16);
976 rmesa
->hw
.mat
[R200_MTX_MVP
].cmd
[MAT_CMD_0
] =
977 cmdvec( R200_VS_MATRIX_2_MVP
, 1, 16);
978 rmesa
->hw
.mat
[R200_MTX_TEX0
].cmd
[MAT_CMD_0
] =
979 cmdvec( R200_VS_MATRIX_3_TEX0
, 1, 16);
980 rmesa
->hw
.mat
[R200_MTX_TEX1
].cmd
[MAT_CMD_0
] =
981 cmdvec( R200_VS_MATRIX_4_TEX1
, 1, 16);
982 rmesa
->hw
.mat
[R200_MTX_TEX2
].cmd
[MAT_CMD_0
] =
983 cmdvec( R200_VS_MATRIX_5_TEX2
, 1, 16);
984 rmesa
->hw
.mat
[R200_MTX_TEX3
].cmd
[MAT_CMD_0
] =
985 cmdvec( R200_VS_MATRIX_6_TEX3
, 1, 16);
986 rmesa
->hw
.mat
[R200_MTX_TEX4
].cmd
[MAT_CMD_0
] =
987 cmdvec( R200_VS_MATRIX_7_TEX4
, 1, 16);
988 rmesa
->hw
.mat
[R200_MTX_TEX5
].cmd
[MAT_CMD_0
] =
989 cmdvec( R200_VS_MATRIX_8_TEX5
, 1, 16);
991 for (i
= 0 ; i
< 8; i
++) {
992 rmesa
->hw
.lit
[i
].cmd
[LIT_CMD_0
] =
993 cmdvec( R200_VS_LIGHT_AMBIENT_ADDR
+ i
, 8, 24 );
994 rmesa
->hw
.lit
[i
].cmd
[LIT_CMD_1
] =
995 cmdscl( R200_SS_LIGHT_DCD_ADDR
+ i
, 8, 7 );
998 for (i
= 0 ; i
< 6; i
++) {
999 rmesa
->hw
.ucp
[i
].cmd
[UCP_CMD_0
] =
1000 cmdvec( R200_VS_UCP_ADDR
+ i
, 1, 4 );
1003 rmesa
->hw
.ptp
.cmd
[PTP_CMD_0
] =
1004 cmdvec( R200_VS_PNT_SPRITE_VPORT_SCALE
, 1, 4 );
1005 rmesa
->hw
.ptp
.cmd
[PTP_CMD_1
] =
1006 cmdvec( R200_VS_PNT_SPRITE_ATT_CONST
, 1, 12 );
1008 /* Initial Harware state:
1010 rmesa
->hw
.ctx
.cmd
[CTX_PP_MISC
] = (R200_ALPHA_TEST_PASS
1011 /* | R200_RIGHT_HAND_CUBE_OGL*/);
1013 rmesa
->hw
.ctx
.cmd
[CTX_PP_FOG_COLOR
] = (R200_FOG_VERTEX
|
1014 R200_FOG_USE_SPEC_ALPHA
);
1016 rmesa
->hw
.ctx
.cmd
[CTX_RE_SOLID_COLOR
] = 0x00000000;
1018 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_BLENDCNTL
] = (R200_COMB_FCN_ADD_CLAMP
|
1019 (R200_BLEND_GL_ONE
<< R200_SRC_BLEND_SHIFT
) |
1020 (R200_BLEND_GL_ZERO
<< R200_DST_BLEND_SHIFT
));
1022 if (rmesa
->radeon
.radeonScreen
->drmSupportsBlendColor
) {
1023 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_BLENDCOLOR
] = 0x00000000;
1024 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ABLENDCNTL
] = (R200_COMB_FCN_ADD_CLAMP
|
1025 (R200_BLEND_GL_ONE
<< R200_SRC_BLEND_SHIFT
) |
1026 (R200_BLEND_GL_ZERO
<< R200_DST_BLEND_SHIFT
));
1027 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CBLENDCNTL
] = (R200_COMB_FCN_ADD_CLAMP
|
1028 (R200_BLEND_GL_ONE
<< R200_SRC_BLEND_SHIFT
) |
1029 (R200_BLEND_GL_ZERO
<< R200_DST_BLEND_SHIFT
));
1032 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_DEPTHOFFSET
] =
1033 rmesa
->radeon
.radeonScreen
->depthOffset
+ rmesa
->radeon
.radeonScreen
->fbLocation
;
1035 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_DEPTHPITCH
] =
1036 ((rmesa
->radeon
.radeonScreen
->depthPitch
&
1037 R200_DEPTHPITCH_MASK
) |
1038 R200_DEPTH_ENDIAN_NO_SWAP
);
1040 if (rmesa
->using_hyperz
)
1041 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_DEPTHPITCH
] |= R200_DEPTH_HYPERZ
;
1043 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] = (R200_Z_TEST_LESS
|
1044 R200_STENCIL_TEST_ALWAYS
|
1045 R200_STENCIL_FAIL_KEEP
|
1046 R200_STENCIL_ZPASS_KEEP
|
1047 R200_STENCIL_ZFAIL_KEEP
|
1048 R200_Z_WRITE_ENABLE
);
1050 if (rmesa
->using_hyperz
) {
1051 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= R200_Z_COMPRESSION_ENABLE
|
1052 R200_Z_DECOMPRESSION_ENABLE
;
1053 /* if (rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_R200)
1054 rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_HIERARCHY_ENABLE;*/
1057 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] = (R200_ANTI_ALIAS_NONE
1058 | R200_TEX_BLEND_0_ENABLE
);
1060 switch ( driQueryOptioni( &rmesa
->radeon
.optionCache
, "dither_mode" ) ) {
1061 case DRI_CONF_DITHER_XERRORDIFFRESET
:
1062 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= R200_DITHER_INIT
;
1064 case DRI_CONF_DITHER_ORDERED
:
1065 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= R200_SCALE_DITHER_ENABLE
;
1068 if ( driQueryOptioni( &rmesa
->radeon
.optionCache
, "round_mode" ) ==
1069 DRI_CONF_ROUND_ROUND
)
1070 rmesa
->radeon
.state
.color
.roundEnable
= R200_ROUND_ENABLE
;
1072 rmesa
->radeon
.state
.color
.roundEnable
= 0;
1073 if ( driQueryOptioni (&rmesa
->radeon
.optionCache
, "color_reduction" ) ==
1074 DRI_CONF_COLOR_REDUCTION_DITHER
)
1075 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= R200_DITHER_ENABLE
;
1077 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= rmesa
->radeon
.state
.color
.roundEnable
;
1079 rmesa
->hw
.prf
.cmd
[PRF_PP_TRI_PERF
] = R200_TRI_CUTOFF_MASK
- R200_TRI_CUTOFF_MASK
*
1080 driQueryOptionf (&rmesa
->radeon
.optionCache
,"texture_blend_quality");
1081 rmesa
->hw
.prf
.cmd
[PRF_PP_PERF_CNTL
] = 0;
1083 rmesa
->hw
.set
.cmd
[SET_SE_CNTL
] = (R200_FFACE_CULL_CCW
|
1086 R200_FLAT_SHADE_VTX_LAST
|
1087 R200_DIFFUSE_SHADE_GOURAUD
|
1088 R200_ALPHA_SHADE_GOURAUD
|
1089 R200_SPECULAR_SHADE_GOURAUD
|
1090 R200_FOG_SHADE_GOURAUD
|
1091 R200_DISC_FOG_SHADE_GOURAUD
|
1092 R200_VTX_PIX_CENTER_OGL
|
1093 R200_ROUND_MODE_TRUNC
|
1094 R200_ROUND_PREC_8TH_PIX
);
1096 rmesa
->hw
.set
.cmd
[SET_RE_CNTL
] = (R200_PERSPECTIVE_ENABLE
|
1097 R200_SCISSOR_ENABLE
);
1099 rmesa
->hw
.lin
.cmd
[LIN_RE_LINE_PATTERN
] = ((1 << 16) | 0xffff);
1101 rmesa
->hw
.lin
.cmd
[LIN_RE_LINE_STATE
] =
1102 ((0 << R200_LINE_CURRENT_PTR_SHIFT
) |
1103 (1 << R200_LINE_CURRENT_COUNT_SHIFT
));
1105 rmesa
->hw
.lin
.cmd
[LIN_SE_LINE_WIDTH
] = (1 << 4);
1107 rmesa
->hw
.msk
.cmd
[MSK_RB3D_STENCILREFMASK
] =
1108 ((0x00 << R200_STENCIL_REF_SHIFT
) |
1109 (0xff << R200_STENCIL_MASK_SHIFT
) |
1110 (0xff << R200_STENCIL_WRITEMASK_SHIFT
));
1112 rmesa
->hw
.msk
.cmd
[MSK_RB3D_ROPCNTL
] = R200_ROP_COPY
;
1113 rmesa
->hw
.msk
.cmd
[MSK_RB3D_PLANEMASK
] = 0xffffffff;
1115 rmesa
->hw
.tam
.cmd
[TAM_DEBUG3
] = 0;
1117 rmesa
->hw
.msc
.cmd
[MSC_RE_MISC
] =
1118 ((0 << R200_STIPPLE_X_OFFSET_SHIFT
) |
1119 (0 << R200_STIPPLE_Y_OFFSET_SHIFT
) |
1120 R200_STIPPLE_BIG_BIT_ORDER
);
1123 rmesa
->hw
.cst
.cmd
[CST_PP_CNTL_X
] = 0;
1124 rmesa
->hw
.cst
.cmd
[CST_RB3D_DEPTHXY_OFFSET
] = 0;
1125 rmesa
->hw
.cst
.cmd
[CST_RE_AUX_SCISSOR_CNTL
] = 0x0;
1126 rmesa
->hw
.cst
.cmd
[CST_RE_SCISSOR_TL_0
] = 0;
1127 rmesa
->hw
.cst
.cmd
[CST_RE_SCISSOR_BR_0
] = 0;
1128 rmesa
->hw
.cst
.cmd
[CST_SE_VAP_CNTL_STATUS
] =
1129 #ifdef MESA_BIG_ENDIAN
1135 if (!(rmesa
->radeon
.radeonScreen
->chip_flags
& RADEON_CHIPSET_TCL
)) {
1137 rmesa
->hw
.cst
.cmd
[CST_SE_VAP_CNTL_STATUS
] |= (1<<8);
1140 rmesa
->hw
.cst
.cmd
[CST_RE_POINTSIZE
] =
1141 (((GLuint
)(ctx
->Const
.MaxPointSize
* 16.0)) << R200_MAXPOINTSIZE_SHIFT
) | 0x10;
1142 rmesa
->hw
.cst
.cmd
[CST_SE_TCL_INPUT_VTX_0
] =
1143 (0x0 << R200_VERTEX_POSITION_ADDR__SHIFT
);
1144 rmesa
->hw
.cst
.cmd
[CST_SE_TCL_INPUT_VTX_1
] =
1145 (0x02 << R200_VTX_COLOR_0_ADDR__SHIFT
) |
1146 (0x03 << R200_VTX_COLOR_1_ADDR__SHIFT
);
1147 rmesa
->hw
.cst
.cmd
[CST_SE_TCL_INPUT_VTX_2
] =
1148 (0x06 << R200_VTX_TEX_0_ADDR__SHIFT
) |
1149 (0x07 << R200_VTX_TEX_1_ADDR__SHIFT
) |
1150 (0x08 << R200_VTX_TEX_2_ADDR__SHIFT
) |
1151 (0x09 << R200_VTX_TEX_3_ADDR__SHIFT
);
1152 rmesa
->hw
.cst
.cmd
[CST_SE_TCL_INPUT_VTX_3
] =
1153 (0x0A << R200_VTX_TEX_4_ADDR__SHIFT
) |
1154 (0x0B << R200_VTX_TEX_5_ADDR__SHIFT
);
1157 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_XSCALE
] = 0x00000000;
1158 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_XOFFSET
] = 0x00000000;
1159 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_YSCALE
] = 0x00000000;
1160 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_YOFFSET
] = 0x00000000;
1161 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_ZSCALE
] = 0x00000000;
1162 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_ZOFFSET
] = 0x00000000;
1164 for ( i
= 0 ; i
< ctx
->Const
.MaxTextureUnits
; i
++ ) {
1165 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXFILTER
] = R200_BORDER_MODE_OGL
;
1166 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXFORMAT
] =
1167 ((i
<< R200_TXFORMAT_ST_ROUTE_SHIFT
) | /* <-- note i */
1168 (2 << R200_TXFORMAT_WIDTH_SHIFT
) |
1169 (2 << R200_TXFORMAT_HEIGHT_SHIFT
));
1170 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_BORDER_COLOR
] = 0;
1171 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXFORMAT_X
] =
1172 (/* R200_TEXCOORD_PROJ | */
1173 0x100000); /* Small default bias */
1174 if (rmesa
->radeon
.radeonScreen
->drmSupportsFragShader
) {
1175 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXOFFSET_NEWDRM
] =
1176 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1177 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_CUBIC_FACES
] = 0;
1178 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXMULTI_CTL
] = 0;
1181 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXOFFSET_OLDDRM
] =
1182 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1185 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_FACES
] = 0;
1186 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F1
] =
1187 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1188 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F2
] =
1189 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1190 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F3
] =
1191 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1192 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F4
] =
1193 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1194 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F5
] =
1195 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1197 rmesa
->hw
.pix
[i
].cmd
[PIX_PP_TXCBLEND
] =
1198 (R200_TXC_ARG_A_ZERO
|
1199 R200_TXC_ARG_B_ZERO
|
1200 R200_TXC_ARG_C_DIFFUSE_COLOR
|
1203 rmesa
->hw
.pix
[i
].cmd
[PIX_PP_TXCBLEND2
] =
1204 ((i
<< R200_TXC_TFACTOR_SEL_SHIFT
) |
1206 R200_TXC_CLAMP_0_1
|
1207 R200_TXC_OUTPUT_REG_R0
);
1209 rmesa
->hw
.pix
[i
].cmd
[PIX_PP_TXABLEND
] =
1210 (R200_TXA_ARG_A_ZERO
|
1211 R200_TXA_ARG_B_ZERO
|
1212 R200_TXA_ARG_C_DIFFUSE_ALPHA
|
1215 rmesa
->hw
.pix
[i
].cmd
[PIX_PP_TXABLEND2
] =
1216 ((i
<< R200_TXA_TFACTOR_SEL_SHIFT
) |
1218 R200_TXA_CLAMP_0_1
|
1219 R200_TXA_OUTPUT_REG_R0
);
1222 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_0
] = 0;
1223 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_1
] = 0;
1224 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_2
] = 0;
1225 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_3
] = 0;
1226 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_4
] = 0;
1227 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_5
] = 0;
1229 rmesa
->hw
.vap
.cmd
[VAP_SE_VAP_CNTL
] =
1230 (R200_VAP_TCL_ENABLE
|
1231 (0x9 << R200_VAP_VF_MAX_VTX_NUM__SHIFT
));
1233 rmesa
->hw
.vte
.cmd
[VTE_SE_VTE_CNTL
] =
1234 (R200_VPORT_X_SCALE_ENA
|
1235 R200_VPORT_Y_SCALE_ENA
|
1236 R200_VPORT_Z_SCALE_ENA
|
1237 R200_VPORT_X_OFFSET_ENA
|
1238 R200_VPORT_Y_OFFSET_ENA
|
1239 R200_VPORT_Z_OFFSET_ENA
|
1240 /* FIXME: Turn on for tex rect only */
1241 R200_VTX_ST_DENORMALIZED
|
1245 rmesa
->hw
.vtx
.cmd
[VTX_VTXFMT_0
] = 0;
1246 rmesa
->hw
.vtx
.cmd
[VTX_VTXFMT_1
] = 0;
1247 rmesa
->hw
.vtx
.cmd
[VTX_TCL_OUTPUT_VTXFMT_0
] =
1248 ((R200_VTX_Z0
| R200_VTX_W0
|
1249 (R200_VTX_FP_RGBA
<< R200_VTX_COLOR_0_SHIFT
)));
1250 rmesa
->hw
.vtx
.cmd
[VTX_TCL_OUTPUT_VTXFMT_1
] = 0;
1251 rmesa
->hw
.vtx
.cmd
[VTX_TCL_OUTPUT_COMPSEL
] = (R200_OUTPUT_XYZW
);
1252 rmesa
->hw
.vtx
.cmd
[VTX_STATE_CNTL
] = R200_VSC_UPDATE_USER_COLOR_0_ENABLE
;
1255 /* Matrix selection */
1256 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_0
] =
1257 (R200_MTX_MV
<< R200_MODELVIEW_0_SHIFT
);
1259 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_1
] =
1260 (R200_MTX_IMV
<< R200_IT_MODELVIEW_0_SHIFT
);
1262 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_2
] =
1263 (R200_MTX_MVP
<< R200_MODELPROJECT_0_SHIFT
);
1265 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_3
] =
1266 ((R200_MTX_TEX0
<< R200_TEXMAT_0_SHIFT
) |
1267 (R200_MTX_TEX1
<< R200_TEXMAT_1_SHIFT
) |
1268 (R200_MTX_TEX2
<< R200_TEXMAT_2_SHIFT
) |
1269 (R200_MTX_TEX3
<< R200_TEXMAT_3_SHIFT
));
1271 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_4
] =
1272 ((R200_MTX_TEX4
<< R200_TEXMAT_4_SHIFT
) |
1273 (R200_MTX_TEX5
<< R200_TEXMAT_5_SHIFT
));
1276 /* General TCL state */
1277 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL_0
] =
1278 (R200_SPECULAR_LIGHTS
|
1279 R200_DIFFUSE_SPECULAR_COMBINE
|
1280 R200_LOCAL_LIGHT_VEC_GL
|
1281 R200_LM0_SOURCE_MATERIAL_0
<< R200_FRONT_SHININESS_SOURCE_SHIFT
|
1282 R200_LM0_SOURCE_MATERIAL_1
<< R200_BACK_SHININESS_SOURCE_SHIFT
);
1284 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL_1
] =
1285 ((R200_LM1_SOURCE_MATERIAL_0
<< R200_FRONT_EMISSIVE_SOURCE_SHIFT
) |
1286 (R200_LM1_SOURCE_MATERIAL_0
<< R200_FRONT_AMBIENT_SOURCE_SHIFT
) |
1287 (R200_LM1_SOURCE_MATERIAL_0
<< R200_FRONT_DIFFUSE_SOURCE_SHIFT
) |
1288 (R200_LM1_SOURCE_MATERIAL_0
<< R200_FRONT_SPECULAR_SOURCE_SHIFT
) |
1289 (R200_LM1_SOURCE_MATERIAL_1
<< R200_BACK_EMISSIVE_SOURCE_SHIFT
) |
1290 (R200_LM1_SOURCE_MATERIAL_1
<< R200_BACK_AMBIENT_SOURCE_SHIFT
) |
1291 (R200_LM1_SOURCE_MATERIAL_1
<< R200_BACK_DIFFUSE_SOURCE_SHIFT
) |
1292 (R200_LM1_SOURCE_MATERIAL_1
<< R200_BACK_SPECULAR_SOURCE_SHIFT
));
1294 rmesa
->hw
.tcl
.cmd
[TCL_PER_LIGHT_CTL_0
] = 0; /* filled in via callbacks */
1295 rmesa
->hw
.tcl
.cmd
[TCL_PER_LIGHT_CTL_1
] = 0;
1296 rmesa
->hw
.tcl
.cmd
[TCL_PER_LIGHT_CTL_2
] = 0;
1297 rmesa
->hw
.tcl
.cmd
[TCL_PER_LIGHT_CTL_3
] = 0;
1299 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] =
1300 (R200_UCP_IN_CLIP_SPACE
|
1301 R200_CULL_FRONT_IS_CCW
);
1303 /* Texgen/Texmat state */
1304 rmesa
->hw
.tcg
.cmd
[TCG_TEX_PROC_CTL_2
] = 0x00ffffff;
1305 rmesa
->hw
.tcg
.cmd
[TCG_TEX_PROC_CTL_3
] =
1306 ((0 << R200_TEXGEN_0_INPUT_TEX_SHIFT
) |
1307 (1 << R200_TEXGEN_1_INPUT_TEX_SHIFT
) |
1308 (2 << R200_TEXGEN_2_INPUT_TEX_SHIFT
) |
1309 (3 << R200_TEXGEN_3_INPUT_TEX_SHIFT
) |
1310 (4 << R200_TEXGEN_4_INPUT_TEX_SHIFT
) |
1311 (5 << R200_TEXGEN_5_INPUT_TEX_SHIFT
));
1312 rmesa
->hw
.tcg
.cmd
[TCG_TEX_PROC_CTL_0
] = 0;
1313 rmesa
->hw
.tcg
.cmd
[TCG_TEX_PROC_CTL_1
] =
1314 ((0 << R200_TEXGEN_0_INPUT_SHIFT
) |
1315 (1 << R200_TEXGEN_1_INPUT_SHIFT
) |
1316 (2 << R200_TEXGEN_2_INPUT_SHIFT
) |
1317 (3 << R200_TEXGEN_3_INPUT_SHIFT
) |
1318 (4 << R200_TEXGEN_4_INPUT_SHIFT
) |
1319 (5 << R200_TEXGEN_5_INPUT_SHIFT
));
1320 rmesa
->hw
.tcg
.cmd
[TCG_TEX_CYL_WRAP_CTL
] = 0;
1323 for (i
= 0 ; i
< 8; i
++) {
1324 struct gl_light
*l
= &ctx
->Light
.Light
[i
];
1325 GLenum p
= GL_LIGHT0
+ i
;
1326 *(float *)&(rmesa
->hw
.lit
[i
].cmd
[LIT_RANGE_CUTOFF
]) = FLT_MAX
;
1328 ctx
->Driver
.Lightfv( ctx
, p
, GL_AMBIENT
, l
->Ambient
);
1329 ctx
->Driver
.Lightfv( ctx
, p
, GL_DIFFUSE
, l
->Diffuse
);
1330 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPECULAR
, l
->Specular
);
1331 ctx
->Driver
.Lightfv( ctx
, p
, GL_POSITION
, NULL
);
1332 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPOT_DIRECTION
, NULL
);
1333 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPOT_EXPONENT
, &l
->SpotExponent
);
1334 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPOT_CUTOFF
, &l
->SpotCutoff
);
1335 ctx
->Driver
.Lightfv( ctx
, p
, GL_CONSTANT_ATTENUATION
,
1336 &l
->ConstantAttenuation
);
1337 ctx
->Driver
.Lightfv( ctx
, p
, GL_LINEAR_ATTENUATION
,
1338 &l
->LinearAttenuation
);
1339 ctx
->Driver
.Lightfv( ctx
, p
, GL_QUADRATIC_ATTENUATION
,
1340 &l
->QuadraticAttenuation
);
1341 *(float *)&(rmesa
->hw
.lit
[i
].cmd
[LIT_ATTEN_XXX
]) = 0.0;
1344 ctx
->Driver
.LightModelfv( ctx
, GL_LIGHT_MODEL_AMBIENT
,
1345 ctx
->Light
.Model
.Ambient
);
1347 TNL_CONTEXT(ctx
)->Driver
.NotifyMaterialChange( ctx
);
1349 for (i
= 0 ; i
< 6; i
++) {
1350 ctx
->Driver
.ClipPlane( ctx
, GL_CLIP_PLANE0
+ i
, NULL
);
1353 ctx
->Driver
.Fogfv( ctx
, GL_FOG_MODE
, NULL
);
1354 ctx
->Driver
.Fogfv( ctx
, GL_FOG_DENSITY
, &ctx
->Fog
.Density
);
1355 ctx
->Driver
.Fogfv( ctx
, GL_FOG_START
, &ctx
->Fog
.Start
);
1356 ctx
->Driver
.Fogfv( ctx
, GL_FOG_END
, &ctx
->Fog
.End
);
1357 ctx
->Driver
.Fogfv( ctx
, GL_FOG_COLOR
, ctx
->Fog
.Color
);
1358 ctx
->Driver
.Fogfv( ctx
, GL_FOG_COORDINATE_SOURCE_EXT
, NULL
);
1360 rmesa
->hw
.grd
.cmd
[GRD_VERT_GUARD_CLIP_ADJ
] = IEEE_ONE
;
1361 rmesa
->hw
.grd
.cmd
[GRD_VERT_GUARD_DISCARD_ADJ
] = IEEE_ONE
;
1362 rmesa
->hw
.grd
.cmd
[GRD_HORZ_GUARD_CLIP_ADJ
] = IEEE_ONE
;
1363 rmesa
->hw
.grd
.cmd
[GRD_HORZ_GUARD_DISCARD_ADJ
] = IEEE_ONE
;
1365 rmesa
->hw
.eye
.cmd
[EYE_X
] = 0;
1366 rmesa
->hw
.eye
.cmd
[EYE_Y
] = 0;
1367 rmesa
->hw
.eye
.cmd
[EYE_Z
] = IEEE_ONE
;
1368 rmesa
->hw
.eye
.cmd
[EYE_RESCALE_FACTOR
] = IEEE_ONE
;
1370 rmesa
->hw
.spr
.cmd
[SPR_POINT_SPRITE_CNTL
] =
1371 R200_PS_SE_SEL_STATE
| R200_PS_MULT_CONST
;
1373 /* ptp_eye is presumably used to calculate the attenuation wrt a different
1374 location? In any case, since point attenuation triggers _needeyecoords,
1375 it is constant. Probably ignored as long as R200_PS_USE_MODEL_EYE_VEC
1377 rmesa
->hw
.ptp
.cmd
[PTP_EYE_X
] = 0;
1378 rmesa
->hw
.ptp
.cmd
[PTP_EYE_Y
] = 0;
1379 rmesa
->hw
.ptp
.cmd
[PTP_EYE_Z
] = IEEE_ONE
| 0x80000000; /* -1.0 */
1380 rmesa
->hw
.ptp
.cmd
[PTP_EYE_3
] = 0;
1381 /* no idea what the ptp_vport_scale values are good for, except the
1382 PTSIZE one - hopefully doesn't matter */
1383 rmesa
->hw
.ptp
.cmd
[PTP_VPORT_SCALE_0
] = IEEE_ONE
;
1384 rmesa
->hw
.ptp
.cmd
[PTP_VPORT_SCALE_1
] = IEEE_ONE
;
1385 rmesa
->hw
.ptp
.cmd
[PTP_VPORT_SCALE_PTSIZE
] = IEEE_ONE
;
1386 rmesa
->hw
.ptp
.cmd
[PTP_VPORT_SCALE_3
] = IEEE_ONE
;
1387 rmesa
->hw
.ptp
.cmd
[PTP_ATT_CONST_QUAD
] = 0;
1388 rmesa
->hw
.ptp
.cmd
[PTP_ATT_CONST_LIN
] = 0;
1389 rmesa
->hw
.ptp
.cmd
[PTP_ATT_CONST_CON
] = IEEE_ONE
;
1390 rmesa
->hw
.ptp
.cmd
[PTP_ATT_CONST_3
] = 0;
1391 rmesa
->hw
.ptp
.cmd
[PTP_CLAMP_MIN
] = IEEE_ONE
;
1392 rmesa
->hw
.ptp
.cmd
[PTP_CLAMP_MAX
] = 0x44ffe000; /* 2047 */
1393 rmesa
->hw
.ptp
.cmd
[PTP_CLAMP_2
] = 0;
1394 rmesa
->hw
.ptp
.cmd
[PTP_CLAMP_3
] = 0;
1396 r200LightingSpaceChange( ctx
);
1398 rmesa
->radeon
.hw
.all_dirty
= GL_TRUE
;
1400 rcommonInitCmdBuf(&rmesa
->radeon
);