Add texture format to get lesson19 working again.
[profile/ivi/mesa.git] / src / mesa / drivers / dri / r300 / r300_state.c
1 /*
2 Copyright (C) The Weather Channel, Inc.  2002.
3 Copyright (C) 2004 Nicolai Haehnle.
4 All Rights Reserved.
5
6 The Weather Channel (TM) funded Tungsten Graphics to develop the
7 initial release of the Radeon 8500 driver under the XFree86 license.
8 This notice must be preserved.
9
10 Permission is hereby granted, free of charge, to any person obtaining
11 a copy of this software and associated documentation files (the
12 "Software"), to deal in the Software without restriction, including
13 without limitation the rights to use, copy, modify, merge, publish,
14 distribute, sublicense, and/or sell copies of the Software, and to
15 permit persons to whom the Software is furnished to do so, subject to
16 the following conditions:
17
18 The above copyright notice and this permission notice (including the
19 next paragraph) shall be included in all copies or substantial
20 portions of the Software.
21
22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
25 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
26 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29
30 **************************************************************************/
31
32 /*
33  * Authors:
34  *   Nicolai Haehnle <prefect_@gmx.net>
35  */
36
37 #include "glheader.h"
38 #include "state.h"
39 #include "imports.h"
40 #include "enums.h"
41 #include "macros.h"
42 #include "context.h"
43 #include "dd.h"
44 #include "simple_list.h"
45
46 #include "api_arrayelt.h"
47 #include "swrast/swrast.h"
48 #include "swrast_setup/swrast_setup.h"
49 #include "array_cache/acache.h"
50 #include "tnl/tnl.h"
51
52 #include "radeon_ioctl.h"
53 #include "radeon_state.h"
54 #include "r300_context.h"
55 #include "r300_ioctl.h"
56 #include "r300_state.h"
57 #include "r300_reg.h"
58 #include "r300_program.h"
59
60 static void r300AlphaFunc(GLcontext * ctx, GLenum func, GLfloat ref)
61 {
62         r300ContextPtr rmesa = R300_CONTEXT(ctx);
63         int pp_misc = rmesa->hw.at.cmd[R300_AT_ALPHA_TEST];
64         GLubyte refByte;
65
66         CLAMPED_FLOAT_TO_UBYTE(refByte, ref);
67
68         R300_STATECHANGE(rmesa, at);
69
70         pp_misc &= ~(R300_ALPHA_TEST_OP_MASK | R300_REF_ALPHA_MASK);
71         pp_misc |= (refByte & R300_REF_ALPHA_MASK);
72
73         switch (func) {
74         case GL_NEVER:
75                 pp_misc |= R300_ALPHA_TEST_FAIL;
76                 break;
77         case GL_LESS:
78                 pp_misc |= R300_ALPHA_TEST_LESS;
79                 break;
80         case GL_EQUAL:
81                 pp_misc |= R300_ALPHA_TEST_EQUAL;
82                 break;
83         case GL_LEQUAL:
84                 pp_misc |= R300_ALPHA_TEST_LEQUAL;
85                 break;
86         case GL_GREATER:
87                 pp_misc |= R300_ALPHA_TEST_GREATER;
88                 break;
89         case GL_NOTEQUAL:
90                 pp_misc |= R300_ALPHA_TEST_NEQUAL;
91                 break;
92         case GL_GEQUAL:
93                 pp_misc |= R300_ALPHA_TEST_GEQUAL;
94                 break;
95         case GL_ALWAYS:
96                 pp_misc |= R300_ALPHA_TEST_PASS;
97                 break;
98         }
99
100         rmesa->hw.at.cmd[R300_AT_ALPHA_TEST] = pp_misc;
101 }
102
103 static void r300BlendColor(GLcontext * ctx, const GLfloat cf[4])
104 {
105         GLubyte color[4];
106         r300ContextPtr rmesa = R300_CONTEXT(ctx);
107         fprintf(stderr, "%s:%s is not implemented yet. Fixme !\n", __FILE__, __FUNCTION__);
108         #if 0
109         R200_STATECHANGE(rmesa, ctx);
110         CLAMPED_FLOAT_TO_UBYTE(color[0], cf[0]);
111         CLAMPED_FLOAT_TO_UBYTE(color[1], cf[1]);
112         CLAMPED_FLOAT_TO_UBYTE(color[2], cf[2]);
113         CLAMPED_FLOAT_TO_UBYTE(color[3], cf[3]);
114         if (rmesa->radeon.radeonScreen->drmSupportsBlendColor)
115                 rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCOLOR] =
116                     radeonPackColor(4, color[0], color[1], color[2], color[3]);
117         #endif
118 }
119
120 /**
121  * Calculate the hardware blend factor setting.  This same function is used
122  * for source and destination of both alpha and RGB.
123  *
124  * \returns
125  * The hardware register value for the specified blend factor.  This value
126  * will need to be shifted into the correct position for either source or
127  * destination factor.
128  *
129  * \todo
130  * Since the two cases where source and destination are handled differently
131  * are essentially error cases, they should never happen.  Determine if these
132  * cases can be removed.
133  */
134 static int blend_factor(GLenum factor, GLboolean is_src)
135 {
136         int func;
137
138         switch (factor) {
139         case GL_ZERO:
140                 func = R200_BLEND_GL_ZERO;
141                 break;
142         case GL_ONE:
143                 func = R200_BLEND_GL_ONE;
144                 break;
145         case GL_DST_COLOR:
146                 func = R200_BLEND_GL_DST_COLOR;
147                 break;
148         case GL_ONE_MINUS_DST_COLOR:
149                 func = R200_BLEND_GL_ONE_MINUS_DST_COLOR;
150                 break;
151         case GL_SRC_COLOR:
152                 func = R200_BLEND_GL_SRC_COLOR;
153                 break;
154         case GL_ONE_MINUS_SRC_COLOR:
155                 func = R200_BLEND_GL_ONE_MINUS_SRC_COLOR;
156                 break;
157         case GL_SRC_ALPHA:
158                 func = R200_BLEND_GL_SRC_ALPHA;
159                 break;
160         case GL_ONE_MINUS_SRC_ALPHA:
161                 func = R200_BLEND_GL_ONE_MINUS_SRC_ALPHA;
162                 break;
163         case GL_DST_ALPHA:
164                 func = R200_BLEND_GL_DST_ALPHA;
165                 break;
166         case GL_ONE_MINUS_DST_ALPHA:
167                 func = R200_BLEND_GL_ONE_MINUS_DST_ALPHA;
168                 break;
169         case GL_SRC_ALPHA_SATURATE:
170                 func =
171                     (is_src) ? R200_BLEND_GL_SRC_ALPHA_SATURATE :
172                     R200_BLEND_GL_ZERO;
173                 break;
174         case GL_CONSTANT_COLOR:
175                 func = R200_BLEND_GL_CONST_COLOR;
176                 break;
177         case GL_ONE_MINUS_CONSTANT_COLOR:
178                 func = R200_BLEND_GL_ONE_MINUS_CONST_COLOR;
179                 break;
180         case GL_CONSTANT_ALPHA:
181                 func = R200_BLEND_GL_CONST_ALPHA;
182                 break;
183         case GL_ONE_MINUS_CONSTANT_ALPHA:
184                 func = R200_BLEND_GL_ONE_MINUS_CONST_ALPHA;
185                 break;
186         default:
187                 func = (is_src) ? R200_BLEND_GL_ONE : R200_BLEND_GL_ZERO;
188         }
189         return func;
190 }
191
192 /**
193  * Sets both the blend equation and the blend function.
194  * This is done in a single
195  * function because some blend equations (i.e., \c GL_MIN and \c GL_MAX)
196  * change the interpretation of the blend function.
197  * Also, make sure that blend function and blend equation are set to their default
198  * value if color blending is not enabled, since at least blend equations GL_MIN
199  * and GL_FUNC_REVERSE_SUBTRACT will cause wrong results otherwise for
200  * unknown reasons.
201  */
202 static void r300_set_blend_state(GLcontext * ctx)
203 {
204         r300ContextPtr rmesa = R300_CONTEXT(ctx);
205         #if 0
206         GLuint cntl = rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &
207             ~(R300_ROP_ENABLE | R300_ALPHA_BLEND_ENABLE |
208               R300_SEPARATE_ALPHA_ENABLE);
209         #endif
210
211         int func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
212             (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT);
213         int eqn = R200_COMB_FCN_ADD_CLAMP;
214         int funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
215             (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT);
216         int eqnA = R200_COMB_FCN_ADD_CLAMP;
217
218         R300_STATECHANGE(rmesa, bld);
219
220         if (rmesa->radeon.radeonScreen->drmSupportsBlendColor) {
221                 if (ctx->Color._LogicOpEnabled) {
222                         #if 0
223                         rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] =
224                             cntl | R300_ROP_ENABLE;
225                         #endif
226                         rmesa->hw.bld.cmd[R300_BLD_ABLEND] = eqn | func;
227                         rmesa->hw.bld.cmd[R300_BLD_CBLEND] = eqn | func;
228                         return;
229                 } else if (ctx->Color.BlendEnabled) {
230                         #if 0
231                         rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] =
232                             cntl | R300_ALPHA_BLEND_ENABLE |
233                             R300_SEPARATE_ALPHA_ENABLE;
234                         #endif
235                 } else {
236                         #if 0
237                         rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = cntl;
238                         #endif
239                         rmesa->hw.bld.cmd[R300_BLD_ABLEND] = eqn | func;
240                         rmesa->hw.bld.cmd[R300_BLD_CBLEND] = eqn | func;
241                         return;
242                 }
243         } else {
244                 if (ctx->Color._LogicOpEnabled) {
245                         #if 0
246                         rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] =
247                             cntl | R300_ROP_ENABLE;
248                         rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = eqn | func;
249                         #endif
250                         return;
251                 } else if (ctx->Color.BlendEnabled) {
252                         #if 0
253                         rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] =
254                             cntl | R300_ALPHA_BLEND_ENABLE;
255                         #endif
256                 } else {
257                         #if 0
258                         rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = cntl;
259                         rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = eqn | func;
260                         #endif
261                         return;
262                 }
263         }
264
265         func =
266             (blend_factor(ctx->Color.BlendSrcRGB, GL_TRUE) <<
267              R200_SRC_BLEND_SHIFT) | (blend_factor(ctx->Color.BlendDstRGB,
268                                                    GL_FALSE) <<
269                                       R200_DST_BLEND_SHIFT);
270
271         switch (ctx->Color.BlendEquationRGB) {
272         case GL_FUNC_ADD:
273                 eqn = R300_COMB_FCN_ADD_CLAMP;
274                 break;
275
276         case GL_FUNC_SUBTRACT:
277                 eqn = R300_COMB_FCN_SUB_CLAMP;
278                 break;
279
280         case GL_FUNC_REVERSE_SUBTRACT:
281                 eqn = R200_COMB_FCN_RSUB_CLAMP;
282                 break;
283
284         case GL_MIN:
285                 eqn = R200_COMB_FCN_MIN;
286                 func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
287                     (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
288                 break;
289
290         case GL_MAX:
291                 eqn = R200_COMB_FCN_MAX;
292                 func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
293                     (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
294                 break;
295
296         default:
297                 fprintf(stderr,
298                         "[%s:%u] Invalid RGB blend equation (0x%04x).\n",
299                         __func__, __LINE__, ctx->Color.BlendEquationRGB);
300                 return;
301         }
302
303         if (!rmesa->radeon.radeonScreen->drmSupportsBlendColor) {
304                 #if 0
305                 rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = eqn | func;
306                 #endif
307                 return;
308         }
309
310         funcA =
311             (blend_factor(ctx->Color.BlendSrcA, GL_TRUE) <<
312              R200_SRC_BLEND_SHIFT) | (blend_factor(ctx->Color.BlendDstA,
313                                                    GL_FALSE) <<
314                                       R200_DST_BLEND_SHIFT);
315
316         switch (ctx->Color.BlendEquationA) {
317         case GL_FUNC_ADD:
318                 eqnA = R300_COMB_FCN_ADD_CLAMP;
319                 break;
320
321         case GL_FUNC_SUBTRACT:
322                 eqnA = R300_COMB_FCN_SUB_CLAMP;
323                 break;
324
325         case GL_FUNC_REVERSE_SUBTRACT:
326                 eqnA = R200_COMB_FCN_RSUB_CLAMP;
327                 break;
328
329         case GL_MIN:
330                 eqnA = R200_COMB_FCN_MIN;
331                 funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
332                     (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
333                 break;
334
335         case GL_MAX:
336                 eqnA = R200_COMB_FCN_MAX;
337                 funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
338                     (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
339                 break;
340
341         default:
342                 fprintf(stderr, "[%s:%u] Invalid A blend equation (0x%04x).\n",
343                         __func__, __LINE__, ctx->Color.BlendEquationA);
344                 return;
345         }
346
347         rmesa->hw.bld.cmd[R300_BLD_ABLEND] = eqnA | funcA;
348         rmesa->hw.bld.cmd[R300_BLD_CBLEND] = eqn | func ;
349         if(rmesa->hw.bld.cmd[R300_BLD_ABLEND] == rmesa->hw.bld.cmd[R300_BLD_CBLEND]){
350                 rmesa->hw.bld.cmd[R300_BLD_CBLEND] |= R300_BLEND_UNKNOWN | R300_BLEND_ENABLE | R300_BLEND_NO_SEPARATE;
351                 } else {
352                 rmesa->hw.bld.cmd[R300_BLD_CBLEND] |= R300_BLEND_UNKNOWN | R300_BLEND_ENABLE;
353                 }
354
355 }
356
357 static void r300BlendEquationSeparate(GLcontext * ctx,
358                                       GLenum modeRGB, GLenum modeA)
359 {
360         r300_set_blend_state(ctx);
361 }
362
363 static void r300BlendFuncSeparate(GLcontext * ctx,
364                                   GLenum sfactorRGB, GLenum dfactorRGB,
365                                   GLenum sfactorA, GLenum dfactorA)
366 {
367         r300_set_blend_state(ctx);
368 }
369
370 /**
371  * Update our tracked culling state based on Mesa's state.
372  */
373 static void r300UpdateCulling(GLcontext* ctx)
374 {
375         r300ContextPtr r300 = R300_CONTEXT(ctx);
376         uint32_t val = 0;
377
378         R300_STATECHANGE(r300, cul);
379         if (ctx->Polygon.CullFlag) {
380                 if (ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)
381                         val = R300_CULL_FRONT|R300_CULL_BACK;
382                 else if (ctx->Polygon.CullFaceMode == GL_FRONT)
383                         val = R300_CULL_FRONT;
384                 else
385                         val = R300_CULL_BACK;
386
387                 if (ctx->Polygon.FrontFace == GL_CW)
388                         val |= R300_FRONT_FACE_CW;
389                 else
390                         val |= R300_FRONT_FACE_CCW;
391         }
392
393         r300->hw.cul.cmd[R300_CUL_CULL] = val;
394 }
395
396
397 /**
398  * Handle glEnable()/glDisable().
399  *
400  * \note Mesa already filters redundant calls to glEnable/glDisable.
401  */
402 static void r300Enable(GLcontext* ctx, GLenum cap, GLboolean state)
403 {
404         r300ContextPtr r300 = R300_CONTEXT(ctx);
405         uint32_t newval;
406
407         if (RADEON_DEBUG & DEBUG_STATE)
408                 fprintf(stderr, "%s( %s = %s )\n", __FUNCTION__,
409                         _mesa_lookup_enum_by_nr(cap),
410                         state ? "GL_TRUE" : "GL_FALSE");
411
412         switch (cap) {
413         case GL_DEPTH_TEST:
414                 R300_STATECHANGE(r300, zc);
415
416                 if (state) {
417                         if (ctx->Depth.Mask)
418                                 newval = R300_RB3D_Z_TEST_AND_WRITE;
419                         else
420                                 newval = R300_RB3D_Z_TEST;
421                 } else
422                         newval = 0;
423
424                 r300->hw.zc.cmd[R300_ZC_CNTL_0] = newval;
425                 break;
426
427         case GL_CULL_FACE:
428                 r300UpdateCulling(ctx);
429                 break;
430
431         default:
432                 radeonEnable(ctx, cap, state);
433                 return;
434         }
435 }
436
437
438 /**
439  * Change the culling mode.
440  *
441  * \note Mesa already filters redundant calls to this function.
442  */
443 static void r300CullFace(GLcontext* ctx, GLenum mode)
444 {
445         (void)mode;
446
447         r300UpdateCulling(ctx);
448 }
449
450
451 /**
452  * Change the polygon orientation.
453  *
454  * \note Mesa already filters redundant calls to this function.
455  */
456 static void r300FrontFace(GLcontext* ctx, GLenum mode)
457 {
458         (void)mode;
459
460         r300UpdateCulling(ctx);
461 }
462
463
464 /**
465  * Change the depth testing function.
466  *
467  * \note Mesa already filters redundant calls to this function.
468  */
469 static void r300DepthFunc(GLcontext* ctx, GLenum func)
470 {
471         r300ContextPtr r300 = R300_CONTEXT(ctx);
472
473         R300_STATECHANGE(r300, zc);
474
475         switch(func) {
476         case GL_NEVER:
477                 r300->hw.zc.cmd[R300_ZC_CNTL_1] = R300_Z_TEST_NEVER;
478                 break;
479         case GL_LESS:
480                 r300->hw.zc.cmd[R300_ZC_CNTL_1] = R300_Z_TEST_LESS;
481                 break;
482         case GL_EQUAL:
483                 r300->hw.zc.cmd[R300_ZC_CNTL_1] = R300_Z_TEST_EQUAL;
484                 break;
485         case GL_LEQUAL:
486                 r300->hw.zc.cmd[R300_ZC_CNTL_1] = R300_Z_TEST_LEQUAL;
487                 break;
488         case GL_GREATER:
489                 r300->hw.zc.cmd[R300_ZC_CNTL_1] = R300_Z_TEST_GREATER;
490                 break;
491         case GL_NOTEQUAL:
492                 r300->hw.zc.cmd[R300_ZC_CNTL_1] = R300_Z_TEST_NEQUAL;
493                 break;
494         case GL_GEQUAL:
495                 r300->hw.zc.cmd[R300_ZC_CNTL_1] = R300_Z_TEST_GEQUAL;
496                 break;
497         case GL_ALWAYS:
498                 r300->hw.zc.cmd[R300_ZC_CNTL_1] = R300_Z_TEST_ALWAYS;
499                 break;
500         }
501 }
502
503
504 /**
505  * Enable/Disable depth writing.
506  *
507  * \note Mesa already filters redundant calls to this function.
508  */
509 static void r300DepthMask(GLcontext* ctx, GLboolean mask)
510 {
511         r300ContextPtr r300 = R300_CONTEXT(ctx);
512
513         if (!ctx->Depth.Test)
514                 return;
515
516         R300_STATECHANGE(r300, zc);
517         r300->hw.zc.cmd[R300_ZC_CNTL_0] = mask
518                 ? R300_RB3D_Z_TEST_AND_WRITE : R300_RB3D_Z_TEST;
519 }
520
521
522 /**
523  * Handle glColorMask()
524  */
525 static void r300ColorMask(GLcontext* ctx,
526                           GLboolean r, GLboolean g, GLboolean b, GLboolean a)
527 {
528         r300ContextPtr r300 = R300_CONTEXT(ctx);
529         int mask = (b << 0) | (g << 1) | (r << 2) | (a << 3);
530
531         if (mask != r300->hw.cmk.cmd[R300_CMK_COLORMASK]) {
532                 R300_STATECHANGE(r300, cmk);
533                 r300->hw.cmk.cmd[R300_CMK_COLORMASK] = mask;
534         }
535 }
536
537 /* =============================================================
538  * Point state
539  */
540 static void r300PointSize(GLcontext * ctx, GLfloat size)
541 {
542         r300ContextPtr r300 = R300_CONTEXT(ctx);
543         
544         /* This might need fixing later */
545         R300_STATECHANGE(r300, vps);
546         r300->hw.vps.cmd[R300_VPS_POINTSIZE] = r300PackFloat32(1.0);
547 }
548
549 /* =============================================================
550  * Window position and viewport transformation
551  */
552
553 /*
554  * To correctly position primitives:
555  */
556 #define SUBPIXEL_X 0.125
557 #define SUBPIXEL_Y 0.125
558
559 void r300UpdateWindow(GLcontext * ctx)
560 {
561         r300ContextPtr rmesa = R300_CONTEXT(ctx);
562         __DRIdrawablePrivate *dPriv = rmesa->radeon.dri.drawable;
563         GLfloat xoffset = dPriv ? (GLfloat) dPriv->x : 0;
564         GLfloat yoffset = dPriv ? (GLfloat) dPriv->y + dPriv->h : 0;
565         const GLfloat *v = ctx->Viewport._WindowMap.m;
566
567         GLfloat sx = v[MAT_SX];
568         GLfloat tx = v[MAT_TX] + xoffset + SUBPIXEL_X;
569         GLfloat sy = -v[MAT_SY];
570         GLfloat ty = (-v[MAT_TY]) + yoffset + SUBPIXEL_Y;
571         GLfloat sz = v[MAT_SZ] * rmesa->state.depth.scale;
572         GLfloat tz = v[MAT_TZ] * rmesa->state.depth.scale;
573
574         R300_FIREVERTICES(rmesa);
575         R300_STATECHANGE(rmesa, vpt);
576
577         rmesa->hw.vpt.cmd[R300_VPT_XSCALE]  = r300PackFloat32(sx);
578         rmesa->hw.vpt.cmd[R300_VPT_XOFFSET] = r300PackFloat32(tx);
579         rmesa->hw.vpt.cmd[R300_VPT_YSCALE]  = r300PackFloat32(sy);
580         rmesa->hw.vpt.cmd[R300_VPT_YOFFSET] = r300PackFloat32(ty);
581         rmesa->hw.vpt.cmd[R300_VPT_ZSCALE]  = r300PackFloat32(sz);
582         rmesa->hw.vpt.cmd[R300_VPT_ZOFFSET] = r300PackFloat32(tz);
583 }
584
585 static void r300Viewport(GLcontext * ctx, GLint x, GLint y,
586                          GLsizei width, GLsizei height)
587 {
588         /* Don't pipeline viewport changes, conflict with window offset
589          * setting below.  Could apply deltas to rescue pipelined viewport
590          * values, or keep the originals hanging around.
591          */
592         R200_FIREVERTICES(R200_CONTEXT(ctx));
593         r300UpdateWindow(ctx);
594 }
595
596 static void r300DepthRange(GLcontext * ctx, GLclampd nearval, GLclampd farval)
597 {
598         r300UpdateWindow(ctx);
599 }
600
601 /* Routing and texture-related */
602
603 void r300_setup_routing(GLcontext *ctx, GLboolean immediate)
604 {
605         int i, count=0,reg=0;
606         GLuint dw, mask;
607         TNLcontext *tnl = TNL_CONTEXT(ctx);
608         struct vertex_buffer *VB = &tnl->vb;
609         r300ContextPtr r300 = R300_CONTEXT(ctx);
610         
611         
612         /* Stage 1 - input to VAP */
613         
614         /* Assign register number automatically, retaining it in rmesa->state.reg */
615         
616         /* Note: immediate vertex data includes all coordinates.
617         To save bandwidth use either VBUF or state-based vertex generation */
618         
619         #define CONFIGURE_AOS(v, o, r, f) \
620                 {\
621                 if(immediate){ \
622                         r300->state.aos[count].element_size=4; \
623                         r300->state.aos[count].stride=4; \
624                         r300->state.aos[count].ncomponents=4; \
625                         } else { \
626                         r300->state.aos[count].element_size=v->size; \
627                         r300->state.aos[count].stride=v->size; \
628                         r300->state.aos[count].ncomponents=v->size; \
629                         } \
630                 r300->state.aos[count].offset=o; \
631                 r300->state.aos[count].reg=reg; \
632                 r300->state.aos[count].format=(f); \
633                 r300->state.vap_reg.r=reg; \
634                 count++; \
635                 reg++; \
636                 }
637         
638                 /* All offsets are 0 - for use by immediate mode. 
639                 Should change later to handle vertex buffers */
640         CONFIGURE_AOS(VB->ObjPtr, 0, i_coords, AOS_FORMAT_FLOAT);
641         CONFIGURE_AOS(VB->ColorPtr[0], 0, i_color[0], AOS_FORMAT_FLOAT_COLOR);
642         for(i=0;i < ctx->Const.MaxTextureUnits;i++)
643                 if(ctx->Texture.Unit[i].Enabled)
644                         CONFIGURE_AOS(VB->TexCoordPtr[i], 0, i_tex[i], AOS_FORMAT_FLOAT);
645                         
646         r300->state.aos_count=count;
647         
648         if (RADEON_DEBUG & DEBUG_STATE)
649                 fprintf(stderr, "aos_count=%d\n", count);
650         
651         if(count>R300_MAX_AOS_ARRAYS){
652                 fprintf(stderr, "Aieee ! AOS array count exceeded !\n");
653                 exit(-1);
654                 }
655                         
656         /* Implement AOS */
657         
658         /* setup INPUT_ROUTE */
659         R300_STATECHANGE(r300, vir[0]);
660         for(i=0;i+1<count;i+=2){
661                 dw=(r300->state.aos[i].ncomponents-1) 
662                 | ((r300->state.aos[i].reg)<<8)
663                 | (r300->state.aos[i].format<<14)
664                 | (((r300->state.aos[i+1].ncomponents-1) 
665                 | ((r300->state.aos[i+1].reg)<<8)
666                 | (r300->state.aos[i+1].format<<14))<<16);
667                 
668                 if(i+2==count){
669                         dw|=(1<<(13+16));
670                         }
671                 r300->hw.vir[0].cmd[R300_VIR_CNTL_0+(i>>1)]=dw;
672                 }
673         if(count & 1){
674                 dw=(r300->state.aos[count-1].ncomponents-1)
675                 | (r300->state.aos[count-1].format<<14)
676                 | ((r300->state.aos[count-1].reg)<<8)
677                 | (1<<13);
678                 r300->hw.vir[0].cmd[R300_VIR_CNTL_0+(count>>1)]=dw;
679                 //fprintf(stderr, "vir0 dw=%08x\n", dw);
680                 }
681         /* Set the rest of INPUT_ROUTE_0 to 0 */
682         //for(i=((count+1)>>1); i<8; i++)r300->hw.vir[0].cmd[R300_VIR_CNTL_0+i]=(0x0);
683         ((drm_r300_cmd_header_t*)r300->hw.vir[0].cmd)->unchecked_state.count = (count+1)>>1;
684         
685         
686         /* Mesa assumes that all missing components are from (0, 0, 0, 1) */
687         #define ALL_COMPONENTS ((R300_INPUT_ROUTE_SELECT_X<<R300_INPUT_ROUTE_X_SHIFT) \
688                 | (R300_INPUT_ROUTE_SELECT_Y<<R300_INPUT_ROUTE_Y_SHIFT) \
689                 | (R300_INPUT_ROUTE_SELECT_Z<<R300_INPUT_ROUTE_Z_SHIFT) \
690                 | (R300_INPUT_ROUTE_SELECT_W<<R300_INPUT_ROUTE_W_SHIFT))
691         
692         #define ALL_DEFAULT ((R300_INPUT_ROUTE_SELECT_ZERO<<R300_INPUT_ROUTE_X_SHIFT) \
693                 | (R300_INPUT_ROUTE_SELECT_ZERO<<R300_INPUT_ROUTE_Y_SHIFT) \
694                 | (R300_INPUT_ROUTE_SELECT_ZERO<<R300_INPUT_ROUTE_Z_SHIFT) \
695                 | (R300_INPUT_ROUTE_SELECT_ONE<<R300_INPUT_ROUTE_W_SHIFT))
696         
697         R300_STATECHANGE(r300, vir[1]);
698                 
699         for(i=0;i+1<count;i+=2){
700                 /* do i first.. */
701                 mask=(1<<(r300->state.aos[i].ncomponents*3))-1;
702                 dw=(ALL_COMPONENTS & mask)
703                 | (ALL_DEFAULT & ~mask)
704                 | R300_INPUT_ROUTE_ENABLE;
705                 
706                 /* i+1 */
707                 mask=(1<<(r300->state.aos[i+1].ncomponents*3))-1;
708                 dw|=( 
709                 (ALL_COMPONENTS & mask)
710                 | (ALL_DEFAULT & ~mask)
711                 | R300_INPUT_ROUTE_ENABLE
712                 )<<16;
713         
714                 r300->hw.vir[1].cmd[R300_VIR_CNTL_0+(i>>1)]=dw;
715                 }
716         if(count & 1){
717                 mask=(1<<(r300->state.aos[count-1].ncomponents*3))-1;
718                 dw=(ALL_COMPONENTS & mask)
719                 | (ALL_DEFAULT & ~mask)
720                 | R300_INPUT_ROUTE_ENABLE;
721                 r300->hw.vir[1].cmd[R300_VIR_CNTL_0+(count>>1)]=dw;
722                 //fprintf(stderr, "vir1 dw=%08x\n", dw);
723                 }
724         /* Set the rest of INPUT_ROUTE_1 to 0 */
725         //for(i=((count+1)>>1); i<8; i++)r300->hw.vir[1].cmd[R300_VIR_CNTL_0+i]=0x0;
726         ((drm_r300_cmd_header_t*)r300->hw.vir[1].cmd)->unchecked_state.count = (count+1)>>1;
727         
728         /* Set up input_cntl */
729         
730         R300_STATECHANGE(r300, vic);
731         r300->hw.vic.cmd[R300_VIC_CNTL_0]=0x5555;  /* Hard coded value, no idea what it means */
732         
733         r300->hw.vic.cmd[R300_VIC_CNTL_1]=R300_INPUT_CNTL_POS
734                                         | R300_INPUT_CNTL_COLOR;
735         
736         for(i=0;i < ctx->Const.MaxTextureUnits;i++)
737                 if(ctx->Texture.Unit[i].Enabled)
738                         r300->hw.vic.cmd[R300_VIC_CNTL_1]|=(R300_INPUT_CNTL_TC0<<i);
739         
740         /* Stage 3: VAP output */
741         R300_STATECHANGE(r300, vof);
742         r300->hw.vof.cmd[R300_VOF_CNTL_0]=R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT
743                                         | R300_VAP_OUTPUT_VTX_FMT_0__COLOR_PRESENT;
744         
745         r300->hw.vof.cmd[R300_VOF_CNTL_1]=0;
746         for(i=0;i < ctx->Const.MaxTextureUnits;i++)
747                 if(ctx->Texture.Unit[i].Enabled)
748                         r300->hw.vof.cmd[R300_VOF_CNTL_1]|=(4<<(3*i));
749         
750 }
751
752 static r300TexObj default_tex_obj={
753         filter:R300_TX_MAG_FILTER_LINEAR | R300_TX_MIN_FILTER_LINEAR,
754         pitch: 0x8000,
755         size: (0xff << R300_TX_WIDTHMASK_SHIFT) 
756               | (0xff << R300_TX_HEIGHTMASK_SHIFT)
757               | (0x8 << R300_TX_SIZE_SHIFT),
758         format: 0x88a0c,
759         offset: 0x0,
760         unknown4: 0x0,
761         unknown5: 0x0
762         };
763
764         /* there is probably a system to these value, but, for now, 
765            we just try by hand */
766
767 static int inline translate_src(int src)
768 {
769         switch (src) {
770         case GL_TEXTURE:
771                 return 1;
772                 break;
773         case GL_CONSTANT:
774                 return 2;
775                 break;
776         case GL_PRIMARY_COLOR:
777                 return 3;
778                 break;
779         case GL_PREVIOUS:
780                 return 4;
781                 break;
782         case GL_ZERO:
783                 return 5;
784                 break;
785         case GL_ONE:
786                 return 6;
787                 break;
788         default:
789                 return 0;
790         }
791 }
792            
793 /* I think 357 and 457 are prime numbers.. wiggle them if you get coincidences */
794 #define FORMAT_HASH(opRGB, srcRGB, modeRGB, opA, srcA, modeA, format)   ( \
795         (\
796         ((opRGB)<<30) | ((opA)<<28) | \
797         ((srcRGB)<< 25) | ((srcA)<<22) | \
798         ((modeRGB)) \
799         ) \
800         ^ ((modeA)*357) \
801         ^ (((format)) *457) \
802         )
803            
804 static GLuint translate_texture_format(GLcontext *ctx, GLint tex_unit, GLuint format)
805 {
806         const struct gl_texture_unit *texUnit= &ctx->Texture.Unit[tex_unit];
807         int i=0; /* number of alpha args .. */
808         switch(FORMAT_HASH(                                                     
809                 texUnit->_CurrentCombine->OperandRGB[i] -GL_SRC_COLOR,
810                 translate_src(texUnit->_CurrentCombine->SourceRGB[i]),
811                 texUnit->_CurrentCombine->ModeRGB,
812                 texUnit->_CurrentCombine->OperandA[i] -GL_SRC_ALPHA,
813                 translate_src(texUnit->_CurrentCombine->SourceA[i]),
814                 texUnit->_CurrentCombine->ModeA,
815                 format
816                 )){
817         case FORMAT_HASH(0, 1, 0x2100, 0, 1, 0x2100, 0x00088047):
818                 return 0x1a0c;
819         case FORMAT_HASH(0, 1, 0x2100, 0, 1, 0x2100, 0x00077047):
820                 return 0x4ba0c;
821         case FORMAT_HASH(0, 1, 0x2100, 0, 1, 0x2100, 0x00055047):
822                 return 0x53a0c; 
823         case FORMAT_HASH(0, 1, 0x2100, 0, 4, 0x1e01, 0x00088047):
824                 return 0x53a0c;
825         case FORMAT_HASH(0, 1, 0x2100, 0, 4, 0x1e01, 0x00055047):
826                 return 0x53a0c; 
827         default:
828                 {
829                 static int warn_once=1;
830                 if(warn_once){
831                         fprintf(stderr, "%s:%s Do not know how to translate texture format - help me !\n",
832                                 __FILE__, __FUNCTION__);
833                         warn_once=0;
834                         }
835                 }
836                 return 0;
837         }
838 }
839         
840 void r300_setup_textures(GLcontext *ctx)
841 {
842         int i, mtu;
843         struct r300_tex_obj *t;
844         r300ContextPtr r300 = R300_CONTEXT(ctx);
845         int max_texture_unit=-1; /* -1 translates into no setup costs for fields */
846         struct gl_texture_unit *texUnit;
847
848         R300_STATECHANGE(r300, txe);
849         R300_STATECHANGE(r300, tex.filter);
850         R300_STATECHANGE(r300, tex.unknown1);
851         R300_STATECHANGE(r300, tex.size);
852         R300_STATECHANGE(r300, tex.format);
853         R300_STATECHANGE(r300, tex.offset);
854         R300_STATECHANGE(r300, tex.unknown4);
855         R300_STATECHANGE(r300, tex.unknown5);
856         
857         r300->state.texture.tc_count=0;
858         
859         r300->hw.txe.cmd[R300_TXE_ENABLE]=0x0;
860         
861         mtu = r300->radeon.glCtx->Const.MaxTextureUnits;
862         if (RADEON_DEBUG & DEBUG_STATE)
863                 fprintf(stderr, "mtu=%d\n", mtu);
864         
865         if(mtu>R300_MAX_TEXTURE_UNITS){
866                 fprintf(stderr, "Aiiee ! mtu=%d is greater than R300_MAX_TEXTURE_UNITS=%d\n", 
867                         mtu, R300_MAX_TEXTURE_UNITS);
868                 exit(-1);
869                 }
870         for(i=0;i<mtu;i++){
871                 if(ctx->Texture.Unit[i].Enabled){
872                         t=r300->state.texture.unit[i].texobj;
873                         r300->state.texture.tc_count++;
874                         if(t==NULL){
875                                 fprintf(stderr, "Texture unit %d enabled, but corresponding texobj is NULL, using default object.\n", i);
876                                 //exit(-1);
877                                 t=&default_tex_obj;
878                                 }
879                         if (RADEON_DEBUG & DEBUG_STATE)
880                                 fprintf(stderr, "Activating texture unit %d\n", i);
881                         max_texture_unit=i;
882                         r300->hw.txe.cmd[R300_TXE_ENABLE]|=(1<<i);
883                         
884                         r300->hw.tex.filter.cmd[R300_TEX_VALUE_0+i]=t->filter;
885                         r300->hw.tex.unknown1.cmd[R300_TEX_VALUE_0+i]=t->pitch;
886                         r300->hw.tex.size.cmd[R300_TEX_VALUE_0+i]=t->size;
887                         r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=t->format;
888                         r300->hw.tex.offset.cmd[R300_TEX_VALUE_0+i]=r300->radeon.radeonScreen->fbLocation+t->offset;
889                         r300->hw.tex.unknown4.cmd[R300_TEX_VALUE_0+i]=0x0;
890                         r300->hw.tex.unknown5.cmd[R300_TEX_VALUE_0+i]=0x0;
891                         
892                         
893                         /* We don't know how to set this yet */
894                         //value from r300_lib.c for RGB24
895                         //r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=0x88a0c; 
896                         r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=translate_texture_format(ctx, i, t->format);
897                         /* Use the code below to quickly find matching texture
898                            formats. Requires an app that displays the same texture
899                            repeatedly  */
900                               #if 1
901                                 if(r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]==0){ 
902                                         static int fmt=0;
903                                         static int k=0;
904                                         k++;
905                                         if(k>200){
906                                                 k=0;
907                                                 fmt++;
908                                                 texUnit = &ctx->Texture.Unit[i];
909                                                 fprintf(stderr, "Want to set FORMAT_HASH(%d, %d, 0x%04x, %d, %d, 0x%04x, 0x%08x)\n",
910                                                         texUnit->_CurrentCombine->OperandRGB[0] -GL_SRC_COLOR,
911                                                         translate_src(texUnit->_CurrentCombine->SourceRGB[0]),
912                                                         texUnit->_CurrentCombine->ModeRGB,
913                                                         texUnit->_CurrentCombine->OperandA[0] -GL_SRC_ALPHA,
914                                                         translate_src(texUnit->_CurrentCombine->SourceA[0]),
915                                                         texUnit->_CurrentCombine->ModeA,
916                                                         t->format
917                                                         );
918                                                 if(fmt>0xff){
919                                                         //exit(-1);
920                                                         fmt=0;
921                                                         }
922                                                 //sleep(1);
923                                                 fprintf(stderr, "Now trying format %08x\n", 
924                                                         0x00a0c | (fmt<<12));
925                                                 }
926                                         r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=0x00a0c | (fmt<<12);
927                                         }
928                               #endif
929                         
930                         }
931                         
932                 }
933         ((drm_r300_cmd_header_t*)r300->hw.tex.filter.cmd)->unchecked_state.count = max_texture_unit+1;
934         ((drm_r300_cmd_header_t*)r300->hw.tex.unknown1.cmd)->unchecked_state.count = max_texture_unit+1;
935         ((drm_r300_cmd_header_t*)r300->hw.tex.size.cmd)->unchecked_state.count = max_texture_unit+1;
936         ((drm_r300_cmd_header_t*)r300->hw.tex.format.cmd)->unchecked_state.count = max_texture_unit+1;
937         ((drm_r300_cmd_header_t*)r300->hw.tex.offset.cmd)->unchecked_state.count = max_texture_unit+1;
938         ((drm_r300_cmd_header_t*)r300->hw.tex.unknown4.cmd)->unchecked_state.count = max_texture_unit+1;
939         ((drm_r300_cmd_header_t*)r300->hw.tex.unknown5.cmd)->unchecked_state.count = max_texture_unit+1;
940         
941         if (RADEON_DEBUG & DEBUG_STATE)
942                 fprintf(stderr, "TX_ENABLE: %08x  max_texture_unit=%d\n", r300->hw.txe.cmd[R300_TXE_ENABLE], max_texture_unit);
943 }
944
945 void r300_setup_rs_unit(GLcontext *ctx)
946 {
947         r300ContextPtr r300 = R300_CONTEXT(ctx);
948         int i;
949         
950         /* This needs to be rewritten - it is a hack at best */
951         
952         R300_STATECHANGE(r300, ri);
953         R300_STATECHANGE(r300, rc);
954         R300_STATECHANGE(r300, rr);
955         
956         for(i = 1; i <= 8; ++i)
957                 r300->hw.ri.cmd[i] = 0x00d10000;
958         r300->hw.ri.cmd[R300_RI_INTERP_1] |= R300_RS_INTERP_1_UNKNOWN;
959         r300->hw.ri.cmd[R300_RI_INTERP_2] |= R300_RS_INTERP_2_UNKNOWN;
960         r300->hw.ri.cmd[R300_RI_INTERP_3] |= R300_RS_INTERP_3_UNKNOWN;
961         
962         for(i = 1; i <= 8; ++i)
963                 r300->hw.rr.cmd[i] = 0;
964         /* textures enabled ? */
965         if(r300->state.texture.tc_count>0){
966         
967                 /* This code only really works with one set of texture coordinates */
968                 
969                 /* The second constant is needed to get glxgears display anything .. */
970                 r300->hw.rc.cmd[1] = R300_RS_CNTL_0_UNKNOWN_7 
971                                 | R300_RS_CNTL_0_UNKNOWN_18 
972                                 | (r300->state.texture.tc_count<<R300_RS_CNTL_TC_CNT_SHIFT);
973                 r300->hw.rc.cmd[2] = 0xc0;
974         
975         
976                 ((drm_r300_cmd_header_t*)r300->hw.rr.cmd)->unchecked_state.count = 1;
977                 r300->hw.rr.cmd[R300_RR_ROUTE_0] = 0x24008;
978                 
979                 } else {
980                 
981                 /* The second constant is needed to get glxgears display anything .. */
982                 r300->hw.rc.cmd[1] = R300_RS_CNTL_0_UNKNOWN_7 | R300_RS_CNTL_0_UNKNOWN_18;
983                 r300->hw.rc.cmd[2] = 0;
984                 
985                 ((drm_r300_cmd_header_t*)r300->hw.rr.cmd)->unchecked_state.count = 1;
986                 r300->hw.rr.cmd[R300_RR_ROUTE_0] = 0x4000;
987                 
988                 }
989 }
990
991 /**
992  * Called by Mesa after an internal state update.
993  */
994 static void r300InvalidateState(GLcontext * ctx, GLuint new_state)
995 {
996         r300ContextPtr r300 = R300_CONTEXT(ctx);
997
998         _swrast_InvalidateState(ctx, new_state);
999         _swsetup_InvalidateState(ctx, new_state);
1000         _ac_InvalidateState(ctx, new_state);
1001         _tnl_InvalidateState(ctx, new_state);
1002         _ae_invalidate_state(ctx, new_state);
1003
1004         /* Go inefficiency! */
1005         r300ResetHwState(r300);
1006 }
1007
1008
1009 /**
1010  * Completely recalculates hardware state based on the Mesa state.
1011  */
1012 void r300ResetHwState(r300ContextPtr r300)
1013 {
1014         GLcontext* ctx = r300->radeon.glCtx;
1015         int i;
1016
1017         if (RADEON_DEBUG & DEBUG_STATE)
1018                 fprintf(stderr, "%s\n", __FUNCTION__);
1019
1020         r300UpdateWindow(ctx);
1021         
1022         r300ColorMask(ctx,
1023                 ctx->Color.ColorMask[RCOMP],
1024                 ctx->Color.ColorMask[GCOMP],
1025                 ctx->Color.ColorMask[BCOMP],
1026                 ctx->Color.ColorMask[ACOMP]);
1027
1028         r300Enable(ctx, GL_DEPTH_TEST, ctx->Depth.Test);
1029         r300DepthMask(ctx, ctx->Depth.Mask);
1030         r300DepthFunc(ctx, ctx->Depth.Func);
1031
1032         r300UpdateCulling(ctx);
1033         
1034         r300_setup_routing(ctx, GL_TRUE);
1035         
1036         r300UpdateTextureState(ctx);
1037         r300_setup_textures(ctx);
1038         r300_setup_rs_unit(ctx);
1039         
1040         
1041         r300_set_blend_state(ctx);
1042         r300AlphaFunc(ctx, ctx->Color.AlphaFunc, ctx->Color.AlphaRef);
1043
1044 //BEGIN: TODO
1045         r300->hw.unk2080.cmd[1] = 0x0030045A;
1046
1047         r300->hw.ovf.cmd[R300_OVF_FMT_0] = 0x00000003;
1048         r300->hw.ovf.cmd[R300_OVF_FMT_1] = 0x00000000;
1049
1050         r300->hw.vte.cmd[1] = R300_VPORT_X_SCALE_ENA
1051                                 | R300_VPORT_X_OFFSET_ENA
1052                                 | R300_VPORT_Y_SCALE_ENA
1053                                 | R300_VPORT_Y_OFFSET_ENA
1054                                 | R300_VPORT_Z_SCALE_ENA
1055                                 | R300_VPORT_Z_OFFSET_ENA
1056                                 | R300_VTX_W0_FMT;
1057         r300->hw.vte.cmd[2] = 0x00000008;
1058
1059         r300->hw.unk2134.cmd[1] = 0x00FFFFFF;
1060         r300->hw.unk2134.cmd[2] = 0x00000000;
1061
1062         r300->hw.unk2140.cmd[1] = 0x00000000;
1063
1064         #if 0 /* Done in setup routing */
1065         ((drm_r300_cmd_header_t*)r300->hw.vir[0].cmd)->unchecked_state.count = 1;
1066         r300->hw.vir[0].cmd[1] = 0x21030003;
1067
1068         ((drm_r300_cmd_header_t*)r300->hw.vir[1].cmd)->unchecked_state.count = 1;
1069         r300->hw.vir[1].cmd[1] = 0xF688F688;
1070
1071         r300->hw.vic.cmd[R300_VIR_CNTL_0] = 0x00000001;
1072         r300->hw.vic.cmd[R300_VIR_CNTL_1] = 0x00000405;
1073         #endif
1074         
1075         r300->hw.unk21DC.cmd[1] = 0xAAAAAAAA;
1076
1077         r300->hw.unk221C.cmd[1] = R300_221C_NORMAL;
1078
1079         r300->hw.unk2220.cmd[1] = r300PackFloat32(1.0);
1080         r300->hw.unk2220.cmd[2] = r300PackFloat32(1.0);
1081         r300->hw.unk2220.cmd[3] = r300PackFloat32(1.0);
1082         r300->hw.unk2220.cmd[4] = r300PackFloat32(1.0);
1083
1084         if (GET_CHIP(r300->radeon.radeonScreen) == RADEON_CHIP_R300)
1085                 r300->hw.unk2288.cmd[1] = R300_2288_R300;
1086         else
1087                 r300->hw.unk2288.cmd[1] = R300_2288_RV350;
1088
1089         #if 0
1090         r300->hw.vof.cmd[R300_VOF_CNTL_0] = R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT
1091                                 | R300_VAP_OUTPUT_VTX_FMT_0__COLOR_PRESENT;
1092         r300->hw.vof.cmd[R300_VOF_CNTL_1] = 0; /* no textures */
1093         #endif  
1094         
1095         r300->hw.pvs.cmd[R300_PVS_CNTL_1] = 0;
1096         r300->hw.pvs.cmd[R300_PVS_CNTL_2] = 0;
1097         r300->hw.pvs.cmd[R300_PVS_CNTL_3] = 0;
1098
1099         r300->hw.gb_enable.cmd[1] = R300_GB_POINT_STUFF_ENABLE
1100                 | R300_GB_LINE_STUFF_ENABLE
1101                 | R300_GB_TRIANGLE_STUFF_ENABLE;
1102
1103         r300->hw.gb_misc.cmd[R300_GB_MISC_MSPOS_0] = 0x66666666;
1104         r300->hw.gb_misc.cmd[R300_GB_MISC_MSPOS_1] = 0x06666666;
1105         if (GET_CHIP(r300->radeon.radeonScreen) == RADEON_CHIP_R300)
1106                 r300->hw.gb_misc.cmd[R300_GB_MISC_TILE_CONFIG] = R300_GB_TILE_ENABLE
1107                                                         | R300_GB_TILE_PIPE_COUNT_R300
1108                                                         | R300_GB_TILE_SIZE_16;
1109         else
1110                 r300->hw.gb_misc.cmd[R300_GB_MISC_TILE_CONFIG] = R300_GB_TILE_ENABLE
1111                                                         | R300_GB_TILE_PIPE_COUNT_RV300
1112                                                         | R300_GB_TILE_SIZE_16;
1113         r300->hw.gb_misc.cmd[R300_GB_MISC_SELECT] = 0x00000000;
1114         r300->hw.gb_misc.cmd[R300_GB_MISC_AA_CONFIG] = 0x00000000; /* No antialiasing */
1115
1116         //r300->hw.txe.cmd[R300_TXE_ENABLE] = 0;
1117
1118         r300->hw.unk4200.cmd[1] = r300PackFloat32(0.0);
1119         r300->hw.unk4200.cmd[2] = r300PackFloat32(0.0);
1120         r300->hw.unk4200.cmd[3] = r300PackFloat32(1.0);
1121         r300->hw.unk4200.cmd[4] = r300PackFloat32(1.0);
1122
1123         r300->hw.unk4214.cmd[1] = 0x00050005;
1124
1125         r300->hw.ps.cmd[R300_PS_POINTSIZE] = (6 << R300_POINTSIZE_X_SHIFT) |
1126                                              (6 << R300_POINTSIZE_Y_SHIFT);
1127
1128         r300->hw.unk4230.cmd[1] = 0x01800000;
1129         r300->hw.unk4230.cmd[2] = 0x00020006;
1130         r300->hw.unk4230.cmd[3] = r300PackFloat32(1.0 / 192.0);
1131
1132         r300->hw.unk4260.cmd[1] = 0;
1133         r300->hw.unk4260.cmd[2] = r300PackFloat32(0.0);
1134         r300->hw.unk4260.cmd[3] = r300PackFloat32(1.0);
1135
1136         r300->hw.unk4274.cmd[1] = 0x00000002;
1137         r300->hw.unk4274.cmd[2] = 0x0003AAAA;
1138         r300->hw.unk4274.cmd[3] = 0x00000000;
1139         r300->hw.unk4274.cmd[4] = 0x00000000;
1140
1141         r300->hw.unk4288.cmd[1] = 0x00000000;
1142         r300->hw.unk4288.cmd[2] = 0x00000001;
1143         r300->hw.unk4288.cmd[3] = 0x00000000;
1144         r300->hw.unk4288.cmd[4] = 0x00000000;
1145         r300->hw.unk4288.cmd[5] = 0x00000000;
1146
1147         r300->hw.unk42A0.cmd[1] = 0x00000000;
1148
1149         r300->hw.unk42B4.cmd[1] = 0x00000000;
1150
1151         r300->hw.unk42C0.cmd[1] = 0x4B7FFFFF;
1152         r300->hw.unk42C0.cmd[2] = 0x00000000;
1153
1154
1155         r300->hw.unk43A4.cmd[1] = 0x0000001C;
1156         r300->hw.unk43A4.cmd[2] = 0x2DA49525;
1157
1158         r300->hw.unk43E8.cmd[1] = 0x00FFFFFF;
1159
1160         r300->hw.fp.cmd[R300_FP_CNTL0] = 0;
1161         r300->hw.fp.cmd[R300_FP_CNTL1] = 0;
1162         r300->hw.fp.cmd[R300_FP_CNTL2] = 0;
1163         r300->hw.fp.cmd[R300_FP_NODE0] = 0;
1164         r300->hw.fp.cmd[R300_FP_NODE1] = 0;
1165         r300->hw.fp.cmd[R300_FP_NODE2] = 0;
1166         r300->hw.fp.cmd[R300_FP_NODE3] = 0;
1167
1168         r300->hw.unk46A4.cmd[1] = 0x00001B01;
1169         r300->hw.unk46A4.cmd[2] = 0x00001B0F;
1170         r300->hw.unk46A4.cmd[3] = 0x00001B0F;
1171         r300->hw.unk46A4.cmd[4] = 0x00001B0F;
1172         r300->hw.unk46A4.cmd[5] = 0x00000001;
1173
1174         for(i = 1; i <= 64; ++i) {
1175                 /* create NOP instructions */
1176                 r300->hw.fpi[0].cmd[i] = FP_INSTRC(MAD, FP_ARGC(SRC0C_XYZ), FP_ARGC(ONE), FP_ARGC(ZERO));
1177                 r300->hw.fpi[1].cmd[i] = FP_SELC(0,XYZ,NO,FP_TMP(0),0,0);
1178                 r300->hw.fpi[2].cmd[i] = FP_INSTRA(MAD, FP_ARGA(SRC0A), FP_ARGA(ONE), FP_ARGA(ZERO));
1179                 r300->hw.fpi[3].cmd[i] = FP_SELA(0,W,NO,FP_TMP(0),0,0);
1180         }
1181
1182         r300->hw.unk4BC0.cmd[1] = 0;
1183
1184         r300->hw.unk4BC8.cmd[1] = 0;
1185         r300->hw.unk4BC8.cmd[2] = 0;
1186         r300->hw.unk4BC8.cmd[3] = 0;
1187
1188         #if 0
1189         r300->hw.at.cmd[R300_AT_ALPHA_TEST] = 0;
1190         #endif
1191
1192         r300->hw.unk4BD8.cmd[1] = 0;
1193
1194         r300->hw.unk4E00.cmd[1] = 0;
1195
1196         #if 0
1197         r300->hw.bld.cmd[R300_BLD_CBLEND] = 0;
1198         r300->hw.bld.cmd[R300_BLD_ABLEND] = 0;
1199         #endif
1200
1201         r300->hw.unk4E10.cmd[1] = 0;
1202         r300->hw.unk4E10.cmd[2] = 0;
1203         r300->hw.unk4E10.cmd[3] = 0;
1204
1205         r300->hw.cb.cmd[R300_CB_OFFSET] =
1206                 r300->radeon.radeonScreen->backOffset +
1207                 r300->radeon.radeonScreen->fbLocation;
1208         r300->hw.cb.cmd[R300_CB_PITCH] = r300->radeon.radeonScreen->backPitch
1209                 | R300_COLOR_UNKNOWN_22_23;
1210
1211         r300->hw.unk4E50.cmd[1] = 0;
1212         r300->hw.unk4E50.cmd[2] = 0;
1213         r300->hw.unk4E50.cmd[3] = 0;
1214         r300->hw.unk4E50.cmd[4] = 0;
1215         r300->hw.unk4E50.cmd[5] = 0;
1216         r300->hw.unk4E50.cmd[6] = 0;
1217         r300->hw.unk4E50.cmd[7] = 0;
1218         r300->hw.unk4E50.cmd[8] = 0;
1219         r300->hw.unk4E50.cmd[9] = 0;
1220
1221         r300->hw.unk4E88.cmd[1] = 0;
1222
1223         r300->hw.unk4EA0.cmd[1] = 0x00000000;
1224         r300->hw.unk4EA0.cmd[2] = 0xffffffff;
1225
1226         r300->hw.unk4F08.cmd[1] = 0x00FFFF00;
1227
1228         r300->hw.unk4F10.cmd[1] = 0x00000002; // depthbuffer format?
1229         r300->hw.unk4F10.cmd[2] = 0x00000000;
1230         r300->hw.unk4F10.cmd[3] = 0x00000003;
1231         r300->hw.unk4F10.cmd[4] = 0x00000000;
1232
1233         r300->hw.zb.cmd[R300_ZB_OFFSET] =
1234                 r300->radeon.radeonScreen->depthOffset +
1235                 r300->radeon.radeonScreen->fbLocation;
1236         r300->hw.zb.cmd[R300_ZB_PITCH] = r300->radeon.radeonScreen->depthPitch;
1237
1238         r300->hw.unk4F28.cmd[1] = 0;
1239
1240         r300->hw.unk4F30.cmd[1] = 0;
1241         r300->hw.unk4F30.cmd[2] = 0;
1242
1243         r300->hw.unk4F44.cmd[1] = 0;
1244
1245         r300->hw.unk4F54.cmd[1] = 0;
1246
1247         ((drm_r300_cmd_header_t*)r300->hw.vpi.cmd)->vpu.count = 0;
1248         for(i = 1; i < R300_VPI_CMDSIZE; i += 4) {
1249                 /* MOV t0, t0 */
1250                 r300->hw.vpi.cmd[i+0] = VP_OUT(ADD,TMP,0,XYZW);
1251                 r300->hw.vpi.cmd[i+1] = VP_IN(TMP,0);
1252                 r300->hw.vpi.cmd[i+2] = VP_ZERO();
1253                 r300->hw.vpi.cmd[i+3] = VP_ZERO();
1254         }
1255
1256         ((drm_r300_cmd_header_t*)r300->hw.vpp.cmd)->vpu.count = 0;
1257         for(i = 1; i < R300_VPP_CMDSIZE; ++i)
1258                 r300->hw.vpp.cmd[i] = 0;
1259
1260         r300->hw.vps.cmd[R300_VPS_ZERO_0] = 0;
1261         r300->hw.vps.cmd[R300_VPS_ZERO_1] = 0;
1262         r300->hw.vps.cmd[R300_VPS_POINTSIZE] = r300PackFloat32(1.0);
1263         r300->hw.vps.cmd[R300_VPS_ZERO_3] = 0;
1264         
1265 //END: TODO
1266         
1267         r300->hw.all_dirty = GL_TRUE;
1268 }
1269
1270
1271
1272 /**
1273  * Calculate initial hardware state and register state functions.
1274  * Assumes that the command buffer and state atoms have been
1275  * initialized already.
1276  */
1277 void r300InitState(r300ContextPtr r300)
1278 {
1279         GLcontext *ctx = r300->radeon.glCtx;
1280         GLuint depth_fmt;
1281
1282         radeonInitState(&r300->radeon);
1283         
1284         switch (ctx->Visual.depthBits) {
1285         case 16:
1286                 r300->state.depth.scale = 1.0 / (GLfloat) 0xffff;
1287                 depth_fmt = R200_DEPTH_FORMAT_16BIT_INT_Z;
1288                 //r300->state.stencil.clear = 0x00000000;
1289                 break;
1290         case 24:
1291                 r300->state.depth.scale = 1.0 / (GLfloat) 0xffffff;
1292                 depth_fmt = R200_DEPTH_FORMAT_24BIT_INT_Z;
1293                 //r300->state.stencil.clear = 0xff000000;
1294                 break;
1295         default:
1296                 fprintf(stderr, "Error: Unsupported depth %d... exiting\n",
1297                         ctx->Visual.depthBits);
1298                 exit(-1);
1299         }
1300         
1301         memset(&(r300->state.texture), 0, sizeof(r300->state.texture));
1302
1303         r300ResetHwState(r300);
1304 }
1305
1306
1307
1308 /**
1309  * Initialize driver's state callback functions
1310  */
1311 void r300InitStateFuncs(struct dd_function_table* functions)
1312 {
1313         radeonInitStateFuncs(functions);
1314
1315         functions->UpdateState = r300InvalidateState;
1316         //functions->AlphaFunc = r300AlphaFunc;
1317         functions->BlendColor = r300BlendColor;
1318         functions->BlendEquationSeparate = r300BlendEquationSeparate;
1319         functions->BlendFuncSeparate = r300BlendFuncSeparate;
1320         functions->Enable = r300Enable;
1321         functions->ColorMask = r300ColorMask;
1322         functions->DepthFunc = r300DepthFunc;
1323         functions->DepthMask = r300DepthMask;
1324         functions->CullFace = r300CullFace;
1325         functions->FrontFace = r300FrontFace;
1326
1327         /* Viewport related */
1328         functions->Viewport = r300Viewport;
1329         functions->DepthRange = r300DepthRange;
1330         functions->PointSize = r300PointSize;
1331 }
1332