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 OUT_BATCH_TABLE(atom
->cmd
, 10);
562 if (t
&& t
->mt
&& !t
->image_override
) {
563 if ((ctx
->Texture
.Unit
[i
]._ReallyEnabled
& TEXTURE_CUBE_BIT
)) {
564 lvl
= &t
->mt
->levels
[0];
565 OUT_BATCH_RELOC(lvl
->faces
[5].offset
, t
->mt
->bo
, lvl
->faces
[5].offset
,
566 RADEON_GEM_DOMAIN_GTT
|RADEON_GEM_DOMAIN_VRAM
, 0, 0);
568 OUT_BATCH_RELOC(t
->tile_bits
, t
->mt
->bo
, 0,
569 RADEON_GEM_DOMAIN_GTT
|RADEON_GEM_DOMAIN_VRAM
, 0, 0);
572 /* workaround for old CS mechanism */
573 OUT_BATCH(r200
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
]);
575 OUT_BATCH(t
->override_offset
);
581 static void tex_emit_cs(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
583 r200ContextPtr r200
= R200_CONTEXT(ctx
);
584 BATCH_LOCALS(&r200
->radeon
);
585 uint32_t dwords
= atom
->cmd_size
;
587 radeonTexObj
*t
= r200
->state
.texture
.unit
[i
].texobj
;
588 radeon_mipmap_level
*lvl
;
594 if (!t
->mt
&& !t
->bo
)
602 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
604 OUT_BATCH(CP_PACKET0(R200_PP_TXFILTER_0
+ (24 * i
), 7));
605 OUT_BATCH_TABLE((atom
->cmd
+ 1), 8);
608 OUT_BATCH(CP_PACKET0(R200_PP_TXOFFSET_0
+ (24 * i
), 0));
609 if (t
->mt
&& !t
->image_override
) {
610 if ((ctx
->Texture
.Unit
[i
]._ReallyEnabled
& TEXTURE_CUBE_BIT
)) {
611 lvl
= &t
->mt
->levels
[0];
612 OUT_BATCH_RELOC(lvl
->faces
[5].offset
, t
->mt
->bo
, lvl
->faces
[5].offset
,
613 RADEON_GEM_DOMAIN_GTT
|RADEON_GEM_DOMAIN_VRAM
, 0, 0);
615 OUT_BATCH_RELOC(t
->tile_bits
, t
->mt
->bo
, 0,
616 RADEON_GEM_DOMAIN_GTT
|RADEON_GEM_DOMAIN_VRAM
, 0, 0);
620 OUT_BATCH_RELOC(t
->tile_bits
, t
->bo
, 0,
621 RADEON_GEM_DOMAIN_GTT
|RADEON_GEM_DOMAIN_VRAM
, 0, 0);
628 static void cube_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
630 r200ContextPtr r200
= R200_CONTEXT(ctx
);
631 BATCH_LOCALS(&r200
->radeon
);
632 uint32_t dwords
= atom
->cmd_size
;
634 radeonTexObj
*t
= r200
->state
.texture
.unit
[i
].texobj
;
637 BEGIN_BATCH_NO_AUTOSTATE(dwords
+ (2 * 5));
638 OUT_BATCH_TABLE(atom
->cmd
, 3);
640 if (t
&& !t
->image_override
) {
641 size
= t
->mt
->totalsize
/ 6;
642 OUT_BATCH_RELOC(0, t
->mt
->bo
, size
, RADEON_GEM_DOMAIN_VRAM
, 0, 0);
643 OUT_BATCH_RELOC(0, t
->mt
->bo
, size
* 2, RADEON_GEM_DOMAIN_VRAM
, 0, 0);
644 OUT_BATCH_RELOC(0, t
->mt
->bo
, size
* 3, RADEON_GEM_DOMAIN_VRAM
, 0, 0);
645 OUT_BATCH_RELOC(0, t
->mt
->bo
, size
* 4, RADEON_GEM_DOMAIN_VRAM
, 0, 0);
646 OUT_BATCH_RELOC(0, t
->mt
->bo
, size
* 5, RADEON_GEM_DOMAIN_VRAM
, 0, 0);
651 /* Initialize the context's hardware state.
653 void r200InitState( r200ContextPtr rmesa
)
655 GLcontext
*ctx
= rmesa
->radeon
.glCtx
;
658 rmesa
->radeon
.state
.color
.clear
= 0x00000000;
660 switch ( ctx
->Visual
.depthBits
) {
662 rmesa
->radeon
.state
.depth
.clear
= 0x0000ffff;
663 rmesa
->radeon
.state
.stencil
.clear
= 0x00000000;
667 rmesa
->radeon
.state
.depth
.clear
= 0x00ffffff;
668 rmesa
->radeon
.state
.stencil
.clear
= 0xffff0000;
672 rmesa
->radeon
.Fallback
= 0;
674 rmesa
->radeon
.hw
.max_state_size
= 0;
676 #define ALLOC_STATE( ATOM, CHK, SZ, NM, IDX ) \
678 rmesa->hw.ATOM.cmd_size = SZ; \
679 rmesa->hw.ATOM.cmd = (GLuint *)CALLOC(SZ * sizeof(int)); \
680 rmesa->hw.ATOM.lastcmd = (GLuint *)CALLOC(SZ * sizeof(int)); \
681 rmesa->hw.ATOM.name = NM; \
682 rmesa->hw.ATOM.idx = IDX; \
683 rmesa->hw.ATOM.check = check_##CHK; \
684 rmesa->hw.ATOM.dirty = GL_FALSE; \
685 rmesa->radeon.hw.max_state_size += SZ * sizeof(int); \
689 /* Allocate state buffers:
691 if (rmesa
->radeon
.radeonScreen
->drmSupportsBlendColor
)
692 ALLOC_STATE( ctx
, always
, CTX_STATE_SIZE_NEWDRM
, "CTX/context", 0 );
694 ALLOC_STATE( ctx
, always
, CTX_STATE_SIZE_OLDDRM
, "CTX/context", 0 );
696 if (rmesa
->radeon
.radeonScreen
->kernel_mm
)
697 rmesa
->hw
.ctx
.emit
= ctx_emit_cs
;
699 rmesa
->hw
.ctx
.emit
= ctx_emit
;
700 ALLOC_STATE( set
, always
, SET_STATE_SIZE
, "SET/setup", 0 );
701 ALLOC_STATE( lin
, always
, LIN_STATE_SIZE
, "LIN/line", 0 );
702 ALLOC_STATE( msk
, always
, MSK_STATE_SIZE
, "MSK/mask", 0 );
703 ALLOC_STATE( vpt
, always
, VPT_STATE_SIZE
, "VPT/viewport", 0 );
704 ALLOC_STATE( vtx
, always
, VTX_STATE_SIZE
, "VTX/vertex", 0 );
705 ALLOC_STATE( vap
, always
, VAP_STATE_SIZE
, "VAP/vap", 0 );
706 ALLOC_STATE( vte
, always
, VTE_STATE_SIZE
, "VTE/vte", 0 );
707 ALLOC_STATE( msc
, always
, MSC_STATE_SIZE
, "MSC/misc", 0 );
708 ALLOC_STATE( cst
, always
, CST_STATE_SIZE
, "CST/constant", 0 );
709 ALLOC_STATE( zbs
, always
, ZBS_STATE_SIZE
, "ZBS/zbias", 0 );
710 ALLOC_STATE( tf
, tf
, TF_STATE_SIZE
, "TF/tfactor", 0 );
711 if (rmesa
->radeon
.radeonScreen
->drmSupportsFragShader
) {
712 if (rmesa
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_R200
) {
713 /* make sure texture units 0/1 are emitted pair-wise for r200 t0 hang workaround */
714 ALLOC_STATE( tex
[0], tex_pair
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-0", 0 );
715 ALLOC_STATE( tex
[1], tex_pair
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-1", 1 );
716 ALLOC_STATE( tam
, tex_any
, TAM_STATE_SIZE
, "TAM/tam", 0 );
719 ALLOC_STATE( tex
[0], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-0", 0 );
720 ALLOC_STATE( tex
[1], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-1", 1 );
721 ALLOC_STATE( tam
, never
, TAM_STATE_SIZE
, "TAM/tam", 0 );
723 ALLOC_STATE( tex
[2], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-2", 2 );
724 ALLOC_STATE( tex
[3], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-3", 3 );
725 ALLOC_STATE( tex
[4], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-4", 4 );
726 ALLOC_STATE( tex
[5], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-5", 5 );
727 ALLOC_STATE( atf
, afs
, ATF_STATE_SIZE
, "ATF/tfactor", 0 );
728 ALLOC_STATE( afs
[0], afs_pass1
, AFS_STATE_SIZE
, "AFS/afsinst-0", 0 );
729 ALLOC_STATE( afs
[1], afs
, AFS_STATE_SIZE
, "AFS/afsinst-1", 1 );
732 if (rmesa
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_R200
) {
733 ALLOC_STATE( tex
[0], tex_pair
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-0", 0 );
734 ALLOC_STATE( tex
[1], tex_pair
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-1", 1 );
735 ALLOC_STATE( tam
, tex_any
, TAM_STATE_SIZE
, "TAM/tam", 0 );
738 ALLOC_STATE( tex
[0], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-0", 0 );
739 ALLOC_STATE( tex
[1], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-1", 1 );
740 ALLOC_STATE( tam
, never
, TAM_STATE_SIZE
, "TAM/tam", 0 );
742 ALLOC_STATE( tex
[2], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-2", 2 );
743 ALLOC_STATE( tex
[3], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-3", 3 );
744 ALLOC_STATE( tex
[4], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-4", 4 );
745 ALLOC_STATE( tex
[5], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-5", 5 );
746 ALLOC_STATE( atf
, never
, ATF_STATE_SIZE
, "TF/tfactor", 0 );
747 ALLOC_STATE( afs
[0], never
, AFS_STATE_SIZE
, "AFS/afsinst-0", 0 );
748 ALLOC_STATE( afs
[1], never
, AFS_STATE_SIZE
, "AFS/afsinst-1", 1 );
751 for (i
= 0; i
< 5; i
++)
752 if (rmesa
->radeon
.radeonScreen
->kernel_mm
)
753 rmesa
->hw
.tex
[i
].emit
= tex_emit_cs
;
755 rmesa
->hw
.tex
[i
].emit
= tex_emit
;
756 if (rmesa
->radeon
.radeonScreen
->drmSupportsCubeMapsR200
) {
757 ALLOC_STATE( cube
[0], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-0", 0 );
758 ALLOC_STATE( cube
[1], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-1", 1 );
759 ALLOC_STATE( cube
[2], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-2", 2 );
760 ALLOC_STATE( cube
[3], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-3", 3 );
761 ALLOC_STATE( cube
[4], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-4", 4 );
762 ALLOC_STATE( cube
[5], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-5", 5 );
763 for (i
= 0; i
< 5; i
++)
764 rmesa
->hw
.cube
[i
].emit
= cube_emit
;
767 ALLOC_STATE( cube
[0], never
, CUBE_STATE_SIZE
, "CUBE/tex-0", 0 );
768 ALLOC_STATE( cube
[1], never
, CUBE_STATE_SIZE
, "CUBE/tex-1", 1 );
769 ALLOC_STATE( cube
[2], never
, CUBE_STATE_SIZE
, "CUBE/tex-2", 2 );
770 ALLOC_STATE( cube
[3], never
, CUBE_STATE_SIZE
, "CUBE/tex-3", 3 );
771 ALLOC_STATE( cube
[4], never
, CUBE_STATE_SIZE
, "CUBE/tex-4", 4 );
772 ALLOC_STATE( cube
[5], never
, CUBE_STATE_SIZE
, "CUBE/tex-5", 5 );
775 if (rmesa
->radeon
.radeonScreen
->drmSupportsVertexProgram
) {
776 ALLOC_STATE( pvs
, tcl_vp
, PVS_STATE_SIZE
, "PVS/pvscntl", 0 );
777 ALLOC_STATE( vpi
[0], tcl_vp
, VPI_STATE_SIZE
, "VP/vertexprog-0", 0 );
778 ALLOC_STATE( vpi
[1], tcl_vp_size
, VPI_STATE_SIZE
, "VP/vertexprog-1", 1 );
779 ALLOC_STATE( vpp
[0], tcl_vp
, VPP_STATE_SIZE
, "VPP/vertexparam-0", 0 );
780 ALLOC_STATE( vpp
[1], tcl_vpp_size
, VPP_STATE_SIZE
, "VPP/vertexparam-1", 1 );
783 ALLOC_STATE( pvs
, never
, PVS_STATE_SIZE
, "PVS/pvscntl", 0 );
784 ALLOC_STATE( vpi
[0], never
, VPI_STATE_SIZE
, "VP/vertexprog-0", 0 );
785 ALLOC_STATE( vpi
[1], never
, VPI_STATE_SIZE
, "VP/vertexprog-1", 1 );
786 ALLOC_STATE( vpp
[0], never
, VPP_STATE_SIZE
, "VPP/vertexparam-0", 0 );
787 ALLOC_STATE( vpp
[1], never
, VPP_STATE_SIZE
, "VPP/vertexparam-1", 1 );
789 /* FIXME: this atom has two commands, we need only one (ucp_vert_blend) for vp */
790 ALLOC_STATE( tcl
, tcl_or_vp
, TCL_STATE_SIZE
, "TCL/tcl", 0 );
791 ALLOC_STATE( msl
, tcl
, MSL_STATE_SIZE
, "MSL/matrix-select", 0 );
792 ALLOC_STATE( tcg
, tcl
, TCG_STATE_SIZE
, "TCG/texcoordgen", 0 );
793 ALLOC_STATE( mtl
[0], tcl_lighting
, MTL_STATE_SIZE
, "MTL0/material0", 0 );
794 ALLOC_STATE( mtl
[1], tcl_lighting
, MTL_STATE_SIZE
, "MTL1/material1", 1 );
795 ALLOC_STATE( grd
, tcl_or_vp
, GRD_STATE_SIZE
, "GRD/guard-band", 0 );
796 ALLOC_STATE( fog
, tcl_fog
, FOG_STATE_SIZE
, "FOG/fog", 0 );
797 ALLOC_STATE( glt
, tcl_lighting
, GLT_STATE_SIZE
, "GLT/light-global", 0 );
798 ALLOC_STATE( eye
, tcl_lighting
, EYE_STATE_SIZE
, "EYE/eye-vector", 0 );
799 ALLOC_STATE( mat
[R200_MTX_MV
], tcl
, MAT_STATE_SIZE
, "MAT/modelview", 0 );
800 ALLOC_STATE( mat
[R200_MTX_IMV
], tcl
, MAT_STATE_SIZE
, "MAT/it-modelview", 0 );
801 ALLOC_STATE( mat
[R200_MTX_MVP
], tcl
, MAT_STATE_SIZE
, "MAT/modelproject", 0 );
802 ALLOC_STATE( mat
[R200_MTX_TEX0
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat0", 0 );
803 ALLOC_STATE( mat
[R200_MTX_TEX1
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat1", 1 );
804 ALLOC_STATE( mat
[R200_MTX_TEX2
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat2", 2 );
805 ALLOC_STATE( mat
[R200_MTX_TEX3
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat3", 3 );
806 ALLOC_STATE( mat
[R200_MTX_TEX4
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat4", 4 );
807 ALLOC_STATE( mat
[R200_MTX_TEX5
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat5", 5 );
808 ALLOC_STATE( ucp
[0], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-0", 0 );
809 ALLOC_STATE( ucp
[1], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-1", 1 );
810 ALLOC_STATE( ucp
[2], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-2", 2 );
811 ALLOC_STATE( ucp
[3], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-3", 3 );
812 ALLOC_STATE( ucp
[4], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-4", 4 );
813 ALLOC_STATE( ucp
[5], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-5", 5 );
814 ALLOC_STATE( lit
[0], tcl_light
, LIT_STATE_SIZE
, "LIT/light-0", 0 );
815 ALLOC_STATE( lit
[1], tcl_light
, LIT_STATE_SIZE
, "LIT/light-1", 1 );
816 ALLOC_STATE( lit
[2], tcl_light
, LIT_STATE_SIZE
, "LIT/light-2", 2 );
817 ALLOC_STATE( lit
[3], tcl_light
, LIT_STATE_SIZE
, "LIT/light-3", 3 );
818 ALLOC_STATE( lit
[4], tcl_light
, LIT_STATE_SIZE
, "LIT/light-4", 4 );
819 ALLOC_STATE( lit
[5], tcl_light
, LIT_STATE_SIZE
, "LIT/light-5", 5 );
820 ALLOC_STATE( lit
[6], tcl_light
, LIT_STATE_SIZE
, "LIT/light-6", 6 );
821 ALLOC_STATE( lit
[7], tcl_light
, LIT_STATE_SIZE
, "LIT/light-7", 7 );
822 ALLOC_STATE( pix
[0], pix_zero
, PIX_STATE_SIZE
, "PIX/pixstage-0", 0 );
823 ALLOC_STATE( pix
[1], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-1", 1 );
824 ALLOC_STATE( pix
[2], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-2", 2 );
825 ALLOC_STATE( pix
[3], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-3", 3 );
826 ALLOC_STATE( pix
[4], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-4", 4 );
827 ALLOC_STATE( pix
[5], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-5", 5 );
828 if (rmesa
->radeon
.radeonScreen
->drmSupportsTriPerf
) {
829 ALLOC_STATE( prf
, always
, PRF_STATE_SIZE
, "PRF/performance-tri", 0 );
832 ALLOC_STATE( prf
, never
, PRF_STATE_SIZE
, "PRF/performance-tri", 0 );
834 if (rmesa
->radeon
.radeonScreen
->drmSupportsPointSprites
) {
835 ALLOC_STATE( spr
, always
, SPR_STATE_SIZE
, "SPR/pointsprite", 0 );
836 ALLOC_STATE( ptp
, tcl
, PTP_STATE_SIZE
, "PTP/pointparams", 0 );
839 ALLOC_STATE (spr
, never
, SPR_STATE_SIZE
, "SPR/pointsprite", 0 );
840 ALLOC_STATE (ptp
, never
, PTP_STATE_SIZE
, "PTP/pointparams", 0 );
843 r200SetUpAtomList( rmesa
);
845 /* Fill in the packet headers:
847 rmesa
->hw
.ctx
.cmd
[CTX_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_PP_MISC
);
848 rmesa
->hw
.ctx
.cmd
[CTX_CMD_1
] = cmdpkt(rmesa
, RADEON_EMIT_PP_CNTL
);
849 rmesa
->hw
.ctx
.cmd
[CTX_CMD_2
] = cmdpkt(rmesa
, RADEON_EMIT_RB3D_COLORPITCH
);
850 if (rmesa
->radeon
.radeonScreen
->drmSupportsBlendColor
)
851 rmesa
->hw
.ctx
.cmd
[CTX_CMD_3
] = cmdpkt(rmesa
, R200_EMIT_RB3D_BLENDCOLOR
);
852 rmesa
->hw
.lin
.cmd
[LIN_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_RE_LINE_PATTERN
);
853 rmesa
->hw
.lin
.cmd
[LIN_CMD_1
] = cmdpkt(rmesa
, RADEON_EMIT_SE_LINE_WIDTH
);
854 rmesa
->hw
.msk
.cmd
[MSK_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_RB3D_STENCILREFMASK
);
855 rmesa
->hw
.vpt
.cmd
[VPT_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_SE_VPORT_XSCALE
);
856 rmesa
->hw
.set
.cmd
[SET_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_SE_CNTL
);
857 rmesa
->hw
.msc
.cmd
[MSC_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_RE_MISC
);
858 rmesa
->hw
.cst
.cmd
[CST_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CNTL_X
);
859 rmesa
->hw
.cst
.cmd
[CST_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_RB3D_DEPTHXY_OFFSET
);
860 rmesa
->hw
.cst
.cmd
[CST_CMD_2
] = cmdpkt(rmesa
, R200_EMIT_RE_AUX_SCISSOR_CNTL
);
861 rmesa
->hw
.cst
.cmd
[CST_CMD_3
] = cmdpkt(rmesa
, R200_EMIT_RE_SCISSOR_TL_0
);
862 rmesa
->hw
.cst
.cmd
[CST_CMD_4
] = cmdpkt(rmesa
, R200_EMIT_SE_VAP_CNTL_STATUS
);
863 rmesa
->hw
.cst
.cmd
[CST_CMD_5
] = cmdpkt(rmesa
, R200_EMIT_RE_POINTSIZE
);
864 rmesa
->hw
.cst
.cmd
[CST_CMD_6
] = cmdpkt(rmesa
, R200_EMIT_TCL_INPUT_VTX_VECTOR_ADDR_0
);
865 rmesa
->hw
.tam
.cmd
[TAM_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TAM_DEBUG3
);
866 rmesa
->hw
.tf
.cmd
[TF_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_TFACTOR_0
);
867 if (rmesa
->radeon
.radeonScreen
->drmSupportsFragShader
) {
868 rmesa
->hw
.atf
.cmd
[ATF_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_ATF_TFACTOR
);
869 rmesa
->hw
.tex
[0].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCTLALL_0
);
870 rmesa
->hw
.tex
[0].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_0
);
871 rmesa
->hw
.tex
[1].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCTLALL_1
);
872 rmesa
->hw
.tex
[1].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_1
);
873 rmesa
->hw
.tex
[2].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCTLALL_2
);
874 rmesa
->hw
.tex
[2].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_2
);
875 rmesa
->hw
.tex
[3].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCTLALL_3
);
876 rmesa
->hw
.tex
[3].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_3
);
877 rmesa
->hw
.tex
[4].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCTLALL_4
);
878 rmesa
->hw
.tex
[4].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_4
);
879 rmesa
->hw
.tex
[5].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCTLALL_5
);
880 rmesa
->hw
.tex
[5].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_5
);
882 rmesa
->hw
.tex
[0].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXFILTER_0
);
883 rmesa
->hw
.tex
[0].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_0
);
884 rmesa
->hw
.tex
[1].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXFILTER_1
);
885 rmesa
->hw
.tex
[1].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_1
);
886 rmesa
->hw
.tex
[2].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXFILTER_2
);
887 rmesa
->hw
.tex
[2].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_2
);
888 rmesa
->hw
.tex
[3].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXFILTER_3
);
889 rmesa
->hw
.tex
[3].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_3
);
890 rmesa
->hw
.tex
[4].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXFILTER_4
);
891 rmesa
->hw
.tex
[4].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_4
);
892 rmesa
->hw
.tex
[5].cmd
[TEX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXFILTER_5
);
893 rmesa
->hw
.tex
[5].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(rmesa
, R200_EMIT_PP_TXOFFSET_5
);
895 rmesa
->hw
.afs
[0].cmd
[AFS_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_AFS_0
);
896 rmesa
->hw
.afs
[1].cmd
[AFS_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_AFS_1
);
897 rmesa
->hw
.pvs
.cmd
[PVS_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_VAP_PVS_CNTL
);
898 rmesa
->hw
.cube
[0].cmd
[CUBE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_FACES_0
);
899 rmesa
->hw
.cube
[0].cmd
[CUBE_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_OFFSETS_0
);
900 rmesa
->hw
.cube
[1].cmd
[CUBE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_FACES_1
);
901 rmesa
->hw
.cube
[1].cmd
[CUBE_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_OFFSETS_1
);
902 rmesa
->hw
.cube
[2].cmd
[CUBE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_FACES_2
);
903 rmesa
->hw
.cube
[2].cmd
[CUBE_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_OFFSETS_2
);
904 rmesa
->hw
.cube
[3].cmd
[CUBE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_FACES_3
);
905 rmesa
->hw
.cube
[3].cmd
[CUBE_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_OFFSETS_3
);
906 rmesa
->hw
.cube
[4].cmd
[CUBE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_FACES_4
);
907 rmesa
->hw
.cube
[4].cmd
[CUBE_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_OFFSETS_4
);
908 rmesa
->hw
.cube
[5].cmd
[CUBE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_FACES_5
);
909 rmesa
->hw
.cube
[5].cmd
[CUBE_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_PP_CUBIC_OFFSETS_5
);
910 rmesa
->hw
.pix
[0].cmd
[PIX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCBLEND_0
);
911 rmesa
->hw
.pix
[1].cmd
[PIX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCBLEND_1
);
912 rmesa
->hw
.pix
[2].cmd
[PIX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCBLEND_2
);
913 rmesa
->hw
.pix
[3].cmd
[PIX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCBLEND_3
);
914 rmesa
->hw
.pix
[4].cmd
[PIX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCBLEND_4
);
915 rmesa
->hw
.pix
[5].cmd
[PIX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TXCBLEND_5
);
916 rmesa
->hw
.zbs
.cmd
[ZBS_CMD_0
] = cmdpkt(rmesa
, RADEON_EMIT_SE_ZBIAS_FACTOR
);
917 rmesa
->hw
.tcl
.cmd
[TCL_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_TCL_LIGHT_MODEL_CTL_0
);
918 rmesa
->hw
.tcl
.cmd
[TCL_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_TCL_UCP_VERT_BLEND_CTL
);
919 rmesa
->hw
.tcg
.cmd
[TCG_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_TEX_PROC_CTL_2
);
920 rmesa
->hw
.msl
.cmd
[MSL_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_MATRIX_SELECT_0
);
921 rmesa
->hw
.vap
.cmd
[VAP_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_VAP_CTL
);
922 rmesa
->hw
.vtx
.cmd
[VTX_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_VTX_FMT_0
);
923 rmesa
->hw
.vtx
.cmd
[VTX_CMD_1
] = cmdpkt(rmesa
, R200_EMIT_OUTPUT_VTX_COMP_SEL
);
924 rmesa
->hw
.vtx
.cmd
[VTX_CMD_2
] = cmdpkt(rmesa
, R200_EMIT_SE_VTX_STATE_CNTL
);
925 rmesa
->hw
.vte
.cmd
[VTE_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_VTE_CNTL
);
926 rmesa
->hw
.prf
.cmd
[PRF_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_PP_TRI_PERF_CNTL
);
927 rmesa
->hw
.spr
.cmd
[SPR_CMD_0
] = cmdpkt(rmesa
, R200_EMIT_TCL_POINT_SPRITE_CNTL
);
928 if (rmesa
->radeon
.radeonScreen
->kernel_mm
) {
929 rmesa
->hw
.mtl
[0].emit
= mtl_emit
;
930 rmesa
->hw
.mtl
[1].emit
= mtl_emit
;
932 rmesa
->hw
.vpi
[0].emit
= veclinear_emit
;
933 rmesa
->hw
.vpi
[1].emit
= veclinear_emit
;
934 rmesa
->hw
.vpp
[0].emit
= veclinear_emit
;
935 rmesa
->hw
.vpp
[1].emit
= veclinear_emit
;
937 rmesa
->hw
.grd
.emit
= scl_emit
;
938 rmesa
->hw
.fog
.emit
= vec_emit
;
939 rmesa
->hw
.glt
.emit
= vec_emit
;
940 rmesa
->hw
.eye
.emit
= vec_emit
;
942 for (i
= R200_MTX_MV
; i
<= R200_MTX_TEX5
; i
++)
943 rmesa
->hw
.mat
[i
].emit
= vec_emit
;
945 for (i
= 0; i
< 8; i
++)
946 rmesa
->hw
.lit
[i
].emit
= lit_emit
;
948 for (i
= 0; i
< 6; i
++)
949 rmesa
->hw
.ucp
[i
].emit
= vec_emit
;
951 rmesa
->hw
.ptp
.emit
= ptp_emit
;
956 rmesa
->hw
.mtl
[0].cmd
[MTL_CMD_0
] =
957 cmdvec( R200_VS_MAT_0_EMISS
, 1, 16 );
958 rmesa
->hw
.mtl
[0].cmd
[MTL_CMD_1
] =
959 cmdscl2( R200_SS_MAT_0_SHININESS
, 1, 1 );
960 rmesa
->hw
.mtl
[1].cmd
[MTL_CMD_0
] =
961 cmdvec( R200_VS_MAT_1_EMISS
, 1, 16 );
962 rmesa
->hw
.mtl
[1].cmd
[MTL_CMD_1
] =
963 cmdscl2( R200_SS_MAT_1_SHININESS
, 1, 1 );
965 rmesa
->hw
.vpi
[0].cmd
[VPI_CMD_0
] =
966 cmdveclinear( R200_PVS_PROG0
, 64 );
967 rmesa
->hw
.vpi
[1].cmd
[VPI_CMD_0
] =
968 cmdveclinear( R200_PVS_PROG1
, 64 );
969 rmesa
->hw
.vpp
[0].cmd
[VPP_CMD_0
] =
970 cmdveclinear( R200_PVS_PARAM0
, 96 );
971 rmesa
->hw
.vpp
[1].cmd
[VPP_CMD_0
] =
972 cmdveclinear( R200_PVS_PARAM1
, 96 );
974 rmesa
->hw
.grd
.cmd
[GRD_CMD_0
] =
975 cmdscl( R200_SS_VERT_GUARD_CLIP_ADJ_ADDR
, 1, 4 );
976 rmesa
->hw
.fog
.cmd
[FOG_CMD_0
] =
977 cmdvec( R200_VS_FOG_PARAM_ADDR
, 1, 4 );
978 rmesa
->hw
.glt
.cmd
[GLT_CMD_0
] =
979 cmdvec( R200_VS_GLOBAL_AMBIENT_ADDR
, 1, 4 );
980 rmesa
->hw
.eye
.cmd
[EYE_CMD_0
] =
981 cmdvec( R200_VS_EYE_VECTOR_ADDR
, 1, 4 );
983 rmesa
->hw
.mat
[R200_MTX_MV
].cmd
[MAT_CMD_0
] =
984 cmdvec( R200_VS_MATRIX_0_MV
, 1, 16);
985 rmesa
->hw
.mat
[R200_MTX_IMV
].cmd
[MAT_CMD_0
] =
986 cmdvec( R200_VS_MATRIX_1_INV_MV
, 1, 16);
987 rmesa
->hw
.mat
[R200_MTX_MVP
].cmd
[MAT_CMD_0
] =
988 cmdvec( R200_VS_MATRIX_2_MVP
, 1, 16);
989 rmesa
->hw
.mat
[R200_MTX_TEX0
].cmd
[MAT_CMD_0
] =
990 cmdvec( R200_VS_MATRIX_3_TEX0
, 1, 16);
991 rmesa
->hw
.mat
[R200_MTX_TEX1
].cmd
[MAT_CMD_0
] =
992 cmdvec( R200_VS_MATRIX_4_TEX1
, 1, 16);
993 rmesa
->hw
.mat
[R200_MTX_TEX2
].cmd
[MAT_CMD_0
] =
994 cmdvec( R200_VS_MATRIX_5_TEX2
, 1, 16);
995 rmesa
->hw
.mat
[R200_MTX_TEX3
].cmd
[MAT_CMD_0
] =
996 cmdvec( R200_VS_MATRIX_6_TEX3
, 1, 16);
997 rmesa
->hw
.mat
[R200_MTX_TEX4
].cmd
[MAT_CMD_0
] =
998 cmdvec( R200_VS_MATRIX_7_TEX4
, 1, 16);
999 rmesa
->hw
.mat
[R200_MTX_TEX5
].cmd
[MAT_CMD_0
] =
1000 cmdvec( R200_VS_MATRIX_8_TEX5
, 1, 16);
1002 for (i
= 0 ; i
< 8; i
++) {
1003 rmesa
->hw
.lit
[i
].cmd
[LIT_CMD_0
] =
1004 cmdvec( R200_VS_LIGHT_AMBIENT_ADDR
+ i
, 8, 24 );
1005 rmesa
->hw
.lit
[i
].cmd
[LIT_CMD_1
] =
1006 cmdscl( R200_SS_LIGHT_DCD_ADDR
+ i
, 8, 7 );
1009 for (i
= 0 ; i
< 6; i
++) {
1010 rmesa
->hw
.ucp
[i
].cmd
[UCP_CMD_0
] =
1011 cmdvec( R200_VS_UCP_ADDR
+ i
, 1, 4 );
1014 rmesa
->hw
.ptp
.cmd
[PTP_CMD_0
] =
1015 cmdvec( R200_VS_PNT_SPRITE_VPORT_SCALE
, 1, 4 );
1016 rmesa
->hw
.ptp
.cmd
[PTP_CMD_1
] =
1017 cmdvec( R200_VS_PNT_SPRITE_ATT_CONST
, 1, 12 );
1019 /* Initial Harware state:
1021 rmesa
->hw
.ctx
.cmd
[CTX_PP_MISC
] = (R200_ALPHA_TEST_PASS
1022 /* | R200_RIGHT_HAND_CUBE_OGL*/);
1024 rmesa
->hw
.ctx
.cmd
[CTX_PP_FOG_COLOR
] = (R200_FOG_VERTEX
|
1025 R200_FOG_USE_SPEC_ALPHA
);
1027 rmesa
->hw
.ctx
.cmd
[CTX_RE_SOLID_COLOR
] = 0x00000000;
1029 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_BLENDCNTL
] = (R200_COMB_FCN_ADD_CLAMP
|
1030 (R200_BLEND_GL_ONE
<< R200_SRC_BLEND_SHIFT
) |
1031 (R200_BLEND_GL_ZERO
<< R200_DST_BLEND_SHIFT
));
1033 if (rmesa
->radeon
.radeonScreen
->drmSupportsBlendColor
) {
1034 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_BLENDCOLOR
] = 0x00000000;
1035 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ABLENDCNTL
] = (R200_COMB_FCN_ADD_CLAMP
|
1036 (R200_BLEND_GL_ONE
<< R200_SRC_BLEND_SHIFT
) |
1037 (R200_BLEND_GL_ZERO
<< R200_DST_BLEND_SHIFT
));
1038 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CBLENDCNTL
] = (R200_COMB_FCN_ADD_CLAMP
|
1039 (R200_BLEND_GL_ONE
<< R200_SRC_BLEND_SHIFT
) |
1040 (R200_BLEND_GL_ZERO
<< R200_DST_BLEND_SHIFT
));
1043 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_DEPTHOFFSET
] =
1044 rmesa
->radeon
.radeonScreen
->depthOffset
+ rmesa
->radeon
.radeonScreen
->fbLocation
;
1046 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_DEPTHPITCH
] =
1047 ((rmesa
->radeon
.radeonScreen
->depthPitch
&
1048 R200_DEPTHPITCH_MASK
) |
1049 R200_DEPTH_ENDIAN_NO_SWAP
);
1051 if (rmesa
->using_hyperz
)
1052 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_DEPTHPITCH
] |= R200_DEPTH_HYPERZ
;
1054 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] = (R200_Z_TEST_LESS
|
1055 R200_STENCIL_TEST_ALWAYS
|
1056 R200_STENCIL_FAIL_KEEP
|
1057 R200_STENCIL_ZPASS_KEEP
|
1058 R200_STENCIL_ZFAIL_KEEP
|
1059 R200_Z_WRITE_ENABLE
);
1061 if (rmesa
->using_hyperz
) {
1062 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= R200_Z_COMPRESSION_ENABLE
|
1063 R200_Z_DECOMPRESSION_ENABLE
;
1064 /* if (rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_R200)
1065 rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_HIERARCHY_ENABLE;*/
1068 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] = (R200_ANTI_ALIAS_NONE
1069 | R200_TEX_BLEND_0_ENABLE
);
1071 switch ( driQueryOptioni( &rmesa
->radeon
.optionCache
, "dither_mode" ) ) {
1072 case DRI_CONF_DITHER_XERRORDIFFRESET
:
1073 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= R200_DITHER_INIT
;
1075 case DRI_CONF_DITHER_ORDERED
:
1076 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= R200_SCALE_DITHER_ENABLE
;
1079 if ( driQueryOptioni( &rmesa
->radeon
.optionCache
, "round_mode" ) ==
1080 DRI_CONF_ROUND_ROUND
)
1081 rmesa
->radeon
.state
.color
.roundEnable
= R200_ROUND_ENABLE
;
1083 rmesa
->radeon
.state
.color
.roundEnable
= 0;
1084 if ( driQueryOptioni (&rmesa
->radeon
.optionCache
, "color_reduction" ) ==
1085 DRI_CONF_COLOR_REDUCTION_DITHER
)
1086 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= R200_DITHER_ENABLE
;
1088 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= rmesa
->radeon
.state
.color
.roundEnable
;
1090 rmesa
->hw
.prf
.cmd
[PRF_PP_TRI_PERF
] = R200_TRI_CUTOFF_MASK
- R200_TRI_CUTOFF_MASK
*
1091 driQueryOptionf (&rmesa
->radeon
.optionCache
,"texture_blend_quality");
1092 rmesa
->hw
.prf
.cmd
[PRF_PP_PERF_CNTL
] = 0;
1094 rmesa
->hw
.set
.cmd
[SET_SE_CNTL
] = (R200_FFACE_CULL_CCW
|
1097 R200_FLAT_SHADE_VTX_LAST
|
1098 R200_DIFFUSE_SHADE_GOURAUD
|
1099 R200_ALPHA_SHADE_GOURAUD
|
1100 R200_SPECULAR_SHADE_GOURAUD
|
1101 R200_FOG_SHADE_GOURAUD
|
1102 R200_DISC_FOG_SHADE_GOURAUD
|
1103 R200_VTX_PIX_CENTER_OGL
|
1104 R200_ROUND_MODE_TRUNC
|
1105 R200_ROUND_PREC_8TH_PIX
);
1107 rmesa
->hw
.set
.cmd
[SET_RE_CNTL
] = (R200_PERSPECTIVE_ENABLE
|
1108 R200_SCISSOR_ENABLE
);
1110 rmesa
->hw
.lin
.cmd
[LIN_RE_LINE_PATTERN
] = ((1 << 16) | 0xffff);
1112 rmesa
->hw
.lin
.cmd
[LIN_RE_LINE_STATE
] =
1113 ((0 << R200_LINE_CURRENT_PTR_SHIFT
) |
1114 (1 << R200_LINE_CURRENT_COUNT_SHIFT
));
1116 rmesa
->hw
.lin
.cmd
[LIN_SE_LINE_WIDTH
] = (1 << 4);
1118 rmesa
->hw
.msk
.cmd
[MSK_RB3D_STENCILREFMASK
] =
1119 ((0x00 << R200_STENCIL_REF_SHIFT
) |
1120 (0xff << R200_STENCIL_MASK_SHIFT
) |
1121 (0xff << R200_STENCIL_WRITEMASK_SHIFT
));
1123 rmesa
->hw
.msk
.cmd
[MSK_RB3D_ROPCNTL
] = R200_ROP_COPY
;
1124 rmesa
->hw
.msk
.cmd
[MSK_RB3D_PLANEMASK
] = 0xffffffff;
1126 rmesa
->hw
.tam
.cmd
[TAM_DEBUG3
] = 0;
1128 rmesa
->hw
.msc
.cmd
[MSC_RE_MISC
] =
1129 ((0 << R200_STIPPLE_X_OFFSET_SHIFT
) |
1130 (0 << R200_STIPPLE_Y_OFFSET_SHIFT
) |
1131 R200_STIPPLE_BIG_BIT_ORDER
);
1134 rmesa
->hw
.cst
.cmd
[CST_PP_CNTL_X
] = 0;
1135 rmesa
->hw
.cst
.cmd
[CST_RB3D_DEPTHXY_OFFSET
] = 0;
1136 rmesa
->hw
.cst
.cmd
[CST_RE_AUX_SCISSOR_CNTL
] = 0x0;
1137 rmesa
->hw
.cst
.cmd
[CST_RE_SCISSOR_TL_0
] = 0;
1138 rmesa
->hw
.cst
.cmd
[CST_RE_SCISSOR_BR_0
] = 0;
1139 rmesa
->hw
.cst
.cmd
[CST_SE_VAP_CNTL_STATUS
] =
1140 #ifdef MESA_BIG_ENDIAN
1146 if (!(rmesa
->radeon
.radeonScreen
->chip_flags
& RADEON_CHIPSET_TCL
)) {
1148 rmesa
->hw
.cst
.cmd
[CST_SE_VAP_CNTL_STATUS
] |= (1<<8);
1151 rmesa
->hw
.cst
.cmd
[CST_RE_POINTSIZE
] =
1152 (((GLuint
)(ctx
->Const
.MaxPointSize
* 16.0)) << R200_MAXPOINTSIZE_SHIFT
) | 0x10;
1153 rmesa
->hw
.cst
.cmd
[CST_SE_TCL_INPUT_VTX_0
] =
1154 (0x0 << R200_VERTEX_POSITION_ADDR__SHIFT
);
1155 rmesa
->hw
.cst
.cmd
[CST_SE_TCL_INPUT_VTX_1
] =
1156 (0x02 << R200_VTX_COLOR_0_ADDR__SHIFT
) |
1157 (0x03 << R200_VTX_COLOR_1_ADDR__SHIFT
);
1158 rmesa
->hw
.cst
.cmd
[CST_SE_TCL_INPUT_VTX_2
] =
1159 (0x06 << R200_VTX_TEX_0_ADDR__SHIFT
) |
1160 (0x07 << R200_VTX_TEX_1_ADDR__SHIFT
) |
1161 (0x08 << R200_VTX_TEX_2_ADDR__SHIFT
) |
1162 (0x09 << R200_VTX_TEX_3_ADDR__SHIFT
);
1163 rmesa
->hw
.cst
.cmd
[CST_SE_TCL_INPUT_VTX_3
] =
1164 (0x0A << R200_VTX_TEX_4_ADDR__SHIFT
) |
1165 (0x0B << R200_VTX_TEX_5_ADDR__SHIFT
);
1168 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_XSCALE
] = 0x00000000;
1169 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_XOFFSET
] = 0x00000000;
1170 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_YSCALE
] = 0x00000000;
1171 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_YOFFSET
] = 0x00000000;
1172 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_ZSCALE
] = 0x00000000;
1173 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_ZOFFSET
] = 0x00000000;
1175 for ( i
= 0 ; i
< ctx
->Const
.MaxTextureUnits
; i
++ ) {
1176 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXFILTER
] = R200_BORDER_MODE_OGL
;
1177 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXFORMAT
] =
1178 ((i
<< R200_TXFORMAT_ST_ROUTE_SHIFT
) | /* <-- note i */
1179 (2 << R200_TXFORMAT_WIDTH_SHIFT
) |
1180 (2 << R200_TXFORMAT_HEIGHT_SHIFT
));
1181 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_BORDER_COLOR
] = 0;
1182 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXFORMAT_X
] =
1183 (/* R200_TEXCOORD_PROJ | */
1184 0x100000); /* Small default bias */
1185 if (rmesa
->radeon
.radeonScreen
->drmSupportsFragShader
) {
1186 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXOFFSET_NEWDRM
] =
1187 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1188 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_CUBIC_FACES
] = 0;
1189 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXMULTI_CTL
] = 0;
1192 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXOFFSET_OLDDRM
] =
1193 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1196 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_FACES
] = 0;
1197 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F1
] =
1198 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1199 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F2
] =
1200 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1201 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F3
] =
1202 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1203 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F4
] =
1204 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1205 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F5
] =
1206 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
1208 rmesa
->hw
.pix
[i
].cmd
[PIX_PP_TXCBLEND
] =
1209 (R200_TXC_ARG_A_ZERO
|
1210 R200_TXC_ARG_B_ZERO
|
1211 R200_TXC_ARG_C_DIFFUSE_COLOR
|
1214 rmesa
->hw
.pix
[i
].cmd
[PIX_PP_TXCBLEND2
] =
1215 ((i
<< R200_TXC_TFACTOR_SEL_SHIFT
) |
1217 R200_TXC_CLAMP_0_1
|
1218 R200_TXC_OUTPUT_REG_R0
);
1220 rmesa
->hw
.pix
[i
].cmd
[PIX_PP_TXABLEND
] =
1221 (R200_TXA_ARG_A_ZERO
|
1222 R200_TXA_ARG_B_ZERO
|
1223 R200_TXA_ARG_C_DIFFUSE_ALPHA
|
1226 rmesa
->hw
.pix
[i
].cmd
[PIX_PP_TXABLEND2
] =
1227 ((i
<< R200_TXA_TFACTOR_SEL_SHIFT
) |
1229 R200_TXA_CLAMP_0_1
|
1230 R200_TXA_OUTPUT_REG_R0
);
1233 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_0
] = 0;
1234 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_1
] = 0;
1235 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_2
] = 0;
1236 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_3
] = 0;
1237 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_4
] = 0;
1238 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_5
] = 0;
1240 rmesa
->hw
.vap
.cmd
[VAP_SE_VAP_CNTL
] =
1241 (R200_VAP_TCL_ENABLE
|
1242 (0x9 << R200_VAP_VF_MAX_VTX_NUM__SHIFT
));
1244 rmesa
->hw
.vte
.cmd
[VTE_SE_VTE_CNTL
] =
1245 (R200_VPORT_X_SCALE_ENA
|
1246 R200_VPORT_Y_SCALE_ENA
|
1247 R200_VPORT_Z_SCALE_ENA
|
1248 R200_VPORT_X_OFFSET_ENA
|
1249 R200_VPORT_Y_OFFSET_ENA
|
1250 R200_VPORT_Z_OFFSET_ENA
|
1251 /* FIXME: Turn on for tex rect only */
1252 R200_VTX_ST_DENORMALIZED
|
1256 rmesa
->hw
.vtx
.cmd
[VTX_VTXFMT_0
] = 0;
1257 rmesa
->hw
.vtx
.cmd
[VTX_VTXFMT_1
] = 0;
1258 rmesa
->hw
.vtx
.cmd
[VTX_TCL_OUTPUT_VTXFMT_0
] =
1259 ((R200_VTX_Z0
| R200_VTX_W0
|
1260 (R200_VTX_FP_RGBA
<< R200_VTX_COLOR_0_SHIFT
)));
1261 rmesa
->hw
.vtx
.cmd
[VTX_TCL_OUTPUT_VTXFMT_1
] = 0;
1262 rmesa
->hw
.vtx
.cmd
[VTX_TCL_OUTPUT_COMPSEL
] = (R200_OUTPUT_XYZW
);
1263 rmesa
->hw
.vtx
.cmd
[VTX_STATE_CNTL
] = R200_VSC_UPDATE_USER_COLOR_0_ENABLE
;
1266 /* Matrix selection */
1267 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_0
] =
1268 (R200_MTX_MV
<< R200_MODELVIEW_0_SHIFT
);
1270 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_1
] =
1271 (R200_MTX_IMV
<< R200_IT_MODELVIEW_0_SHIFT
);
1273 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_2
] =
1274 (R200_MTX_MVP
<< R200_MODELPROJECT_0_SHIFT
);
1276 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_3
] =
1277 ((R200_MTX_TEX0
<< R200_TEXMAT_0_SHIFT
) |
1278 (R200_MTX_TEX1
<< R200_TEXMAT_1_SHIFT
) |
1279 (R200_MTX_TEX2
<< R200_TEXMAT_2_SHIFT
) |
1280 (R200_MTX_TEX3
<< R200_TEXMAT_3_SHIFT
));
1282 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_4
] =
1283 ((R200_MTX_TEX4
<< R200_TEXMAT_4_SHIFT
) |
1284 (R200_MTX_TEX5
<< R200_TEXMAT_5_SHIFT
));
1287 /* General TCL state */
1288 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL_0
] =
1289 (R200_SPECULAR_LIGHTS
|
1290 R200_DIFFUSE_SPECULAR_COMBINE
|
1291 R200_LOCAL_LIGHT_VEC_GL
|
1292 R200_LM0_SOURCE_MATERIAL_0
<< R200_FRONT_SHININESS_SOURCE_SHIFT
|
1293 R200_LM0_SOURCE_MATERIAL_1
<< R200_BACK_SHININESS_SOURCE_SHIFT
);
1295 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL_1
] =
1296 ((R200_LM1_SOURCE_MATERIAL_0
<< R200_FRONT_EMISSIVE_SOURCE_SHIFT
) |
1297 (R200_LM1_SOURCE_MATERIAL_0
<< R200_FRONT_AMBIENT_SOURCE_SHIFT
) |
1298 (R200_LM1_SOURCE_MATERIAL_0
<< R200_FRONT_DIFFUSE_SOURCE_SHIFT
) |
1299 (R200_LM1_SOURCE_MATERIAL_0
<< R200_FRONT_SPECULAR_SOURCE_SHIFT
) |
1300 (R200_LM1_SOURCE_MATERIAL_1
<< R200_BACK_EMISSIVE_SOURCE_SHIFT
) |
1301 (R200_LM1_SOURCE_MATERIAL_1
<< R200_BACK_AMBIENT_SOURCE_SHIFT
) |
1302 (R200_LM1_SOURCE_MATERIAL_1
<< R200_BACK_DIFFUSE_SOURCE_SHIFT
) |
1303 (R200_LM1_SOURCE_MATERIAL_1
<< R200_BACK_SPECULAR_SOURCE_SHIFT
));
1305 rmesa
->hw
.tcl
.cmd
[TCL_PER_LIGHT_CTL_0
] = 0; /* filled in via callbacks */
1306 rmesa
->hw
.tcl
.cmd
[TCL_PER_LIGHT_CTL_1
] = 0;
1307 rmesa
->hw
.tcl
.cmd
[TCL_PER_LIGHT_CTL_2
] = 0;
1308 rmesa
->hw
.tcl
.cmd
[TCL_PER_LIGHT_CTL_3
] = 0;
1310 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] =
1311 (R200_UCP_IN_CLIP_SPACE
|
1312 R200_CULL_FRONT_IS_CCW
);
1314 /* Texgen/Texmat state */
1315 rmesa
->hw
.tcg
.cmd
[TCG_TEX_PROC_CTL_2
] = 0x00ffffff;
1316 rmesa
->hw
.tcg
.cmd
[TCG_TEX_PROC_CTL_3
] =
1317 ((0 << R200_TEXGEN_0_INPUT_TEX_SHIFT
) |
1318 (1 << R200_TEXGEN_1_INPUT_TEX_SHIFT
) |
1319 (2 << R200_TEXGEN_2_INPUT_TEX_SHIFT
) |
1320 (3 << R200_TEXGEN_3_INPUT_TEX_SHIFT
) |
1321 (4 << R200_TEXGEN_4_INPUT_TEX_SHIFT
) |
1322 (5 << R200_TEXGEN_5_INPUT_TEX_SHIFT
));
1323 rmesa
->hw
.tcg
.cmd
[TCG_TEX_PROC_CTL_0
] = 0;
1324 rmesa
->hw
.tcg
.cmd
[TCG_TEX_PROC_CTL_1
] =
1325 ((0 << R200_TEXGEN_0_INPUT_SHIFT
) |
1326 (1 << R200_TEXGEN_1_INPUT_SHIFT
) |
1327 (2 << R200_TEXGEN_2_INPUT_SHIFT
) |
1328 (3 << R200_TEXGEN_3_INPUT_SHIFT
) |
1329 (4 << R200_TEXGEN_4_INPUT_SHIFT
) |
1330 (5 << R200_TEXGEN_5_INPUT_SHIFT
));
1331 rmesa
->hw
.tcg
.cmd
[TCG_TEX_CYL_WRAP_CTL
] = 0;
1334 for (i
= 0 ; i
< 8; i
++) {
1335 struct gl_light
*l
= &ctx
->Light
.Light
[i
];
1336 GLenum p
= GL_LIGHT0
+ i
;
1337 *(float *)&(rmesa
->hw
.lit
[i
].cmd
[LIT_RANGE_CUTOFF
]) = FLT_MAX
;
1339 ctx
->Driver
.Lightfv( ctx
, p
, GL_AMBIENT
, l
->Ambient
);
1340 ctx
->Driver
.Lightfv( ctx
, p
, GL_DIFFUSE
, l
->Diffuse
);
1341 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPECULAR
, l
->Specular
);
1342 ctx
->Driver
.Lightfv( ctx
, p
, GL_POSITION
, NULL
);
1343 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPOT_DIRECTION
, NULL
);
1344 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPOT_EXPONENT
, &l
->SpotExponent
);
1345 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPOT_CUTOFF
, &l
->SpotCutoff
);
1346 ctx
->Driver
.Lightfv( ctx
, p
, GL_CONSTANT_ATTENUATION
,
1347 &l
->ConstantAttenuation
);
1348 ctx
->Driver
.Lightfv( ctx
, p
, GL_LINEAR_ATTENUATION
,
1349 &l
->LinearAttenuation
);
1350 ctx
->Driver
.Lightfv( ctx
, p
, GL_QUADRATIC_ATTENUATION
,
1351 &l
->QuadraticAttenuation
);
1352 *(float *)&(rmesa
->hw
.lit
[i
].cmd
[LIT_ATTEN_XXX
]) = 0.0;
1355 ctx
->Driver
.LightModelfv( ctx
, GL_LIGHT_MODEL_AMBIENT
,
1356 ctx
->Light
.Model
.Ambient
);
1358 TNL_CONTEXT(ctx
)->Driver
.NotifyMaterialChange( ctx
);
1360 for (i
= 0 ; i
< 6; i
++) {
1361 ctx
->Driver
.ClipPlane( ctx
, GL_CLIP_PLANE0
+ i
, NULL
);
1364 ctx
->Driver
.Fogfv( ctx
, GL_FOG_MODE
, NULL
);
1365 ctx
->Driver
.Fogfv( ctx
, GL_FOG_DENSITY
, &ctx
->Fog
.Density
);
1366 ctx
->Driver
.Fogfv( ctx
, GL_FOG_START
, &ctx
->Fog
.Start
);
1367 ctx
->Driver
.Fogfv( ctx
, GL_FOG_END
, &ctx
->Fog
.End
);
1368 ctx
->Driver
.Fogfv( ctx
, GL_FOG_COLOR
, ctx
->Fog
.Color
);
1369 ctx
->Driver
.Fogfv( ctx
, GL_FOG_COORDINATE_SOURCE_EXT
, NULL
);
1371 rmesa
->hw
.grd
.cmd
[GRD_VERT_GUARD_CLIP_ADJ
] = IEEE_ONE
;
1372 rmesa
->hw
.grd
.cmd
[GRD_VERT_GUARD_DISCARD_ADJ
] = IEEE_ONE
;
1373 rmesa
->hw
.grd
.cmd
[GRD_HORZ_GUARD_CLIP_ADJ
] = IEEE_ONE
;
1374 rmesa
->hw
.grd
.cmd
[GRD_HORZ_GUARD_DISCARD_ADJ
] = IEEE_ONE
;
1376 rmesa
->hw
.eye
.cmd
[EYE_X
] = 0;
1377 rmesa
->hw
.eye
.cmd
[EYE_Y
] = 0;
1378 rmesa
->hw
.eye
.cmd
[EYE_Z
] = IEEE_ONE
;
1379 rmesa
->hw
.eye
.cmd
[EYE_RESCALE_FACTOR
] = IEEE_ONE
;
1381 rmesa
->hw
.spr
.cmd
[SPR_POINT_SPRITE_CNTL
] =
1382 R200_PS_SE_SEL_STATE
| R200_PS_MULT_CONST
;
1384 /* ptp_eye is presumably used to calculate the attenuation wrt a different
1385 location? In any case, since point attenuation triggers _needeyecoords,
1386 it is constant. Probably ignored as long as R200_PS_USE_MODEL_EYE_VEC
1388 rmesa
->hw
.ptp
.cmd
[PTP_EYE_X
] = 0;
1389 rmesa
->hw
.ptp
.cmd
[PTP_EYE_Y
] = 0;
1390 rmesa
->hw
.ptp
.cmd
[PTP_EYE_Z
] = IEEE_ONE
| 0x80000000; /* -1.0 */
1391 rmesa
->hw
.ptp
.cmd
[PTP_EYE_3
] = 0;
1392 /* no idea what the ptp_vport_scale values are good for, except the
1393 PTSIZE one - hopefully doesn't matter */
1394 rmesa
->hw
.ptp
.cmd
[PTP_VPORT_SCALE_0
] = IEEE_ONE
;
1395 rmesa
->hw
.ptp
.cmd
[PTP_VPORT_SCALE_1
] = IEEE_ONE
;
1396 rmesa
->hw
.ptp
.cmd
[PTP_VPORT_SCALE_PTSIZE
] = IEEE_ONE
;
1397 rmesa
->hw
.ptp
.cmd
[PTP_VPORT_SCALE_3
] = IEEE_ONE
;
1398 rmesa
->hw
.ptp
.cmd
[PTP_ATT_CONST_QUAD
] = 0;
1399 rmesa
->hw
.ptp
.cmd
[PTP_ATT_CONST_LIN
] = 0;
1400 rmesa
->hw
.ptp
.cmd
[PTP_ATT_CONST_CON
] = IEEE_ONE
;
1401 rmesa
->hw
.ptp
.cmd
[PTP_ATT_CONST_3
] = 0;
1402 rmesa
->hw
.ptp
.cmd
[PTP_CLAMP_MIN
] = IEEE_ONE
;
1403 rmesa
->hw
.ptp
.cmd
[PTP_CLAMP_MAX
] = 0x44ffe000; /* 2047 */
1404 rmesa
->hw
.ptp
.cmd
[PTP_CLAMP_2
] = 0;
1405 rmesa
->hw
.ptp
.cmd
[PTP_CLAMP_3
] = 0;
1407 r200LightingSpaceChange( ctx
);
1409 rmesa
->radeon
.hw
.all_dirty
= GL_TRUE
;
1411 rcommonInitCmdBuf(&rmesa
->radeon
);