2 Copyright (C) The Weather Channel, Inc. 2002.
3 Copyright (C) 2004 Nicolai Haehnle.
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.
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:
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.
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.
30 **************************************************************************/
34 * Nicolai Haehnle <prefect_@gmx.net>
44 #include "simple_list.h"
46 #include "api_arrayelt.h"
47 #include "swrast/swrast.h"
48 #include "swrast_setup/swrast_setup.h"
49 #include "array_cache/acache.h"
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"
58 #include "r300_program.h"
59 #include "r300_fixed_pipelines.h"
61 static void r300AlphaFunc(GLcontext * ctx, GLenum func, GLfloat ref)
63 r300ContextPtr rmesa = R300_CONTEXT(ctx);
64 int pp_misc = rmesa->hw.at.cmd[R300_AT_ALPHA_TEST];
67 CLAMPED_FLOAT_TO_UBYTE(refByte, ref);
69 R300_STATECHANGE(rmesa, at);
71 pp_misc &= ~(R300_ALPHA_TEST_OP_MASK | R300_REF_ALPHA_MASK);
72 pp_misc |= (refByte & R300_REF_ALPHA_MASK);
76 pp_misc |= R300_ALPHA_TEST_FAIL;
79 pp_misc |= R300_ALPHA_TEST_LESS;
82 pp_misc |= R300_ALPHA_TEST_EQUAL;
85 pp_misc |= R300_ALPHA_TEST_LEQUAL;
88 pp_misc |= R300_ALPHA_TEST_GREATER;
91 pp_misc |= R300_ALPHA_TEST_NEQUAL;
94 pp_misc |= R300_ALPHA_TEST_GEQUAL;
97 pp_misc |= R300_ALPHA_TEST_PASS;
101 rmesa->hw.at.cmd[R300_AT_ALPHA_TEST] = pp_misc;
104 static void r300BlendColor(GLcontext * ctx, const GLfloat cf[4])
107 r300ContextPtr rmesa = R300_CONTEXT(ctx);
108 fprintf(stderr, "%s:%s is not implemented yet. Fixme !\n", __FILE__, __FUNCTION__);
110 R200_STATECHANGE(rmesa, ctx);
111 CLAMPED_FLOAT_TO_UBYTE(color[0], cf[0]);
112 CLAMPED_FLOAT_TO_UBYTE(color[1], cf[1]);
113 CLAMPED_FLOAT_TO_UBYTE(color[2], cf[2]);
114 CLAMPED_FLOAT_TO_UBYTE(color[3], cf[3]);
115 if (rmesa->radeon.radeonScreen->drmSupportsBlendColor)
116 rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCOLOR] =
117 radeonPackColor(4, color[0], color[1], color[2], color[3]);
122 * Calculate the hardware blend factor setting. This same function is used
123 * for source and destination of both alpha and RGB.
126 * The hardware register value for the specified blend factor. This value
127 * will need to be shifted into the correct position for either source or
128 * destination factor.
131 * Since the two cases where source and destination are handled differently
132 * are essentially error cases, they should never happen. Determine if these
133 * cases can be removed.
135 static int blend_factor(GLenum factor, GLboolean is_src)
141 func = R200_BLEND_GL_ZERO;
144 func = R200_BLEND_GL_ONE;
147 func = R200_BLEND_GL_DST_COLOR;
149 case GL_ONE_MINUS_DST_COLOR:
150 func = R200_BLEND_GL_ONE_MINUS_DST_COLOR;
153 func = R200_BLEND_GL_SRC_COLOR;
155 case GL_ONE_MINUS_SRC_COLOR:
156 func = R200_BLEND_GL_ONE_MINUS_SRC_COLOR;
159 func = R200_BLEND_GL_SRC_ALPHA;
161 case GL_ONE_MINUS_SRC_ALPHA:
162 func = R200_BLEND_GL_ONE_MINUS_SRC_ALPHA;
165 func = R200_BLEND_GL_DST_ALPHA;
167 case GL_ONE_MINUS_DST_ALPHA:
168 func = R200_BLEND_GL_ONE_MINUS_DST_ALPHA;
170 case GL_SRC_ALPHA_SATURATE:
172 (is_src) ? R200_BLEND_GL_SRC_ALPHA_SATURATE :
175 case GL_CONSTANT_COLOR:
176 func = R200_BLEND_GL_CONST_COLOR;
178 case GL_ONE_MINUS_CONSTANT_COLOR:
179 func = R200_BLEND_GL_ONE_MINUS_CONST_COLOR;
181 case GL_CONSTANT_ALPHA:
182 func = R200_BLEND_GL_CONST_ALPHA;
184 case GL_ONE_MINUS_CONSTANT_ALPHA:
185 func = R200_BLEND_GL_ONE_MINUS_CONST_ALPHA;
188 func = (is_src) ? R200_BLEND_GL_ONE : R200_BLEND_GL_ZERO;
194 * Sets both the blend equation and the blend function.
195 * This is done in a single
196 * function because some blend equations (i.e., \c GL_MIN and \c GL_MAX)
197 * change the interpretation of the blend function.
198 * Also, make sure that blend function and blend equation are set to their default
199 * value if color blending is not enabled, since at least blend equations GL_MIN
200 * and GL_FUNC_REVERSE_SUBTRACT will cause wrong results otherwise for
203 static void r300_set_blend_state(GLcontext * ctx)
205 r300ContextPtr rmesa = R300_CONTEXT(ctx);
207 GLuint cntl = rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &
208 ~(R300_ROP_ENABLE | R300_ALPHA_BLEND_ENABLE |
209 R300_SEPARATE_ALPHA_ENABLE);
212 int func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
213 (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT);
214 int eqn = R200_COMB_FCN_ADD_CLAMP;
215 int funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
216 (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT);
217 int eqnA = R200_COMB_FCN_ADD_CLAMP;
219 R300_STATECHANGE(rmesa, bld);
221 if (rmesa->radeon.radeonScreen->drmSupportsBlendColor) {
222 if (ctx->Color._LogicOpEnabled) {
224 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] =
225 cntl | R300_ROP_ENABLE;
227 rmesa->hw.bld.cmd[R300_BLD_ABLEND] = eqn | func;
228 rmesa->hw.bld.cmd[R300_BLD_CBLEND] = eqn | func;
230 } else if (ctx->Color.BlendEnabled) {
232 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] =
233 cntl | R300_ALPHA_BLEND_ENABLE |
234 R300_SEPARATE_ALPHA_ENABLE;
238 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = cntl;
240 rmesa->hw.bld.cmd[R300_BLD_ABLEND] = eqn | func;
241 rmesa->hw.bld.cmd[R300_BLD_CBLEND] = eqn | func;
245 if (ctx->Color._LogicOpEnabled) {
247 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] =
248 cntl | R300_ROP_ENABLE;
249 rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = eqn | func;
252 } else if (ctx->Color.BlendEnabled) {
254 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] =
255 cntl | R300_ALPHA_BLEND_ENABLE;
259 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = cntl;
260 rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = eqn | func;
267 (blend_factor(ctx->Color.BlendSrcRGB, GL_TRUE) <<
268 R200_SRC_BLEND_SHIFT) | (blend_factor(ctx->Color.BlendDstRGB,
270 R200_DST_BLEND_SHIFT);
272 switch (ctx->Color.BlendEquationRGB) {
274 eqn = R300_COMB_FCN_ADD_CLAMP;
277 case GL_FUNC_SUBTRACT:
278 eqn = R300_COMB_FCN_SUB_CLAMP;
281 case GL_FUNC_REVERSE_SUBTRACT:
282 eqn = R200_COMB_FCN_RSUB_CLAMP;
286 eqn = R200_COMB_FCN_MIN;
287 func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
288 (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
292 eqn = R200_COMB_FCN_MAX;
293 func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
294 (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
299 "[%s:%u] Invalid RGB blend equation (0x%04x).\n",
300 __func__, __LINE__, ctx->Color.BlendEquationRGB);
304 if (!rmesa->radeon.radeonScreen->drmSupportsBlendColor) {
306 rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = eqn | func;
312 (blend_factor(ctx->Color.BlendSrcA, GL_TRUE) <<
313 R200_SRC_BLEND_SHIFT) | (blend_factor(ctx->Color.BlendDstA,
315 R200_DST_BLEND_SHIFT);
317 switch (ctx->Color.BlendEquationA) {
319 eqnA = R300_COMB_FCN_ADD_CLAMP;
322 case GL_FUNC_SUBTRACT:
323 eqnA = R300_COMB_FCN_SUB_CLAMP;
326 case GL_FUNC_REVERSE_SUBTRACT:
327 eqnA = R200_COMB_FCN_RSUB_CLAMP;
331 eqnA = R200_COMB_FCN_MIN;
332 funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
333 (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
337 eqnA = R200_COMB_FCN_MAX;
338 funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
339 (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
343 fprintf(stderr, "[%s:%u] Invalid A blend equation (0x%04x).\n",
344 __func__, __LINE__, ctx->Color.BlendEquationA);
348 rmesa->hw.bld.cmd[R300_BLD_ABLEND] = eqnA | funcA;
349 rmesa->hw.bld.cmd[R300_BLD_CBLEND] = eqn | func ;
350 if(rmesa->hw.bld.cmd[R300_BLD_ABLEND] == rmesa->hw.bld.cmd[R300_BLD_CBLEND]){
351 rmesa->hw.bld.cmd[R300_BLD_CBLEND] |= R300_BLEND_UNKNOWN | R300_BLEND_ENABLE | R300_BLEND_NO_SEPARATE;
353 rmesa->hw.bld.cmd[R300_BLD_CBLEND] |= R300_BLEND_UNKNOWN | R300_BLEND_ENABLE;
358 static void r300BlendEquationSeparate(GLcontext * ctx,
359 GLenum modeRGB, GLenum modeA)
361 r300_set_blend_state(ctx);
364 static void r300BlendFuncSeparate(GLcontext * ctx,
365 GLenum sfactorRGB, GLenum dfactorRGB,
366 GLenum sfactorA, GLenum dfactorA)
368 r300_set_blend_state(ctx);
372 * Update our tracked culling state based on Mesa's state.
374 static void r300UpdateCulling(GLcontext* ctx)
376 r300ContextPtr r300 = R300_CONTEXT(ctx);
379 R300_STATECHANGE(r300, cul);
380 if (ctx->Polygon.CullFlag) {
381 if (ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)
382 val = R300_CULL_FRONT|R300_CULL_BACK;
383 else if (ctx->Polygon.CullFaceMode == GL_FRONT)
384 val = R300_CULL_FRONT;
386 val = R300_CULL_BACK;
388 if (ctx->Polygon.FrontFace == GL_CW)
389 val |= R300_FRONT_FACE_CW;
391 val |= R300_FRONT_FACE_CCW;
394 r300->hw.cul.cmd[R300_CUL_CULL] = val;
399 * Handle glEnable()/glDisable().
401 * \note Mesa already filters redundant calls to glEnable/glDisable.
403 static void r300Enable(GLcontext* ctx, GLenum cap, GLboolean state)
405 r300ContextPtr r300 = R300_CONTEXT(ctx);
408 if (RADEON_DEBUG & DEBUG_STATE)
409 fprintf(stderr, "%s( %s = %s )\n", __FUNCTION__,
410 _mesa_lookup_enum_by_nr(cap),
411 state ? "GL_TRUE" : "GL_FALSE");
415 R300_STATECHANGE(r300, zc);
419 newval = R300_RB3D_Z_TEST_AND_WRITE;
421 newval = R300_RB3D_Z_TEST;
425 r300->hw.zc.cmd[R300_ZC_CNTL_0] = newval;
429 r300UpdateCulling(ctx);
433 radeonEnable(ctx, cap, state);
440 * Change the culling mode.
442 * \note Mesa already filters redundant calls to this function.
444 static void r300CullFace(GLcontext* ctx, GLenum mode)
448 r300UpdateCulling(ctx);
453 * Change the polygon orientation.
455 * \note Mesa already filters redundant calls to this function.
457 static void r300FrontFace(GLcontext* ctx, GLenum mode)
461 r300UpdateCulling(ctx);
466 * Change the depth testing function.
468 * \note Mesa already filters redundant calls to this function.
470 static void r300DepthFunc(GLcontext* ctx, GLenum func)
472 r300ContextPtr r300 = R300_CONTEXT(ctx);
474 R300_STATECHANGE(r300, zc);
478 r300->hw.zc.cmd[R300_ZC_CNTL_1] = R300_Z_TEST_NEVER;
481 r300->hw.zc.cmd[R300_ZC_CNTL_1] = R300_Z_TEST_LESS;
484 r300->hw.zc.cmd[R300_ZC_CNTL_1] = R300_Z_TEST_EQUAL;
487 r300->hw.zc.cmd[R300_ZC_CNTL_1] = R300_Z_TEST_LEQUAL;
490 r300->hw.zc.cmd[R300_ZC_CNTL_1] = R300_Z_TEST_GREATER;
493 r300->hw.zc.cmd[R300_ZC_CNTL_1] = R300_Z_TEST_NEQUAL;
496 r300->hw.zc.cmd[R300_ZC_CNTL_1] = R300_Z_TEST_GEQUAL;
499 r300->hw.zc.cmd[R300_ZC_CNTL_1] = R300_Z_TEST_ALWAYS;
506 * Enable/Disable depth writing.
508 * \note Mesa already filters redundant calls to this function.
510 static void r300DepthMask(GLcontext* ctx, GLboolean mask)
512 r300ContextPtr r300 = R300_CONTEXT(ctx);
514 if (!ctx->Depth.Test)
517 R300_STATECHANGE(r300, zc);
518 r300->hw.zc.cmd[R300_ZC_CNTL_0] = mask
519 ? R300_RB3D_Z_TEST_AND_WRITE : R300_RB3D_Z_TEST;
524 * Handle glColorMask()
526 static void r300ColorMask(GLcontext* ctx,
527 GLboolean r, GLboolean g, GLboolean b, GLboolean a)
529 r300ContextPtr r300 = R300_CONTEXT(ctx);
530 int mask = (b << 0) | (g << 1) | (r << 2) | (a << 3);
532 if (mask != r300->hw.cmk.cmd[R300_CMK_COLORMASK]) {
533 R300_STATECHANGE(r300, cmk);
534 r300->hw.cmk.cmd[R300_CMK_COLORMASK] = mask;
538 /* =============================================================
541 static void r300PointSize(GLcontext * ctx, GLfloat size)
543 r300ContextPtr r300 = R300_CONTEXT(ctx);
545 /* This might need fixing later */
546 R300_STATECHANGE(r300, vps);
547 r300->hw.vps.cmd[R300_VPS_POINTSIZE] = r300PackFloat32(1.0);
550 /* =============================================================
551 * Window position and viewport transformation
555 * To correctly position primitives:
557 #define SUBPIXEL_X 0.125
558 #define SUBPIXEL_Y 0.125
560 void r300UpdateWindow(GLcontext * ctx)
562 r300ContextPtr rmesa = R300_CONTEXT(ctx);
563 __DRIdrawablePrivate *dPriv = rmesa->radeon.dri.drawable;
564 GLfloat xoffset = dPriv ? (GLfloat) dPriv->x : 0;
565 GLfloat yoffset = dPriv ? (GLfloat) dPriv->y + dPriv->h : 0;
566 const GLfloat *v = ctx->Viewport._WindowMap.m;
568 GLfloat sx = v[MAT_SX];
569 GLfloat tx = v[MAT_TX] + xoffset + SUBPIXEL_X;
570 GLfloat sy = -v[MAT_SY];
571 GLfloat ty = (-v[MAT_TY]) + yoffset + SUBPIXEL_Y;
572 GLfloat sz = v[MAT_SZ] * rmesa->state.depth.scale;
573 GLfloat tz = v[MAT_TZ] * rmesa->state.depth.scale;
575 R300_FIREVERTICES(rmesa);
576 R300_STATECHANGE(rmesa, vpt);
578 rmesa->hw.vpt.cmd[R300_VPT_XSCALE] = r300PackFloat32(sx);
579 rmesa->hw.vpt.cmd[R300_VPT_XOFFSET] = r300PackFloat32(tx);
580 rmesa->hw.vpt.cmd[R300_VPT_YSCALE] = r300PackFloat32(sy);
581 rmesa->hw.vpt.cmd[R300_VPT_YOFFSET] = r300PackFloat32(ty);
582 rmesa->hw.vpt.cmd[R300_VPT_ZSCALE] = r300PackFloat32(sz);
583 rmesa->hw.vpt.cmd[R300_VPT_ZOFFSET] = r300PackFloat32(tz);
586 static void r300Viewport(GLcontext * ctx, GLint x, GLint y,
587 GLsizei width, GLsizei height)
589 /* Don't pipeline viewport changes, conflict with window offset
590 * setting below. Could apply deltas to rescue pipelined viewport
591 * values, or keep the originals hanging around.
593 R200_FIREVERTICES(R200_CONTEXT(ctx));
594 r300UpdateWindow(ctx);
597 static void r300DepthRange(GLcontext * ctx, GLclampd nearval, GLclampd farval)
599 r300UpdateWindow(ctx);
602 /* Routing and texture-related */
604 void r300_setup_routing(GLcontext *ctx, GLboolean immediate)
606 int i, count=0,reg=0;
608 TNLcontext *tnl = TNL_CONTEXT(ctx);
609 struct vertex_buffer *VB = &tnl->vb;
610 r300ContextPtr r300 = R300_CONTEXT(ctx);
613 /* Stage 1 - input to VAP */
615 /* Assign register number automatically, retaining it in rmesa->state.reg */
617 /* Note: immediate vertex data includes all coordinates.
618 To save bandwidth use either VBUF or state-based vertex generation */
620 #define CONFIGURE_AOS(v, o, r, f) \
623 r300->state.aos[count].element_size=4; \
624 r300->state.aos[count].stride=4; \
625 r300->state.aos[count].ncomponents=4; \
627 r300->state.aos[count].element_size=v->size; \
628 r300->state.aos[count].stride=v->size; \
629 r300->state.aos[count].ncomponents=v->size; \
631 r300->state.aos[count].offset=o; \
632 r300->state.aos[count].reg=reg; \
633 r300->state.aos[count].format=(f); \
634 r300->state.vap_reg.r=reg; \
639 /* All offsets are 0 - for use by immediate mode.
640 Should change later to handle vertex buffers */
641 CONFIGURE_AOS(VB->ObjPtr, 0, i_coords, AOS_FORMAT_FLOAT);
642 CONFIGURE_AOS(VB->ColorPtr[0], 0, i_color[0], AOS_FORMAT_FLOAT_COLOR);
643 for(i=0;i < ctx->Const.MaxTextureUnits;i++)
644 if(ctx->Texture.Unit[i].Enabled)
645 CONFIGURE_AOS(VB->TexCoordPtr[i], 0, i_tex[i], AOS_FORMAT_FLOAT);
647 r300->state.aos_count=count;
649 if (RADEON_DEBUG & DEBUG_STATE)
650 fprintf(stderr, "aos_count=%d\n", count);
652 if(count>R300_MAX_AOS_ARRAYS){
653 fprintf(stderr, "Aieee ! AOS array count exceeded !\n");
659 /* setup INPUT_ROUTE */
660 R300_STATECHANGE(r300, vir[0]);
661 for(i=0;i+1<count;i+=2){
662 dw=(r300->state.aos[i].ncomponents-1)
663 | ((r300->state.aos[i].reg)<<8)
664 | (r300->state.aos[i].format<<14)
665 | (((r300->state.aos[i+1].ncomponents-1)
666 | ((r300->state.aos[i+1].reg)<<8)
667 | (r300->state.aos[i+1].format<<14))<<16);
672 r300->hw.vir[0].cmd[R300_VIR_CNTL_0+(i>>1)]=dw;
675 dw=(r300->state.aos[count-1].ncomponents-1)
676 | (r300->state.aos[count-1].format<<14)
677 | ((r300->state.aos[count-1].reg)<<8)
679 r300->hw.vir[0].cmd[R300_VIR_CNTL_0+(count>>1)]=dw;
680 //fprintf(stderr, "vir0 dw=%08x\n", dw);
682 /* Set the rest of INPUT_ROUTE_0 to 0 */
683 //for(i=((count+1)>>1); i<8; i++)r300->hw.vir[0].cmd[R300_VIR_CNTL_0+i]=(0x0);
684 ((drm_r300_cmd_header_t*)r300->hw.vir[0].cmd)->unchecked_state.count = (count+1)>>1;
687 /* Mesa assumes that all missing components are from (0, 0, 0, 1) */
688 #define ALL_COMPONENTS ((R300_INPUT_ROUTE_SELECT_X<<R300_INPUT_ROUTE_X_SHIFT) \
689 | (R300_INPUT_ROUTE_SELECT_Y<<R300_INPUT_ROUTE_Y_SHIFT) \
690 | (R300_INPUT_ROUTE_SELECT_Z<<R300_INPUT_ROUTE_Z_SHIFT) \
691 | (R300_INPUT_ROUTE_SELECT_W<<R300_INPUT_ROUTE_W_SHIFT))
693 #define ALL_DEFAULT ((R300_INPUT_ROUTE_SELECT_ZERO<<R300_INPUT_ROUTE_X_SHIFT) \
694 | (R300_INPUT_ROUTE_SELECT_ZERO<<R300_INPUT_ROUTE_Y_SHIFT) \
695 | (R300_INPUT_ROUTE_SELECT_ZERO<<R300_INPUT_ROUTE_Z_SHIFT) \
696 | (R300_INPUT_ROUTE_SELECT_ONE<<R300_INPUT_ROUTE_W_SHIFT))
698 R300_STATECHANGE(r300, vir[1]);
700 for(i=0;i+1<count;i+=2){
702 mask=(1<<(r300->state.aos[i].ncomponents*3))-1;
703 dw=(ALL_COMPONENTS & mask)
704 | (ALL_DEFAULT & ~mask)
705 | R300_INPUT_ROUTE_ENABLE;
708 mask=(1<<(r300->state.aos[i+1].ncomponents*3))-1;
710 (ALL_COMPONENTS & mask)
711 | (ALL_DEFAULT & ~mask)
712 | R300_INPUT_ROUTE_ENABLE
715 r300->hw.vir[1].cmd[R300_VIR_CNTL_0+(i>>1)]=dw;
718 mask=(1<<(r300->state.aos[count-1].ncomponents*3))-1;
719 dw=(ALL_COMPONENTS & mask)
720 | (ALL_DEFAULT & ~mask)
721 | R300_INPUT_ROUTE_ENABLE;
722 r300->hw.vir[1].cmd[R300_VIR_CNTL_0+(count>>1)]=dw;
723 //fprintf(stderr, "vir1 dw=%08x\n", dw);
725 /* Set the rest of INPUT_ROUTE_1 to 0 */
726 //for(i=((count+1)>>1); i<8; i++)r300->hw.vir[1].cmd[R300_VIR_CNTL_0+i]=0x0;
727 ((drm_r300_cmd_header_t*)r300->hw.vir[1].cmd)->unchecked_state.count = (count+1)>>1;
729 /* Set up input_cntl */
731 R300_STATECHANGE(r300, vic);
732 r300->hw.vic.cmd[R300_VIC_CNTL_0]=0x5555; /* Hard coded value, no idea what it means */
734 r300->hw.vic.cmd[R300_VIC_CNTL_1]=R300_INPUT_CNTL_POS
735 | R300_INPUT_CNTL_COLOR;
737 for(i=0;i < ctx->Const.MaxTextureUnits;i++)
738 if(ctx->Texture.Unit[i].Enabled)
739 r300->hw.vic.cmd[R300_VIC_CNTL_1]|=(R300_INPUT_CNTL_TC0<<i);
741 /* Stage 3: VAP output */
742 R300_STATECHANGE(r300, vof);
743 r300->hw.vof.cmd[R300_VOF_CNTL_0]=R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT
744 | R300_VAP_OUTPUT_VTX_FMT_0__COLOR_PRESENT;
746 r300->hw.vof.cmd[R300_VOF_CNTL_1]=0;
747 for(i=0;i < ctx->Const.MaxTextureUnits;i++)
748 if(ctx->Texture.Unit[i].Enabled)
749 r300->hw.vof.cmd[R300_VOF_CNTL_1]|=(4<<(3*i));
753 static r300TexObj default_tex_obj={
754 filter:R300_TX_MAG_FILTER_LINEAR | R300_TX_MIN_FILTER_LINEAR,
756 size: (0xff << R300_TX_WIDTHMASK_SHIFT)
757 | (0xff << R300_TX_HEIGHTMASK_SHIFT)
758 | (0x8 << R300_TX_SIZE_SHIFT),
765 /* there is probably a system to these value, but, for now,
766 we just try by hand */
768 static int inline translate_src(int src)
777 case GL_PRIMARY_COLOR:
794 /* I think 357 and 457 are prime numbers.. wiggle them if you get coincidences */
795 #define FORMAT_HASH(opRGB, srcRGB, modeRGB, opA, srcA, modeA, format, intFormat) ( \
797 ((opRGB)<<30) | ((opA)<<28) | \
798 ((srcRGB)<< 25) | ((srcA)<<22) | \
802 ^ (((format)) *457) \
803 ^ ((intFormat) * 7) \
806 static GLuint translate_texture_format(GLcontext *ctx, GLint tex_unit, GLuint format, GLint IntFormat)
808 const struct gl_texture_unit *texUnit= &ctx->Texture.Unit[tex_unit];
809 int i=0; /* number of alpha args .. */
811 /* Size field in format specific first */
813 texUnit->_CurrentCombine->OperandRGB[i] -GL_SRC_COLOR,
814 translate_src(texUnit->_CurrentCombine->SourceRGB[i]),
815 texUnit->_CurrentCombine->ModeRGB,
816 texUnit->_CurrentCombine->OperandA[i] -GL_SRC_ALPHA,
817 translate_src(texUnit->_CurrentCombine->SourceA[i]),
818 texUnit->_CurrentCombine->ModeA,
822 case FORMAT_HASH(0, 1, 0x2100, 0, 1, 0x2100, 0x00088047, 0x1908):
826 return 0x7a0c; /* kfiresaver.kss */
827 case FORMAT_HASH(0, 1, 0x2100, 0, 1, 0x2100, 0x00088047, 0x8058):
831 return 0x8a0c; /* Quake3demo -small font on the bottom */
832 case FORMAT_HASH(0, 1, 0x2100, 0, 1, 0x2100, 0x00077047, 4):
837 case FORMAT_HASH(0, 1, 0x2100, 0, 1, 0x2100, 0x00055047, 4):
843 case FORMAT_HASH(0, 1, 0x2100, 0, 4, 0x1e01, 0x00088047, 3):
849 //case FORMAT_HASH(0, 1, 0x2100, 0, 4, 0x1e01, 0x00055047, 0):
850 /* Can't remember what I tested this with..
851 try putting return 0 of you see broken textures which
852 are not being complained about */
854 case FORMAT_HASH(0, 1, 0x2100, 0, 4, 0x1e01, 0x00099047, 0x8051):
855 //case FORMAT_HASH(0, 1, 0x2100, 0, 4, 0x1e01, 0x00089047, 0x8058):
856 case FORMAT_HASH(0, 1, 0x2100, 0, 4, 0x1e01, 0x00077047, 0x8051):
861 case FORMAT_HASH(0, 1, 0x2100, 0, 1, 0x2100, 0x00055045, 0x00008056):
862 case FORMAT_HASH(0, 1, 0x2100, 0, 1, 0x2100, 0x00088045, 0x00008056):
864 case FORMAT_HASH(0, 1, 0x2100, 0, 4, 0x1e01, 0x00099004, 0x00008050):
870 /* Just key on internal format - useful for quick tryouts*/
886 //fprintf(stderr, "%08x\n", format);
899 static int warn_once=1;
901 fprintf(stderr, "%s:%s Do not know how to translate texture format - help me !\n",
902 __FILE__, __FUNCTION__);
909 void r300_setup_textures(GLcontext *ctx)
912 struct r300_tex_obj *t;
913 r300ContextPtr r300 = R300_CONTEXT(ctx);
914 int max_texture_unit=-1; /* -1 translates into no setup costs for fields */
915 struct gl_texture_unit *texUnit;
917 R300_STATECHANGE(r300, txe);
918 R300_STATECHANGE(r300, tex.filter);
919 R300_STATECHANGE(r300, tex.unknown1);
920 R300_STATECHANGE(r300, tex.size);
921 R300_STATECHANGE(r300, tex.format);
922 R300_STATECHANGE(r300, tex.offset);
923 R300_STATECHANGE(r300, tex.unknown4);
924 R300_STATECHANGE(r300, tex.unknown5);
926 r300->state.texture.tc_count=0;
928 r300->hw.txe.cmd[R300_TXE_ENABLE]=0x0;
930 mtu = r300->radeon.glCtx->Const.MaxTextureUnits;
931 if (RADEON_DEBUG & DEBUG_STATE)
932 fprintf(stderr, "mtu=%d\n", mtu);
934 if(mtu>R300_MAX_TEXTURE_UNITS){
935 fprintf(stderr, "Aiiee ! mtu=%d is greater than R300_MAX_TEXTURE_UNITS=%d\n",
936 mtu, R300_MAX_TEXTURE_UNITS);
940 if(ctx->Texture.Unit[i].Enabled){
941 t=r300->state.texture.unit[i].texobj;
942 r300->state.texture.tc_count++;
944 fprintf(stderr, "Texture unit %d enabled, but corresponding texobj is NULL, using default object.\n", i);
948 if (RADEON_DEBUG & DEBUG_STATE)
949 fprintf(stderr, "Activating texture unit %d\n", i);
951 r300->hw.txe.cmd[R300_TXE_ENABLE]|=(1<<i);
953 r300->hw.tex.filter.cmd[R300_TEX_VALUE_0+i]=t->filter;
954 r300->hw.tex.unknown1.cmd[R300_TEX_VALUE_0+i]=t->pitch;
955 r300->hw.tex.size.cmd[R300_TEX_VALUE_0+i]=t->size;
956 r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=t->format;
957 r300->hw.tex.offset.cmd[R300_TEX_VALUE_0+i]=r300->radeon.radeonScreen->fbLocation+t->offset;
958 r300->hw.tex.unknown4.cmd[R300_TEX_VALUE_0+i]=0x0;
959 r300->hw.tex.unknown5.cmd[R300_TEX_VALUE_0+i]=0x0;
963 /* We don't know how to set this yet */
964 //value from r300_lib.c for RGB24
965 //r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=0x88a0c;
966 r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=translate_texture_format(ctx, i, t->format, t->base.tObj->Image[0][0]->IntFormat);
967 /* Use the code below to quickly find matching texture
968 formats. Requires an app that displays the same texture
971 if(r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]==0){
978 texUnit = &ctx->Texture.Unit[i];
979 fprintf(stderr, "Want to set FORMAT_HASH(%d, %d, 0x%04x, %d, %d, 0x%04x, 0x%08x, 0x%08x)\n",
980 texUnit->_CurrentCombine->OperandRGB[0] -GL_SRC_COLOR,
981 translate_src(texUnit->_CurrentCombine->SourceRGB[0]),
982 texUnit->_CurrentCombine->ModeRGB,
983 texUnit->_CurrentCombine->OperandA[0] -GL_SRC_ALPHA,
984 translate_src(texUnit->_CurrentCombine->SourceA[0]),
985 texUnit->_CurrentCombine->ModeA,
987 t->base.tObj->Image[0][0]->IntFormat
989 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);
990 fprintf(stderr, "\t_ReallyEnabled=%08x EnvMode=%08x IntFormat=%08x\n", texUnit->_ReallyEnabled, texUnit->EnvMode, t->base.tObj->Image[0][0]->IntFormat);
996 fprintf(stderr, "Now trying format %08x\n",
997 0x00a0c | (fmt<<12));
998 fprintf(stderr, "size=%08x\n", t->size);
1000 r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=0x00a0b | (fmt<<12);
1001 //r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=0x51a00 | (fmt);
1002 //r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=0x53a0c | (fmt<<24);
1009 ((drm_r300_cmd_header_t*)r300->hw.tex.filter.cmd)->unchecked_state.count = max_texture_unit+1;
1010 ((drm_r300_cmd_header_t*)r300->hw.tex.unknown1.cmd)->unchecked_state.count = max_texture_unit+1;
1011 ((drm_r300_cmd_header_t*)r300->hw.tex.size.cmd)->unchecked_state.count = max_texture_unit+1;
1012 ((drm_r300_cmd_header_t*)r300->hw.tex.format.cmd)->unchecked_state.count = max_texture_unit+1;
1013 ((drm_r300_cmd_header_t*)r300->hw.tex.offset.cmd)->unchecked_state.count = max_texture_unit+1;
1014 ((drm_r300_cmd_header_t*)r300->hw.tex.unknown4.cmd)->unchecked_state.count = max_texture_unit+1;
1015 ((drm_r300_cmd_header_t*)r300->hw.tex.unknown5.cmd)->unchecked_state.count = max_texture_unit+1;
1017 if (RADEON_DEBUG & DEBUG_STATE)
1018 fprintf(stderr, "TX_ENABLE: %08x max_texture_unit=%d\n", r300->hw.txe.cmd[R300_TXE_ENABLE], max_texture_unit);
1021 void r300_setup_rs_unit(GLcontext *ctx)
1023 r300ContextPtr r300 = R300_CONTEXT(ctx);
1026 /* This needs to be rewritten - it is a hack at best */
1028 R300_STATECHANGE(r300, ri);
1029 R300_STATECHANGE(r300, rc);
1030 R300_STATECHANGE(r300, rr);
1032 for(i = 1; i <= 8; ++i)
1033 r300->hw.ri.cmd[i] = 0x00d10000;
1034 r300->hw.ri.cmd[R300_RI_INTERP_1] |= R300_RS_INTERP_1_UNKNOWN;
1035 r300->hw.ri.cmd[R300_RI_INTERP_2] |= R300_RS_INTERP_2_UNKNOWN;
1036 r300->hw.ri.cmd[R300_RI_INTERP_3] |= R300_RS_INTERP_3_UNKNOWN;
1038 for(i = 1; i <= 8; ++i)
1039 r300->hw.rr.cmd[i] = 0;
1040 /* textures enabled ? */
1041 if(r300->state.texture.tc_count>0){
1043 /* This code only really works with one set of texture coordinates */
1045 /* The second constant is needed to get glxgears display anything .. */
1046 r300->hw.rc.cmd[1] = R300_RS_CNTL_0_UNKNOWN_7
1047 | R300_RS_CNTL_0_UNKNOWN_18
1048 | (r300->state.texture.tc_count<<R300_RS_CNTL_TC_CNT_SHIFT);
1049 r300->hw.rc.cmd[2] = 0xc0;
1052 ((drm_r300_cmd_header_t*)r300->hw.rr.cmd)->unchecked_state.count = 1;
1053 r300->hw.rr.cmd[R300_RR_ROUTE_0] = 0x24008;
1057 /* The second constant is needed to get glxgears display anything .. */
1058 r300->hw.rc.cmd[1] = R300_RS_CNTL_0_UNKNOWN_7 | R300_RS_CNTL_0_UNKNOWN_18;
1059 r300->hw.rc.cmd[2] = 0;
1061 ((drm_r300_cmd_header_t*)r300->hw.rr.cmd)->unchecked_state.count = 1;
1062 r300->hw.rr.cmd[R300_RR_ROUTE_0] = 0x4000;
1067 #define vpucount(ptr) (((drm_r300_cmd_header_t*)(ptr))->vpu.count)
1069 #define bump_vpu_count(ptr, new_count) do{\
1070 drm_r300_cmd_header_t* _p=((drm_r300_cmd_header_t*)(ptr));\
1071 int _nc=(new_count)/4; \
1072 if(_nc>_p->vpu.count)_p->vpu.count=_nc;\
1075 void static inline setup_vertex_shader_fragment(r300ContextPtr r300, int dest, struct r300_vertex_shader_fragment *vsf)
1079 if(vsf->length==0)return;
1081 if(vsf->length & 0x3){
1082 fprintf(stderr,"VERTEX_SHADER_FRAGMENT must have length divisible by 4\n");
1086 switch((dest>>8) & 0xf){
1088 R300_STATECHANGE(r300, vpi);
1089 for(i=0;i<vsf->length;i++)
1090 r300->hw.vpi.cmd[R300_VPI_INSTR_0+i+4*(dest & 0xff)]=(vsf->body.d[i]);
1091 bump_vpu_count(r300->hw.vpi.cmd, vsf->length+4*(dest & 0xff));
1095 R300_STATECHANGE(r300, vpp);
1096 for(i=0;i<vsf->length;i++)
1097 r300->hw.vpp.cmd[R300_VPP_PARAM_0+i+4*(dest & 0xff)]=(vsf->body.d[i]);
1098 bump_vpu_count(r300->hw.vpp.cmd, vsf->length+4*(dest & 0xff));
1101 R300_STATECHANGE(r300, vps);
1102 for(i=0;i<vsf->length;i++)
1103 r300->hw.vps.cmd[1+i+4*(dest & 0xff)]=(vsf->body.d[i]);
1104 bump_vpu_count(r300->hw.vps.cmd, vsf->length+4*(dest & 0xff));
1107 fprintf(stderr, "%s:%s don't know how to handle dest %04x\n", __FILE__, __FUNCTION__, dest);
1113 void r300SetupVertexShader(r300ContextPtr rmesa)
1115 GLcontext* ctx = rmesa->radeon.glCtx;
1117 /* Reset state, in case we don't use something */
1118 ((drm_r300_cmd_header_t*)rmesa->hw.vpp.cmd)->vpu.count = 0;
1119 ((drm_r300_cmd_header_t*)rmesa->hw.vpi.cmd)->vpu.count = 0;
1120 ((drm_r300_cmd_header_t*)rmesa->hw.vps.cmd)->vpu.count = 0;
1123 /* This needs to be replaced by vertex shader generation code */
1126 /* textures enabled ? */
1127 if(rmesa->state.texture.tc_count>0){
1128 rmesa->state.vertex_shader=SINGLE_TEXTURE_VERTEX_SHADER;
1130 rmesa->state.vertex_shader=FLAT_COLOR_VERTEX_SHADER;
1134 rmesa->state.vertex_shader.matrix[0].length=16;
1135 memcpy(rmesa->state.vertex_shader.matrix[0].body.f, ctx->_ModelProjectMatrix.m, 16*4);
1137 setup_vertex_shader_fragment(rmesa, VSF_DEST_PROGRAM, &(rmesa->state.vertex_shader.program));
1139 setup_vertex_shader_fragment(rmesa, VSF_DEST_MATRIX0, &(rmesa->state.vertex_shader.matrix[0]));
1141 setup_vertex_shader_fragment(rmesa, VSF_DEST_MATRIX1, &(rmesa->state.vertex_shader.matrix[0]));
1142 setup_vertex_shader_fragment(rmesa, VSF_DEST_MATRIX2, &(rmesa->state.vertex_shader.matrix[0]));
1144 setup_vertex_shader_fragment(rmesa, VSF_DEST_VECTOR0, &(rmesa->state.vertex_shader.vector[0]));
1145 setup_vertex_shader_fragment(rmesa, VSF_DEST_VECTOR1, &(rmesa->state.vertex_shader.vector[1]));
1149 setup_vertex_shader_fragment(rmesa, VSF_DEST_UNKNOWN1, &(rmesa->state.vertex_shader.unknown1));
1150 setup_vertex_shader_fragment(rmesa, VSF_DEST_UNKNOWN2, &(rmesa->state.vertex_shader.unknown2));
1153 R300_STATECHANGE(rmesa, pvs);
1154 rmesa->hw.pvs.cmd[R300_PVS_CNTL_1]=(rmesa->state.vertex_shader.program_start << R300_PVS_CNTL_1_PROGRAM_START_SHIFT)
1155 | (rmesa->state.vertex_shader.unknown_ptr1 << R300_PVS_CNTL_1_UNKNOWN_SHIFT)
1156 | (rmesa->state.vertex_shader.program_end << R300_PVS_CNTL_1_PROGRAM_END_SHIFT);
1157 rmesa->hw.pvs.cmd[R300_PVS_CNTL_2]=(rmesa->state.vertex_shader.param_offset << R300_PVS_CNTL_2_PARAM_OFFSET_SHIFT)
1158 | (rmesa->state.vertex_shader.param_count << R300_PVS_CNTL_2_PARAM_COUNT_SHIFT);
1159 rmesa->hw.pvs.cmd[R300_PVS_CNTL_3]=(rmesa->state.vertex_shader.unknown_ptr2 << R300_PVS_CNTL_3_PROGRAM_UNKNOWN_SHIFT)
1160 | (rmesa->state.vertex_shader.unknown_ptr3 << 0);
1162 /* This is done for vertex shader fragments, but also needs to be done for vap_pvs,
1163 so I leave it as a reminder */
1165 reg_start(R300_VAP_PVS_WAITIDLE,0);
1170 void r300SetupPixelShader(r300ContextPtr rmesa)
1174 /* This needs to be replaced by pixel shader generation code */
1176 /* textures enabled ? */
1177 if(rmesa->state.texture.tc_count>0){
1178 rmesa->state.pixel_shader=SINGLE_TEXTURE_PIXEL_SHADER;
1180 rmesa->state.pixel_shader=FLAT_COLOR_PIXEL_SHADER;
1183 R300_STATECHANGE(rmesa, fpt);
1184 for(i=0;i<rmesa->state.pixel_shader.program.tex.length;i++)
1185 rmesa->hw.fpt.cmd[R300_FPT_INSTR_0+i]=rmesa->state.pixel_shader.program.tex.inst[i];
1186 rmesa->hw.fpt.cmd[R300_FPT_CMD_0]=cmducs(R300_PFS_TEXI_0, rmesa->state.pixel_shader.program.tex.length);
1188 #define OUTPUT_FIELD(st, reg, field) \
1189 R300_STATECHANGE(rmesa, st); \
1190 for(i=0;i<rmesa->state.pixel_shader.program.alu.length;i++) \
1191 rmesa->hw.st.cmd[R300_FPI_INSTR_0+i]=rmesa->state.pixel_shader.program.alu.inst[i].field;\
1192 rmesa->hw.st.cmd[R300_FPI_CMD_0]=cmducs(reg, rmesa->state.pixel_shader.program.alu.length);
1194 OUTPUT_FIELD(fpi[0], R300_PFS_INSTR0_0, inst0);
1195 OUTPUT_FIELD(fpi[1], R300_PFS_INSTR1_0, inst1);
1196 OUTPUT_FIELD(fpi[2], R300_PFS_INSTR2_0, inst2);
1197 OUTPUT_FIELD(fpi[3], R300_PFS_INSTR3_0, inst3);
1200 R300_STATECHANGE(rmesa, fp);
1202 rmesa->hw.fp.cmd[R300_FP_NODE0+i]=
1203 (rmesa->state.pixel_shader.program.node[i].alu_offset << R300_PFS_NODE_ALU_OFFSET_SHIFT)
1204 | (rmesa->state.pixel_shader.program.node[i].alu_end << R300_PFS_NODE_ALU_END_SHIFT)
1205 | (rmesa->state.pixel_shader.program.node[i].tex_offset << R300_PFS_NODE_TEX_OFFSET_SHIFT)
1206 | (rmesa->state.pixel_shader.program.node[i].tex_end << R300_PFS_NODE_TEX_END_SHIFT)
1207 | ( (i==3) ? R300_PFS_NODE_LAST_NODE : 0);
1211 rmesa->hw.fp.cmd[R300_FP_CNTL0]=
1212 (rmesa->state.pixel_shader.program.active_nodes-1)
1213 | (rmesa->state.pixel_shader.program.first_node_has_tex<<3);
1215 rmesa->hw.fp.cmd[R300_FP_CNTL1]=rmesa->state.pixel_shader.program.temp_register_count;
1217 rmesa->hw.fp.cmd[R300_FP_CNTL2]=
1218 (rmesa->state.pixel_shader.program.alu_offset << R300_PFS_CNTL_ALU_OFFSET_SHIFT)
1219 | (rmesa->state.pixel_shader.program.alu_end << R300_PFS_CNTL_ALU_END_SHIFT)
1220 | (rmesa->state.pixel_shader.program.tex_offset << R300_PFS_CNTL_TEX_OFFSET_SHIFT)
1221 | (rmesa->state.pixel_shader.program.tex_end << R300_PFS_CNTL_TEX_END_SHIFT);
1223 R300_STATECHANGE(rmesa, fpp);
1224 for(i=0;i<rmesa->state.pixel_shader.param_length;i++){
1225 rmesa->hw.fpp.cmd[R300_FPP_PARAM_0+4*i+0]=r300PackFloat32(rmesa->state.pixel_shader.param[i].x);
1226 rmesa->hw.fpp.cmd[R300_FPP_PARAM_0+4*i+1]=r300PackFloat32(rmesa->state.pixel_shader.param[i].y);
1227 rmesa->hw.fpp.cmd[R300_FPP_PARAM_0+4*i+2]=r300PackFloat32(rmesa->state.pixel_shader.param[i].z);
1228 rmesa->hw.fpp.cmd[R300_FPP_PARAM_0+4*i+3]=r300PackFloat32(rmesa->state.pixel_shader.param[i].w);
1230 rmesa->hw.fpp.cmd[R300_FPP_CMD_0]=cmducs(R300_PFS_PARAM_0_X, rmesa->state.pixel_shader.param_length);
1235 * Called by Mesa after an internal state update.
1237 static void r300InvalidateState(GLcontext * ctx, GLuint new_state)
1239 r300ContextPtr r300 = R300_CONTEXT(ctx);
1241 _swrast_InvalidateState(ctx, new_state);
1242 _swsetup_InvalidateState(ctx, new_state);
1243 _ac_InvalidateState(ctx, new_state);
1244 _tnl_InvalidateState(ctx, new_state);
1245 _ae_invalidate_state(ctx, new_state);
1247 /* Go inefficiency! */
1248 r300ResetHwState(r300);
1253 * Completely recalculates hardware state based on the Mesa state.
1255 void r300ResetHwState(r300ContextPtr r300)
1257 GLcontext* ctx = r300->radeon.glCtx;
1260 if (RADEON_DEBUG & DEBUG_STATE)
1261 fprintf(stderr, "%s\n", __FUNCTION__);
1263 r300UpdateWindow(ctx);
1266 ctx->Color.ColorMask[RCOMP],
1267 ctx->Color.ColorMask[GCOMP],
1268 ctx->Color.ColorMask[BCOMP],
1269 ctx->Color.ColorMask[ACOMP]);
1271 r300Enable(ctx, GL_DEPTH_TEST, ctx->Depth.Test);
1272 r300DepthMask(ctx, ctx->Depth.Mask);
1273 r300DepthFunc(ctx, ctx->Depth.Func);
1275 r300UpdateCulling(ctx);
1277 r300_setup_routing(ctx, GL_TRUE);
1279 r300UpdateTextureState(ctx);
1280 r300_setup_textures(ctx);
1281 r300_setup_rs_unit(ctx);
1283 r300SetupVertexShader(r300);
1284 r300SetupPixelShader(r300);
1286 r300_set_blend_state(ctx);
1287 r300AlphaFunc(ctx, ctx->Color.AlphaFunc, ctx->Color.AlphaRef);
1290 r300->hw.unk2080.cmd[1] = 0x0030045A;
1292 r300->hw.ovf.cmd[R300_OVF_FMT_0] = 0x00000003;
1293 r300->hw.ovf.cmd[R300_OVF_FMT_1] = 0x00000000;
1295 r300->hw.vte.cmd[1] = R300_VPORT_X_SCALE_ENA
1296 | R300_VPORT_X_OFFSET_ENA
1297 | R300_VPORT_Y_SCALE_ENA
1298 | R300_VPORT_Y_OFFSET_ENA
1299 | R300_VPORT_Z_SCALE_ENA
1300 | R300_VPORT_Z_OFFSET_ENA
1302 r300->hw.vte.cmd[2] = 0x00000008;
1304 r300->hw.unk2134.cmd[1] = 0x00FFFFFF;
1305 r300->hw.unk2134.cmd[2] = 0x00000000;
1307 r300->hw.unk2140.cmd[1] = 0x00000000;
1309 #if 0 /* Done in setup routing */
1310 ((drm_r300_cmd_header_t*)r300->hw.vir[0].cmd)->unchecked_state.count = 1;
1311 r300->hw.vir[0].cmd[1] = 0x21030003;
1313 ((drm_r300_cmd_header_t*)r300->hw.vir[1].cmd)->unchecked_state.count = 1;
1314 r300->hw.vir[1].cmd[1] = 0xF688F688;
1316 r300->hw.vic.cmd[R300_VIR_CNTL_0] = 0x00000001;
1317 r300->hw.vic.cmd[R300_VIR_CNTL_1] = 0x00000405;
1320 r300->hw.unk21DC.cmd[1] = 0xAAAAAAAA;
1322 r300->hw.unk221C.cmd[1] = R300_221C_NORMAL;
1324 r300->hw.unk2220.cmd[1] = r300PackFloat32(1.0);
1325 r300->hw.unk2220.cmd[2] = r300PackFloat32(1.0);
1326 r300->hw.unk2220.cmd[3] = r300PackFloat32(1.0);
1327 r300->hw.unk2220.cmd[4] = r300PackFloat32(1.0);
1329 if (GET_CHIP(r300->radeon.radeonScreen) == RADEON_CHIP_R300)
1330 r300->hw.unk2288.cmd[1] = R300_2288_R300;
1332 r300->hw.unk2288.cmd[1] = R300_2288_RV350;
1335 r300->hw.vof.cmd[R300_VOF_CNTL_0] = R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT
1336 | R300_VAP_OUTPUT_VTX_FMT_0__COLOR_PRESENT;
1337 r300->hw.vof.cmd[R300_VOF_CNTL_1] = 0; /* no textures */
1340 r300->hw.pvs.cmd[R300_PVS_CNTL_1] = 0;
1341 r300->hw.pvs.cmd[R300_PVS_CNTL_2] = 0;
1342 r300->hw.pvs.cmd[R300_PVS_CNTL_3] = 0;
1345 r300->hw.gb_enable.cmd[1] = R300_GB_POINT_STUFF_ENABLE
1346 | R300_GB_LINE_STUFF_ENABLE
1347 | R300_GB_TRIANGLE_STUFF_ENABLE;
1349 r300->hw.gb_misc.cmd[R300_GB_MISC_MSPOS_0] = 0x66666666;
1350 r300->hw.gb_misc.cmd[R300_GB_MISC_MSPOS_1] = 0x06666666;
1351 if (GET_CHIP(r300->radeon.radeonScreen) == RADEON_CHIP_R300)
1352 r300->hw.gb_misc.cmd[R300_GB_MISC_TILE_CONFIG] = R300_GB_TILE_ENABLE
1353 | R300_GB_TILE_PIPE_COUNT_R300
1354 | R300_GB_TILE_SIZE_16;
1356 r300->hw.gb_misc.cmd[R300_GB_MISC_TILE_CONFIG] = R300_GB_TILE_ENABLE
1357 | R300_GB_TILE_PIPE_COUNT_RV300
1358 | R300_GB_TILE_SIZE_16;
1359 r300->hw.gb_misc.cmd[R300_GB_MISC_SELECT] = 0x00000000;
1360 r300->hw.gb_misc.cmd[R300_GB_MISC_AA_CONFIG] = 0x00000000; /* No antialiasing */
1362 //r300->hw.txe.cmd[R300_TXE_ENABLE] = 0;
1364 r300->hw.unk4200.cmd[1] = r300PackFloat32(0.0);
1365 r300->hw.unk4200.cmd[2] = r300PackFloat32(0.0);
1366 r300->hw.unk4200.cmd[3] = r300PackFloat32(1.0);
1367 r300->hw.unk4200.cmd[4] = r300PackFloat32(1.0);
1369 r300->hw.unk4214.cmd[1] = 0x00050005;
1371 r300->hw.ps.cmd[R300_PS_POINTSIZE] = (6 << R300_POINTSIZE_X_SHIFT) |
1372 (6 << R300_POINTSIZE_Y_SHIFT);
1374 r300->hw.unk4230.cmd[1] = 0x01800000;
1375 r300->hw.unk4230.cmd[2] = 0x00020006;
1376 r300->hw.unk4230.cmd[3] = r300PackFloat32(1.0 / 192.0);
1378 r300->hw.unk4260.cmd[1] = 0;
1379 r300->hw.unk4260.cmd[2] = r300PackFloat32(0.0);
1380 r300->hw.unk4260.cmd[3] = r300PackFloat32(1.0);
1382 r300->hw.unk4274.cmd[1] = 0x00000002;
1383 r300->hw.unk4274.cmd[2] = 0x0003AAAA;
1384 r300->hw.unk4274.cmd[3] = 0x00000000;
1385 r300->hw.unk4274.cmd[4] = 0x00000000;
1387 r300->hw.unk4288.cmd[1] = 0x00000000;
1388 r300->hw.unk4288.cmd[2] = 0x00000001;
1389 r300->hw.unk4288.cmd[3] = 0x00000000;
1390 r300->hw.unk4288.cmd[4] = 0x00000000;
1391 r300->hw.unk4288.cmd[5] = 0x00000000;
1393 r300->hw.unk42A0.cmd[1] = 0x00000000;
1395 r300->hw.unk42B4.cmd[1] = 0x00000000;
1397 r300->hw.unk42C0.cmd[1] = 0x4B7FFFFF;
1398 r300->hw.unk42C0.cmd[2] = 0x00000000;
1401 r300->hw.unk43A4.cmd[1] = 0x0000001C;
1402 r300->hw.unk43A4.cmd[2] = 0x2DA49525;
1404 r300->hw.unk43E8.cmd[1] = 0x00FFFFFF;
1407 r300->hw.fp.cmd[R300_FP_CNTL0] = 0;
1408 r300->hw.fp.cmd[R300_FP_CNTL1] = 0;
1409 r300->hw.fp.cmd[R300_FP_CNTL2] = 0;
1410 r300->hw.fp.cmd[R300_FP_NODE0] = 0;
1411 r300->hw.fp.cmd[R300_FP_NODE1] = 0;
1412 r300->hw.fp.cmd[R300_FP_NODE2] = 0;
1413 r300->hw.fp.cmd[R300_FP_NODE3] = 0;
1416 r300->hw.unk46A4.cmd[1] = 0x00001B01;
1417 r300->hw.unk46A4.cmd[2] = 0x00001B0F;
1418 r300->hw.unk46A4.cmd[3] = 0x00001B0F;
1419 r300->hw.unk46A4.cmd[4] = 0x00001B0F;
1420 r300->hw.unk46A4.cmd[5] = 0x00000001;
1423 for(i = 1; i <= 64; ++i) {
1424 /* create NOP instructions */
1425 r300->hw.fpi[0].cmd[i] = FP_INSTRC(MAD, FP_ARGC(SRC0C_XYZ), FP_ARGC(ONE), FP_ARGC(ZERO));
1426 r300->hw.fpi[1].cmd[i] = FP_SELC(0,XYZ,NO,FP_TMP(0),0,0);
1427 r300->hw.fpi[2].cmd[i] = FP_INSTRA(MAD, FP_ARGA(SRC0A), FP_ARGA(ONE), FP_ARGA(ZERO));
1428 r300->hw.fpi[3].cmd[i] = FP_SELA(0,W,NO,FP_TMP(0),0,0);
1432 r300->hw.unk4BC0.cmd[1] = 0;
1434 r300->hw.unk4BC8.cmd[1] = 0;
1435 r300->hw.unk4BC8.cmd[2] = 0;
1436 r300->hw.unk4BC8.cmd[3] = 0;
1439 r300->hw.at.cmd[R300_AT_ALPHA_TEST] = 0;
1442 r300->hw.unk4BD8.cmd[1] = 0;
1444 r300->hw.unk4E00.cmd[1] = 0;
1447 r300->hw.bld.cmd[R300_BLD_CBLEND] = 0;
1448 r300->hw.bld.cmd[R300_BLD_ABLEND] = 0;
1451 r300->hw.unk4E10.cmd[1] = 0;
1452 r300->hw.unk4E10.cmd[2] = 0;
1453 r300->hw.unk4E10.cmd[3] = 0;
1455 r300->hw.cb.cmd[R300_CB_OFFSET] =
1456 r300->radeon.radeonScreen->backOffset +
1457 r300->radeon.radeonScreen->fbLocation;
1458 r300->hw.cb.cmd[R300_CB_PITCH] = r300->radeon.radeonScreen->backPitch
1459 | R300_COLOR_UNKNOWN_22_23;
1461 r300->hw.unk4E50.cmd[1] = 0;
1462 r300->hw.unk4E50.cmd[2] = 0;
1463 r300->hw.unk4E50.cmd[3] = 0;
1464 r300->hw.unk4E50.cmd[4] = 0;
1465 r300->hw.unk4E50.cmd[5] = 0;
1466 r300->hw.unk4E50.cmd[6] = 0;
1467 r300->hw.unk4E50.cmd[7] = 0;
1468 r300->hw.unk4E50.cmd[8] = 0;
1469 r300->hw.unk4E50.cmd[9] = 0;
1471 r300->hw.unk4E88.cmd[1] = 0;
1473 r300->hw.unk4EA0.cmd[1] = 0x00000000;
1474 r300->hw.unk4EA0.cmd[2] = 0xffffffff;
1476 r300->hw.unk4F08.cmd[1] = 0x00FFFF00;
1478 r300->hw.unk4F10.cmd[1] = 0x00000002; // depthbuffer format?
1479 r300->hw.unk4F10.cmd[2] = 0x00000000;
1480 r300->hw.unk4F10.cmd[3] = 0x00000003;
1481 r300->hw.unk4F10.cmd[4] = 0x00000000;
1483 r300->hw.zb.cmd[R300_ZB_OFFSET] =
1484 r300->radeon.radeonScreen->depthOffset +
1485 r300->radeon.radeonScreen->fbLocation;
1486 r300->hw.zb.cmd[R300_ZB_PITCH] = r300->radeon.radeonScreen->depthPitch;
1488 r300->hw.unk4F28.cmd[1] = 0;
1490 r300->hw.unk4F30.cmd[1] = 0;
1491 r300->hw.unk4F30.cmd[2] = 0;
1493 r300->hw.unk4F44.cmd[1] = 0;
1495 r300->hw.unk4F54.cmd[1] = 0;
1498 ((drm_r300_cmd_header_t*)r300->hw.vpi.cmd)->vpu.count = 0;
1499 for(i = 1; i < R300_VPI_CMDSIZE; i += 4) {
1501 r300->hw.vpi.cmd[i+0] = VP_OUT(ADD,TMP,0,XYZW);
1502 r300->hw.vpi.cmd[i+1] = VP_IN(TMP,0);
1503 r300->hw.vpi.cmd[i+2] = VP_ZERO();
1504 r300->hw.vpi.cmd[i+3] = VP_ZERO();
1507 ((drm_r300_cmd_header_t*)r300->hw.vpp.cmd)->vpu.count = 0;
1508 for(i = 1; i < R300_VPP_CMDSIZE; ++i)
1509 r300->hw.vpp.cmd[i] = 0;
1512 r300->hw.vps.cmd[R300_VPS_ZERO_0] = 0;
1513 r300->hw.vps.cmd[R300_VPS_ZERO_1] = 0;
1514 r300->hw.vps.cmd[R300_VPS_POINTSIZE] = r300PackFloat32(1.0);
1515 r300->hw.vps.cmd[R300_VPS_ZERO_3] = 0;
1519 r300->hw.all_dirty = GL_TRUE;
1525 * Calculate initial hardware state and register state functions.
1526 * Assumes that the command buffer and state atoms have been
1527 * initialized already.
1529 void r300InitState(r300ContextPtr r300)
1531 GLcontext *ctx = r300->radeon.glCtx;
1534 radeonInitState(&r300->radeon);
1536 switch (ctx->Visual.depthBits) {
1538 r300->state.depth.scale = 1.0 / (GLfloat) 0xffff;
1539 depth_fmt = R200_DEPTH_FORMAT_16BIT_INT_Z;
1540 //r300->state.stencil.clear = 0x00000000;
1543 r300->state.depth.scale = 1.0 / (GLfloat) 0xffffff;
1544 depth_fmt = R200_DEPTH_FORMAT_24BIT_INT_Z;
1545 //r300->state.stencil.clear = 0xff000000;
1548 fprintf(stderr, "Error: Unsupported depth %d... exiting\n",
1549 ctx->Visual.depthBits);
1553 memset(&(r300->state.texture), 0, sizeof(r300->state.texture));
1555 r300ResetHwState(r300);
1561 * Initialize driver's state callback functions
1563 void r300InitStateFuncs(struct dd_function_table* functions)
1565 radeonInitStateFuncs(functions);
1567 functions->UpdateState = r300InvalidateState;
1568 //functions->AlphaFunc = r300AlphaFunc;
1569 functions->BlendColor = r300BlendColor;
1570 functions->BlendEquationSeparate = r300BlendEquationSeparate;
1571 functions->BlendFuncSeparate = r300BlendFuncSeparate;
1572 functions->Enable = r300Enable;
1573 functions->ColorMask = r300ColorMask;
1574 functions->DepthFunc = r300DepthFunc;
1575 functions->DepthMask = r300DepthMask;
1576 functions->CullFace = r300CullFace;
1577 functions->FrontFace = r300FrontFace;
1579 /* Viewport related */
1580 functions->Viewport = r300Viewport;
1581 functions->DepthRange = r300DepthRange;
1582 functions->PointSize = r300PointSize;