Fixed off by one errors in clipping.
[mesa.git] / src / mesa / drivers / dri / r200 / r200_state_init.c
1 /* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_state_init.c,v 1.4 2003/02/22 06:21:11 dawes Exp $ */
2 /*
3 Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
4
5 The Weather Channel (TM) funded Tungsten Graphics to develop the
6 initial release of the Radeon 8500 driver under the XFree86 license.
7 This notice must be preserved.
8
9 Permission is hereby granted, free of charge, to any person obtaining
10 a copy of this software and associated documentation files (the
11 "Software"), to deal in the Software without restriction, including
12 without limitation the rights to use, copy, modify, merge, publish,
13 distribute, sublicense, and/or sell copies of the Software, and to
14 permit persons to whom the Software is furnished to do so, subject to
15 the following conditions:
16
17 The above copyright notice and this permission notice (including the
18 next paragraph) shall be included in all copies or substantial
19 portions of the Software.
20
21 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
24 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
25 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 */
29
30 /*
31 * Authors:
32 * Keith Whitwell <keith@tungstengraphics.com>
33 */
34
35 #include "glheader.h"
36 #include "imports.h"
37 #include "enums.h"
38 #include "colormac.h"
39 #include "api_arrayelt.h"
40
41 #include "swrast/swrast.h"
42 #include "array_cache/acache.h"
43 #include "tnl/tnl.h"
44 #include "tnl/t_pipeline.h"
45 #include "swrast_setup/swrast_setup.h"
46
47 #include "r200_context.h"
48 #include "r200_ioctl.h"
49 #include "r200_state.h"
50 #include "r200_tcl.h"
51 #include "r200_tex.h"
52 #include "r200_swtcl.h"
53 #include "r200_vtxfmt.h"
54
55 #include "xmlpool.h"
56
57 /* =============================================================
58 * State initialization
59 */
60
61 void r200PrintDirty( r200ContextPtr rmesa, const char *msg )
62 {
63 struct r200_state_atom *l;
64
65 fprintf(stderr, msg);
66 fprintf(stderr, ": ");
67
68 foreach(l, &rmesa->hw.atomlist) {
69 if (l->dirty || rmesa->hw.all_dirty)
70 fprintf(stderr, "%s, ", l->name);
71 }
72
73 fprintf(stderr, "\n");
74 }
75
76 static int cmdpkt( int id )
77 {
78 drm_radeon_cmd_header_t h;
79 h.i = 0;
80 h.packet.cmd_type = RADEON_CMD_PACKET;
81 h.packet.packet_id = id;
82 return h.i;
83 }
84
85 static int cmdvec( int offset, int stride, int count )
86 {
87 drm_radeon_cmd_header_t h;
88 h.i = 0;
89 h.vectors.cmd_type = RADEON_CMD_VECTORS;
90 h.vectors.offset = offset;
91 h.vectors.stride = stride;
92 h.vectors.count = count;
93 return h.i;
94 }
95
96 static int cmdscl( int offset, int stride, int count )
97 {
98 drm_radeon_cmd_header_t h;
99 h.i = 0;
100 h.scalars.cmd_type = RADEON_CMD_SCALARS;
101 h.scalars.offset = offset;
102 h.scalars.stride = stride;
103 h.scalars.count = count;
104 return h.i;
105 }
106
107 static int cmdscl2( int offset, int stride, int count )
108 {
109 drm_radeon_cmd_header_t h;
110 h.i = 0;
111 h.scalars.cmd_type = RADEON_CMD_SCALARS2;
112 h.scalars.offset = offset - 0x100;
113 h.scalars.stride = stride;
114 h.scalars.count = count;
115 return h.i;
116 }
117
118 #define CHECK( NM, FLAG ) \
119 static GLboolean check_##NM( GLcontext *ctx, int idx ) \
120 { \
121 (void) idx; \
122 return FLAG; \
123 }
124
125 #define TCL_CHECK( NM, FLAG ) \
126 static GLboolean check_##NM( GLcontext *ctx, int idx ) \
127 { \
128 r200ContextPtr rmesa = R200_CONTEXT(ctx); \
129 (void) idx; \
130 return !rmesa->TclFallback && (FLAG); \
131 }
132
133
134
135 CHECK( always, GL_TRUE )
136 CHECK( never, GL_FALSE )
137 CHECK( tex_any, ctx->Texture._EnabledUnits )
138 CHECK( tex_pair, (ctx->Texture.Unit[idx]._ReallyEnabled | ctx->Texture.Unit[idx & ~1]._ReallyEnabled))
139 CHECK( tex, ctx->Texture.Unit[idx]._ReallyEnabled )
140 CHECK( tex_cube, ctx->Texture.Unit[idx]._ReallyEnabled & TEXTURE_CUBE_BIT)
141 CHECK( fog, ctx->Fog.Enabled )
142 TCL_CHECK( tcl, GL_TRUE )
143 TCL_CHECK( tcl_tex, ctx->Texture.Unit[idx]._ReallyEnabled )
144 TCL_CHECK( tcl_lighting, ctx->Light.Enabled )
145 TCL_CHECK( tcl_light, ctx->Light.Enabled && ctx->Light.Light[idx].Enabled )
146 TCL_CHECK( tcl_ucp, (ctx->Transform.ClipPlanesEnabled & (1 << idx)) )
147
148
149 /* Initialize the context's hardware state.
150 */
151 void r200InitState( r200ContextPtr rmesa )
152 {
153 GLcontext *ctx = rmesa->glCtx;
154 GLuint color_fmt, depth_fmt, i;
155
156 switch ( rmesa->r200Screen->cpp ) {
157 case 2:
158 color_fmt = R200_COLOR_FORMAT_RGB565;
159 break;
160 case 4:
161 color_fmt = R200_COLOR_FORMAT_ARGB8888;
162 break;
163 default:
164 fprintf( stderr, "Error: Unsupported pixel depth... exiting\n" );
165 exit( -1 );
166 }
167
168 rmesa->state.color.clear = 0x00000000;
169
170 switch ( ctx->Visual.depthBits ) {
171 case 16:
172 rmesa->state.depth.scale = 1.0 / (GLfloat)0xffff;
173 depth_fmt = R200_DEPTH_FORMAT_16BIT_INT_Z;
174 rmesa->state.stencil.clear = 0x00000000;
175 break;
176 case 24:
177 rmesa->state.depth.scale = 1.0 / (GLfloat)0xffffff;
178 depth_fmt = R200_DEPTH_FORMAT_24BIT_INT_Z;
179 rmesa->state.stencil.clear = 0xff000000;
180 break;
181 default:
182 fprintf( stderr, "Error: Unsupported depth %d... exiting\n",
183 ctx->Visual.depthBits );
184 exit( -1 );
185 }
186
187 /* Only have hw stencil when depth buffer is 24 bits deep */
188 rmesa->state.stencil.hwBuffer = ( ctx->Visual.stencilBits > 0 &&
189 ctx->Visual.depthBits == 24 );
190
191 rmesa->Fallback = 0;
192
193 if ( ctx->Visual.doubleBufferMode && rmesa->sarea->pfCurrentPage == 0 ) {
194 rmesa->state.color.drawOffset = rmesa->r200Screen->backOffset;
195 rmesa->state.color.drawPitch = rmesa->r200Screen->backPitch;
196 } else {
197 rmesa->state.color.drawOffset = rmesa->r200Screen->frontOffset;
198 rmesa->state.color.drawPitch = rmesa->r200Screen->frontPitch;
199 }
200
201 rmesa->state.pixel.readOffset = rmesa->state.color.drawOffset;
202 rmesa->state.pixel.readPitch = rmesa->state.color.drawPitch;
203
204 rmesa->hw.max_state_size = 0;
205
206 #define ALLOC_STATE( ATOM, CHK, SZ, NM, IDX ) \
207 do { \
208 rmesa->hw.ATOM.cmd_size = SZ; \
209 rmesa->hw.ATOM.cmd = (int *)CALLOC(SZ * sizeof(int)); \
210 rmesa->hw.ATOM.lastcmd = (int *)CALLOC(SZ * sizeof(int)); \
211 rmesa->hw.ATOM.name = NM; \
212 rmesa->hw.ATOM.idx = IDX; \
213 rmesa->hw.ATOM.check = check_##CHK; \
214 rmesa->hw.ATOM.dirty = GL_FALSE; \
215 rmesa->hw.max_state_size += SZ * sizeof(int); \
216 } while (0)
217
218
219 /* Allocate state buffers:
220 */
221 if (rmesa->r200Screen->drmSupportsBlendColor)
222 ALLOC_STATE( ctx, always, CTX_STATE_SIZE_NEWDRM, "CTX/context", 0 );
223 else
224 ALLOC_STATE( ctx, always, CTX_STATE_SIZE_OLDDRM, "CTX/context", 0 );
225 ALLOC_STATE( set, always, SET_STATE_SIZE, "SET/setup", 0 );
226 ALLOC_STATE( lin, always, LIN_STATE_SIZE, "LIN/line", 0 );
227 ALLOC_STATE( msk, always, MSK_STATE_SIZE, "MSK/mask", 0 );
228 ALLOC_STATE( vpt, always, VPT_STATE_SIZE, "VPT/viewport", 0 );
229 ALLOC_STATE( vtx, always, VTX_STATE_SIZE, "VTX/vertex", 0 );
230 ALLOC_STATE( vap, always, VAP_STATE_SIZE, "VAP/vap", 0 );
231 ALLOC_STATE( vte, always, VTE_STATE_SIZE, "VTE/vte", 0 );
232 ALLOC_STATE( msc, always, MSC_STATE_SIZE, "MSC/misc", 0 );
233 ALLOC_STATE( cst, always, CST_STATE_SIZE, "CST/constant", 0 );
234 ALLOC_STATE( zbs, always, ZBS_STATE_SIZE, "ZBS/zbias", 0 );
235 ALLOC_STATE( tf, tex_any, TF_STATE_SIZE, "TF/tfactor", 0 );
236 if (rmesa->r200Screen->chipset & R200_CHIPSET_REAL_R200) {
237 /* make sure texture units 0/1 are emitted pair-wise for r200 t0 hang workaround */
238 ALLOC_STATE( tex[0], tex_pair, TEX_STATE_SIZE, "TEX/tex-0", 0 );
239 ALLOC_STATE( tex[1], tex_pair, TEX_STATE_SIZE, "TEX/tex-1", 1 );
240 ALLOC_STATE( tam, tex_any, TAM_STATE_SIZE, "TAM/tam", 0 );
241 }
242 else {
243 ALLOC_STATE( tex[0], tex, TEX_STATE_SIZE, "TEX/tex-0", 0 );
244 ALLOC_STATE( tex[1], tex, TEX_STATE_SIZE, "TEX/tex-1", 1 );
245 ALLOC_STATE( tam, never, TAM_STATE_SIZE, "TAM/tam", 0 );
246 }
247 ALLOC_STATE( tex[2], tex, TEX_STATE_SIZE, "TEX/tex-2", 2 );
248 ALLOC_STATE( tex[3], tex, TEX_STATE_SIZE, "TEX/tex-3", 3 );
249 ALLOC_STATE( tex[4], tex, TEX_STATE_SIZE, "TEX/tex-4", 4 );
250 ALLOC_STATE( tex[5], tex, TEX_STATE_SIZE, "TEX/tex-5", 5 );
251 if (rmesa->r200Screen->drmSupportsCubeMaps) {
252 ALLOC_STATE( cube[0], tex_cube, CUBE_STATE_SIZE, "CUBE/tex-0", 0 );
253 ALLOC_STATE( cube[1], tex_cube, CUBE_STATE_SIZE, "CUBE/tex-1", 1 );
254 ALLOC_STATE( cube[2], tex_cube, CUBE_STATE_SIZE, "CUBE/tex-2", 2 );
255 ALLOC_STATE( cube[3], tex_cube, CUBE_STATE_SIZE, "CUBE/tex-3", 3 );
256 ALLOC_STATE( cube[4], tex_cube, CUBE_STATE_SIZE, "CUBE/tex-4", 4 );
257 ALLOC_STATE( cube[5], tex_cube, CUBE_STATE_SIZE, "CUBE/tex-5", 5 );
258 }
259 else {
260 ALLOC_STATE( cube[0], never, CUBE_STATE_SIZE, "CUBE/tex-0", 0 );
261 ALLOC_STATE( cube[1], never, CUBE_STATE_SIZE, "CUBE/tex-1", 1 );
262 ALLOC_STATE( cube[2], never, CUBE_STATE_SIZE, "CUBE/tex-2", 2 );
263 ALLOC_STATE( cube[3], never, CUBE_STATE_SIZE, "CUBE/tex-3", 3 );
264 ALLOC_STATE( cube[4], never, CUBE_STATE_SIZE, "CUBE/tex-4", 4 );
265 ALLOC_STATE( cube[5], never, CUBE_STATE_SIZE, "CUBE/tex-5", 5 );
266 }
267
268 ALLOC_STATE( tcl, tcl, TCL_STATE_SIZE, "TCL/tcl", 0 );
269 ALLOC_STATE( msl, tcl, MSL_STATE_SIZE, "MSL/matrix-select", 0 );
270 ALLOC_STATE( tcg, tcl, TCG_STATE_SIZE, "TCG/texcoordgen", 0 );
271 ALLOC_STATE( mtl[0], tcl_lighting, MTL_STATE_SIZE, "MTL0/material0", 0 );
272 ALLOC_STATE( mtl[1], tcl_lighting, MTL_STATE_SIZE, "MTL1/material1", 1 );
273 ALLOC_STATE( grd, tcl, GRD_STATE_SIZE, "GRD/guard-band", 0 );
274 ALLOC_STATE( fog, fog, FOG_STATE_SIZE, "FOG/fog", 0 );
275 ALLOC_STATE( glt, tcl_lighting, GLT_STATE_SIZE, "GLT/light-global", 0 );
276 ALLOC_STATE( eye, tcl_lighting, EYE_STATE_SIZE, "EYE/eye-vector", 0 );
277 ALLOC_STATE( mat[R200_MTX_MV], tcl, MAT_STATE_SIZE, "MAT/modelview", 0 );
278 ALLOC_STATE( mat[R200_MTX_IMV], tcl, MAT_STATE_SIZE, "MAT/it-modelview", 0 );
279 ALLOC_STATE( mat[R200_MTX_MVP], tcl, MAT_STATE_SIZE, "MAT/modelproject", 0 );
280 ALLOC_STATE( mat[R200_MTX_TEX0], tcl_tex, MAT_STATE_SIZE, "MAT/texmat0", 0 );
281 ALLOC_STATE( mat[R200_MTX_TEX1], tcl_tex, MAT_STATE_SIZE, "MAT/texmat1", 1 );
282 ALLOC_STATE( mat[R200_MTX_TEX2], tcl_tex, MAT_STATE_SIZE, "MAT/texmat2", 2 );
283 ALLOC_STATE( mat[R200_MTX_TEX3], tcl_tex, MAT_STATE_SIZE, "MAT/texmat3", 3 );
284 ALLOC_STATE( mat[R200_MTX_TEX4], tcl_tex, MAT_STATE_SIZE, "MAT/texmat4", 4 );
285 ALLOC_STATE( mat[R200_MTX_TEX5], tcl_tex, MAT_STATE_SIZE, "MAT/texmat5", 5 );
286 ALLOC_STATE( ucp[0], tcl_ucp, UCP_STATE_SIZE, "UCP/userclip-0", 0 );
287 ALLOC_STATE( ucp[1], tcl_ucp, UCP_STATE_SIZE, "UCP/userclip-1", 1 );
288 ALLOC_STATE( ucp[2], tcl_ucp, UCP_STATE_SIZE, "UCP/userclip-2", 2 );
289 ALLOC_STATE( ucp[3], tcl_ucp, UCP_STATE_SIZE, "UCP/userclip-3", 3 );
290 ALLOC_STATE( ucp[4], tcl_ucp, UCP_STATE_SIZE, "UCP/userclip-4", 4 );
291 ALLOC_STATE( ucp[5], tcl_ucp, UCP_STATE_SIZE, "UCP/userclip-5", 5 );
292 ALLOC_STATE( lit[0], tcl_light, LIT_STATE_SIZE, "LIT/light-0", 0 );
293 ALLOC_STATE( lit[1], tcl_light, LIT_STATE_SIZE, "LIT/light-1", 1 );
294 ALLOC_STATE( lit[2], tcl_light, LIT_STATE_SIZE, "LIT/light-2", 2 );
295 ALLOC_STATE( lit[3], tcl_light, LIT_STATE_SIZE, "LIT/light-3", 3 );
296 ALLOC_STATE( lit[4], tcl_light, LIT_STATE_SIZE, "LIT/light-4", 4 );
297 ALLOC_STATE( lit[5], tcl_light, LIT_STATE_SIZE, "LIT/light-5", 5 );
298 ALLOC_STATE( lit[6], tcl_light, LIT_STATE_SIZE, "LIT/light-6", 6 );
299 ALLOC_STATE( lit[7], tcl_light, LIT_STATE_SIZE, "LIT/light-7", 7 );
300 ALLOC_STATE( pix[0], always, PIX_STATE_SIZE, "PIX/pixstage-0", 0 );
301 ALLOC_STATE( pix[1], tex, PIX_STATE_SIZE, "PIX/pixstage-1", 1 );
302 ALLOC_STATE( pix[2], tex, PIX_STATE_SIZE, "PIX/pixstage-2", 2 );
303 ALLOC_STATE( pix[3], tex, PIX_STATE_SIZE, "PIX/pixstage-3", 3 );
304 ALLOC_STATE( pix[4], tex, PIX_STATE_SIZE, "PIX/pixstage-4", 4 );
305 ALLOC_STATE( pix[5], tex, PIX_STATE_SIZE, "PIX/pixstage-5", 5 );
306
307 r200SetUpAtomList( rmesa );
308
309 /* Fill in the packet headers:
310 */
311 rmesa->hw.ctx.cmd[CTX_CMD_0] = cmdpkt(RADEON_EMIT_PP_MISC);
312 rmesa->hw.ctx.cmd[CTX_CMD_1] = cmdpkt(RADEON_EMIT_PP_CNTL);
313 rmesa->hw.ctx.cmd[CTX_CMD_2] = cmdpkt(RADEON_EMIT_RB3D_COLORPITCH);
314 if (rmesa->r200Screen->drmSupportsBlendColor)
315 rmesa->hw.ctx.cmd[CTX_CMD_3] = cmdpkt(R200_EMIT_RB3D_BLENDCOLOR);
316 rmesa->hw.lin.cmd[LIN_CMD_0] = cmdpkt(RADEON_EMIT_RE_LINE_PATTERN);
317 rmesa->hw.lin.cmd[LIN_CMD_1] = cmdpkt(RADEON_EMIT_SE_LINE_WIDTH);
318 rmesa->hw.msk.cmd[MSK_CMD_0] = cmdpkt(RADEON_EMIT_RB3D_STENCILREFMASK);
319 rmesa->hw.vpt.cmd[VPT_CMD_0] = cmdpkt(RADEON_EMIT_SE_VPORT_XSCALE);
320 rmesa->hw.set.cmd[SET_CMD_0] = cmdpkt(RADEON_EMIT_SE_CNTL);
321 rmesa->hw.msc.cmd[MSC_CMD_0] = cmdpkt(RADEON_EMIT_RE_MISC);
322 rmesa->hw.cst.cmd[CST_CMD_0] = cmdpkt(R200_EMIT_PP_CNTL_X);
323 rmesa->hw.cst.cmd[CST_CMD_1] = cmdpkt(R200_EMIT_RB3D_DEPTHXY_OFFSET);
324 rmesa->hw.cst.cmd[CST_CMD_2] = cmdpkt(R200_EMIT_RE_AUX_SCISSOR_CNTL);
325 rmesa->hw.cst.cmd[CST_CMD_3] = cmdpkt(R200_EMIT_RE_SCISSOR_TL_0);
326 rmesa->hw.cst.cmd[CST_CMD_4] = cmdpkt(R200_EMIT_SE_VAP_CNTL_STATUS);
327 rmesa->hw.cst.cmd[CST_CMD_5] = cmdpkt(R200_EMIT_RE_POINTSIZE);
328 rmesa->hw.cst.cmd[CST_CMD_6] = cmdpkt(R200_EMIT_TCL_INPUT_VTX_VECTOR_ADDR_0);
329 rmesa->hw.tam.cmd[TAM_CMD_0] = cmdpkt(R200_EMIT_PP_TAM_DEBUG3);
330 rmesa->hw.tf.cmd[TF_CMD_0] = cmdpkt(R200_EMIT_TFACTOR_0);
331 rmesa->hw.tex[0].cmd[TEX_CMD_0] = cmdpkt(R200_EMIT_PP_TXFILTER_0);
332 rmesa->hw.tex[0].cmd[TEX_CMD_1] = cmdpkt(R200_EMIT_PP_TXOFFSET_0);
333 rmesa->hw.tex[1].cmd[TEX_CMD_0] = cmdpkt(R200_EMIT_PP_TXFILTER_1);
334 rmesa->hw.tex[1].cmd[TEX_CMD_1] = cmdpkt(R200_EMIT_PP_TXOFFSET_1);
335 rmesa->hw.tex[2].cmd[TEX_CMD_0] = cmdpkt(R200_EMIT_PP_TXFILTER_2);
336 rmesa->hw.tex[2].cmd[TEX_CMD_1] = cmdpkt(R200_EMIT_PP_TXOFFSET_2);
337 rmesa->hw.tex[3].cmd[TEX_CMD_0] = cmdpkt(R200_EMIT_PP_TXFILTER_3);
338 rmesa->hw.tex[3].cmd[TEX_CMD_1] = cmdpkt(R200_EMIT_PP_TXOFFSET_3);
339 rmesa->hw.tex[4].cmd[TEX_CMD_0] = cmdpkt(R200_EMIT_PP_TXFILTER_4);
340 rmesa->hw.tex[4].cmd[TEX_CMD_1] = cmdpkt(R200_EMIT_PP_TXOFFSET_4);
341 rmesa->hw.tex[5].cmd[TEX_CMD_0] = cmdpkt(R200_EMIT_PP_TXFILTER_5);
342 rmesa->hw.tex[5].cmd[TEX_CMD_1] = cmdpkt(R200_EMIT_PP_TXOFFSET_5);
343 rmesa->hw.cube[0].cmd[CUBE_CMD_0] = cmdpkt(R200_EMIT_PP_CUBIC_FACES_0);
344 rmesa->hw.cube[0].cmd[CUBE_CMD_1] = cmdpkt(R200_EMIT_PP_CUBIC_OFFSETS_0);
345 rmesa->hw.cube[1].cmd[CUBE_CMD_0] = cmdpkt(R200_EMIT_PP_CUBIC_FACES_1);
346 rmesa->hw.cube[1].cmd[CUBE_CMD_1] = cmdpkt(R200_EMIT_PP_CUBIC_OFFSETS_1);
347 rmesa->hw.cube[2].cmd[CUBE_CMD_0] = cmdpkt(R200_EMIT_PP_CUBIC_FACES_2);
348 rmesa->hw.cube[2].cmd[CUBE_CMD_1] = cmdpkt(R200_EMIT_PP_CUBIC_OFFSETS_2);
349 rmesa->hw.cube[3].cmd[CUBE_CMD_0] = cmdpkt(R200_EMIT_PP_CUBIC_FACES_3);
350 rmesa->hw.cube[3].cmd[CUBE_CMD_1] = cmdpkt(R200_EMIT_PP_CUBIC_OFFSETS_3);
351 rmesa->hw.cube[4].cmd[CUBE_CMD_0] = cmdpkt(R200_EMIT_PP_CUBIC_FACES_4);
352 rmesa->hw.cube[4].cmd[CUBE_CMD_1] = cmdpkt(R200_EMIT_PP_CUBIC_OFFSETS_4);
353 rmesa->hw.cube[5].cmd[CUBE_CMD_0] = cmdpkt(R200_EMIT_PP_CUBIC_FACES_5);
354 rmesa->hw.cube[5].cmd[CUBE_CMD_1] = cmdpkt(R200_EMIT_PP_CUBIC_OFFSETS_5);
355 rmesa->hw.pix[0].cmd[PIX_CMD_0] = cmdpkt(R200_EMIT_PP_TXCBLEND_0);
356 rmesa->hw.pix[1].cmd[PIX_CMD_0] = cmdpkt(R200_EMIT_PP_TXCBLEND_1);
357 rmesa->hw.pix[2].cmd[PIX_CMD_0] = cmdpkt(R200_EMIT_PP_TXCBLEND_2);
358 rmesa->hw.pix[3].cmd[PIX_CMD_0] = cmdpkt(R200_EMIT_PP_TXCBLEND_3);
359 rmesa->hw.pix[4].cmd[PIX_CMD_0] = cmdpkt(R200_EMIT_PP_TXCBLEND_4);
360 rmesa->hw.pix[5].cmd[PIX_CMD_0] = cmdpkt(R200_EMIT_PP_TXCBLEND_5);
361 rmesa->hw.zbs.cmd[ZBS_CMD_0] = cmdpkt(RADEON_EMIT_SE_ZBIAS_FACTOR);
362 rmesa->hw.tcl.cmd[TCL_CMD_0] = cmdpkt(R200_EMIT_TCL_LIGHT_MODEL_CTL_0);
363 rmesa->hw.tcl.cmd[TCL_CMD_1] = cmdpkt(R200_EMIT_TCL_UCP_VERT_BLEND_CTL);
364 rmesa->hw.tcg.cmd[TCG_CMD_0] = cmdpkt(R200_EMIT_TEX_PROC_CTL_2);
365 rmesa->hw.msl.cmd[MSL_CMD_0] = cmdpkt(R200_EMIT_MATRIX_SELECT_0);
366 rmesa->hw.vap.cmd[VAP_CMD_0] = cmdpkt(R200_EMIT_VAP_CTL);
367 rmesa->hw.vtx.cmd[VTX_CMD_0] = cmdpkt(R200_EMIT_VTX_FMT_0);
368 rmesa->hw.vtx.cmd[VTX_CMD_1] = cmdpkt(R200_EMIT_OUTPUT_VTX_COMP_SEL);
369 rmesa->hw.vtx.cmd[VTX_CMD_2] = cmdpkt(R200_EMIT_SE_VTX_STATE_CNTL);
370 rmesa->hw.vte.cmd[VTE_CMD_0] = cmdpkt(R200_EMIT_VTE_CNTL);
371 rmesa->hw.mtl[0].cmd[MTL_CMD_0] =
372 cmdvec( R200_VS_MAT_0_EMISS, 1, 16 );
373 rmesa->hw.mtl[0].cmd[MTL_CMD_1] =
374 cmdscl2( R200_SS_MAT_0_SHININESS, 1, 1 );
375 rmesa->hw.mtl[1].cmd[MTL_CMD_0] =
376 cmdvec( R200_VS_MAT_1_EMISS, 1, 16 );
377 rmesa->hw.mtl[1].cmd[MTL_CMD_1] =
378 cmdscl2( R200_SS_MAT_1_SHININESS, 1, 1 );
379
380 rmesa->hw.grd.cmd[GRD_CMD_0] =
381 cmdscl( R200_SS_VERT_GUARD_CLIP_ADJ_ADDR, 1, 4 );
382 rmesa->hw.fog.cmd[FOG_CMD_0] =
383 cmdvec( R200_VS_FOG_PARAM_ADDR, 1, 4 );
384 rmesa->hw.glt.cmd[GLT_CMD_0] =
385 cmdvec( R200_VS_GLOBAL_AMBIENT_ADDR, 1, 4 );
386 rmesa->hw.eye.cmd[EYE_CMD_0] =
387 cmdvec( R200_VS_EYE_VECTOR_ADDR, 1, 4 );
388
389 rmesa->hw.mat[R200_MTX_MV].cmd[MAT_CMD_0] =
390 cmdvec( R200_VS_MATRIX_0_MV, 1, 16);
391 rmesa->hw.mat[R200_MTX_IMV].cmd[MAT_CMD_0] =
392 cmdvec( R200_VS_MATRIX_1_INV_MV, 1, 16);
393 rmesa->hw.mat[R200_MTX_MVP].cmd[MAT_CMD_0] =
394 cmdvec( R200_VS_MATRIX_2_MVP, 1, 16);
395 rmesa->hw.mat[R200_MTX_TEX0].cmd[MAT_CMD_0] =
396 cmdvec( R200_VS_MATRIX_3_TEX0, 1, 16);
397 rmesa->hw.mat[R200_MTX_TEX1].cmd[MAT_CMD_0] =
398 cmdvec( R200_VS_MATRIX_4_TEX1, 1, 16);
399 rmesa->hw.mat[R200_MTX_TEX2].cmd[MAT_CMD_0] =
400 cmdvec( R200_VS_MATRIX_5_TEX2, 1, 16);
401 rmesa->hw.mat[R200_MTX_TEX3].cmd[MAT_CMD_0] =
402 cmdvec( R200_VS_MATRIX_6_TEX3, 1, 16);
403 rmesa->hw.mat[R200_MTX_TEX4].cmd[MAT_CMD_0] =
404 cmdvec( R200_VS_MATRIX_7_TEX4, 1, 16);
405 rmesa->hw.mat[R200_MTX_TEX5].cmd[MAT_CMD_0] =
406 cmdvec( R200_VS_MATRIX_8_TEX5, 1, 16);
407
408 for (i = 0 ; i < 8; i++) {
409 rmesa->hw.lit[i].cmd[LIT_CMD_0] =
410 cmdvec( R200_VS_LIGHT_AMBIENT_ADDR + i, 8, 24 );
411 rmesa->hw.lit[i].cmd[LIT_CMD_1] =
412 cmdscl( R200_SS_LIGHT_DCD_ADDR + i, 8, 7 );
413 }
414
415 for (i = 0 ; i < 6; i++) {
416 rmesa->hw.ucp[i].cmd[UCP_CMD_0] =
417 cmdvec( R200_VS_UCP_ADDR + i, 1, 4 );
418 }
419
420 /* Initial Harware state:
421 */
422 rmesa->hw.ctx.cmd[CTX_PP_MISC] = (R200_ALPHA_TEST_PASS
423 /* | R200_RIGHT_HAND_CUBE_OGL*/);
424
425 rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] = (R200_FOG_VERTEX |
426 R200_FOG_USE_SPEC_ALPHA);
427
428 rmesa->hw.ctx.cmd[CTX_RE_SOLID_COLOR] = 0x00000000;
429
430 rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = (R200_COMB_FCN_ADD_CLAMP |
431 (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
432 (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT));
433
434 if (rmesa->r200Screen->drmSupportsBlendColor) {
435 rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCOLOR] = 0x00000000;
436 rmesa->hw.ctx.cmd[CTX_RB3D_ABLENDCNTL] = (R200_COMB_FCN_ADD_CLAMP |
437 (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
438 (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT));
439 rmesa->hw.ctx.cmd[CTX_RB3D_CBLENDCNTL] = (R200_COMB_FCN_ADD_CLAMP |
440 (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
441 (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT));
442 }
443
444 rmesa->hw.ctx.cmd[CTX_RB3D_DEPTHOFFSET] =
445 rmesa->r200Screen->depthOffset + rmesa->r200Screen->fbLocation;
446
447 rmesa->hw.ctx.cmd[CTX_RB3D_DEPTHPITCH] =
448 ((rmesa->r200Screen->depthPitch &
449 R200_DEPTHPITCH_MASK) |
450 R200_DEPTH_ENDIAN_NO_SWAP);
451
452 rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] = (depth_fmt |
453 R200_Z_TEST_LESS |
454 R200_STENCIL_TEST_ALWAYS |
455 R200_STENCIL_FAIL_KEEP |
456 R200_STENCIL_ZPASS_KEEP |
457 R200_STENCIL_ZFAIL_KEEP |
458 R200_Z_WRITE_ENABLE);
459
460 rmesa->hw.ctx.cmd[CTX_PP_CNTL] = (R200_ANTI_ALIAS_NONE
461 | R200_TEX_BLEND_0_ENABLE);
462
463 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = color_fmt;
464 switch ( driQueryOptioni( &rmesa->optionCache, "dither_mode" ) ) {
465 case DRI_CONF_DITHER_XERRORDIFFRESET:
466 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_DITHER_INIT;
467 break;
468 case DRI_CONF_DITHER_ORDERED:
469 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_SCALE_DITHER_ENABLE;
470 break;
471 }
472 if ( driQueryOptioni( &rmesa->optionCache, "round_mode" ) ==
473 DRI_CONF_ROUND_ROUND )
474 rmesa->state.color.roundEnable = R200_ROUND_ENABLE;
475 else
476 rmesa->state.color.roundEnable = 0;
477 if ( driQueryOptioni (&rmesa->optionCache, "color_reduction" ) ==
478 DRI_CONF_COLOR_REDUCTION_DITHER )
479 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_DITHER_ENABLE;
480 else
481 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= rmesa->state.color.roundEnable;
482
483 rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = ((rmesa->state.color.drawOffset +
484 rmesa->r200Screen->fbLocation)
485 & R200_COLOROFFSET_MASK);
486
487 rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] = ((rmesa->state.color.drawPitch &
488 R200_COLORPITCH_MASK) |
489 R200_COLOR_ENDIAN_NO_SWAP);
490
491 rmesa->hw.set.cmd[SET_SE_CNTL] = (R200_FFACE_CULL_CCW |
492 R200_BFACE_SOLID |
493 R200_FFACE_SOLID |
494 R200_FLAT_SHADE_VTX_LAST |
495 R200_DIFFUSE_SHADE_GOURAUD |
496 R200_ALPHA_SHADE_GOURAUD |
497 R200_SPECULAR_SHADE_GOURAUD |
498 R200_FOG_SHADE_GOURAUD |
499 R200_VTX_PIX_CENTER_OGL |
500 R200_ROUND_MODE_TRUNC |
501 R200_ROUND_PREC_8TH_PIX);
502
503 rmesa->hw.set.cmd[SET_RE_CNTL] = (R200_PERSPECTIVE_ENABLE |
504 R200_SCISSOR_ENABLE);
505
506 rmesa->hw.lin.cmd[LIN_RE_LINE_PATTERN] = ((1 << 16) | 0xffff);
507
508 rmesa->hw.lin.cmd[LIN_RE_LINE_STATE] =
509 ((0 << R200_LINE_CURRENT_PTR_SHIFT) |
510 (1 << R200_LINE_CURRENT_COUNT_SHIFT));
511
512 rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] = (1 << 4);
513
514 rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] =
515 ((0x00 << R200_STENCIL_REF_SHIFT) |
516 (0xff << R200_STENCIL_MASK_SHIFT) |
517 (0xff << R200_STENCIL_WRITEMASK_SHIFT));
518
519 rmesa->hw.msk.cmd[MSK_RB3D_ROPCNTL] = R200_ROP_COPY;
520 rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] = 0xffffffff;
521
522 rmesa->hw.tam.cmd[TAM_DEBUG3] = 0;
523
524 rmesa->hw.msc.cmd[MSC_RE_MISC] =
525 ((0 << R200_STIPPLE_X_OFFSET_SHIFT) |
526 (0 << R200_STIPPLE_Y_OFFSET_SHIFT) |
527 R200_STIPPLE_BIG_BIT_ORDER);
528
529
530 rmesa->hw.cst.cmd[CST_PP_CNTL_X] = 0;
531 rmesa->hw.cst.cmd[CST_RB3D_DEPTHXY_OFFSET] = 0;
532 rmesa->hw.cst.cmd[CST_RE_AUX_SCISSOR_CNTL] = 0x0;
533 rmesa->hw.cst.cmd[CST_RE_SCISSOR_TL_0] = 0;
534 rmesa->hw.cst.cmd[CST_RE_SCISSOR_BR_0] = 0;
535 rmesa->hw.cst.cmd[CST_SE_VAP_CNTL_STATUS] =
536 #ifdef MESA_BIG_ENDIAN
537 R200_VC_32BIT_SWAP;
538 #else
539 R200_VC_NO_SWAP;
540 #endif
541
542 if (!(rmesa->r200Screen->chipset & R200_CHIPSET_TCL)) {
543 /* Bypass TCL */
544 rmesa->hw.cst.cmd[CST_SE_VAP_CNTL_STATUS] |= (1<<8);
545 }
546
547 rmesa->hw.cst.cmd[CST_RE_POINTSIZE] = 0x100010;
548 rmesa->hw.cst.cmd[CST_SE_TCL_INPUT_VTX_0] =
549 (0x0 << R200_VERTEX_POSITION_ADDR__SHIFT);
550 rmesa->hw.cst.cmd[CST_SE_TCL_INPUT_VTX_1] =
551 (0x02 << R200_VTX_COLOR_0_ADDR__SHIFT) |
552 (0x03 << R200_VTX_COLOR_1_ADDR__SHIFT);
553 rmesa->hw.cst.cmd[CST_SE_TCL_INPUT_VTX_2] =
554 (0x06 << R200_VTX_TEX_0_ADDR__SHIFT) |
555 (0x07 << R200_VTX_TEX_1_ADDR__SHIFT) |
556 (0x08 << R200_VTX_TEX_2_ADDR__SHIFT) |
557 (0x09 << R200_VTX_TEX_3_ADDR__SHIFT);
558 rmesa->hw.cst.cmd[CST_SE_TCL_INPUT_VTX_3] =
559 (0x0A << R200_VTX_TEX_4_ADDR__SHIFT) |
560 (0x0B << R200_VTX_TEX_5_ADDR__SHIFT);
561
562
563 rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE] = 0x00000000;
564 rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = 0x00000000;
565 rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE] = 0x00000000;
566 rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = 0x00000000;
567 rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE] = 0x00000000;
568 rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = 0x00000000;
569
570 for ( i = 0 ; i < ctx->Const.MaxTextureUnits ; i++ ) {
571 rmesa->hw.tex[i].cmd[TEX_PP_TXFILTER] = R200_BORDER_MODE_OGL;
572 rmesa->hw.tex[i].cmd[TEX_PP_TXFORMAT] =
573 ((i << R200_TXFORMAT_ST_ROUTE_SHIFT) | /* <-- note i */
574 (2 << R200_TXFORMAT_WIDTH_SHIFT) |
575 (2 << R200_TXFORMAT_HEIGHT_SHIFT));
576 rmesa->hw.tex[i].cmd[TEX_PP_TXOFFSET] =
577 rmesa->r200Screen->texOffset[RADEON_LOCAL_TEX_HEAP];
578 rmesa->hw.tex[i].cmd[TEX_PP_BORDER_COLOR] = 0;
579 rmesa->hw.tex[i].cmd[TEX_PP_TXFORMAT_X] =
580 (/* R200_TEXCOORD_PROJ | */
581 0x100000); /* Small default bias */
582
583 rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_FACES] = 0;
584 rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_OFFSET_F1] =
585 rmesa->r200Screen->texOffset[RADEON_LOCAL_TEX_HEAP];
586 rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_OFFSET_F2] =
587 rmesa->r200Screen->texOffset[RADEON_LOCAL_TEX_HEAP];
588 rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_OFFSET_F3] =
589 rmesa->r200Screen->texOffset[RADEON_LOCAL_TEX_HEAP];
590 rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_OFFSET_F4] =
591 rmesa->r200Screen->texOffset[RADEON_LOCAL_TEX_HEAP];
592 rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_OFFSET_F5] =
593 rmesa->r200Screen->texOffset[RADEON_LOCAL_TEX_HEAP];
594
595 rmesa->hw.pix[i].cmd[PIX_PP_TXCBLEND] =
596 (R200_TXC_ARG_A_ZERO |
597 R200_TXC_ARG_B_ZERO |
598 R200_TXC_ARG_C_DIFFUSE_COLOR |
599 R200_TXC_OP_MADD);
600
601 rmesa->hw.pix[i].cmd[PIX_PP_TXCBLEND2] =
602 ((i << R200_TXC_TFACTOR_SEL_SHIFT) |
603 R200_TXC_SCALE_1X |
604 R200_TXC_CLAMP_0_1 |
605 R200_TXC_OUTPUT_REG_R0);
606
607 rmesa->hw.pix[i].cmd[PIX_PP_TXABLEND] =
608 (R200_TXA_ARG_A_ZERO |
609 R200_TXA_ARG_B_ZERO |
610 R200_TXA_ARG_C_DIFFUSE_ALPHA |
611 R200_TXA_OP_MADD);
612
613 rmesa->hw.pix[i].cmd[PIX_PP_TXABLEND2] =
614 ((i << R200_TXA_TFACTOR_SEL_SHIFT) |
615 R200_TXA_SCALE_1X |
616 R200_TXA_CLAMP_0_1 |
617 R200_TXA_OUTPUT_REG_R0);
618 }
619
620 rmesa->hw.tf.cmd[TF_TFACTOR_0] = 0;
621 rmesa->hw.tf.cmd[TF_TFACTOR_1] = 0;
622 rmesa->hw.tf.cmd[TF_TFACTOR_2] = 0;
623 rmesa->hw.tf.cmd[TF_TFACTOR_3] = 0;
624 rmesa->hw.tf.cmd[TF_TFACTOR_4] = 0;
625 rmesa->hw.tf.cmd[TF_TFACTOR_5] = 0;
626
627 rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL] =
628 (R200_VAP_TCL_ENABLE |
629 (0x9 << R200_VAP_VF_MAX_VTX_NUM__SHIFT));
630
631 rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL] =
632 (R200_VPORT_X_SCALE_ENA |
633 R200_VPORT_Y_SCALE_ENA |
634 R200_VPORT_Z_SCALE_ENA |
635 R200_VPORT_X_OFFSET_ENA |
636 R200_VPORT_Y_OFFSET_ENA |
637 R200_VPORT_Z_OFFSET_ENA |
638 /* FIXME: Turn on for tex rect only */
639 R200_VTX_ST_DENORMALIZED |
640 R200_VTX_W0_FMT);
641
642
643 rmesa->hw.vtx.cmd[VTX_VTXFMT_0] = 0;
644 rmesa->hw.vtx.cmd[VTX_VTXFMT_1] = 0;
645 rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] =
646 ((R200_VTX_Z0 | R200_VTX_W0 |
647 (R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT)));
648 rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_1] = 0;
649 rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] = (R200_OUTPUT_XYZW);
650 rmesa->hw.vtx.cmd[VTX_STATE_CNTL] = R200_VSC_UPDATE_USER_COLOR_0_ENABLE;
651
652
653 /* Matrix selection */
654 rmesa->hw.msl.cmd[MSL_MATRIX_SELECT_0] =
655 (R200_MTX_MV << R200_MODELVIEW_0_SHIFT);
656
657 rmesa->hw.msl.cmd[MSL_MATRIX_SELECT_1] =
658 (R200_MTX_IMV << R200_IT_MODELVIEW_0_SHIFT);
659
660 rmesa->hw.msl.cmd[MSL_MATRIX_SELECT_2] =
661 (R200_MTX_MVP << R200_MODELPROJECT_0_SHIFT);
662
663 rmesa->hw.msl.cmd[MSL_MATRIX_SELECT_3] =
664 ((R200_MTX_TEX0 << R200_TEXMAT_0_SHIFT) |
665 (R200_MTX_TEX1 << R200_TEXMAT_1_SHIFT) |
666 (R200_MTX_TEX2 << R200_TEXMAT_2_SHIFT) |
667 (R200_MTX_TEX3 << R200_TEXMAT_3_SHIFT));
668
669 rmesa->hw.msl.cmd[MSL_MATRIX_SELECT_4] =
670 ((R200_MTX_TEX4 << R200_TEXMAT_4_SHIFT) |
671 (R200_MTX_TEX5 << R200_TEXMAT_5_SHIFT));
672
673
674 /* General TCL state */
675 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] =
676 (R200_SPECULAR_LIGHTS |
677 R200_DIFFUSE_SPECULAR_COMBINE |
678 R200_LOCAL_LIGHT_VEC_GL |
679 R200_LM0_SOURCE_MATERIAL_0 << R200_FRONT_SHININESS_SOURCE_SHIFT |
680 R200_LM0_SOURCE_MATERIAL_1 << R200_BACK_SHININESS_SOURCE_SHIFT);
681
682 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1] =
683 ((R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_EMISSIVE_SOURCE_SHIFT) |
684 (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_AMBIENT_SOURCE_SHIFT) |
685 (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_DIFFUSE_SOURCE_SHIFT) |
686 (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_SPECULAR_SOURCE_SHIFT) |
687 (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_EMISSIVE_SOURCE_SHIFT) |
688 (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_AMBIENT_SOURCE_SHIFT) |
689 (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_DIFFUSE_SOURCE_SHIFT) |
690 (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_SPECULAR_SOURCE_SHIFT));
691
692 rmesa->hw.tcl.cmd[TCL_PER_LIGHT_CTL_0] = 0; /* filled in via callbacks */
693 rmesa->hw.tcl.cmd[TCL_PER_LIGHT_CTL_1] = 0;
694 rmesa->hw.tcl.cmd[TCL_PER_LIGHT_CTL_2] = 0;
695 rmesa->hw.tcl.cmd[TCL_PER_LIGHT_CTL_3] = 0;
696
697 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] =
698 (R200_UCP_IN_CLIP_SPACE |
699 R200_CULL_FRONT_IS_CCW);
700
701 /* Texgen/Texmat state */
702 rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_2] = 0x00ffffff;
703 rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_3] =
704 ((0 << R200_TEXGEN_0_INPUT_TEX_SHIFT) |
705 (1 << R200_TEXGEN_1_INPUT_TEX_SHIFT) |
706 (2 << R200_TEXGEN_2_INPUT_TEX_SHIFT) |
707 (3 << R200_TEXGEN_3_INPUT_TEX_SHIFT) |
708 (4 << R200_TEXGEN_4_INPUT_TEX_SHIFT) |
709 (5 << R200_TEXGEN_5_INPUT_TEX_SHIFT));
710 rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_0] = 0;
711 rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_1] =
712 ((0 << R200_TEXGEN_0_INPUT_SHIFT) |
713 (1 << R200_TEXGEN_1_INPUT_SHIFT) |
714 (2 << R200_TEXGEN_2_INPUT_SHIFT) |
715 (3 << R200_TEXGEN_3_INPUT_SHIFT) |
716 (4 << R200_TEXGEN_4_INPUT_SHIFT) |
717 (5 << R200_TEXGEN_5_INPUT_SHIFT));
718 rmesa->hw.tcg.cmd[TCG_TEX_CYL_WRAP_CTL] = 0;
719
720
721 for (i = 0 ; i < 8; i++) {
722 struct gl_light *l = &ctx->Light.Light[i];
723 GLenum p = GL_LIGHT0 + i;
724 *(float *)&(rmesa->hw.lit[i].cmd[LIT_RANGE_CUTOFF]) = FLT_MAX;
725
726 ctx->Driver.Lightfv( ctx, p, GL_AMBIENT, l->Ambient );
727 ctx->Driver.Lightfv( ctx, p, GL_DIFFUSE, l->Diffuse );
728 ctx->Driver.Lightfv( ctx, p, GL_SPECULAR, l->Specular );
729 ctx->Driver.Lightfv( ctx, p, GL_POSITION, 0 );
730 ctx->Driver.Lightfv( ctx, p, GL_SPOT_DIRECTION, 0 );
731 ctx->Driver.Lightfv( ctx, p, GL_SPOT_EXPONENT, &l->SpotExponent );
732 ctx->Driver.Lightfv( ctx, p, GL_SPOT_CUTOFF, &l->SpotCutoff );
733 ctx->Driver.Lightfv( ctx, p, GL_CONSTANT_ATTENUATION,
734 &l->ConstantAttenuation );
735 ctx->Driver.Lightfv( ctx, p, GL_LINEAR_ATTENUATION,
736 &l->LinearAttenuation );
737 ctx->Driver.Lightfv( ctx, p, GL_QUADRATIC_ATTENUATION,
738 &l->QuadraticAttenuation );
739 *(float *)&(rmesa->hw.lit[i].cmd[LIT_ATTEN_XXX]) = 0.0;
740 }
741
742 ctx->Driver.LightModelfv( ctx, GL_LIGHT_MODEL_AMBIENT,
743 ctx->Light.Model.Ambient );
744
745 TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange( ctx );
746
747 for (i = 0 ; i < 6; i++) {
748 ctx->Driver.ClipPlane( ctx, GL_CLIP_PLANE0 + i, NULL );
749 }
750
751 ctx->Driver.Fogfv( ctx, GL_FOG_MODE, 0 );
752 ctx->Driver.Fogfv( ctx, GL_FOG_DENSITY, &ctx->Fog.Density );
753 ctx->Driver.Fogfv( ctx, GL_FOG_START, &ctx->Fog.Start );
754 ctx->Driver.Fogfv( ctx, GL_FOG_END, &ctx->Fog.End );
755 ctx->Driver.Fogfv( ctx, GL_FOG_COLOR, ctx->Fog.Color );
756 ctx->Driver.Fogfv( ctx, GL_FOG_COORDINATE_SOURCE_EXT, 0 );
757
758 rmesa->hw.grd.cmd[GRD_VERT_GUARD_CLIP_ADJ] = IEEE_ONE;
759 rmesa->hw.grd.cmd[GRD_VERT_GUARD_DISCARD_ADJ] = IEEE_ONE;
760 rmesa->hw.grd.cmd[GRD_HORZ_GUARD_CLIP_ADJ] = IEEE_ONE;
761 rmesa->hw.grd.cmd[GRD_HORZ_GUARD_DISCARD_ADJ] = IEEE_ONE;
762
763 rmesa->hw.eye.cmd[EYE_X] = 0;
764 rmesa->hw.eye.cmd[EYE_Y] = 0;
765 rmesa->hw.eye.cmd[EYE_Z] = IEEE_ONE;
766 rmesa->hw.eye.cmd[EYE_RESCALE_FACTOR] = IEEE_ONE;
767
768 r200LightingSpaceChange( ctx );
769
770 rmesa->hw.all_dirty = GL_TRUE;
771 }