Implement a more elaborate hashing scheme for texture formats. Still not perfect.
[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, intFormat)        ( \
795         (\
796         ((opRGB)<<30) | ((opA)<<28) | \
797         ((srcRGB)<< 25) | ((srcA)<<22) | \
798         ((modeRGB)) \
799         ) \
800         ^ ((modeA)*357) \
801         ^ (((format)) *457) \
802         ^ ((intFormat) * 7) \
803         )
804            
805 static GLuint translate_texture_format(GLcontext *ctx, GLint tex_unit, GLuint format, GLint IntFormat)
806 {
807         const struct gl_texture_unit *texUnit= &ctx->Texture.Unit[tex_unit];
808         int i=0; /* number of alpha args .. */
809         
810         /* Size field in format specific first */
811         switch(FORMAT_HASH(                                                     
812                 texUnit->_CurrentCombine->OperandRGB[i] -GL_SRC_COLOR,
813                 translate_src(texUnit->_CurrentCombine->SourceRGB[i]),
814                 texUnit->_CurrentCombine->ModeRGB,
815                 texUnit->_CurrentCombine->OperandA[i] -GL_SRC_ALPHA,
816                 translate_src(texUnit->_CurrentCombine->SourceA[i]),
817                 texUnit->_CurrentCombine->ModeA,
818                 format,
819                 IntFormat
820                 )){
821         case FORMAT_HASH(0, 1, 0x2100, 0, 1, 0x2100, 0x00088047, 0x1908):
822                 /* tested with:
823                         kfiresaver.kss 
824                         */
825                 return 0x7a0c; /* kfiresaver.kss */
826         case FORMAT_HASH(0, 1, 0x2100, 0, 1, 0x2100, 0x00088047, 0x8058):
827                 /* tested with:
828                         Quake3demo 
829                         */
830                 return 0x8a0c; /* Quake3demo -small font on the bottom */
831         case FORMAT_HASH(0, 1, 0x2100, 0, 1, 0x2100, 0x00077047, 4):
832                 /* tested with:
833                         kfiresaver.kss 
834                         */
835                 return 0x4ba0c;
836         case FORMAT_HASH(0, 1, 0x2100, 0, 1, 0x2100, 0x00055047, 4):
837                 /* tested with:
838                         kfiresaver.kss
839                         kfountain.kss
840                         */
841                 return 0x51a0c; 
842         case FORMAT_HASH(0, 1, 0x2100, 0, 4, 0x1e01, 0x00088047, 3):
843                 /* tested with
844                         lesson 06
845                         lesson 07
846                         */
847                 return 0x53a0c;
848         //case FORMAT_HASH(0, 1, 0x2100, 0, 4, 0x1e01, 0x00055047, 0):
849                 /* Can't remember what I tested this with.. 
850                    try putting return 0 of you see broken textures which 
851                    are not being complained about */
852                 return 0x53a0c; 
853         case FORMAT_HASH(0, 1, 0x2100, 0, 4, 0x1e01, 0x00099047, 0x8051):
854         //case FORMAT_HASH(0, 1, 0x2100, 0, 4, 0x1e01, 0x00089047, 0x8058):
855         case FORMAT_HASH(0, 1, 0x2100, 0, 4, 0x1e01, 0x00077047, 0x8051):
856                 /* Tested with:
857                         Quake3demo
858                         */
859                 return 0x53a0c; 
860         case  FORMAT_HASH(0, 1, 0x2100, 0, 1, 0x2100, 0x00055045, 0x00008056):
861         case  FORMAT_HASH(0, 1, 0x2100, 0, 1, 0x2100, 0x00088045, 0x00008056):
862                 return 0x53a23;
863         case FORMAT_HASH(0, 1, 0x2100, 0, 4, 0x1e01, 0x00099004, 0x00008050):
864                 return 0;
865                 return 0x2a0b;
866         }
867         //      return 0x53a0c; 
868         
869         /* Just key on internal format  - useful for quick tryouts*/
870         
871                 return 0;
872         #if 1
873         switch(IntFormat
874                 ){
875         case 0x3:
876                 return 0x53a0c;
877         case 0x8050:
878                 return 0x2a0b;
879         case 0x8056:
880         
881                 return 0x53a23;
882         case 0x8058:
883                 return 0;
884                 return 0x8a0c;
885                 //fprintf(stderr, "%08x\n", format);
886                 /* Tested with:
887                         Quake3demo
888                         */
889                 return 0x53a0c; 
890         default:
891                 return 0x53a0c;
892         }
893         #endif
894         
895         
896         
897         {
898                 static int warn_once=1;
899                 if(warn_once){
900                         fprintf(stderr, "%s:%s Do not know how to translate texture format - help me !\n",
901                                 __FILE__, __FUNCTION__);
902                         warn_once=0;
903                         }
904         }
905                 return 0;
906 }
907         
908 void r300_setup_textures(GLcontext *ctx)
909 {
910         int i, mtu;
911         struct r300_tex_obj *t;
912         r300ContextPtr r300 = R300_CONTEXT(ctx);
913         int max_texture_unit=-1; /* -1 translates into no setup costs for fields */
914         struct gl_texture_unit *texUnit;
915
916         R300_STATECHANGE(r300, txe);
917         R300_STATECHANGE(r300, tex.filter);
918         R300_STATECHANGE(r300, tex.unknown1);
919         R300_STATECHANGE(r300, tex.size);
920         R300_STATECHANGE(r300, tex.format);
921         R300_STATECHANGE(r300, tex.offset);
922         R300_STATECHANGE(r300, tex.unknown4);
923         R300_STATECHANGE(r300, tex.unknown5);
924         
925         r300->state.texture.tc_count=0;
926         
927         r300->hw.txe.cmd[R300_TXE_ENABLE]=0x0;
928         
929         mtu = r300->radeon.glCtx->Const.MaxTextureUnits;
930         if (RADEON_DEBUG & DEBUG_STATE)
931                 fprintf(stderr, "mtu=%d\n", mtu);
932         
933         if(mtu>R300_MAX_TEXTURE_UNITS){
934                 fprintf(stderr, "Aiiee ! mtu=%d is greater than R300_MAX_TEXTURE_UNITS=%d\n", 
935                         mtu, R300_MAX_TEXTURE_UNITS);
936                 exit(-1);
937                 }
938         for(i=0;i<mtu;i++){
939                 if(ctx->Texture.Unit[i].Enabled){
940                         t=r300->state.texture.unit[i].texobj;
941                         r300->state.texture.tc_count++;
942                         if(t==NULL){
943                                 fprintf(stderr, "Texture unit %d enabled, but corresponding texobj is NULL, using default object.\n", i);
944                                 //exit(-1);
945                                 t=&default_tex_obj;
946                                 }
947                         if (RADEON_DEBUG & DEBUG_STATE)
948                                 fprintf(stderr, "Activating texture unit %d\n", i);
949                         max_texture_unit=i;
950                         r300->hw.txe.cmd[R300_TXE_ENABLE]|=(1<<i);
951                         
952                         r300->hw.tex.filter.cmd[R300_TEX_VALUE_0+i]=t->filter;
953                         r300->hw.tex.unknown1.cmd[R300_TEX_VALUE_0+i]=t->pitch;
954                         r300->hw.tex.size.cmd[R300_TEX_VALUE_0+i]=t->size;
955                         r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=t->format;
956                         r300->hw.tex.offset.cmd[R300_TEX_VALUE_0+i]=r300->radeon.radeonScreen->fbLocation+t->offset;
957                         r300->hw.tex.unknown4.cmd[R300_TEX_VALUE_0+i]=0x0;
958                         r300->hw.tex.unknown5.cmd[R300_TEX_VALUE_0+i]=0x0;
959                         
960                         
961                         
962                         /* We don't know how to set this yet */
963                         //value from r300_lib.c for RGB24
964                         //r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=0x88a0c; 
965                         r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=translate_texture_format(ctx, i, t->format, t->base.tObj->Image[0][0]->IntFormat);
966                         /* Use the code below to quickly find matching texture
967                            formats. Requires an app that displays the same texture
968                            repeatedly  */
969                               #if 1
970                                 if(r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]==0){ 
971                                         static int fmt=0x0;
972                                         static int k=0;
973                                         k++;
974                                         if(k>400){
975                                                 k=0;
976                                                 fmt++;
977                                                 texUnit = &ctx->Texture.Unit[i];
978                                                 fprintf(stderr, "Want to set FORMAT_HASH(%d, %d, 0x%04x, %d, %d, 0x%04x, 0x%08x, 0x%08x)\n",
979                                                         texUnit->_CurrentCombine->OperandRGB[0] -GL_SRC_COLOR,
980                                                         translate_src(texUnit->_CurrentCombine->SourceRGB[0]),
981                                                         texUnit->_CurrentCombine->ModeRGB,
982                                                         texUnit->_CurrentCombine->OperandA[0] -GL_SRC_ALPHA,
983                                                         translate_src(texUnit->_CurrentCombine->SourceA[0]),
984                                                         texUnit->_CurrentCombine->ModeA,
985                                                         t->format,
986                                                         t->base.tObj->Image[0][0]->IntFormat
987                                                         );
988                                                 fprintf(stderr, "Also known: format_x=%08x border_color=%08x cubic_faces=%08x\n", t->format_x, t->pp_border_color, t->pp_cubic_faces);
989                                                 fprintf(stderr, "\t_ReallyEnabled=%08x EnvMode=%08x IntFormat=%08x\n", texUnit->_ReallyEnabled, texUnit->EnvMode,  t->base.tObj->Image[0][0]->IntFormat);
990                                                 if(fmt>0xff){
991                                                         //exit(-1);
992                                                         fmt=0;
993                                                         }
994                                                 //sleep(1);
995                                                 fprintf(stderr, "Now trying format %08x\n", 
996                                                         0x00a0c | (fmt<<12));
997                                                 fprintf(stderr, "size=%08x\n", t->size);
998                                                 }
999                                         r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=0x00a0b | (fmt<<12);
1000                                         //r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=0x51a00 | (fmt);
1001                                         //r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=0x53a0c | (fmt<<24);
1002                                         }
1003                               #endif
1004                         
1005                         }
1006                         
1007                 }
1008         ((drm_r300_cmd_header_t*)r300->hw.tex.filter.cmd)->unchecked_state.count = max_texture_unit+1;
1009         ((drm_r300_cmd_header_t*)r300->hw.tex.unknown1.cmd)->unchecked_state.count = max_texture_unit+1;
1010         ((drm_r300_cmd_header_t*)r300->hw.tex.size.cmd)->unchecked_state.count = max_texture_unit+1;
1011         ((drm_r300_cmd_header_t*)r300->hw.tex.format.cmd)->unchecked_state.count = max_texture_unit+1;
1012         ((drm_r300_cmd_header_t*)r300->hw.tex.offset.cmd)->unchecked_state.count = max_texture_unit+1;
1013         ((drm_r300_cmd_header_t*)r300->hw.tex.unknown4.cmd)->unchecked_state.count = max_texture_unit+1;
1014         ((drm_r300_cmd_header_t*)r300->hw.tex.unknown5.cmd)->unchecked_state.count = max_texture_unit+1;
1015         
1016         if (RADEON_DEBUG & DEBUG_STATE)
1017                 fprintf(stderr, "TX_ENABLE: %08x  max_texture_unit=%d\n", r300->hw.txe.cmd[R300_TXE_ENABLE], max_texture_unit);
1018 }
1019
1020 void r300_setup_rs_unit(GLcontext *ctx)
1021 {
1022         r300ContextPtr r300 = R300_CONTEXT(ctx);
1023         int i;
1024         
1025         /* This needs to be rewritten - it is a hack at best */
1026         
1027         R300_STATECHANGE(r300, ri);
1028         R300_STATECHANGE(r300, rc);
1029         R300_STATECHANGE(r300, rr);
1030         
1031         for(i = 1; i <= 8; ++i)
1032                 r300->hw.ri.cmd[i] = 0x00d10000;
1033         r300->hw.ri.cmd[R300_RI_INTERP_1] |= R300_RS_INTERP_1_UNKNOWN;
1034         r300->hw.ri.cmd[R300_RI_INTERP_2] |= R300_RS_INTERP_2_UNKNOWN;
1035         r300->hw.ri.cmd[R300_RI_INTERP_3] |= R300_RS_INTERP_3_UNKNOWN;
1036         
1037         for(i = 1; i <= 8; ++i)
1038                 r300->hw.rr.cmd[i] = 0;
1039         /* textures enabled ? */
1040         if(r300->state.texture.tc_count>0){
1041         
1042                 /* This code only really works with one set of texture coordinates */
1043                 
1044                 /* The second constant is needed to get glxgears display anything .. */
1045                 r300->hw.rc.cmd[1] = R300_RS_CNTL_0_UNKNOWN_7 
1046                                 | R300_RS_CNTL_0_UNKNOWN_18 
1047                                 | (r300->state.texture.tc_count<<R300_RS_CNTL_TC_CNT_SHIFT);
1048                 r300->hw.rc.cmd[2] = 0xc0;
1049         
1050         
1051                 ((drm_r300_cmd_header_t*)r300->hw.rr.cmd)->unchecked_state.count = 1;
1052                 r300->hw.rr.cmd[R300_RR_ROUTE_0] = 0x24008;
1053                 
1054                 } else {
1055                 
1056                 /* The second constant is needed to get glxgears display anything .. */
1057                 r300->hw.rc.cmd[1] = R300_RS_CNTL_0_UNKNOWN_7 | R300_RS_CNTL_0_UNKNOWN_18;
1058                 r300->hw.rc.cmd[2] = 0;
1059                 
1060                 ((drm_r300_cmd_header_t*)r300->hw.rr.cmd)->unchecked_state.count = 1;
1061                 r300->hw.rr.cmd[R300_RR_ROUTE_0] = 0x4000;
1062                 
1063                 }
1064 }
1065
1066 #define vpucount(ptr) (((drm_r300_cmd_header_t*)(ptr))->vpu.count)
1067
1068 #define bump_vpu_count(ptr, new_count)   do{\
1069         drm_r300_cmd_header_t* _p=((drm_r300_cmd_header_t*)(ptr));\
1070         int _nc=(new_count)/4; \
1071         if(_nc>_p->vpu.count)_p->vpu.count=_nc;\
1072         }while(0)
1073
1074 void static inline setup_vertex_shader_fragment(r300ContextPtr r300, int dest, struct r300_vertex_shader_fragment *vsf)
1075 {
1076         int i;
1077         
1078         if(vsf->length==0)return;
1079         
1080         if(vsf->length & 0x3){
1081                 fprintf(stderr,"VERTEX_SHADER_FRAGMENT must have length divisible by 4\n");
1082                 exit(-1);
1083                 }
1084         
1085         switch((dest>>8) & 0xf){
1086         case 0:
1087                 R300_STATECHANGE(r300, vpi);
1088                 for(i=0;i<vsf->length;i++)
1089                         r300->hw.vpi.cmd[R300_VPI_INSTR_0+i+4*(dest & 0xff)]=(vsf->body.d[i]);
1090                 bump_vpu_count(r300->hw.vpi.cmd, vsf->length+4*(dest & 0xff));
1091                 break;
1092                 
1093         case 2:
1094                 R300_STATECHANGE(r300, vpp);
1095                 for(i=0;i<vsf->length;i++)
1096                         r300->hw.vpp.cmd[R300_VPP_PARAM_0+i+4*(dest & 0xff)]=(vsf->body.d[i]);
1097                 bump_vpu_count(r300->hw.vpp.cmd, vsf->length+4*(dest & 0xff));
1098                 break;
1099         case 4: 
1100                 R300_STATECHANGE(r300, vps);
1101                 for(i=0;i<vsf->length;i++)
1102                         r300->hw.vps.cmd[1+i+4*(dest & 0xff)]=(vsf->body.d[i]);
1103                 bump_vpu_count(r300->hw.vps.cmd, vsf->length+4*(dest & 0xff));
1104                 break;
1105         default:
1106                 fprintf(stderr, "%s:%s don't know how to handle dest %04x\n", __FILE__, __FUNCTION__, dest);
1107                 exit(-1);
1108         }
1109 }
1110
1111
1112 #include "r300_lib.h"
1113
1114 void r300SetupVertexShader(r300ContextPtr rmesa)
1115 {
1116         GLcontext* ctx = rmesa->radeon.glCtx;
1117         
1118         /* Reset state, in case we don't use something */
1119         ((drm_r300_cmd_header_t*)rmesa->hw.vpp.cmd)->vpu.count = 0;
1120         ((drm_r300_cmd_header_t*)rmesa->hw.vpi.cmd)->vpu.count = 0;
1121         ((drm_r300_cmd_header_t*)rmesa->hw.vps.cmd)->vpu.count = 0;
1122
1123
1124 /* This needs to be replaced by vertex shader generation code */
1125
1126         
1127         /* Watch out ! This is buggy .. but will do for now */
1128         
1129         /* At least one sanity check is in order */
1130         if(sizeof(rmesa->state.vertex_shader) != sizeof(FLAT_COLOR_PIPELINE.vertex_shader)){
1131                 fprintf(stderr, "Aieee ! vertex_shader sizes don't match.\n");
1132                 exit(-1);
1133                 }
1134         /* textures enabled ? */
1135         if(rmesa->state.texture.tc_count>0){
1136                 memcpy(&rmesa->state.vertex_shader, &(SINGLE_TEXTURE_PIPELINE.vertex_shader), sizeof(rmesa->state.vertex_shader));
1137                 } else {
1138                 memcpy(&rmesa->state.vertex_shader, &(FLAT_COLOR_PIPELINE.vertex_shader), sizeof(rmesa->state.vertex_shader));
1139                 }
1140
1141
1142         rmesa->state.vertex_shader.matrix[0].length=16;
1143         memcpy(rmesa->state.vertex_shader.matrix[0].body.f, ctx->_ModelProjectMatrix.m, 16*4);
1144         
1145         setup_vertex_shader_fragment(rmesa, VSF_DEST_PROGRAM, &(rmesa->state.vertex_shader.program));
1146         
1147         setup_vertex_shader_fragment(rmesa, VSF_DEST_MATRIX0, &(rmesa->state.vertex_shader.matrix[0]));
1148         #if 0
1149         setup_vertex_shader_fragment(rmesa, VSF_DEST_MATRIX1, &(rmesa->state.vertex_shader.matrix[0]));
1150         setup_vertex_shader_fragment(rmesa, VSF_DEST_MATRIX2, &(rmesa->state.vertex_shader.matrix[0]));
1151         
1152         setup_vertex_shader_fragment(rmesa, VSF_DEST_VECTOR0, &(rmesa->state.vertex_shader.vector[0]));
1153         setup_vertex_shader_fragment(rmesa, VSF_DEST_VECTOR1, &(rmesa->state.vertex_shader.vector[1]));
1154         #endif
1155         
1156         #if 0
1157         setup_vertex_shader_fragment(rmesa, VSF_DEST_UNKNOWN1, &(rmesa->state.vertex_shader.unknown1));
1158         setup_vertex_shader_fragment(rmesa, VSF_DEST_UNKNOWN2, &(rmesa->state.vertex_shader.unknown2));
1159         #endif
1160         
1161         R300_STATECHANGE(rmesa, pvs);
1162         rmesa->hw.pvs.cmd[R300_PVS_CNTL_1]=(rmesa->state.vertex_shader.program_start << R300_PVS_CNTL_1_PROGRAM_START_SHIFT)
1163                 | (rmesa->state.vertex_shader.unknown_ptr1 << R300_PVS_CNTL_1_UNKNOWN_SHIFT)
1164                 | (rmesa->state.vertex_shader.program_end << R300_PVS_CNTL_1_PROGRAM_END_SHIFT);
1165         rmesa->hw.pvs.cmd[R300_PVS_CNTL_2]=(rmesa->state.vertex_shader.param_offset << R300_PVS_CNTL_2_PARAM_OFFSET_SHIFT)
1166                 | (rmesa->state.vertex_shader.param_count << R300_PVS_CNTL_2_PARAM_COUNT_SHIFT);
1167         rmesa->hw.pvs.cmd[R300_PVS_CNTL_3]=(rmesa->state.vertex_shader.unknown_ptr2 << R300_PVS_CNTL_3_PROGRAM_UNKNOWN_SHIFT)
1168         | (rmesa->state.vertex_shader.unknown_ptr3 << 0);
1169         
1170         /* This is done for vertex shader fragments, but also needs to be done for vap_pvs, 
1171         so I leave it as a reminder */
1172         #if 0
1173         reg_start(R300_VAP_PVS_WAITIDLE,0);
1174                 e32(0x00000000);
1175         #endif
1176 }
1177
1178 /**
1179  * Called by Mesa after an internal state update.
1180  */
1181 static void r300InvalidateState(GLcontext * ctx, GLuint new_state)
1182 {
1183         r300ContextPtr r300 = R300_CONTEXT(ctx);
1184
1185         _swrast_InvalidateState(ctx, new_state);
1186         _swsetup_InvalidateState(ctx, new_state);
1187         _ac_InvalidateState(ctx, new_state);
1188         _tnl_InvalidateState(ctx, new_state);
1189         _ae_invalidate_state(ctx, new_state);
1190
1191         /* Go inefficiency! */
1192         r300ResetHwState(r300);
1193 }
1194
1195
1196 /**
1197  * Completely recalculates hardware state based on the Mesa state.
1198  */
1199 void r300ResetHwState(r300ContextPtr r300)
1200 {
1201         GLcontext* ctx = r300->radeon.glCtx;
1202         int i;
1203
1204         if (RADEON_DEBUG & DEBUG_STATE)
1205                 fprintf(stderr, "%s\n", __FUNCTION__);
1206
1207         r300UpdateWindow(ctx);
1208         
1209         r300ColorMask(ctx,
1210                 ctx->Color.ColorMask[RCOMP],
1211                 ctx->Color.ColorMask[GCOMP],
1212                 ctx->Color.ColorMask[BCOMP],
1213                 ctx->Color.ColorMask[ACOMP]);
1214
1215         r300Enable(ctx, GL_DEPTH_TEST, ctx->Depth.Test);
1216         r300DepthMask(ctx, ctx->Depth.Mask);
1217         r300DepthFunc(ctx, ctx->Depth.Func);
1218
1219         r300UpdateCulling(ctx);
1220         
1221         r300_setup_routing(ctx, GL_TRUE);
1222         
1223         r300UpdateTextureState(ctx);
1224         r300_setup_textures(ctx);
1225         r300_setup_rs_unit(ctx);
1226         
1227         r300SetupVertexShader(r300);
1228         
1229         r300_set_blend_state(ctx);
1230         r300AlphaFunc(ctx, ctx->Color.AlphaFunc, ctx->Color.AlphaRef);
1231
1232 //BEGIN: TODO
1233         r300->hw.unk2080.cmd[1] = 0x0030045A;
1234
1235         r300->hw.ovf.cmd[R300_OVF_FMT_0] = 0x00000003;
1236         r300->hw.ovf.cmd[R300_OVF_FMT_1] = 0x00000000;
1237
1238         r300->hw.vte.cmd[1] = R300_VPORT_X_SCALE_ENA
1239                                 | R300_VPORT_X_OFFSET_ENA
1240                                 | R300_VPORT_Y_SCALE_ENA
1241                                 | R300_VPORT_Y_OFFSET_ENA
1242                                 | R300_VPORT_Z_SCALE_ENA
1243                                 | R300_VPORT_Z_OFFSET_ENA
1244                                 | R300_VTX_W0_FMT;
1245         r300->hw.vte.cmd[2] = 0x00000008;
1246
1247         r300->hw.unk2134.cmd[1] = 0x00FFFFFF;
1248         r300->hw.unk2134.cmd[2] = 0x00000000;
1249
1250         r300->hw.unk2140.cmd[1] = 0x00000000;
1251
1252         #if 0 /* Done in setup routing */
1253         ((drm_r300_cmd_header_t*)r300->hw.vir[0].cmd)->unchecked_state.count = 1;
1254         r300->hw.vir[0].cmd[1] = 0x21030003;
1255
1256         ((drm_r300_cmd_header_t*)r300->hw.vir[1].cmd)->unchecked_state.count = 1;
1257         r300->hw.vir[1].cmd[1] = 0xF688F688;
1258
1259         r300->hw.vic.cmd[R300_VIR_CNTL_0] = 0x00000001;
1260         r300->hw.vic.cmd[R300_VIR_CNTL_1] = 0x00000405;
1261         #endif
1262         
1263         r300->hw.unk21DC.cmd[1] = 0xAAAAAAAA;
1264
1265         r300->hw.unk221C.cmd[1] = R300_221C_NORMAL;
1266
1267         r300->hw.unk2220.cmd[1] = r300PackFloat32(1.0);
1268         r300->hw.unk2220.cmd[2] = r300PackFloat32(1.0);
1269         r300->hw.unk2220.cmd[3] = r300PackFloat32(1.0);
1270         r300->hw.unk2220.cmd[4] = r300PackFloat32(1.0);
1271
1272         if (GET_CHIP(r300->radeon.radeonScreen) == RADEON_CHIP_R300)
1273                 r300->hw.unk2288.cmd[1] = R300_2288_R300;
1274         else
1275                 r300->hw.unk2288.cmd[1] = R300_2288_RV350;
1276
1277         #if 0
1278         r300->hw.vof.cmd[R300_VOF_CNTL_0] = R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT
1279                                 | R300_VAP_OUTPUT_VTX_FMT_0__COLOR_PRESENT;
1280         r300->hw.vof.cmd[R300_VOF_CNTL_1] = 0; /* no textures */
1281         #endif  
1282         
1283         r300->hw.pvs.cmd[R300_PVS_CNTL_1] = 0;
1284         r300->hw.pvs.cmd[R300_PVS_CNTL_2] = 0;
1285         r300->hw.pvs.cmd[R300_PVS_CNTL_3] = 0;
1286
1287         r300->hw.gb_enable.cmd[1] = R300_GB_POINT_STUFF_ENABLE
1288                 | R300_GB_LINE_STUFF_ENABLE
1289                 | R300_GB_TRIANGLE_STUFF_ENABLE;
1290
1291         r300->hw.gb_misc.cmd[R300_GB_MISC_MSPOS_0] = 0x66666666;
1292         r300->hw.gb_misc.cmd[R300_GB_MISC_MSPOS_1] = 0x06666666;
1293         if (GET_CHIP(r300->radeon.radeonScreen) == RADEON_CHIP_R300)
1294                 r300->hw.gb_misc.cmd[R300_GB_MISC_TILE_CONFIG] = R300_GB_TILE_ENABLE
1295                                                         | R300_GB_TILE_PIPE_COUNT_R300
1296                                                         | R300_GB_TILE_SIZE_16;
1297         else
1298                 r300->hw.gb_misc.cmd[R300_GB_MISC_TILE_CONFIG] = R300_GB_TILE_ENABLE
1299                                                         | R300_GB_TILE_PIPE_COUNT_RV300
1300                                                         | R300_GB_TILE_SIZE_16;
1301         r300->hw.gb_misc.cmd[R300_GB_MISC_SELECT] = 0x00000000;
1302         r300->hw.gb_misc.cmd[R300_GB_MISC_AA_CONFIG] = 0x00000000; /* No antialiasing */
1303
1304         //r300->hw.txe.cmd[R300_TXE_ENABLE] = 0;
1305
1306         r300->hw.unk4200.cmd[1] = r300PackFloat32(0.0);
1307         r300->hw.unk4200.cmd[2] = r300PackFloat32(0.0);
1308         r300->hw.unk4200.cmd[3] = r300PackFloat32(1.0);
1309         r300->hw.unk4200.cmd[4] = r300PackFloat32(1.0);
1310
1311         r300->hw.unk4214.cmd[1] = 0x00050005;
1312
1313         r300->hw.ps.cmd[R300_PS_POINTSIZE] = (6 << R300_POINTSIZE_X_SHIFT) |
1314                                              (6 << R300_POINTSIZE_Y_SHIFT);
1315
1316         r300->hw.unk4230.cmd[1] = 0x01800000;
1317         r300->hw.unk4230.cmd[2] = 0x00020006;
1318         r300->hw.unk4230.cmd[3] = r300PackFloat32(1.0 / 192.0);
1319
1320         r300->hw.unk4260.cmd[1] = 0;
1321         r300->hw.unk4260.cmd[2] = r300PackFloat32(0.0);
1322         r300->hw.unk4260.cmd[3] = r300PackFloat32(1.0);
1323
1324         r300->hw.unk4274.cmd[1] = 0x00000002;
1325         r300->hw.unk4274.cmd[2] = 0x0003AAAA;
1326         r300->hw.unk4274.cmd[3] = 0x00000000;
1327         r300->hw.unk4274.cmd[4] = 0x00000000;
1328
1329         r300->hw.unk4288.cmd[1] = 0x00000000;
1330         r300->hw.unk4288.cmd[2] = 0x00000001;
1331         r300->hw.unk4288.cmd[3] = 0x00000000;
1332         r300->hw.unk4288.cmd[4] = 0x00000000;
1333         r300->hw.unk4288.cmd[5] = 0x00000000;
1334
1335         r300->hw.unk42A0.cmd[1] = 0x00000000;
1336
1337         r300->hw.unk42B4.cmd[1] = 0x00000000;
1338
1339         r300->hw.unk42C0.cmd[1] = 0x4B7FFFFF;
1340         r300->hw.unk42C0.cmd[2] = 0x00000000;
1341
1342
1343         r300->hw.unk43A4.cmd[1] = 0x0000001C;
1344         r300->hw.unk43A4.cmd[2] = 0x2DA49525;
1345
1346         r300->hw.unk43E8.cmd[1] = 0x00FFFFFF;
1347
1348         r300->hw.fp.cmd[R300_FP_CNTL0] = 0;
1349         r300->hw.fp.cmd[R300_FP_CNTL1] = 0;
1350         r300->hw.fp.cmd[R300_FP_CNTL2] = 0;
1351         r300->hw.fp.cmd[R300_FP_NODE0] = 0;
1352         r300->hw.fp.cmd[R300_FP_NODE1] = 0;
1353         r300->hw.fp.cmd[R300_FP_NODE2] = 0;
1354         r300->hw.fp.cmd[R300_FP_NODE3] = 0;
1355
1356         r300->hw.unk46A4.cmd[1] = 0x00001B01;
1357         r300->hw.unk46A4.cmd[2] = 0x00001B0F;
1358         r300->hw.unk46A4.cmd[3] = 0x00001B0F;
1359         r300->hw.unk46A4.cmd[4] = 0x00001B0F;
1360         r300->hw.unk46A4.cmd[5] = 0x00000001;
1361
1362         for(i = 1; i <= 64; ++i) {
1363                 /* create NOP instructions */
1364                 r300->hw.fpi[0].cmd[i] = FP_INSTRC(MAD, FP_ARGC(SRC0C_XYZ), FP_ARGC(ONE), FP_ARGC(ZERO));
1365                 r300->hw.fpi[1].cmd[i] = FP_SELC(0,XYZ,NO,FP_TMP(0),0,0);
1366                 r300->hw.fpi[2].cmd[i] = FP_INSTRA(MAD, FP_ARGA(SRC0A), FP_ARGA(ONE), FP_ARGA(ZERO));
1367                 r300->hw.fpi[3].cmd[i] = FP_SELA(0,W,NO,FP_TMP(0),0,0);
1368         }
1369
1370         r300->hw.unk4BC0.cmd[1] = 0;
1371
1372         r300->hw.unk4BC8.cmd[1] = 0;
1373         r300->hw.unk4BC8.cmd[2] = 0;
1374         r300->hw.unk4BC8.cmd[3] = 0;
1375
1376         #if 0
1377         r300->hw.at.cmd[R300_AT_ALPHA_TEST] = 0;
1378         #endif
1379
1380         r300->hw.unk4BD8.cmd[1] = 0;
1381
1382         r300->hw.unk4E00.cmd[1] = 0;
1383
1384         #if 0
1385         r300->hw.bld.cmd[R300_BLD_CBLEND] = 0;
1386         r300->hw.bld.cmd[R300_BLD_ABLEND] = 0;
1387         #endif
1388
1389         r300->hw.unk4E10.cmd[1] = 0;
1390         r300->hw.unk4E10.cmd[2] = 0;
1391         r300->hw.unk4E10.cmd[3] = 0;
1392
1393         r300->hw.cb.cmd[R300_CB_OFFSET] =
1394                 r300->radeon.radeonScreen->backOffset +
1395                 r300->radeon.radeonScreen->fbLocation;
1396         r300->hw.cb.cmd[R300_CB_PITCH] = r300->radeon.radeonScreen->backPitch
1397                 | R300_COLOR_UNKNOWN_22_23;
1398
1399         r300->hw.unk4E50.cmd[1] = 0;
1400         r300->hw.unk4E50.cmd[2] = 0;
1401         r300->hw.unk4E50.cmd[3] = 0;
1402         r300->hw.unk4E50.cmd[4] = 0;
1403         r300->hw.unk4E50.cmd[5] = 0;
1404         r300->hw.unk4E50.cmd[6] = 0;
1405         r300->hw.unk4E50.cmd[7] = 0;
1406         r300->hw.unk4E50.cmd[8] = 0;
1407         r300->hw.unk4E50.cmd[9] = 0;
1408
1409         r300->hw.unk4E88.cmd[1] = 0;
1410
1411         r300->hw.unk4EA0.cmd[1] = 0x00000000;
1412         r300->hw.unk4EA0.cmd[2] = 0xffffffff;
1413
1414         r300->hw.unk4F08.cmd[1] = 0x00FFFF00;
1415
1416         r300->hw.unk4F10.cmd[1] = 0x00000002; // depthbuffer format?
1417         r300->hw.unk4F10.cmd[2] = 0x00000000;
1418         r300->hw.unk4F10.cmd[3] = 0x00000003;
1419         r300->hw.unk4F10.cmd[4] = 0x00000000;
1420
1421         r300->hw.zb.cmd[R300_ZB_OFFSET] =
1422                 r300->radeon.radeonScreen->depthOffset +
1423                 r300->radeon.radeonScreen->fbLocation;
1424         r300->hw.zb.cmd[R300_ZB_PITCH] = r300->radeon.radeonScreen->depthPitch;
1425
1426         r300->hw.unk4F28.cmd[1] = 0;
1427
1428         r300->hw.unk4F30.cmd[1] = 0;
1429         r300->hw.unk4F30.cmd[2] = 0;
1430
1431         r300->hw.unk4F44.cmd[1] = 0;
1432
1433         r300->hw.unk4F54.cmd[1] = 0;
1434
1435         #if 0
1436         ((drm_r300_cmd_header_t*)r300->hw.vpi.cmd)->vpu.count = 0;
1437         for(i = 1; i < R300_VPI_CMDSIZE; i += 4) {
1438                 /* MOV t0, t0 */
1439                 r300->hw.vpi.cmd[i+0] = VP_OUT(ADD,TMP,0,XYZW);
1440                 r300->hw.vpi.cmd[i+1] = VP_IN(TMP,0);
1441                 r300->hw.vpi.cmd[i+2] = VP_ZERO();
1442                 r300->hw.vpi.cmd[i+3] = VP_ZERO();
1443         }
1444
1445         ((drm_r300_cmd_header_t*)r300->hw.vpp.cmd)->vpu.count = 0;
1446         for(i = 1; i < R300_VPP_CMDSIZE; ++i)
1447                 r300->hw.vpp.cmd[i] = 0;
1448         #endif
1449                 
1450         r300->hw.vps.cmd[R300_VPS_ZERO_0] = 0;
1451         r300->hw.vps.cmd[R300_VPS_ZERO_1] = 0;
1452         r300->hw.vps.cmd[R300_VPS_POINTSIZE] = r300PackFloat32(1.0);
1453         r300->hw.vps.cmd[R300_VPS_ZERO_3] = 0;
1454         
1455 //END: TODO
1456         
1457         r300->hw.all_dirty = GL_TRUE;
1458 }
1459
1460
1461
1462 /**
1463  * Calculate initial hardware state and register state functions.
1464  * Assumes that the command buffer and state atoms have been
1465  * initialized already.
1466  */
1467 void r300InitState(r300ContextPtr r300)
1468 {
1469         GLcontext *ctx = r300->radeon.glCtx;
1470         GLuint depth_fmt;
1471
1472         radeonInitState(&r300->radeon);
1473         
1474         switch (ctx->Visual.depthBits) {
1475         case 16:
1476                 r300->state.depth.scale = 1.0 / (GLfloat) 0xffff;
1477                 depth_fmt = R200_DEPTH_FORMAT_16BIT_INT_Z;
1478                 //r300->state.stencil.clear = 0x00000000;
1479                 break;
1480         case 24:
1481                 r300->state.depth.scale = 1.0 / (GLfloat) 0xffffff;
1482                 depth_fmt = R200_DEPTH_FORMAT_24BIT_INT_Z;
1483                 //r300->state.stencil.clear = 0xff000000;
1484                 break;
1485         default:
1486                 fprintf(stderr, "Error: Unsupported depth %d... exiting\n",
1487                         ctx->Visual.depthBits);
1488                 exit(-1);
1489         }
1490         
1491         memset(&(r300->state.texture), 0, sizeof(r300->state.texture));
1492
1493         r300ResetHwState(r300);
1494 }
1495
1496
1497
1498 /**
1499  * Initialize driver's state callback functions
1500  */
1501 void r300InitStateFuncs(struct dd_function_table* functions)
1502 {
1503         radeonInitStateFuncs(functions);
1504
1505         functions->UpdateState = r300InvalidateState;
1506         //functions->AlphaFunc = r300AlphaFunc;
1507         functions->BlendColor = r300BlendColor;
1508         functions->BlendEquationSeparate = r300BlendEquationSeparate;
1509         functions->BlendFuncSeparate = r300BlendFuncSeparate;
1510         functions->Enable = r300Enable;
1511         functions->ColorMask = r300ColorMask;
1512         functions->DepthFunc = r300DepthFunc;
1513         functions->DepthMask = r300DepthMask;
1514         functions->CullFace = r300CullFace;
1515         functions->FrontFace = r300FrontFace;
1516
1517         /* Viewport related */
1518         functions->Viewport = r300Viewport;
1519         functions->DepthRange = r300DepthRange;
1520         functions->PointSize = r300PointSize;
1521 }
1522