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"
51 #include "texformat.h"
53 #include "radeon_ioctl.h"
54 #include "radeon_state.h"
55 #include "r300_context.h"
56 #include "r300_ioctl.h"
57 #include "r300_state.h"
59 #include "r300_program.h"
60 #include "r300_emit.h"
62 #include "r300_fragprog.h"
64 #include "r300_fixed_pipelines.h"
65 #include "r300_texprog.h"
68 #include "r300_maos.h"
70 static void r300AlphaFunc(GLcontext
* ctx
, GLenum func
, GLfloat ref
)
72 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
73 int pp_misc
= rmesa
->hw
.at
.cmd
[R300_AT_ALPHA_TEST
];
76 CLAMPED_FLOAT_TO_UBYTE(refByte
, ref
);
78 R300_STATECHANGE(rmesa
, at
);
80 pp_misc
&= ~(R300_ALPHA_TEST_OP_MASK
| R300_REF_ALPHA_MASK
);
81 pp_misc
|= (refByte
& R300_REF_ALPHA_MASK
);
85 pp_misc
|= R300_ALPHA_TEST_FAIL
;
88 pp_misc
|= R300_ALPHA_TEST_LESS
;
91 pp_misc
|= R300_ALPHA_TEST_EQUAL
;
94 pp_misc
|= R300_ALPHA_TEST_LEQUAL
;
97 pp_misc
|= R300_ALPHA_TEST_GREATER
;
100 pp_misc
|= R300_ALPHA_TEST_NEQUAL
;
103 pp_misc
|= R300_ALPHA_TEST_GEQUAL
;
106 pp_misc
|= R300_ALPHA_TEST_PASS
;
107 //pp_misc &= ~R300_ALPHA_TEST_ENABLE;
111 rmesa
->hw
.at
.cmd
[R300_AT_ALPHA_TEST
] = pp_misc
;
114 static void r300BlendColor(GLcontext
* ctx
, const GLfloat cf
[4])
117 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
119 R300_STATECHANGE(rmesa
, unk4E10
);
121 CLAMPED_FLOAT_TO_UBYTE(color
[0], cf
[0]);
122 CLAMPED_FLOAT_TO_UBYTE(color
[1], cf
[1]);
123 CLAMPED_FLOAT_TO_UBYTE(color
[2], cf
[2]);
124 CLAMPED_FLOAT_TO_UBYTE(color
[3], cf
[3]);
126 rmesa
->hw
.unk4E10
.cmd
[1] = r300PackColor(4, color
[3], color
[0],
131 * Calculate the hardware blend factor setting. This same function is used
132 * for source and destination of both alpha and RGB.
135 * The hardware register value for the specified blend factor. This value
136 * will need to be shifted into the correct position for either source or
137 * destination factor.
140 * Since the two cases where source and destination are handled differently
141 * are essentially error cases, they should never happen. Determine if these
142 * cases can be removed.
144 static int blend_factor(GLenum factor
, GLboolean is_src
)
150 func
= R200_BLEND_GL_ZERO
;
153 func
= R200_BLEND_GL_ONE
;
156 func
= R200_BLEND_GL_DST_COLOR
;
158 case GL_ONE_MINUS_DST_COLOR
:
159 func
= R200_BLEND_GL_ONE_MINUS_DST_COLOR
;
162 func
= R200_BLEND_GL_SRC_COLOR
;
164 case GL_ONE_MINUS_SRC_COLOR
:
165 func
= R200_BLEND_GL_ONE_MINUS_SRC_COLOR
;
168 func
= R200_BLEND_GL_SRC_ALPHA
;
170 case GL_ONE_MINUS_SRC_ALPHA
:
171 func
= R200_BLEND_GL_ONE_MINUS_SRC_ALPHA
;
174 func
= R200_BLEND_GL_DST_ALPHA
;
176 case GL_ONE_MINUS_DST_ALPHA
:
177 func
= R200_BLEND_GL_ONE_MINUS_DST_ALPHA
;
179 case GL_SRC_ALPHA_SATURATE
:
181 (is_src
) ? R200_BLEND_GL_SRC_ALPHA_SATURATE
:
184 case GL_CONSTANT_COLOR
:
185 func
= R200_BLEND_GL_CONST_COLOR
;
187 case GL_ONE_MINUS_CONSTANT_COLOR
:
188 func
= R200_BLEND_GL_ONE_MINUS_CONST_COLOR
;
190 case GL_CONSTANT_ALPHA
:
191 func
= R200_BLEND_GL_CONST_ALPHA
;
193 case GL_ONE_MINUS_CONSTANT_ALPHA
:
194 func
= R200_BLEND_GL_ONE_MINUS_CONST_ALPHA
;
197 fprintf(stderr
, "unknown blend factor %x\n", factor
);
198 func
= (is_src
) ? R200_BLEND_GL_ONE
: R200_BLEND_GL_ZERO
;
204 * Sets both the blend equation and the blend function.
205 * This is done in a single
206 * function because some blend equations (i.e., \c GL_MIN and \c GL_MAX)
207 * change the interpretation of the blend function.
208 * Also, make sure that blend function and blend equation are set to their default
209 * value if color blending is not enabled, since at least blend equations GL_MIN
210 * and GL_FUNC_REVERSE_SUBTRACT will cause wrong results otherwise for
214 /* helper function */
215 static void r300_set_blend_cntl(r300ContextPtr r300
, int func
, int eqn
, int cbits
, int funcA
, int eqnA
)
217 GLuint new_ablend
, new_cblend
;
220 fprintf(stderr
, "eqnA=%08x funcA=%08x eqn=%08x func=%08x cbits=%08x\n", eqnA
, funcA
, eqn
, func
, cbits
);
222 new_ablend
= eqnA
| funcA
;
223 new_cblend
= eqn
| func
;
225 /* Some blend factor combinations don't seem to work when the
226 * BLEND_NO_SEPARATE bit is set.
228 * Especially problematic candidates are the ONE_MINUS_* flags,
229 * but I can't see a real pattern.
232 if (new_ablend
== new_cblend
) {
233 new_cblend
|= R300_BLEND_NO_SEPARATE
;
238 if((new_ablend
!= r300
->hw
.bld
.cmd
[R300_BLD_ABLEND
]) ||
239 (new_cblend
!= r300
->hw
.bld
.cmd
[R300_BLD_CBLEND
])) {
240 R300_STATECHANGE(r300
, bld
);
241 r300
->hw
.bld
.cmd
[R300_BLD_ABLEND
]=new_ablend
;
242 r300
->hw
.bld
.cmd
[R300_BLD_CBLEND
]=new_cblend
;
247 static void r300_set_blend_state(GLcontext
* ctx
)
249 r300ContextPtr r300
= R300_CONTEXT(ctx
);
250 int func
= (R200_BLEND_GL_ONE
<< R200_SRC_BLEND_SHIFT
) |
251 (R200_BLEND_GL_ZERO
<< R200_DST_BLEND_SHIFT
);
252 int eqn
= R200_COMB_FCN_ADD_CLAMP
;
253 int funcA
= (R200_BLEND_GL_ONE
<< R200_SRC_BLEND_SHIFT
) |
254 (R200_BLEND_GL_ZERO
<< R200_DST_BLEND_SHIFT
);
255 int eqnA
= R200_COMB_FCN_ADD_CLAMP
;
257 if (ctx
->Color
._LogicOpEnabled
|| !ctx
->Color
.BlendEnabled
) {
258 r300_set_blend_cntl(r300
,
264 func
= (blend_factor(ctx
->Color
.BlendSrcRGB
, GL_TRUE
) << R200_SRC_BLEND_SHIFT
) |
265 (blend_factor(ctx
->Color
.BlendDstRGB
, GL_FALSE
) << R200_DST_BLEND_SHIFT
);
267 switch (ctx
->Color
.BlendEquationRGB
) {
269 eqn
= R300_COMB_FCN_ADD_CLAMP
;
272 case GL_FUNC_SUBTRACT
:
273 eqn
= R300_COMB_FCN_SUB_CLAMP
;
276 case GL_FUNC_REVERSE_SUBTRACT
:
277 eqn
= R200_COMB_FCN_RSUB_CLAMP
;
281 eqn
= R200_COMB_FCN_MIN
;
282 func
= (R200_BLEND_GL_ONE
<< R200_SRC_BLEND_SHIFT
) |
283 (R200_BLEND_GL_ONE
<< R200_DST_BLEND_SHIFT
);
287 eqn
= R200_COMB_FCN_MAX
;
288 func
= (R200_BLEND_GL_ONE
<< R200_SRC_BLEND_SHIFT
) |
289 (R200_BLEND_GL_ONE
<< R200_DST_BLEND_SHIFT
);
294 "[%s:%u] Invalid RGB blend equation (0x%04x).\n",
295 __func__
, __LINE__
, ctx
->Color
.BlendEquationRGB
);
300 funcA
= (blend_factor(ctx
->Color
.BlendSrcA
, GL_TRUE
) << R200_SRC_BLEND_SHIFT
) |
301 (blend_factor(ctx
->Color
.BlendDstA
, GL_FALSE
) << R200_DST_BLEND_SHIFT
);
303 switch (ctx
->Color
.BlendEquationA
) {
305 eqnA
= R300_COMB_FCN_ADD_CLAMP
;
308 case GL_FUNC_SUBTRACT
:
309 eqnA
= R300_COMB_FCN_SUB_CLAMP
;
312 case GL_FUNC_REVERSE_SUBTRACT
:
313 eqnA
= R200_COMB_FCN_RSUB_CLAMP
;
317 eqnA
= R200_COMB_FCN_MIN
;
318 funcA
= (R200_BLEND_GL_ONE
<< R200_SRC_BLEND_SHIFT
) |
319 (R200_BLEND_GL_ONE
<< R200_DST_BLEND_SHIFT
);
323 eqnA
= R200_COMB_FCN_MAX
;
324 funcA
= (R200_BLEND_GL_ONE
<< R200_SRC_BLEND_SHIFT
) |
325 (R200_BLEND_GL_ONE
<< R200_DST_BLEND_SHIFT
);
329 fprintf(stderr
, "[%s:%u] Invalid A blend equation (0x%04x).\n",
330 __func__
, __LINE__
, ctx
->Color
.BlendEquationA
);
334 r300_set_blend_cntl(r300
,
335 func
, eqn
, R300_BLEND_UNKNOWN
| R300_BLEND_ENABLE
,
339 static void r300BlendEquationSeparate(GLcontext
* ctx
,
340 GLenum modeRGB
, GLenum modeA
)
342 r300_set_blend_state(ctx
);
345 static void r300BlendFuncSeparate(GLcontext
* ctx
,
346 GLenum sfactorRGB
, GLenum dfactorRGB
,
347 GLenum sfactorA
, GLenum dfactorA
)
349 r300_set_blend_state(ctx
);
353 * Update our tracked culling state based on Mesa's state.
355 static void r300UpdateCulling(GLcontext
* ctx
)
357 r300ContextPtr r300
= R300_CONTEXT(ctx
);
360 R300_STATECHANGE(r300
, cul
);
361 if (ctx
->Polygon
.CullFlag
) {
362 if (ctx
->Polygon
.CullFaceMode
== GL_FRONT_AND_BACK
)
363 val
= R300_CULL_FRONT
|R300_CULL_BACK
;
364 else if (ctx
->Polygon
.CullFaceMode
== GL_FRONT
)
365 val
= R300_CULL_FRONT
;
367 val
= R300_CULL_BACK
;
369 if (ctx
->Polygon
.FrontFace
== GL_CW
)
370 val
|= R300_FRONT_FACE_CW
;
372 val
|= R300_FRONT_FACE_CCW
;
374 r300
->hw
.cul
.cmd
[R300_CUL_CULL
] = val
;
377 static void update_early_z(GLcontext
* ctx
)
379 /* updates register 0x4f14
380 if depth test is not enabled it should be 0x00000000
381 if depth is enabled and alpha not it should be 0x00000001
382 if depth and alpha is enabled it should be 0x00000000
384 r300ContextPtr r300
= R300_CONTEXT(ctx
);
386 R300_STATECHANGE(r300
, unk4F10
);
387 if (ctx
->Color
.AlphaEnabled
)
388 /* disable early Z */
389 r300
->hw
.unk4F10
.cmd
[2] = 0x00000000;
393 r300
->hw
.unk4F10
.cmd
[2] = 0x00000001;
395 /* disable early Z */
396 r300
->hw
.unk4F10
.cmd
[2] = 0x00000000;
401 * Handle glEnable()/glDisable().
403 * \note Mesa already filters redundant calls to glEnable/glDisable.
405 static void r300Enable(GLcontext
* ctx
, GLenum cap
, GLboolean state
)
407 r300ContextPtr r300
= R300_CONTEXT(ctx
);
410 if (RADEON_DEBUG
& DEBUG_STATE
)
411 fprintf(stderr
, "%s( %s = %s )\n", __FUNCTION__
,
412 _mesa_lookup_enum_by_nr(cap
),
413 state
? "GL_TRUE" : "GL_FALSE");
416 /* Fast track this one...
424 R300_STATECHANGE(r300
, at
);
426 r300
->hw
.at
.cmd
[R300_AT_ALPHA_TEST
] |=
427 R300_ALPHA_TEST_ENABLE
;
429 r300
->hw
.at
.cmd
[R300_AT_ALPHA_TEST
] &=
430 ~R300_ALPHA_TEST_ENABLE
;
436 case GL_COLOR_LOGIC_OP
:
437 r300_set_blend_state(ctx
);
441 R300_STATECHANGE(r300
, zs
);
445 newval
= R300_RB3D_Z_TEST_AND_WRITE
;
447 newval
= R300_RB3D_Z_TEST
;
449 newval
= R300_RB3D_Z_DISABLED_1
;
451 r300
->hw
.zs
.cmd
[R300_ZS_CNTL_0
] &= R300_RB3D_STENCIL_ENABLE
;
452 r300
->hw
.zs
.cmd
[R300_ZS_CNTL_0
] |= newval
;
456 case GL_STENCIL_TEST
:
457 WARN_ONCE("TODO - double side stencil !\n");
458 if (r300
->state
.stencil
.hw_stencil
) {
459 R300_STATECHANGE(r300
, zs
);
461 r300
->hw
.zs
.cmd
[R300_ZS_CNTL_0
] |=
462 R300_RB3D_STENCIL_ENABLE
;
464 r300
->hw
.zs
.cmd
[R300_ZS_CNTL_0
] &=
465 ~R300_RB3D_STENCIL_ENABLE
;
469 FALLBACK(&r300
->radeon
, RADEON_FALLBACK_STENCIL
, state
);
475 r300UpdateCulling(ctx
);
478 case GL_POLYGON_OFFSET_POINT
:
479 case GL_POLYGON_OFFSET_LINE
:
482 case GL_POLYGON_OFFSET_FILL
:
483 R300_STATECHANGE(r300
, unk42B4
);
485 r300
->hw
.unk42B4
.cmd
[1] |= (3<<0);
487 r300
->hw
.unk42B4
.cmd
[1] &= ~(3<<0);
491 radeonEnable(ctx
, cap
, state
);
497 static void r300UpdatePolygonMode(GLcontext
*ctx
)
499 r300ContextPtr r300
= R300_CONTEXT(ctx
);
502 if (ctx
->Polygon
.FrontMode
!= GL_FILL
||
503 ctx
->Polygon
.BackMode
!= GL_FILL
) {
506 if (ctx
->Polygon
.FrontFace
== GL_CCW
) {
507 f
= ctx
->Polygon
.FrontMode
;
508 b
= ctx
->Polygon
.BackMode
;
510 f
= ctx
->Polygon
.BackMode
;
511 b
= ctx
->Polygon
.FrontMode
;
514 hw_mode
|= R300_PM_ENABLED
;
518 hw_mode
|= R300_PM_FRONT_LINE
;
520 case GL_POINT
: /* noop */
521 hw_mode
|= R300_PM_FRONT_POINT
;
524 hw_mode
|= R300_PM_FRONT_FILL
;
530 hw_mode
|= R300_PM_BACK_LINE
;
532 case GL_POINT
: /* noop */
533 hw_mode
|= R300_PM_BACK_POINT
;
536 hw_mode
|= R300_PM_BACK_FILL
;
541 if (r300
->hw
.unk4288
.cmd
[1] != hw_mode
) {
542 R300_STATECHANGE(r300
, unk4288
);
543 r300
->hw
.unk4288
.cmd
[1] = hw_mode
;
548 * Change the culling mode.
550 * \note Mesa already filters redundant calls to this function.
552 static void r300CullFace(GLcontext
* ctx
, GLenum mode
)
556 r300UpdateCulling(ctx
);
561 * Change the polygon orientation.
563 * \note Mesa already filters redundant calls to this function.
565 static void r300FrontFace(GLcontext
* ctx
, GLenum mode
)
569 r300UpdateCulling(ctx
);
570 r300UpdatePolygonMode(ctx
);
575 * Change the depth testing function.
577 * \note Mesa already filters redundant calls to this function.
579 static void r300DepthFunc(GLcontext
* ctx
, GLenum func
)
581 r300ContextPtr r300
= R300_CONTEXT(ctx
);
583 R300_STATECHANGE(r300
, zs
);
585 r300
->hw
.zs
.cmd
[R300_ZS_CNTL_1
] &= ~(R300_ZS_MASK
<< R300_RB3D_ZS1_DEPTH_FUNC_SHIFT
);
589 r300
->hw
.zs
.cmd
[R300_ZS_CNTL_1
] |= R300_ZS_NEVER
<< R300_RB3D_ZS1_DEPTH_FUNC_SHIFT
;
592 r300
->hw
.zs
.cmd
[R300_ZS_CNTL_1
] |= R300_ZS_LESS
<< R300_RB3D_ZS1_DEPTH_FUNC_SHIFT
;
595 r300
->hw
.zs
.cmd
[R300_ZS_CNTL_1
] |= R300_ZS_EQUAL
<< R300_RB3D_ZS1_DEPTH_FUNC_SHIFT
;
598 r300
->hw
.zs
.cmd
[R300_ZS_CNTL_1
] |= R300_ZS_LEQUAL
<< R300_RB3D_ZS1_DEPTH_FUNC_SHIFT
;
601 r300
->hw
.zs
.cmd
[R300_ZS_CNTL_1
] |= R300_ZS_GREATER
<< R300_RB3D_ZS1_DEPTH_FUNC_SHIFT
;
604 r300
->hw
.zs
.cmd
[R300_ZS_CNTL_1
] |= R300_ZS_NOTEQUAL
<< R300_RB3D_ZS1_DEPTH_FUNC_SHIFT
;
607 r300
->hw
.zs
.cmd
[R300_ZS_CNTL_1
] |= R300_ZS_GEQUAL
<< R300_RB3D_ZS1_DEPTH_FUNC_SHIFT
;
610 r300
->hw
.zs
.cmd
[R300_ZS_CNTL_1
] |= R300_ZS_ALWAYS
<< R300_RB3D_ZS1_DEPTH_FUNC_SHIFT
;
617 * Enable/Disable depth writing.
619 * \note Mesa already filters redundant calls to this function.
621 static void r300DepthMask(GLcontext
* ctx
, GLboolean mask
)
623 r300ContextPtr r300
= R300_CONTEXT(ctx
);
624 r300Enable(ctx
, GL_DEPTH_TEST
, ctx
->Depth
.Test
);
629 * Handle glColorMask()
631 static void r300ColorMask(GLcontext
* ctx
,
632 GLboolean r
, GLboolean g
, GLboolean b
, GLboolean a
)
634 r300ContextPtr r300
= R300_CONTEXT(ctx
);
635 int mask
= (r
? R300_COLORMASK0_R
: 0) |
636 (g
? R300_COLORMASK0_G
: 0) |
637 (b
? R300_COLORMASK0_B
: 0) |
638 (a
? R300_COLORMASK0_A
: 0);
640 if (mask
!= r300
->hw
.cmk
.cmd
[R300_CMK_COLORMASK
]) {
641 R300_STATECHANGE(r300
, cmk
);
642 r300
->hw
.cmk
.cmd
[R300_CMK_COLORMASK
] = mask
;
646 /* =============================================================
649 static void r300PointSize(GLcontext
* ctx
, GLfloat size
)
651 r300ContextPtr r300
= R300_CONTEXT(ctx
);
653 size
= ctx
->Point
._Size
;
655 R300_STATECHANGE(r300
, ps
);
656 r300
->hw
.ps
.cmd
[R300_PS_POINTSIZE
] =
657 ((int)(size
* 6) << R300_POINTSIZE_X_SHIFT
) |
658 ((int)(size
* 6) << R300_POINTSIZE_Y_SHIFT
);
661 /* =============================================================
664 static void r300LineWidth(GLcontext
*ctx
, GLfloat widthf
)
666 r300ContextPtr r300
= R300_CONTEXT(ctx
);
668 widthf
= ctx
->Line
._Width
;
670 R300_STATECHANGE(r300
, lcntl
);
671 r300
->hw
.lcntl
.cmd
[1] = (int)(widthf
* 6.0);
672 r300
->hw
.lcntl
.cmd
[1] |= R300_LINE_CNT_VE
;
675 static void r300PolygonMode(GLcontext
*ctx
, GLenum face
, GLenum mode
)
680 r300UpdatePolygonMode(ctx
);
683 /* =============================================================
687 static int translate_stencil_func(int func
)
691 return R300_ZS_NEVER
;
695 return R300_ZS_EQUAL
;
697 return R300_ZS_LEQUAL
;
699 return R300_ZS_GREATER
;
701 return R300_ZS_NOTEQUAL
;
703 return R300_ZS_GEQUAL
;
705 return R300_ZS_ALWAYS
;
710 static int translate_stencil_op(int op
)
718 return R300_ZS_REPLACE
;
723 case GL_INCR_WRAP_EXT
:
724 return R300_ZS_INCR_WRAP
;
725 case GL_DECR_WRAP_EXT
:
726 return R300_ZS_DECR_WRAP
;
728 return R300_ZS_INVERT
;
730 WARN_ONCE("Do not know how to translate stencil op");
736 static void r300ShadeModel(GLcontext
* ctx
, GLenum mode
)
738 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
740 R300_STATECHANGE(rmesa
, unk4274
);
743 rmesa
->hw
.unk4274
.cmd
[2] = R300_RE_SHADE_MODEL_FLAT
;
746 rmesa
->hw
.unk4274
.cmd
[2] = R300_RE_SHADE_MODEL_SMOOTH
;
753 static void r300StencilFuncSeparate(GLcontext
* ctx
, GLenum face
,
754 GLenum func
, GLint ref
, GLuint mask
)
756 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
757 GLuint refmask
= ((ctx
->Stencil
.Ref
[0] << R300_RB3D_ZS2_STENCIL_REF_SHIFT
) |
758 (ctx
->Stencil
.ValueMask
[0] << R300_RB3D_ZS2_STENCIL_MASK_SHIFT
));
762 R300_STATECHANGE(rmesa
, zs
);
764 rmesa
->hw
.zs
.cmd
[R300_ZS_CNTL_1
] &= ~(
765 (R300_ZS_MASK
<< R300_RB3D_ZS1_FRONT_FUNC_SHIFT
)
766 | (R300_ZS_MASK
<< R300_RB3D_ZS1_BACK_FUNC_SHIFT
));
768 rmesa
->hw
.zs
.cmd
[R300_ZS_CNTL_2
] &= ~((R300_RB3D_ZS2_STENCIL_MASK
<< R300_RB3D_ZS2_STENCIL_REF_SHIFT
) |
769 (R300_RB3D_ZS2_STENCIL_MASK
<< R300_RB3D_ZS2_STENCIL_MASK_SHIFT
));
771 flag
= translate_stencil_func(ctx
->Stencil
.Function
[0]);
773 rmesa
->hw
.zs
.cmd
[R300_ZS_CNTL_1
] |= (flag
<< R300_RB3D_ZS1_FRONT_FUNC_SHIFT
)
774 | (flag
<< R300_RB3D_ZS1_BACK_FUNC_SHIFT
);
775 rmesa
->hw
.zs
.cmd
[R300_ZS_CNTL_2
] |= refmask
;
778 static void r300StencilMaskSeparate(GLcontext
* ctx
, GLenum face
, GLuint mask
)
780 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
782 R300_STATECHANGE(rmesa
, zs
);
783 rmesa
->hw
.zs
.cmd
[R300_ZS_CNTL_2
] &= ~(R300_RB3D_ZS2_STENCIL_MASK
<< R300_RB3D_ZS2_STENCIL_WRITE_MASK_SHIFT
);
784 rmesa
->hw
.zs
.cmd
[R300_ZS_CNTL_2
] |= ctx
->Stencil
.WriteMask
[0] << R300_RB3D_ZS2_STENCIL_WRITE_MASK_SHIFT
;
788 static void r300StencilOpSeparate(GLcontext
* ctx
, GLenum face
, GLenum fail
,
789 GLenum zfail
, GLenum zpass
)
791 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
793 R300_STATECHANGE(rmesa
, zs
);
794 /* It is easier to mask what's left.. */
795 rmesa
->hw
.zs
.cmd
[R300_ZS_CNTL_1
] &=
796 (R300_ZS_MASK
<< R300_RB3D_ZS1_DEPTH_FUNC_SHIFT
) |
797 (R300_ZS_MASK
<< R300_RB3D_ZS1_FRONT_FUNC_SHIFT
) |
798 (R300_ZS_MASK
<< R300_RB3D_ZS1_BACK_FUNC_SHIFT
);
800 rmesa
->hw
.zs
.cmd
[R300_ZS_CNTL_1
] |=
801 (translate_stencil_op(ctx
->Stencil
.FailFunc
[0]) << R300_RB3D_ZS1_FRONT_FAIL_OP_SHIFT
)
802 |(translate_stencil_op(ctx
->Stencil
.ZFailFunc
[0]) << R300_RB3D_ZS1_FRONT_ZFAIL_OP_SHIFT
)
803 |(translate_stencil_op(ctx
->Stencil
.ZPassFunc
[0]) << R300_RB3D_ZS1_FRONT_ZPASS_OP_SHIFT
)
804 |(translate_stencil_op(ctx
->Stencil
.FailFunc
[0]) << R300_RB3D_ZS1_BACK_FAIL_OP_SHIFT
)
805 |(translate_stencil_op(ctx
->Stencil
.ZFailFunc
[0]) << R300_RB3D_ZS1_BACK_ZFAIL_OP_SHIFT
)
806 |(translate_stencil_op(ctx
->Stencil
.ZPassFunc
[0]) << R300_RB3D_ZS1_BACK_ZPASS_OP_SHIFT
);
809 static void r300ClearStencil(GLcontext
* ctx
, GLint s
)
811 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
813 rmesa
->state
.stencil
.clear
=
814 ((GLuint
) ctx
->Stencil
.Clear
|
815 (R300_RB3D_ZS2_STENCIL_MASK
<< R300_RB3D_ZS2_STENCIL_MASK_SHIFT
) |
816 (ctx
->Stencil
.WriteMask
[0] << R300_RB3D_ZS2_STENCIL_WRITE_MASK_SHIFT
));
819 /* =============================================================
820 * Window position and viewport transformation
824 * To correctly position primitives:
826 #define SUBPIXEL_X 0.125
827 #define SUBPIXEL_Y 0.125
829 static void r300UpdateWindow(GLcontext
* ctx
)
831 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
832 __DRIdrawablePrivate
*dPriv
= rmesa
->radeon
.dri
.drawable
;
833 GLfloat xoffset
= dPriv
? (GLfloat
) dPriv
->x
: 0;
834 GLfloat yoffset
= dPriv
? (GLfloat
) dPriv
->y
+ dPriv
->h
: 0;
835 const GLfloat
*v
= ctx
->Viewport
._WindowMap
.m
;
837 GLfloat sx
= v
[MAT_SX
];
838 GLfloat tx
= v
[MAT_TX
] + xoffset
+ SUBPIXEL_X
;
839 GLfloat sy
= -v
[MAT_SY
];
840 GLfloat ty
= (-v
[MAT_TY
]) + yoffset
+ SUBPIXEL_Y
;
841 GLfloat sz
= v
[MAT_SZ
] * rmesa
->state
.depth
.scale
;
842 GLfloat tz
= v
[MAT_TZ
] * rmesa
->state
.depth
.scale
;
844 R300_FIREVERTICES(rmesa
);
845 R300_STATECHANGE(rmesa
, vpt
);
847 rmesa
->hw
.vpt
.cmd
[R300_VPT_XSCALE
] = r300PackFloat32(sx
);
848 rmesa
->hw
.vpt
.cmd
[R300_VPT_XOFFSET
] = r300PackFloat32(tx
);
849 rmesa
->hw
.vpt
.cmd
[R300_VPT_YSCALE
] = r300PackFloat32(sy
);
850 rmesa
->hw
.vpt
.cmd
[R300_VPT_YOFFSET
] = r300PackFloat32(ty
);
851 rmesa
->hw
.vpt
.cmd
[R300_VPT_ZSCALE
] = r300PackFloat32(sz
);
852 rmesa
->hw
.vpt
.cmd
[R300_VPT_ZOFFSET
] = r300PackFloat32(tz
);
855 static void r300Viewport(GLcontext
* ctx
, GLint x
, GLint y
,
856 GLsizei width
, GLsizei height
)
858 /* Don't pipeline viewport changes, conflict with window offset
859 * setting below. Could apply deltas to rescue pipelined viewport
860 * values, or keep the originals hanging around.
862 R300_FIREVERTICES(R300_CONTEXT(ctx
));
863 r300UpdateWindow(ctx
);
866 static void r300DepthRange(GLcontext
* ctx
, GLclampd nearval
, GLclampd farval
)
868 r300UpdateWindow(ctx
);
871 /* =============================================================
874 static void r300PolygonOffset(GLcontext
* ctx
, GLfloat factor
, GLfloat units
)
876 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
877 GLfloat constant
= units
;
879 switch (ctx
->Visual
.depthBits
) {
890 /* fprintf(stderr, "%s f:%f u:%f\n", __FUNCTION__, factor, constant); */
892 R300_STATECHANGE(rmesa
, zbs
);
893 rmesa
->hw
.zbs
.cmd
[R300_ZBS_T_FACTOR
] = r300PackFloat32(factor
);
894 rmesa
->hw
.zbs
.cmd
[R300_ZBS_T_CONSTANT
] = r300PackFloat32(constant
);
895 rmesa
->hw
.zbs
.cmd
[R300_ZBS_W_FACTOR
] = r300PackFloat32(factor
);
896 rmesa
->hw
.zbs
.cmd
[R300_ZBS_W_CONSTANT
] = r300PackFloat32(constant
);
899 /* Routing and texture-related */
901 static r300TexObj default_tex_obj
={
902 filter
:R300_TX_MAG_FILTER_LINEAR
| R300_TX_MIN_FILTER_LINEAR
,
904 size
: (0xff << R300_TX_WIDTHMASK_SHIFT
)
905 | (0xff << R300_TX_HEIGHTMASK_SHIFT
)
906 | (0x8 << R300_TX_SIZE_SHIFT
),
913 /* there is probably a system to these value, but, for now,
914 we just try by hand */
916 static int inline translate_src(int src
)
925 case GL_PRIMARY_COLOR
:
942 /* r300 doesnt handle GL_CLAMP and GL_MIRROR_CLAMP_EXT correctly when filter is NEAREST.
943 * Since texwrap produces same results for GL_CLAMP and GL_CLAMP_TO_EDGE we use them instead.
944 * We need to recalculate wrap modes whenever filter mode is changed because someone might do:
945 * glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
946 * glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
947 * glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
948 * Since r300 completely ignores R300_TX_CLAMP when either min or mag is nearest it cant handle
949 * combinations where only one of them is nearest.
951 static unsigned long gen_fixed_filter(unsigned long f
)
953 unsigned long mag
, min
, needs_fixing
=0;
956 /* We ignore MIRROR bit so we dont have to do everything twice */
957 if((f
& ((7-1) << R300_TX_WRAP_S_SHIFT
)) == (R300_TX_CLAMP
<< R300_TX_WRAP_S_SHIFT
)){
960 if((f
& ((7-1) << R300_TX_WRAP_T_SHIFT
)) == (R300_TX_CLAMP
<< R300_TX_WRAP_T_SHIFT
)){
963 if((f
& ((7-1) << R300_TX_WRAP_Q_SHIFT
)) == (R300_TX_CLAMP
<< R300_TX_WRAP_Q_SHIFT
)){
970 mag
=f
& R300_TX_MAG_FILTER_MASK
;
971 min
=f
& R300_TX_MIN_FILTER_MASK
;
973 /* TODO: Check for anisto filters too */
974 if((mag
!= R300_TX_MAG_FILTER_NEAREST
) && (min
!= R300_TX_MIN_FILTER_NEAREST
))
977 /* r300 cant handle these modes hence we force nearest to linear */
978 if((mag
== R300_TX_MAG_FILTER_NEAREST
) && (min
!= R300_TX_MIN_FILTER_NEAREST
)){
979 f
&= ~R300_TX_MAG_FILTER_NEAREST
;
980 f
|= R300_TX_MAG_FILTER_LINEAR
;
984 if((min
== R300_TX_MIN_FILTER_NEAREST
) && (mag
!= R300_TX_MAG_FILTER_NEAREST
)){
985 f
&= ~R300_TX_MIN_FILTER_NEAREST
;
986 f
|= R300_TX_MIN_FILTER_LINEAR
;
990 /* Both are nearest */
991 if(needs_fixing
& 1){
992 f
&= ~((7-1) << R300_TX_WRAP_S_SHIFT
);
993 f
|= R300_TX_CLAMP_TO_EDGE
<< R300_TX_WRAP_S_SHIFT
;
995 if(needs_fixing
& 2){
996 f
&= ~((7-1) << R300_TX_WRAP_T_SHIFT
);
997 f
|= R300_TX_CLAMP_TO_EDGE
<< R300_TX_WRAP_T_SHIFT
;
999 if(needs_fixing
& 4){
1000 f
&= ~((7-1) << R300_TX_WRAP_Q_SHIFT
);
1001 f
|= R300_TX_CLAMP_TO_EDGE
<< R300_TX_WRAP_Q_SHIFT
;
1006 void r300_setup_textures(GLcontext
*ctx
)
1009 struct r300_tex_obj
*t
;
1010 r300ContextPtr r300
= R300_CONTEXT(ctx
);
1011 int max_texture_unit
=-1; /* -1 translates into no setup costs for fields */
1012 GLuint OutputsWritten
;
1015 OutputsWritten
= CURRENT_VERTEX_SHADER(ctx
)->OutputsWritten
;
1017 R300_STATECHANGE(r300
, txe
);
1018 R300_STATECHANGE(r300
, tex
.filter
);
1019 R300_STATECHANGE(r300
, tex
.unknown1
);
1020 R300_STATECHANGE(r300
, tex
.size
);
1021 R300_STATECHANGE(r300
, tex
.format
);
1022 R300_STATECHANGE(r300
, tex
.offset
);
1023 R300_STATECHANGE(r300
, tex
.unknown4
);
1024 R300_STATECHANGE(r300
, tex
.border_color
);
1026 r300
->hw
.txe
.cmd
[R300_TXE_ENABLE
]=0x0;
1028 mtu
= r300
->radeon
.glCtx
->Const
.MaxTextureUnits
;
1029 if (RADEON_DEBUG
& DEBUG_STATE
)
1030 fprintf(stderr
, "mtu=%d\n", mtu
);
1032 if(mtu
> R300_MAX_TEXTURE_UNITS
) {
1033 fprintf(stderr
, "Aiiee ! mtu=%d is greater than R300_MAX_TEXTURE_UNITS=%d\n",
1034 mtu
, R300_MAX_TEXTURE_UNITS
);
1038 for(i
=0; i
< mtu
; i
++) {
1039 /*if( ((r300->state.render_inputs & (_TNL_BIT_TEX0<<i))!=0) != ((ctx->Texture.Unit[i].Enabled)!=0) ) {
1040 WARN_ONCE("Mismatch between render_inputs and ctx->Texture.Unit[i].Enabled value(%d vs %d).\n",
1041 ((r300->state.render_inputs & (_TNL_BIT_TEX0<<i))!=0), ((ctx->Texture.Unit[i].Enabled)!=0));
1044 if(TMU_ENABLED(ctx
, i
)) {
1045 t
=r300
->state
.texture
.unit
[i
].texobj
;
1046 //fprintf(stderr, "format=%08x\n", r300->state.texture.unit[i].format);
1049 fprintf(stderr
, "Texture unit %d enabled, but corresponding texobj is NULL, using default object.\n", i
);
1054 //fprintf(stderr, "t->format=%08x\n", t->format);
1055 if((t
->format
& 0xffffff00)==0xffffff00) {
1056 WARN_ONCE("unknown texture format (entry %x) encountered. Help me !\n", t
->format
& 0xff);
1057 //fprintf(stderr, "t->format=%08x\n", t->format);
1060 if (RADEON_DEBUG
& DEBUG_STATE
)
1061 fprintf(stderr
, "Activating texture unit %d\n", i
);
1063 r300
->hw
.txe
.cmd
[R300_TXE_ENABLE
]|=(1<<i
);
1065 r300
->hw
.tex
.filter
.cmd
[R300_TEX_VALUE_0
+i
]=gen_fixed_filter(t
->filter
) | (i
<< 28);
1066 //r300->hw.tex.unknown1.cmd[R300_TEX_VALUE_0+i]=0x0; /* move lod bias here? */
1068 /* No idea why linear filtered textures shake when puting random data */
1069 /*r300->hw.tex.unknown1.cmd[R300_TEX_VALUE_0+i]=(rand()%0xffffffff) & (~0x1fff);*/
1070 r300
->hw
.tex
.size
.cmd
[R300_TEX_VALUE_0
+i
]=t
->size
;
1071 r300
->hw
.tex
.format
.cmd
[R300_TEX_VALUE_0
+i
]=t
->format
;
1072 //fprintf(stderr, "t->format=%08x\n", t->format);
1073 r300
->hw
.tex
.offset
.cmd
[R300_TEX_VALUE_0
+i
]=t
->offset
;
1074 r300
->hw
.tex
.unknown4
.cmd
[R300_TEX_VALUE_0
+i
]=0x0;
1075 r300
->hw
.tex
.border_color
.cmd
[R300_TEX_VALUE_0
+i
]=t
->pp_border_color
;
1079 ((drm_r300_cmd_header_t
*)r300
->hw
.tex
.filter
.cmd
)->packet0
.count
= max_texture_unit
+1;
1080 ((drm_r300_cmd_header_t
*)r300
->hw
.tex
.unknown1
.cmd
)->packet0
.count
= max_texture_unit
+1;
1081 ((drm_r300_cmd_header_t
*)r300
->hw
.tex
.size
.cmd
)->packet0
.count
= max_texture_unit
+1;
1082 ((drm_r300_cmd_header_t
*)r300
->hw
.tex
.format
.cmd
)->packet0
.count
= max_texture_unit
+1;
1083 ((drm_r300_cmd_header_t
*)r300
->hw
.tex
.offset
.cmd
)->packet0
.count
= max_texture_unit
+1;
1084 ((drm_r300_cmd_header_t
*)r300
->hw
.tex
.unknown4
.cmd
)->packet0
.count
= max_texture_unit
+1;
1085 ((drm_r300_cmd_header_t
*)r300
->hw
.tex
.border_color
.cmd
)->packet0
.count
= max_texture_unit
+1;
1087 if (RADEON_DEBUG
& DEBUG_STATE
)
1088 fprintf(stderr
, "TX_ENABLE: %08x max_texture_unit=%d\n", r300
->hw
.txe
.cmd
[R300_TXE_ENABLE
], max_texture_unit
);
1091 #if USE_ARB_F_P == 1
1092 void r300_setup_rs_unit(GLcontext
*ctx
)
1094 r300ContextPtr r300
= R300_CONTEXT(ctx
);
1095 /* I'm still unsure if these are needed */
1096 GLuint interp_magic
[8] = {
1106 GLuint OutputsWritten
;
1108 int vp_reg
, fp_reg
, high_rr
;
1109 int in_texcoords
, col_interp_nr
;
1113 OutputsWritten
= CURRENT_VERTEX_SHADER(ctx
)->OutputsWritten
;
1115 OutputsWritten
= r300
->state
.render_inputs
;
1117 if (ctx
->FragmentProgram
._Current
)
1118 InputsRead
= ctx
->FragmentProgram
._Current
->InputsRead
;
1120 fprintf(stderr
, "No ctx->FragmentProgram._Current!!\n");
1121 return; /* This should only ever happen once.. */
1124 R300_STATECHANGE(r300
, ri
);
1125 R300_STATECHANGE(r300
, rc
);
1126 R300_STATECHANGE(r300
, rr
);
1128 vp_reg
= fp_reg
= in_texcoords
= col_interp_nr
= high_rr
= 0;
1129 r300
->hw
.rr
.cmd
[R300_RR_ROUTE_0
] = 0;
1130 r300
->hw
.rr
.cmd
[R300_RR_ROUTE_1
] = 0;
1132 for (i
=0;i
<ctx
->Const
.MaxTextureUnits
;i
++) {
1133 if (OutputsWritten
& (hw_tcl_on
? (1 << (VERT_RESULT_TEX0
+i
)) : (_TNL_BIT_TEX0
<<i
)))
1136 r300
->hw
.ri
.cmd
[R300_RI_INTERP_0
+i
] = 0
1137 | R300_RS_INTERP_USED
1138 | (vp_reg
<< R300_RS_INTERP_SRC_SHIFT
)
1141 if (InputsRead
& (FRAG_BIT_TEX0
<<i
)) {
1142 //assert(r300->state.texture.tc_count != 0);
1143 r300
->hw
.rr
.cmd
[R300_RR_ROUTE_0
+ fp_reg
] = 0
1144 | R300_RS_ROUTE_ENABLE
1145 | i
/* source INTERP */
1146 | (fp_reg
<< R300_RS_ROUTE_DEST_SHIFT
);
1149 if (OutputsWritten
& (hw_tcl_on
? (1 << (VERT_RESULT_TEX0
+i
)) : (_TNL_BIT_TEX0
<<i
))) {
1152 /* Unsure of how to handle this situation, for now print errors and
1153 * the program will just recieve bogus data
1155 fprintf(stderr
, "fragprog wants coords for tex%d, vp doesn't provide them!\n", i
);
1157 InputsRead
&= ~(FRAG_BIT_TEX0
<<i
);
1162 if (InputsRead
& FRAG_BIT_COL0
) {
1163 if (!(OutputsWritten
& (hw_tcl_on
? (1<<VERT_RESULT_COL0
) : _TNL_BIT_COLOR0
)))
1164 fprintf(stderr
, "fragprog wants col0, vp doesn't provide it\n");
1166 r300
->hw
.rr
.cmd
[R300_RR_ROUTE_0
] |= 0
1167 | R300_RS_ROUTE_0_COLOR
1168 | (fp_reg
++ << R300_RS_ROUTE_0_COLOR_DEST_SHIFT
);
1169 InputsRead
&= ~FRAG_BIT_COL0
;
1173 if (InputsRead
& FRAG_BIT_COL1
) {
1174 if (!(OutputsWritten
& (hw_tcl_on
? (1<<VERT_RESULT_COL1
) : _TNL_BIT_COLOR1
)))
1175 fprintf(stderr
, "fragprog wants col1, vp doesn't provide it\n");
1177 r300
->hw
.rr
.cmd
[R300_RR_ROUTE_1
] |= R300_RS_ROUTE_1_UNKNOWN11
1178 | R300_RS_ROUTE_1_COLOR1
1179 | (fp_reg
++ << R300_RS_ROUTE_1_COLOR1_DEST_SHIFT
);
1180 InputsRead
&= ~FRAG_BIT_COL1
;
1181 if (high_rr
< 1) high_rr
= 1;
1185 r300
->hw
.rc
.cmd
[1] = 0
1186 | (in_texcoords
<< R300_RS_CNTL_TC_CNT_SHIFT
)
1187 | (col_interp_nr
<< R300_RS_CNTL_CI_CNT_SHIFT
)
1188 | R300_RS_CNTL_0_UNKNOWN_18
;
1190 assert(high_rr
>= 0);
1191 r300
->hw
.rr
.cmd
[R300_RR_CMD_0
] = cmdpacket0(R300_RS_ROUTE_0
, high_rr
+1);
1192 r300
->hw
.rc
.cmd
[2] = 0xC0 | high_rr
;
1195 WARN_ONCE("Don't know how to satisfy InputsRead=0x%08x\n", InputsRead
);
1198 void r300_setup_rs_unit(GLcontext
*ctx
)
1200 r300ContextPtr r300
= R300_CONTEXT(ctx
);
1202 /* I'm still unsure if these are needed */
1203 GLuint interp_magic
[8] = {
1213 GLuint OutputsWritten
;
1216 OutputsWritten
= CURRENT_VERTEX_SHADER(ctx
)->OutputsWritten
;
1218 /* This needs to be rewritten - it is a hack at best */
1220 R300_STATECHANGE(r300
, ri
);
1221 R300_STATECHANGE(r300
, rc
);
1222 R300_STATECHANGE(r300
, rr
);
1225 r300
->hw
.rr
.cmd
[R300_RR_ROUTE_0
] = 0;
1227 for (i
=0;i
<ctx
->Const
.MaxTextureUnits
;i
++) {
1228 r300
->hw
.ri
.cmd
[R300_RI_INTERP_0
+i
] = 0
1229 | R300_RS_INTERP_USED
1230 | (cur_reg
<< R300_RS_INTERP_SRC_SHIFT
)
1232 // fprintf(stderr, "RS_INTERP[%d] = 0x%x\n", i, r300->hw.ri.cmd[R300_RI_INTERP_0+i]);
1234 if (TMU_ENABLED(ctx
, i
)) {
1235 assert(r300
->state
.texture
.tc_count
!= 0);
1236 r300
->hw
.rr
.cmd
[R300_RR_ROUTE_0
+ cur_reg
] = 0
1237 | R300_RS_ROUTE_ENABLE
1238 | i
/* source INTERP */
1239 | (cur_reg
<< R300_RS_ROUTE_DEST_SHIFT
);
1240 // fprintf(stderr, "RS_ROUTE[%d] = 0x%x\n", cur_reg, r300->hw.rr.cmd[R300_RR_ROUTE_0 + cur_reg]);
1244 if (hw_tcl_on
? OutputsWritten
& (1<<VERT_RESULT_COL0
) : r300
->state
.render_inputs
& _TNL_BIT_COLOR0
)
1245 r300
->hw
.rr
.cmd
[R300_RR_ROUTE_0
] |= 0
1246 | R300_RS_ROUTE_0_COLOR
1247 | (cur_reg
<< R300_RS_ROUTE_0_COLOR_DEST_SHIFT
);
1249 // fprintf(stderr, "ADJ_RR0 = 0x%x\n", r300->hw.rr.cmd[R300_RR_ROUTE_0]);
1251 r300
->hw
.rc
.cmd
[1] = 0
1252 | (cur_reg
/* count */ << R300_RS_CNTL_TC_CNT_SHIFT
)
1253 | (1 << R300_RS_CNTL_CI_CNT_SHIFT
)
1254 | R300_RS_CNTL_0_UNKNOWN_18
;
1256 if (r300
->state
.texture
.tc_count
> 0) {
1257 r300
->hw
.rr
.cmd
[R300_RR_CMD_0
] = cmdpacket0(R300_RS_ROUTE_0
, cur_reg
);
1258 r300
->hw
.rc
.cmd
[2] = 0xC0 | (cur_reg
-1); /* index of highest */
1260 r300
->hw
.rr
.cmd
[R300_RR_CMD_0
] = cmdpacket0(R300_RS_ROUTE_0
, 1);
1261 r300
->hw
.rc
.cmd
[2] = 0x0;
1265 // fprintf(stderr, "rendering with %d texture co-ordinate sets\n", cur_reg);
1267 #endif // USE_ARB_F_P
1269 #define vpucount(ptr) (((drm_r300_cmd_header_t*)(ptr))->vpu.count)
1271 #define bump_vpu_count(ptr, new_count) do{\
1272 drm_r300_cmd_header_t* _p=((drm_r300_cmd_header_t*)(ptr));\
1273 int _nc=(new_count)/4; \
1274 if(_nc>_p->vpu.count)_p->vpu.count=_nc;\
1277 void static inline setup_vertex_shader_fragment(r300ContextPtr r300
, int dest
, struct r300_vertex_shader_fragment
*vsf
)
1281 if(vsf
->length
==0)return;
1283 if(vsf
->length
& 0x3){
1284 fprintf(stderr
,"VERTEX_SHADER_FRAGMENT must have length divisible by 4\n");
1288 switch((dest
>>8) & 0xf){
1290 R300_STATECHANGE(r300
, vpi
);
1291 for(i
=0;i
<vsf
->length
;i
++)
1292 r300
->hw
.vpi
.cmd
[R300_VPI_INSTR_0
+i
+4*(dest
& 0xff)]=(vsf
->body
.d
[i
]);
1293 bump_vpu_count(r300
->hw
.vpi
.cmd
, vsf
->length
+4*(dest
& 0xff));
1297 R300_STATECHANGE(r300
, vpp
);
1298 for(i
=0;i
<vsf
->length
;i
++)
1299 r300
->hw
.vpp
.cmd
[R300_VPP_PARAM_0
+i
+4*(dest
& 0xff)]=(vsf
->body
.d
[i
]);
1300 bump_vpu_count(r300
->hw
.vpp
.cmd
, vsf
->length
+4*(dest
& 0xff));
1303 R300_STATECHANGE(r300
, vps
);
1304 for(i
=0;i
<vsf
->length
;i
++)
1305 r300
->hw
.vps
.cmd
[1+i
+4*(dest
& 0xff)]=(vsf
->body
.d
[i
]);
1306 bump_vpu_count(r300
->hw
.vps
.cmd
, vsf
->length
+4*(dest
& 0xff));
1309 fprintf(stderr
, "%s:%s don't know how to handle dest %04x\n", __FILE__
, __FUNCTION__
, dest
);
1314 void r300SetupVertexProgram(r300ContextPtr rmesa
);
1316 /* just a skeleton for now.. */
1318 /* Generate a vertex shader that simply transforms vertex and texture coordinates,
1319 while leaving colors intact. Nothing fancy (like lights)
1321 If implementing lights make a copy first, so it is easy to switch between the two versions */
1322 static void r300GenerateSimpleVertexShader(r300ContextPtr r300
)
1327 /* Allocate parameters */
1328 r300
->state
.vap_param
.transform_offset
=0x0; /* transform matrix */
1329 r300
->state
.vertex_shader
.param_offset
=0x0;
1330 r300
->state
.vertex_shader
.param_count
=0x4; /* 4 vector values - 4x4 matrix */
1332 r300
->state
.vertex_shader
.program_start
=0x0;
1333 r300
->state
.vertex_shader
.unknown_ptr1
=0x4; /* magic value ? */
1334 r300
->state
.vertex_shader
.program_end
=0x0;
1336 r300
->state
.vertex_shader
.unknown_ptr2
=0x0; /* magic value */
1337 r300
->state
.vertex_shader
.unknown_ptr3
=0x4; /* magic value */
1339 /* Initialize matrix and vector parameters.. these should really be restructured */
1340 /* TODO: fix vertex_shader structure */
1341 r300
->state
.vertex_shader
.matrix
[0].length
=16;
1342 r300
->state
.vertex_shader
.matrix
[1].length
=0;
1343 r300
->state
.vertex_shader
.matrix
[2].length
=0;
1344 r300
->state
.vertex_shader
.vector
[0].length
=0;
1345 r300
->state
.vertex_shader
.vector
[1].length
=0;
1346 r300
->state
.vertex_shader
.unknown1
.length
=0;
1347 r300
->state
.vertex_shader
.unknown2
.length
=0;
1349 #define WRITE_OP(oper,source1,source2,source3) {\
1350 r300->state.vertex_shader.program.body.i[r300->state.vertex_shader.program_end].op=(oper); \
1351 r300->state.vertex_shader.program.body.i[r300->state.vertex_shader.program_end].src1=(source1); \
1352 r300->state.vertex_shader.program.body.i[r300->state.vertex_shader.program_end].src2=(source2); \
1353 r300->state.vertex_shader.program.body.i[r300->state.vertex_shader.program_end].src3=(source3); \
1354 r300->state.vertex_shader.program_end++; \
1357 /* Multiply vertex coordinates with transform matrix */
1360 EASY_VSF_OP(MUL
, 0, ALL
, TMP
),
1363 EASY_VSF_SOURCE(0, W
, W
, W
, W
, NONE
, NONE
)
1367 EASY_VSF_OP(MUL
, 1, ALL
, RESULT
),
1374 EASY_VSF_OP(MAD
, 0, ALL
, TMP
),
1381 EASY_VSF_OP(MAD
, 0, ALL
, TMP
),
1388 EASY_VSF_OP(MAD
, 0, ALL
, RESULT
),
1395 if (r300
->state
.render_inputs
& _TNL_BIT_COLOR1
) {
1397 EASY_VSF_OP(MUL
, o_reg
++, ALL
, RESULT
),
1398 VSF_REG(r300
->state
.vap_reg
.i_color
[1]),
1399 VSF_ATTR_UNITY(r300
->state
.vap_reg
.i_color
[1]),
1400 VSF_UNITY(r300
->state
.vap_reg
.i_color
[1])
1404 /* Pass through texture coordinates, if any */
1405 for(i
=0;i
< r300
->radeon
.glCtx
->Const
.MaxTextureUnits
;i
++)
1406 if(r300
->state
.render_inputs
& (_TNL_BIT_TEX0
<<i
)){
1407 // fprintf(stderr, "i_tex[%d]=%d\n", i, r300->state.vap_reg.i_tex[i]);
1409 EASY_VSF_OP(MUL
, o_reg
++ /* 2+i */, ALL
, RESULT
),
1410 VSF_REG(r300
->state
.vap_reg
.i_tex
[i
]),
1411 VSF_ATTR_UNITY(r300
->state
.vap_reg
.i_tex
[i
]),
1412 VSF_UNITY(r300
->state
.vap_reg
.i_tex
[i
])
1416 r300
->state
.vertex_shader
.program_end
--; /* r300 wants program length to be one more - no idea why */
1417 r300
->state
.vertex_shader
.program
.length
=(r300
->state
.vertex_shader
.program_end
+1)*4;
1419 r300
->state
.vertex_shader
.unknown_ptr1
=r300
->state
.vertex_shader
.program_end
; /* magic value ? */
1420 r300
->state
.vertex_shader
.unknown_ptr2
=r300
->state
.vertex_shader
.program_end
; /* magic value ? */
1421 r300
->state
.vertex_shader
.unknown_ptr3
=r300
->state
.vertex_shader
.program_end
; /* magic value ? */
1426 void r300SetupVertexShader(r300ContextPtr rmesa
)
1428 GLcontext
* ctx
= rmesa
->radeon
.glCtx
;
1430 /* Reset state, in case we don't use something */
1431 ((drm_r300_cmd_header_t
*)rmesa
->hw
.vpp
.cmd
)->vpu
.count
= 0;
1432 ((drm_r300_cmd_header_t
*)rmesa
->hw
.vpi
.cmd
)->vpu
.count
= 0;
1433 ((drm_r300_cmd_header_t
*)rmesa
->hw
.vps
.cmd
)->vpu
.count
= 0;
1435 /* Not sure why this doesnt work...
1436 0x400 area might have something to do with pixel shaders as it appears right after pfs programming.
1437 0x406 is set to { 0.0, 0.0, 1.0, 0.0 } most of the time but should change with smooth points and in other rare cases. */
1438 //setup_vertex_shader_fragment(rmesa, 0x406, &unk4);
1439 if(hw_tcl_on
&& ((struct r300_vertex_program
*)CURRENT_VERTEX_SHADER(ctx
))->translated
){
1440 r300SetupVertexProgram(rmesa
);
1444 /* This needs to be replaced by vertex shader generation code */
1448 /* textures enabled ? */
1449 if(rmesa
->state
.texture
.tc_count
>0){
1450 rmesa
->state
.vertex_shader
=SINGLE_TEXTURE_VERTEX_SHADER
;
1452 rmesa
->state
.vertex_shader
=FLAT_COLOR_VERTEX_SHADER
;
1456 r300GenerateSimpleVertexShader(rmesa
);
1458 rmesa
->state
.vertex_shader
.matrix
[0].length
=16;
1459 memcpy(rmesa
->state
.vertex_shader
.matrix
[0].body
.f
, ctx
->_ModelProjectMatrix
.m
, 16*4);
1461 setup_vertex_shader_fragment(rmesa
, VSF_DEST_PROGRAM
, &(rmesa
->state
.vertex_shader
.program
));
1463 setup_vertex_shader_fragment(rmesa
, VSF_DEST_MATRIX0
, &(rmesa
->state
.vertex_shader
.matrix
[0]));
1465 setup_vertex_shader_fragment(rmesa
, VSF_DEST_MATRIX1
, &(rmesa
->state
.vertex_shader
.matrix
[0]));
1466 setup_vertex_shader_fragment(rmesa
, VSF_DEST_MATRIX2
, &(rmesa
->state
.vertex_shader
.matrix
[0]));
1468 setup_vertex_shader_fragment(rmesa
, VSF_DEST_VECTOR0
, &(rmesa
->state
.vertex_shader
.vector
[0]));
1469 setup_vertex_shader_fragment(rmesa
, VSF_DEST_VECTOR1
, &(rmesa
->state
.vertex_shader
.vector
[1]));
1473 setup_vertex_shader_fragment(rmesa
, VSF_DEST_UNKNOWN1
, &(rmesa
->state
.vertex_shader
.unknown1
));
1474 setup_vertex_shader_fragment(rmesa
, VSF_DEST_UNKNOWN2
, &(rmesa
->state
.vertex_shader
.unknown2
));
1477 R300_STATECHANGE(rmesa
, pvs
);
1478 rmesa
->hw
.pvs
.cmd
[R300_PVS_CNTL_1
]=(rmesa
->state
.vertex_shader
.program_start
<< R300_PVS_CNTL_1_PROGRAM_START_SHIFT
)
1479 | (rmesa
->state
.vertex_shader
.unknown_ptr1
<< R300_PVS_CNTL_1_POS_END_SHIFT
)
1480 | (rmesa
->state
.vertex_shader
.program_end
<< R300_PVS_CNTL_1_PROGRAM_END_SHIFT
);
1481 rmesa
->hw
.pvs
.cmd
[R300_PVS_CNTL_2
]=(rmesa
->state
.vertex_shader
.param_offset
<< R300_PVS_CNTL_2_PARAM_OFFSET_SHIFT
)
1482 | (rmesa
->state
.vertex_shader
.param_count
<< R300_PVS_CNTL_2_PARAM_COUNT_SHIFT
);
1483 rmesa
->hw
.pvs
.cmd
[R300_PVS_CNTL_3
]=(rmesa
->state
.vertex_shader
.unknown_ptr2
<< R300_PVS_CNTL_3_PROGRAM_UNKNOWN_SHIFT
)
1484 | (rmesa
->state
.vertex_shader
.unknown_ptr3
<< 0);
1486 /* This is done for vertex shader fragments, but also needs to be done for vap_pvs,
1487 so I leave it as a reminder */
1489 reg_start(R300_VAP_PVS_WAITIDLE
,0);
1494 void r300SetupVertexProgram(r300ContextPtr rmesa
)
1496 GLcontext
* ctx
= rmesa
->radeon
.glCtx
;
1499 struct r300_vertex_program
*prog
=(struct r300_vertex_program
*)CURRENT_VERTEX_SHADER(ctx
);
1502 ((drm_r300_cmd_header_t
*)rmesa
->hw
.vpp
.cmd
)->vpu
.count
= 0;
1503 R300_STATECHANGE(rmesa
, vpp
);
1504 param_count
= r300VertexProgUpdateParams(ctx
, prog
, (float *)&rmesa
->hw
.vpp
.cmd
[R300_VPP_PARAM_0
]);
1505 bump_vpu_count(rmesa
->hw
.vpp
.cmd
, param_count
);
1508 /* Reset state, in case we don't use something */
1509 ((drm_r300_cmd_header_t
*)rmesa
->hw
.vpi
.cmd
)->vpu
.count
= 0;
1510 ((drm_r300_cmd_header_t
*)rmesa
->hw
.vps
.cmd
)->vpu
.count
= 0;
1512 setup_vertex_shader_fragment(rmesa
, VSF_DEST_PROGRAM
, &(prog
->program
));
1515 setup_vertex_shader_fragment(rmesa
, VSF_DEST_UNKNOWN1
, &(rmesa
->state
.vertex_shader
.unknown1
));
1516 setup_vertex_shader_fragment(rmesa
, VSF_DEST_UNKNOWN2
, &(rmesa
->state
.vertex_shader
.unknown2
));
1519 inst_count
=prog
->program
.length
/4 - 1;
1521 R300_STATECHANGE(rmesa
, pvs
);
1522 rmesa
->hw
.pvs
.cmd
[R300_PVS_CNTL_1
]=(0 << R300_PVS_CNTL_1_PROGRAM_START_SHIFT
)
1523 | (inst_count
/*pos_end*/ << R300_PVS_CNTL_1_POS_END_SHIFT
)
1524 | (inst_count
<< R300_PVS_CNTL_1_PROGRAM_END_SHIFT
);
1525 rmesa
->hw
.pvs
.cmd
[R300_PVS_CNTL_2
]=(0 << R300_PVS_CNTL_2_PARAM_OFFSET_SHIFT
)
1526 | (param_count
<< R300_PVS_CNTL_2_PARAM_COUNT_SHIFT
);
1527 rmesa
->hw
.pvs
.cmd
[R300_PVS_CNTL_3
]=(0/*rmesa->state.vertex_shader.unknown_ptr2*/ << R300_PVS_CNTL_3_PROGRAM_UNKNOWN_SHIFT
)
1528 | (inst_count
/*rmesa->state.vertex_shader.unknown_ptr3*/ << 0);
1530 /* This is done for vertex shader fragments, but also needs to be done for vap_pvs,
1531 so I leave it as a reminder */
1533 reg_start(R300_VAP_PVS_WAITIDLE
,0);
1538 extern void _tnl_UpdateFixedFunctionProgram( GLcontext
*ctx
);
1540 extern int future_hw_tcl_on
;
1541 void r300UpdateShaders(r300ContextPtr rmesa
)
1544 struct r300_vertex_program
*vp
;
1546 ctx
= rmesa
->radeon
.glCtx
;
1548 if (rmesa
->NewGLState
&& hw_tcl_on
) {
1549 rmesa
->NewGLState
= 0;
1550 if (ctx
->VertexProgram
._Enabled
== GL_FALSE
)
1551 _tnl_UpdateFixedFunctionProgram(ctx
);
1553 vp
= (struct r300_vertex_program
*)CURRENT_VERTEX_SHADER(ctx
);
1554 if (vp
->translated
== GL_FALSE
)
1555 translate_vertex_shader(vp
);
1556 if (vp
->translated
== GL_FALSE
) {
1557 fprintf(stderr
, "Failing back to sw-tcl\n");
1558 debug_vp(ctx
, &vp
->mesa_program
);
1559 hw_tcl_on
= future_hw_tcl_on
= 0;
1560 r300ResetHwState(rmesa
);
1568 void r300UpdateShaderStates(r300ContextPtr rmesa
)
1571 ctx
= rmesa
->radeon
.glCtx
;
1574 r300UpdateTextureState(ctx
);
1577 r300_setup_textures(ctx
);
1578 r300_setup_rs_unit(ctx
);
1580 r300SetupVertexShader(rmesa
);
1581 r300SetupPixelShader(rmesa
);
1584 /* This is probably wrong for some values, I need to test this
1585 * some more. Range checking would be a good idea also..
1587 * But it works for most things. I'll fix it later if someone
1588 * else with a better clue doesn't
1590 static unsigned int r300PackFloat24(float f
)
1594 unsigned int float24
= 0;
1596 if (f
== 0.0) return 0;
1598 mantissa
= frexpf(f
, &exponent
);
1603 mantissa
= mantissa
* -1.0;
1605 /* Handle exponent, bias of 63 */
1607 float24
|= (exponent
<< 16);
1608 /* Kill 7 LSB of mantissa */
1609 float24
|= (r300PackFloat32(mantissa
) & 0x7FFFFF) >> 7;
1614 #if USE_ARB_F_P == 1
1615 void r300SetupPixelShader(r300ContextPtr rmesa
)
1617 GLcontext
*ctx
= rmesa
->radeon
.glCtx
;
1618 struct r300_fragment_program
*rp
=
1619 (struct r300_fragment_program
*)ctx
->FragmentProgram
._Current
;
1622 if (!rp
) /* should only happenen once, just after context is created */
1625 translate_fragment_shader(rp
);
1626 if (!rp
->translated
) {
1627 fprintf(stderr
, "%s: No valid fragment shader, exiting\n", __func__
);
1631 R300_STATECHANGE(rmesa
, fpt
);
1632 for(i
=0;i
<rp
->tex
.length
;i
++)
1633 rmesa
->hw
.fpt
.cmd
[R300_FPT_INSTR_0
+i
]=rp
->tex
.inst
[i
];
1634 rmesa
->hw
.fpt
.cmd
[R300_FPT_CMD_0
]=cmdpacket0(R300_PFS_TEXI_0
, rp
->tex
.length
);
1636 #define OUTPUT_FIELD(st, reg, field) \
1637 R300_STATECHANGE(rmesa, st); \
1638 for(i=0;i<=rp->alu_end;i++) \
1639 rmesa->hw.st.cmd[R300_FPI_INSTR_0+i]=rp->alu.inst[i].field;\
1640 rmesa->hw.st.cmd[R300_FPI_CMD_0]=cmdpacket0(reg, rp->alu_end+1);
1642 OUTPUT_FIELD(fpi
[0], R300_PFS_INSTR0_0
, inst0
);
1643 OUTPUT_FIELD(fpi
[1], R300_PFS_INSTR1_0
, inst1
);
1644 OUTPUT_FIELD(fpi
[2], R300_PFS_INSTR2_0
, inst2
);
1645 OUTPUT_FIELD(fpi
[3], R300_PFS_INSTR3_0
, inst3
);
1648 R300_STATECHANGE(rmesa
, fp
);
1649 /* I just want to say, the way these nodes are stored.. weird.. */
1650 for (i
=0,k
=(4-(rp
->cur_node
+1));i
<4;i
++,k
++) {
1651 if (i
<(rp
->cur_node
+1)) {
1652 rmesa
->hw
.fp
.cmd
[R300_FP_NODE0
+k
]=
1653 (rp
->node
[i
].alu_offset
<< R300_PFS_NODE_ALU_OFFSET_SHIFT
)
1654 | (rp
->node
[i
].alu_end
<< R300_PFS_NODE_ALU_END_SHIFT
)
1655 | (rp
->node
[i
].tex_offset
<< R300_PFS_NODE_TEX_OFFSET_SHIFT
)
1656 | (rp
->node
[i
].tex_end
<< R300_PFS_NODE_TEX_END_SHIFT
)
1657 | ( (k
==3) ? R300_PFS_NODE_LAST_NODE
: 0);
1659 rmesa
->hw
.fp
.cmd
[R300_FP_NODE0
+(3-i
)] = 0;
1664 rmesa
->hw
.fp
.cmd
[R300_FP_CNTL0
]=
1666 | (rp
->first_node_has_tex
<<3);
1668 rmesa
->hw
.fp
.cmd
[R300_FP_CNTL1
]=rp
->max_temp_idx
;
1670 rmesa
->hw
.fp
.cmd
[R300_FP_CNTL2
]=
1671 (rp
->alu_offset
<< R300_PFS_CNTL_ALU_OFFSET_SHIFT
)
1672 | (rp
->alu_end
<< R300_PFS_CNTL_ALU_END_SHIFT
)
1673 | (rp
->tex_offset
<< R300_PFS_CNTL_TEX_OFFSET_SHIFT
)
1674 | (rp
->tex_end
<< R300_PFS_CNTL_TEX_END_SHIFT
);
1676 R300_STATECHANGE(rmesa
, fpp
);
1677 for(i
=0;i
<rp
->const_nr
;i
++){
1678 rmesa
->hw
.fpp
.cmd
[R300_FPP_PARAM_0
+4*i
+0]=r300PackFloat24(rp
->constant
[i
][0]);
1679 rmesa
->hw
.fpp
.cmd
[R300_FPP_PARAM_0
+4*i
+1]=r300PackFloat24(rp
->constant
[i
][1]);
1680 rmesa
->hw
.fpp
.cmd
[R300_FPP_PARAM_0
+4*i
+2]=r300PackFloat24(rp
->constant
[i
][2]);
1681 rmesa
->hw
.fpp
.cmd
[R300_FPP_PARAM_0
+4*i
+3]=r300PackFloat24(rp
->constant
[i
][3]);
1683 rmesa
->hw
.fpp
.cmd
[R300_FPP_CMD_0
]=cmdpacket0(R300_PFS_PARAM_0_X
, rp
->const_nr
*4);
1686 /* just a skeleton for now.. */
1687 void r300GenerateTexturePixelShader(r300ContextPtr r300
)
1690 mtu
= r300
->radeon
.glCtx
->Const
.MaxTextureUnits
;
1692 GLuint OutputsWritten
= CURRENT_VERTEX_SHADER(r300
->radeon
.glCtx
)->OutputsWritten
;
1694 int tex_inst
=0, alu_inst
=0;
1697 /* No need to proliferate {} */
1698 if(!TMU_ENABLED(r300
->radeon
.glCtx
, i
))continue;
1700 envMode
= r300
->radeon
.glCtx
->Texture
.Unit
[i
].EnvMode
;
1701 //fprintf(stderr, "envMode=%s\n", _mesa_lookup_enum_by_nr(envMode));
1703 /* Fetch textured pixel */
1705 r300
->state
.pixel_shader
.program
.tex
.inst
[tex_inst
]=0x00018000;
1708 switch(r300
->radeon
.glCtx
->Texture
.Unit
[i
]._CurrentCombine
->ModeRGB
){
1710 WARN_ONCE("ModeA==GL_REPLACE is possibly broken.\n");
1711 r300
->state
.pixel_shader
.program
.alu
.inst
[alu_inst
].inst0
=
1712 EASY_PFS_INSTR0(MAD
, SRC0C_XYZ
, ONE
, ZERO
);
1714 r300
->state
.pixel_shader
.program
.alu
.inst
[alu_inst
].inst1
=
1715 EASY_PFS_INSTR1(0, 0, 0 | PFS_FLAG_CONST
, 0 | PFS_FLAG_CONST
, NONE
, ALL
);
1718 WARN_ONCE("ModeRGB==GL_MODULATE is possibly broken.\n");
1719 r300
->state
.pixel_shader
.program
.alu
.inst
[alu_inst
].inst0
=
1720 EASY_PFS_INSTR0(MAD
, SRC0C_XYZ
, SRC1C_XYZ
, ZERO
);
1722 r300
->state
.pixel_shader
.program
.alu
.inst
[alu_inst
].inst1
=
1723 EASY_PFS_INSTR1(0, 0, 1, 0 | PFS_FLAG_CONST
, NONE
, ALL
);
1727 WARN_ONCE("ModeRGB=%s is not implemented yet !\n",
1728 _mesa_lookup_enum_by_nr(r300
->radeon
.glCtx
->Texture
.Unit
[i
]._CurrentCombine
->ModeRGB
));
1730 r300
->state
.pixel_shader
.program
.alu
.inst
[alu_inst
].inst0
=
1731 EASY_PFS_INSTR0(MAD
, SRC0C_XYZ
, ONE
, ZERO
);
1733 r300
->state
.pixel_shader
.program
.alu
.inst
[alu_inst
].inst1
=
1734 EASY_PFS_INSTR1(0, 0, 0 | PFS_FLAG_CONST
, 0 | PFS_FLAG_CONST
, NONE
, ALL
);
1736 switch(r300
->radeon
.glCtx
->Texture
.Unit
[i
]._CurrentCombine
->ModeA
){
1738 WARN_ONCE("ModeA==GL_REPLACE is possibly broken.\n");
1739 r300
->state
.pixel_shader
.program
.alu
.inst
[alu_inst
].inst2
=
1740 EASY_PFS_INSTR2(MAD
, SRC0A
, ONE
, ZERO
);
1742 r300
->state
.pixel_shader
.program
.alu
.inst
[alu_inst
].inst3
=
1743 EASY_PFS_INSTR3(0, 0, 0| PFS_FLAG_CONST
, 0 | PFS_FLAG_CONST
, OUTPUT
);
1746 fprintf(stderr
, "numArgsA=%d sourceA[0]=%s op=%d\n",
1747 r300
->radeon
.glCtx
->Texture
.Unit
[i
]._CurrentCombine
->_NumArgsA
,
1748 _mesa_lookup_enum_by_nr(r300
->radeon
.glCtx
->Texture
.Unit
[i
]._CurrentCombine
->SourceA
[0]),
1749 r300
->radeon
.glCtx
->Texture
.Unit
[i
]._CurrentCombine
->OperandA
[0]-GL_SRC_ALPHA
);
1753 WARN_ONCE("ModeA==GL_MODULATE is possibly broken.\n");
1755 r300
->state
.pixel_shader
.program
.alu
.inst
[alu_inst
].inst2
=
1756 EASY_PFS_INSTR2(MAD
, SRC0A
, SRC1A
, ZERO
);
1758 r300
->state
.pixel_shader
.program
.alu
.inst
[alu_inst
].inst3
=
1759 EASY_PFS_INSTR3(0, 0, 1, 0 | PFS_FLAG_CONST
, OUTPUT
);
1763 WARN_ONCE("ModeA=%s is not implemented yet !\n",
1764 _mesa_lookup_enum_by_nr(r300
->radeon
.glCtx
->Texture
.Unit
[i
]._CurrentCombine
->ModeA
));
1766 r300
->state
.pixel_shader
.program
.alu
.inst
[alu_inst
].inst2
=
1767 EASY_PFS_INSTR2(MAD
, SRC0A
, ONE
, ZERO
);
1769 r300
->state
.pixel_shader
.program
.alu
.inst
[alu_inst
].inst3
=
1770 EASY_PFS_INSTR3(0, 0, 0 | PFS_FLAG_CONST
, 0 | PFS_FLAG_CONST
, OUTPUT
);
1777 r300
->state
.pixel_shader
.program
.tex
.length
=tex_inst
;
1778 r300
->state
.pixel_shader
.program
.tex_offset
=0;
1779 r300
->state
.pixel_shader
.program
.tex_end
=tex_inst
-1;
1782 /* saturate last instruction, like i915 driver does */
1783 r300
->state
.pixel_shader
.program
.alu
.inst
[alu_inst
-1].inst0
|=R300_FPI0_OUTC_SAT
;
1784 r300
->state
.pixel_shader
.program
.alu
.inst
[alu_inst
-1].inst2
|=R300_FPI2_OUTA_SAT
;
1787 r300
->state
.pixel_shader
.program
.alu
.length
=alu_inst
;
1788 r300
->state
.pixel_shader
.program
.alu_offset
=0;
1789 r300
->state
.pixel_shader
.program
.alu_end
=alu_inst
-1;
1792 void r300SetupPixelShader(r300ContextPtr rmesa
)
1796 /* This needs to be replaced by pixel shader generation code */
1798 /* textures enabled ? */
1799 if(rmesa
->state
.texture
.tc_count
>0){
1801 r300GenerateTextureFragmentShader(rmesa
);
1803 rmesa
->state
.pixel_shader
=SINGLE_TEXTURE_PIXEL_SHADER
;
1804 r300GenerateTexturePixelShader(rmesa
);
1807 rmesa
->state
.pixel_shader
=FLAT_COLOR_PIXEL_SHADER
;
1810 R300_STATECHANGE(rmesa
, fpt
);
1811 for(i
=0;i
<rmesa
->state
.pixel_shader
.program
.tex
.length
;i
++)
1812 rmesa
->hw
.fpt
.cmd
[R300_FPT_INSTR_0
+i
]=rmesa
->state
.pixel_shader
.program
.tex
.inst
[i
];
1813 rmesa
->hw
.fpt
.cmd
[R300_FPT_CMD_0
]=cmdpacket0(R300_PFS_TEXI_0
, rmesa
->state
.pixel_shader
.program
.tex
.length
);
1815 #define OUTPUT_FIELD(st, reg, field) \
1816 R300_STATECHANGE(rmesa, st); \
1817 for(i=0;i<rmesa->state.pixel_shader.program.alu.length;i++) \
1818 rmesa->hw.st.cmd[R300_FPI_INSTR_0+i]=rmesa->state.pixel_shader.program.alu.inst[i].field;\
1819 rmesa->hw.st.cmd[R300_FPI_CMD_0]=cmdpacket0(reg, rmesa->state.pixel_shader.program.alu.length);
1821 OUTPUT_FIELD(fpi
[0], R300_PFS_INSTR0_0
, inst0
);
1822 OUTPUT_FIELD(fpi
[1], R300_PFS_INSTR1_0
, inst1
);
1823 OUTPUT_FIELD(fpi
[2], R300_PFS_INSTR2_0
, inst2
);
1824 OUTPUT_FIELD(fpi
[3], R300_PFS_INSTR3_0
, inst3
);
1827 R300_STATECHANGE(rmesa
, fp
);
1829 rmesa
->hw
.fp
.cmd
[R300_FP_NODE0
+i
]=
1830 (rmesa
->state
.pixel_shader
.program
.node
[i
].alu_offset
<< R300_PFS_NODE_ALU_OFFSET_SHIFT
)
1831 | (rmesa
->state
.pixel_shader
.program
.node
[i
].alu_end
<< R300_PFS_NODE_ALU_END_SHIFT
)
1832 | (rmesa
->state
.pixel_shader
.program
.node
[i
].tex_offset
<< R300_PFS_NODE_TEX_OFFSET_SHIFT
)
1833 | (rmesa
->state
.pixel_shader
.program
.node
[i
].tex_end
<< R300_PFS_NODE_TEX_END_SHIFT
)
1834 | ( (i
==3) ? R300_PFS_NODE_LAST_NODE
: 0);
1838 rmesa
->hw
.fp
.cmd
[R300_FP_CNTL0
]=
1839 (rmesa
->state
.pixel_shader
.program
.active_nodes
-1)
1840 | (rmesa
->state
.pixel_shader
.program
.first_node_has_tex
<<3);
1842 rmesa
->hw
.fp
.cmd
[R300_FP_CNTL1
]=rmesa
->state
.pixel_shader
.program
.temp_register_count
;
1844 rmesa
->hw
.fp
.cmd
[R300_FP_CNTL2
]=
1845 (rmesa
->state
.pixel_shader
.program
.alu_offset
<< R300_PFS_CNTL_ALU_OFFSET_SHIFT
)
1846 | (rmesa
->state
.pixel_shader
.program
.alu_end
<< R300_PFS_CNTL_ALU_END_SHIFT
)
1847 | (rmesa
->state
.pixel_shader
.program
.tex_offset
<< R300_PFS_CNTL_TEX_OFFSET_SHIFT
)
1848 | (rmesa
->state
.pixel_shader
.program
.tex_end
<< R300_PFS_CNTL_TEX_END_SHIFT
);
1850 R300_STATECHANGE(rmesa
, fpp
);
1851 for(i
=0;i
<rmesa
->state
.pixel_shader
.param_length
;i
++){
1852 rmesa
->hw
.fpp
.cmd
[R300_FPP_PARAM_0
+4*i
+0]=r300PackFloat32(rmesa
->state
.pixel_shader
.param
[i
].x
);
1853 rmesa
->hw
.fpp
.cmd
[R300_FPP_PARAM_0
+4*i
+1]=r300PackFloat32(rmesa
->state
.pixel_shader
.param
[i
].y
);
1854 rmesa
->hw
.fpp
.cmd
[R300_FPP_PARAM_0
+4*i
+2]=r300PackFloat32(rmesa
->state
.pixel_shader
.param
[i
].z
);
1855 rmesa
->hw
.fpp
.cmd
[R300_FPP_PARAM_0
+4*i
+3]=r300PackFloat32(rmesa
->state
.pixel_shader
.param
[i
].w
);
1857 rmesa
->hw
.fpp
.cmd
[R300_FPP_CMD_0
]=cmdpacket0(R300_PFS_PARAM_0_X
, rmesa
->state
.pixel_shader
.param_length
);
1863 * Called by Mesa after an internal state update.
1865 static void r300InvalidateState(GLcontext
* ctx
, GLuint new_state
)
1867 r300ContextPtr r300
= R300_CONTEXT(ctx
);
1869 _swrast_InvalidateState(ctx
, new_state
);
1870 _swsetup_InvalidateState(ctx
, new_state
);
1871 _ac_InvalidateState(ctx
, new_state
);
1872 _tnl_InvalidateState(ctx
, new_state
);
1873 _ae_invalidate_state(ctx
, new_state
);
1876 /* Go inefficiency! */
1877 r300ResetHwState(r300
);
1880 if(new_state
& _NEW_ARRAY
)
1881 r300
->state
.VB
.lock_uptodate
= GL_FALSE
;
1883 r300
->NewGLState
|= new_state
;
1887 * Completely recalculates hardware state based on the Mesa state.
1889 void r300ResetHwState(r300ContextPtr r300
)
1891 GLcontext
* ctx
= r300
->radeon
.glCtx
;
1893 if (RADEON_DEBUG
& DEBUG_STATE
)
1894 fprintf(stderr
, "%s\n", __FUNCTION__
);
1896 /* This is a place to initialize registers which
1897 have bitfields accessed by different functions
1898 and not all bits are used */
1900 /* initialize similiar to r200 */
1901 r300
->hw
.zs
.cmd
[R300_ZS_CNTL_0
] = 0;
1902 r300
->hw
.zs
.cmd
[R300_ZS_CNTL_1
] =
1903 (R300_ZS_ALWAYS
<< R300_RB3D_ZS1_FRONT_FUNC_SHIFT
) |
1904 (R300_ZS_KEEP
<< R300_RB3D_ZS1_FRONT_FAIL_OP_SHIFT
) |
1905 (R300_ZS_KEEP
<< R300_RB3D_ZS1_FRONT_ZPASS_OP_SHIFT
) |
1906 (R300_ZS_KEEP
<< R300_RB3D_ZS1_FRONT_ZFAIL_OP_SHIFT
) |
1907 (R300_ZS_ALWAYS
<< R300_RB3D_ZS1_BACK_FUNC_SHIFT
) |
1908 (R300_ZS_KEEP
<< R300_RB3D_ZS1_BACK_FAIL_OP_SHIFT
) |
1909 (R300_ZS_KEEP
<< R300_RB3D_ZS1_BACK_ZPASS_OP_SHIFT
) |
1910 (R300_ZS_KEEP
<< R300_RB3D_ZS1_BACK_ZFAIL_OP_SHIFT
);
1911 r300
->hw
.zs
.cmd
[R300_ZS_CNTL_2
] = 0x00ffff00;
1914 /* go and compute register values from GL state */
1916 r300UpdateWindow(ctx
);
1919 ctx
->Color
.ColorMask
[RCOMP
],
1920 ctx
->Color
.ColorMask
[GCOMP
],
1921 ctx
->Color
.ColorMask
[BCOMP
],
1922 ctx
->Color
.ColorMask
[ACOMP
]);
1924 r300Enable(ctx
, GL_DEPTH_TEST
, ctx
->Depth
.Test
);
1925 r300DepthMask(ctx
, ctx
->Depth
.Mask
);
1926 r300DepthFunc(ctx
, ctx
->Depth
.Func
);
1929 r300Enable(ctx
, GL_STENCIL_TEST
, ctx
->Stencil
.Enabled
);
1930 r300StencilMaskSeparate(ctx
, 0, ctx
->Stencil
.WriteMask
[0]);
1931 r300StencilFuncSeparate(ctx
, 0, ctx
->Stencil
.Function
[0], ctx
->Stencil
.Ref
[0], ctx
->Stencil
.ValueMask
[0]);
1932 r300StencilOpSeparate(ctx
, 0, ctx
->Stencil
.FailFunc
[0], ctx
->Stencil
.ZFailFunc
[0], ctx
->Stencil
.ZPassFunc
[0]);
1934 r300UpdateCulling(ctx
);
1936 r300UpdateTextureState(ctx
);
1938 // r300_setup_routing(ctx, GL_TRUE);
1939 if(hw_tcl_on
== GL_FALSE
){
1940 r300EmitArrays(ctx
, GL_TRUE
); /* Just do the routing */
1941 r300_setup_textures(ctx
);
1942 r300_setup_rs_unit(ctx
);
1944 r300SetupVertexShader(r300
);
1945 r300SetupPixelShader(r300
);
1948 r300_set_blend_state(ctx
);
1950 r300AlphaFunc(ctx
, ctx
->Color
.AlphaFunc
, ctx
->Color
.AlphaRef
);
1951 r300Enable(ctx
, GL_ALPHA_TEST
, ctx
->Color
.AlphaEnabled
);
1953 /* Initialize magic registers
1954 TODO : learn what they really do, or get rid of
1955 those we don't have to touch */
1956 r300
->hw
.unk2080
.cmd
[1] = 0x0030045A; /* Dangerous */
1958 r300
->hw
.vte
.cmd
[1] = R300_VPORT_X_SCALE_ENA
1959 | R300_VPORT_X_OFFSET_ENA
1960 | R300_VPORT_Y_SCALE_ENA
1961 | R300_VPORT_Y_OFFSET_ENA
1962 | R300_VPORT_Z_SCALE_ENA
1963 | R300_VPORT_Z_OFFSET_ENA
1965 r300
->hw
.vte
.cmd
[2] = 0x00000008;
1967 r300
->hw
.unk2134
.cmd
[1] = 0x00FFFFFF;
1968 r300
->hw
.unk2134
.cmd
[2] = 0x00000000;
1969 #ifdef MESA_BIG_ENDIAN
1970 r300
->hw
.unk2140
.cmd
[1] = 0x00000002;
1972 r300
->hw
.unk2140
.cmd
[1] = 0x00000000;
1975 #if 0 /* Done in setup routing */
1976 ((drm_r300_cmd_header_t
*)r300
->hw
.vir
[0].cmd
)->packet0
.count
= 1;
1977 r300
->hw
.vir
[0].cmd
[1] = 0x21030003;
1979 ((drm_r300_cmd_header_t
*)r300
->hw
.vir
[1].cmd
)->packet0
.count
= 1;
1980 r300
->hw
.vir
[1].cmd
[1] = 0xF688F688;
1982 r300
->hw
.vic
.cmd
[R300_VIR_CNTL_0
] = 0x00000001;
1983 r300
->hw
.vic
.cmd
[R300_VIR_CNTL_1
] = 0x00000405;
1986 r300
->hw
.unk21DC
.cmd
[1] = 0xAAAAAAAA;
1988 r300
->hw
.unk221C
.cmd
[1] = R300_221C_NORMAL
;
1990 r300
->hw
.unk2220
.cmd
[1] = r300PackFloat32(1.0);
1991 r300
->hw
.unk2220
.cmd
[2] = r300PackFloat32(1.0);
1992 r300
->hw
.unk2220
.cmd
[3] = r300PackFloat32(1.0);
1993 r300
->hw
.unk2220
.cmd
[4] = r300PackFloat32(1.0);
1995 if (GET_CHIP(r300
->radeon
.radeonScreen
) == RADEON_CHIP_R300
)
1996 r300
->hw
.unk2288
.cmd
[1] = R300_2288_R300
;
1998 r300
->hw
.unk2288
.cmd
[1] = R300_2288_RV350
;
2001 r300
->hw
.vof
.cmd
[R300_VOF_CNTL_0
] = R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT
2002 | R300_VAP_OUTPUT_VTX_FMT_0__COLOR_PRESENT
;
2003 r300
->hw
.vof
.cmd
[R300_VOF_CNTL_1
] = 0; /* no textures */
2006 r300
->hw
.pvs
.cmd
[R300_PVS_CNTL_1
] = 0;
2007 r300
->hw
.pvs
.cmd
[R300_PVS_CNTL_2
] = 0;
2008 r300
->hw
.pvs
.cmd
[R300_PVS_CNTL_3
] = 0;
2011 r300
->hw
.gb_enable
.cmd
[1] = R300_GB_POINT_STUFF_ENABLE
2012 | R300_GB_LINE_STUFF_ENABLE
2013 | R300_GB_TRIANGLE_STUFF_ENABLE
/*| R300_GB_UNK30*/;
2015 r300
->hw
.gb_misc
.cmd
[R300_GB_MISC_MSPOS_0
] = 0x66666666;
2016 r300
->hw
.gb_misc
.cmd
[R300_GB_MISC_MSPOS_1
] = 0x06666666;
2017 if (GET_CHIP(r300
->radeon
.radeonScreen
) == RADEON_CHIP_R300
)
2018 r300
->hw
.gb_misc
.cmd
[R300_GB_MISC_TILE_CONFIG
] = R300_GB_TILE_ENABLE
2019 | R300_GB_TILE_PIPE_COUNT_R300
2020 | R300_GB_TILE_SIZE_16
;
2021 else if (GET_CHIP(r300
->radeon
.radeonScreen
) == RADEON_CHIP_R420
)
2022 r300
->hw
.gb_misc
.cmd
[R300_GB_MISC_TILE_CONFIG
] = R300_GB_TILE_ENABLE
2023 | R300_GB_TILE_PIPE_COUNT_R420
2024 | R300_GB_TILE_SIZE_16
;
2026 r300
->hw
.gb_misc
.cmd
[R300_GB_MISC_TILE_CONFIG
] = R300_GB_TILE_ENABLE
2027 | R300_GB_TILE_PIPE_COUNT_RV300
2028 | R300_GB_TILE_SIZE_16
;
2029 r300
->hw
.gb_misc
.cmd
[R300_GB_MISC_SELECT
] = 0x00000000;
2030 r300
->hw
.gb_misc
.cmd
[R300_GB_MISC_AA_CONFIG
] = 0x00000000; /* No antialiasing */
2032 //r300->hw.txe.cmd[R300_TXE_ENABLE] = 0;
2034 r300
->hw
.unk4200
.cmd
[1] = r300PackFloat32(0.0);
2035 r300
->hw
.unk4200
.cmd
[2] = r300PackFloat32(0.0);
2036 r300
->hw
.unk4200
.cmd
[3] = r300PackFloat32(1.0);
2037 r300
->hw
.unk4200
.cmd
[4] = r300PackFloat32(1.0);
2039 r300
->hw
.unk4214
.cmd
[1] = 0x00050005;
2041 r300PointSize(ctx
, 0.0);
2043 r300
->hw
.ps
.cmd
[R300_PS_POINTSIZE
] = (6 << R300_POINTSIZE_X_SHIFT
) |
2044 (6 << R300_POINTSIZE_Y_SHIFT
);
2047 r300
->hw
.unk4230
.cmd
[1] = 0x01800000;//18000006;
2048 r300
->hw
.unk4230
.cmd
[2] = 0x00020006;
2049 r300
->hw
.unk4230
.cmd
[3] = r300PackFloat32(1.0 / 192.0);
2051 r300LineWidth(ctx
, 0.0);
2053 r300
->hw
.unk4260
.cmd
[1] = 0;
2054 r300
->hw
.unk4260
.cmd
[2] = r300PackFloat32(0.0);
2055 r300
->hw
.unk4260
.cmd
[3] = r300PackFloat32(1.0);
2057 r300
->hw
.unk4274
.cmd
[1] = 0x00000002;
2058 r300ShadeModel(ctx
, ctx
->Light
.ShadeModel
);
2059 r300
->hw
.unk4274
.cmd
[3] = 0x00000000;
2060 r300
->hw
.unk4274
.cmd
[4] = 0x00000000;
2062 r300PolygonMode(ctx
, GL_FRONT
, ctx
->Polygon
.FrontMode
);
2063 r300PolygonMode(ctx
, GL_BACK
, ctx
->Polygon
.BackMode
);
2064 r300
->hw
.unk4288
.cmd
[2] = 0x00000001;
2065 r300
->hw
.unk4288
.cmd
[3] = 0x00000000;
2066 r300
->hw
.unk4288
.cmd
[4] = 0x00000000;
2067 r300
->hw
.unk4288
.cmd
[5] = 0x00000000;
2069 r300
->hw
.unk42A0
.cmd
[1] = 0x00000000;
2071 r300PolygonOffset(ctx
, ctx
->Polygon
.OffsetFactor
, ctx
->Polygon
.OffsetUnits
);
2072 r300Enable(ctx
, GL_POLYGON_OFFSET_FILL
, ctx
->Polygon
.OffsetFill
);
2074 r300
->hw
.unk42C0
.cmd
[1] = 0x4B7FFFFF;
2075 r300
->hw
.unk42C0
.cmd
[2] = 0x00000000;
2078 r300
->hw
.unk43A4
.cmd
[1] = 0x0000001C;
2079 r300
->hw
.unk43A4
.cmd
[2] = 0x2DA49525;
2081 r300
->hw
.unk43E8
.cmd
[1] = 0x00FFFFFF;
2084 r300
->hw
.fp
.cmd
[R300_FP_CNTL0
] = 0;
2085 r300
->hw
.fp
.cmd
[R300_FP_CNTL1
] = 0;
2086 r300
->hw
.fp
.cmd
[R300_FP_CNTL2
] = 0;
2087 r300
->hw
.fp
.cmd
[R300_FP_NODE0
] = 0;
2088 r300
->hw
.fp
.cmd
[R300_FP_NODE1
] = 0;
2089 r300
->hw
.fp
.cmd
[R300_FP_NODE2
] = 0;
2090 r300
->hw
.fp
.cmd
[R300_FP_NODE3
] = 0;
2093 r300
->hw
.unk46A4
.cmd
[1] = 0x00001B01;
2094 r300
->hw
.unk46A4
.cmd
[2] = 0x00001B0F;
2095 r300
->hw
.unk46A4
.cmd
[3] = 0x00001B0F;
2096 r300
->hw
.unk46A4
.cmd
[4] = 0x00001B0F;
2097 r300
->hw
.unk46A4
.cmd
[5] = 0x00000001;
2100 for(i
= 1; i
<= 64; ++i
) {
2101 /* create NOP instructions */
2102 r300
->hw
.fpi
[0].cmd
[i
] = FP_INSTRC(MAD
, FP_ARGC(SRC0C_XYZ
), FP_ARGC(ONE
), FP_ARGC(ZERO
));
2103 r300
->hw
.fpi
[1].cmd
[i
] = FP_SELC(0,XYZ
,NO
,FP_TMP(0),0,0);
2104 r300
->hw
.fpi
[2].cmd
[i
] = FP_INSTRA(MAD
, FP_ARGA(SRC0A
), FP_ARGA(ONE
), FP_ARGA(ZERO
));
2105 r300
->hw
.fpi
[3].cmd
[i
] = FP_SELA(0,W
,NO
,FP_TMP(0),0,0);
2109 r300
->hw
.unk4BC0
.cmd
[1] = 0;
2111 r300
->hw
.unk4BC8
.cmd
[1] = 0;
2112 r300
->hw
.unk4BC8
.cmd
[2] = 0;
2113 r300
->hw
.unk4BC8
.cmd
[3] = 0;
2116 r300
->hw
.at
.cmd
[R300_AT_UNKNOWN
] = 0;
2117 r300
->hw
.unk4BD8
.cmd
[1] = 0;
2119 r300
->hw
.unk4E00
.cmd
[1] = 0;
2122 r300
->hw
.bld
.cmd
[R300_BLD_CBLEND
] = 0;
2123 r300
->hw
.bld
.cmd
[R300_BLD_ABLEND
] = 0;
2126 r300BlendColor(ctx
, ctx
->Color
.BlendColor
);
2127 r300
->hw
.unk4E10
.cmd
[2] = 0;
2128 r300
->hw
.unk4E10
.cmd
[3] = 0;
2130 /* Again, r300ClearBuffer uses this */
2131 r300
->hw
.cb
.cmd
[R300_CB_OFFSET
] = r300
->radeon
.state
.color
.drawOffset
+
2132 r300
->radeon
.radeonScreen
->fbLocation
;
2133 r300
->hw
.cb
.cmd
[R300_CB_PITCH
] = r300
->radeon
.state
.color
.drawPitch
;
2135 if (r300
->radeon
.radeonScreen
->cpp
== 4)
2136 r300
->hw
.cb
.cmd
[R300_CB_PITCH
] |= R300_COLOR_FORMAT_ARGB8888
;
2138 r300
->hw
.cb
.cmd
[R300_CB_PITCH
] |= R300_COLOR_FORMAT_RGB565
;
2140 if (r300
->radeon
.sarea
->tiling_enabled
)
2141 r300
->hw
.cb
.cmd
[R300_CB_PITCH
] |= R300_COLOR_TILE_ENABLE
;
2143 r300
->hw
.unk4E50
.cmd
[1] = 0;
2144 r300
->hw
.unk4E50
.cmd
[2] = 0;
2145 r300
->hw
.unk4E50
.cmd
[3] = 0;
2146 r300
->hw
.unk4E50
.cmd
[4] = 0;
2147 r300
->hw
.unk4E50
.cmd
[5] = 0;
2148 r300
->hw
.unk4E50
.cmd
[6] = 0;
2149 r300
->hw
.unk4E50
.cmd
[7] = 0;
2150 r300
->hw
.unk4E50
.cmd
[8] = 0;
2151 r300
->hw
.unk4E50
.cmd
[9] = 0;
2153 r300
->hw
.unk4E88
.cmd
[1] = 0;
2155 r300
->hw
.unk4EA0
.cmd
[1] = 0x00000000;
2156 r300
->hw
.unk4EA0
.cmd
[2] = 0xffffffff;
2158 switch (ctx
->Visual
.depthBits
) {
2160 r300
->hw
.unk4F10
.cmd
[1] = R300_DEPTH_FORMAT_16BIT_INT_Z
;
2163 r300
->hw
.unk4F10
.cmd
[1] = R300_DEPTH_FORMAT_24BIT_INT_Z
;
2166 fprintf(stderr
, "Error: Unsupported depth %d... exiting\n",
2167 ctx
->Visual
.depthBits
);
2171 r300
->hw
.unk4F10
.cmd
[3] = 0x00000003;
2172 r300
->hw
.unk4F10
.cmd
[4] = 0x00000000;
2174 r300
->hw
.zb
.cmd
[R300_ZB_OFFSET
] =
2175 r300
->radeon
.radeonScreen
->depthOffset
+
2176 r300
->radeon
.radeonScreen
->fbLocation
;
2177 r300
->hw
.zb
.cmd
[R300_ZB_PITCH
] = r300
->radeon
.radeonScreen
->depthPitch
;
2179 if (r300
->radeon
.sarea
->tiling_enabled
) {
2180 /* Turn off when clearing buffers ? */
2181 r300
->hw
.zb
.cmd
[R300_ZB_PITCH
] |= R300_DEPTH_TILE_ENABLE
;
2183 if (ctx
->Visual
.depthBits
== 24)
2184 r300
->hw
.zb
.cmd
[R300_ZB_PITCH
] |= R300_DEPTH_MICROTILE_ENABLE
;
2187 r300
->hw
.unk4F28
.cmd
[1] = 0;
2189 r300
->hw
.unk4F30
.cmd
[1] = 0;
2190 r300
->hw
.unk4F30
.cmd
[2] = 0;
2192 r300
->hw
.unk4F44
.cmd
[1] = 0;
2194 r300
->hw
.unk4F54
.cmd
[1] = 0;
2197 ((drm_r300_cmd_header_t
*)r300
->hw
.vpi
.cmd
)->vpu
.count
= 0;
2198 for(i
= 1; i
< R300_VPI_CMDSIZE
; i
+= 4) {
2200 r300
->hw
.vpi
.cmd
[i
+0] = VP_OUT(ADD
,TMP
,0,XYZW
);
2201 r300
->hw
.vpi
.cmd
[i
+1] = VP_IN(TMP
,0);
2202 r300
->hw
.vpi
.cmd
[i
+2] = VP_ZERO();
2203 r300
->hw
.vpi
.cmd
[i
+3] = VP_ZERO();
2206 ((drm_r300_cmd_header_t
*)r300
->hw
.vpp
.cmd
)->vpu
.count
= 0;
2207 for(i
= 1; i
< R300_VPP_CMDSIZE
; ++i
)
2208 r300
->hw
.vpp
.cmd
[i
] = 0;
2211 r300
->hw
.vps
.cmd
[R300_VPS_ZERO_0
] = 0;
2212 r300
->hw
.vps
.cmd
[R300_VPS_ZERO_1
] = 0;
2213 r300
->hw
.vps
.cmd
[R300_VPS_POINTSIZE
] = r300PackFloat32(1.0);
2214 r300
->hw
.vps
.cmd
[R300_VPS_ZERO_3
] = 0;
2217 r300
->hw
.all_dirty
= GL_TRUE
;
2223 * Calculate initial hardware state and register state functions.
2224 * Assumes that the command buffer and state atoms have been
2225 * initialized already.
2227 void r300InitState(r300ContextPtr r300
)
2229 GLcontext
*ctx
= r300
->radeon
.glCtx
;
2232 radeonInitState(&r300
->radeon
);
2234 switch (ctx
->Visual
.depthBits
) {
2236 r300
->state
.depth
.scale
= 1.0 / (GLfloat
) 0xffff;
2237 depth_fmt
= R200_DEPTH_FORMAT_16BIT_INT_Z
;
2238 r300
->state
.stencil
.clear
= 0x00000000;
2241 r300
->state
.depth
.scale
= 1.0 / (GLfloat
) 0xffffff;
2242 depth_fmt
= R200_DEPTH_FORMAT_24BIT_INT_Z
;
2243 r300
->state
.stencil
.clear
= 0x00ff0000;
2246 fprintf(stderr
, "Error: Unsupported depth %d... exiting\n",
2247 ctx
->Visual
.depthBits
);
2251 /* Only have hw stencil when depth buffer is 24 bits deep */
2252 r300
->state
.stencil
.hw_stencil
= (ctx
->Visual
.stencilBits
> 0 &&
2253 ctx
->Visual
.depthBits
== 24);
2255 memset(&(r300
->state
.texture
), 0, sizeof(r300
->state
.texture
));
2257 r300ResetHwState(r300
);
2260 static void r300RenderMode( GLcontext
*ctx
, GLenum mode
)
2262 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
2264 WARN_ONCE("TODO: fallback properly when rendering mode is not GL_RENDER\n"
2265 "\tThe way things are now neither selection nor feedback modes work\n")
2266 // FALLBACK( rmesa, R300_FALLBACK_RENDER_MODE, (mode != GL_RENDER) );
2270 * Initialize driver's state callback functions
2272 void r300InitStateFuncs(struct dd_function_table
* functions
)
2274 radeonInitStateFuncs(functions
);
2276 functions
->UpdateState
= r300InvalidateState
;
2277 functions
->AlphaFunc
= r300AlphaFunc
;
2278 functions
->BlendColor
= r300BlendColor
;
2279 functions
->BlendEquationSeparate
= r300BlendEquationSeparate
;
2280 functions
->BlendFuncSeparate
= r300BlendFuncSeparate
;
2281 functions
->Enable
= r300Enable
;
2282 functions
->ColorMask
= r300ColorMask
;
2283 functions
->DepthFunc
= r300DepthFunc
;
2284 functions
->DepthMask
= r300DepthMask
;
2285 functions
->CullFace
= r300CullFace
;
2286 functions
->FrontFace
= r300FrontFace
;
2287 functions
->ShadeModel
= r300ShadeModel
;
2289 /* Stencil related */
2290 functions
->ClearStencil
= r300ClearStencil
;
2291 functions
->StencilFuncSeparate
= r300StencilFuncSeparate
;
2292 functions
->StencilMaskSeparate
= r300StencilMaskSeparate
;
2293 functions
->StencilOpSeparate
= r300StencilOpSeparate
;
2295 /* Viewport related */
2296 functions
->Viewport
= r300Viewport
;
2297 functions
->DepthRange
= r300DepthRange
;
2298 functions
->PointSize
= r300PointSize
;
2299 functions
->LineWidth
= r300LineWidth
;
2301 functions
->PolygonOffset
= r300PolygonOffset
;
2302 functions
->PolygonMode
= r300PolygonMode
;
2304 functions
->RenderMode
= r300RenderMode
;