1 /**************************************************************************
3 Copyright 2000, 2001 VA Linux Systems Inc., Fremont, California.
7 Permission is hereby granted, free of charge, to any person obtaining
8 a copy of this software and associated documentation files (the
9 "Software"), to deal in the Software without restriction, including
10 without limitation the rights to use, copy, modify, merge, publish,
11 distribute, sublicense, and/or sell copies of the Software, and to
12 permit persons to whom the Software is furnished to do so, subject to
13 the following conditions:
15 The above copyright notice and this permission notice (including the
16 next paragraph) shall be included in all copies or substantial
17 portions of the Software.
19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
23 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 **************************************************************************/
31 * Gareth Hughes <gareth@valinux.com>
32 * Keith Whitwell <keith@tungstengraphics.com>
35 #include "main/glheader.h"
36 #include "main/imports.h"
37 #include "main/api_arrayelt.h"
38 #include "main/enums.h"
39 #include "main/light.h"
40 #include "main/context.h"
41 #include "main/framebuffer.h"
42 #include "main/fbobject.h"
43 #include "main/simple_list.h"
44 #include "main/state.h"
48 #include "tnl/t_pipeline.h"
49 #include "swrast_setup/swrast_setup.h"
50 #include "drivers/common/meta.h"
52 #include "radeon_context.h"
53 #include "radeon_mipmap_tree.h"
54 #include "radeon_ioctl.h"
55 #include "radeon_state.h"
56 #include "radeon_tcl.h"
57 #include "radeon_tex.h"
58 #include "radeon_swtcl.h"
60 static void radeonUpdateSpecular( struct gl_context
*ctx
);
62 /* =============================================================
66 static void radeonAlphaFunc( struct gl_context
*ctx
, GLenum func
, GLfloat ref
)
68 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
69 int pp_misc
= rmesa
->hw
.ctx
.cmd
[CTX_PP_MISC
];
72 CLAMPED_FLOAT_TO_UBYTE(refByte
, ref
);
74 RADEON_STATECHANGE( rmesa
, ctx
);
76 pp_misc
&= ~(RADEON_ALPHA_TEST_OP_MASK
| RADEON_REF_ALPHA_MASK
);
77 pp_misc
|= (refByte
& RADEON_REF_ALPHA_MASK
);
81 pp_misc
|= RADEON_ALPHA_TEST_FAIL
;
84 pp_misc
|= RADEON_ALPHA_TEST_LESS
;
87 pp_misc
|= RADEON_ALPHA_TEST_EQUAL
;
90 pp_misc
|= RADEON_ALPHA_TEST_LEQUAL
;
93 pp_misc
|= RADEON_ALPHA_TEST_GREATER
;
96 pp_misc
|= RADEON_ALPHA_TEST_NEQUAL
;
99 pp_misc
|= RADEON_ALPHA_TEST_GEQUAL
;
102 pp_misc
|= RADEON_ALPHA_TEST_PASS
;
106 rmesa
->hw
.ctx
.cmd
[CTX_PP_MISC
] = pp_misc
;
109 static void radeonBlendEquationSeparate( struct gl_context
*ctx
,
110 GLenum modeRGB
, GLenum modeA
)
112 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
113 GLuint b
= rmesa
->hw
.ctx
.cmd
[CTX_RB3D_BLENDCNTL
] & ~RADEON_COMB_FCN_MASK
;
114 GLboolean fallback
= GL_FALSE
;
116 assert( modeRGB
== modeA
);
121 b
|= RADEON_COMB_FCN_ADD_CLAMP
;
124 case GL_FUNC_SUBTRACT
:
125 b
|= RADEON_COMB_FCN_SUB_CLAMP
;
129 if (ctx
->Color
.BlendEnabled
)
132 b
|= RADEON_COMB_FCN_ADD_CLAMP
;
136 FALLBACK( rmesa
, RADEON_FALLBACK_BLEND_EQ
, fallback
);
138 RADEON_STATECHANGE( rmesa
, ctx
);
139 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_BLENDCNTL
] = b
;
140 if ( (ctx
->Color
.ColorLogicOpEnabled
|| (ctx
->Color
.BlendEnabled
141 && ctx
->Color
.Blend
[0].EquationRGB
== GL_LOGIC_OP
)) ) {
142 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= RADEON_ROP_ENABLE
;
144 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] &= ~RADEON_ROP_ENABLE
;
149 static void radeonBlendFuncSeparate( struct gl_context
*ctx
,
150 GLenum sfactorRGB
, GLenum dfactorRGB
,
151 GLenum sfactorA
, GLenum dfactorA
)
153 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
154 GLuint b
= rmesa
->hw
.ctx
.cmd
[CTX_RB3D_BLENDCNTL
] &
155 ~(RADEON_SRC_BLEND_MASK
| RADEON_DST_BLEND_MASK
);
156 GLboolean fallback
= GL_FALSE
;
158 switch ( ctx
->Color
.Blend
[0].SrcRGB
) {
160 b
|= RADEON_SRC_BLEND_GL_ZERO
;
163 b
|= RADEON_SRC_BLEND_GL_ONE
;
166 b
|= RADEON_SRC_BLEND_GL_DST_COLOR
;
168 case GL_ONE_MINUS_DST_COLOR
:
169 b
|= RADEON_SRC_BLEND_GL_ONE_MINUS_DST_COLOR
;
172 b
|= RADEON_SRC_BLEND_GL_SRC_COLOR
;
174 case GL_ONE_MINUS_SRC_COLOR
:
175 b
|= RADEON_SRC_BLEND_GL_ONE_MINUS_SRC_COLOR
;
178 b
|= RADEON_SRC_BLEND_GL_SRC_ALPHA
;
180 case GL_ONE_MINUS_SRC_ALPHA
:
181 b
|= RADEON_SRC_BLEND_GL_ONE_MINUS_SRC_ALPHA
;
184 b
|= RADEON_SRC_BLEND_GL_DST_ALPHA
;
186 case GL_ONE_MINUS_DST_ALPHA
:
187 b
|= RADEON_SRC_BLEND_GL_ONE_MINUS_DST_ALPHA
;
189 case GL_SRC_ALPHA_SATURATE
:
190 b
|= RADEON_SRC_BLEND_GL_SRC_ALPHA_SATURATE
;
192 case GL_CONSTANT_COLOR
:
193 case GL_ONE_MINUS_CONSTANT_COLOR
:
194 case GL_CONSTANT_ALPHA
:
195 case GL_ONE_MINUS_CONSTANT_ALPHA
:
196 if (ctx
->Color
.BlendEnabled
)
199 b
|= RADEON_SRC_BLEND_GL_ONE
;
205 switch ( ctx
->Color
.Blend
[0].DstRGB
) {
207 b
|= RADEON_DST_BLEND_GL_ZERO
;
210 b
|= RADEON_DST_BLEND_GL_ONE
;
213 b
|= RADEON_DST_BLEND_GL_SRC_COLOR
;
215 case GL_ONE_MINUS_SRC_COLOR
:
216 b
|= RADEON_DST_BLEND_GL_ONE_MINUS_SRC_COLOR
;
219 b
|= RADEON_DST_BLEND_GL_SRC_ALPHA
;
221 case GL_ONE_MINUS_SRC_ALPHA
:
222 b
|= RADEON_DST_BLEND_GL_ONE_MINUS_SRC_ALPHA
;
225 b
|= RADEON_DST_BLEND_GL_DST_COLOR
;
227 case GL_ONE_MINUS_DST_COLOR
:
228 b
|= RADEON_DST_BLEND_GL_ONE_MINUS_DST_COLOR
;
231 b
|= RADEON_DST_BLEND_GL_DST_ALPHA
;
233 case GL_ONE_MINUS_DST_ALPHA
:
234 b
|= RADEON_DST_BLEND_GL_ONE_MINUS_DST_ALPHA
;
236 case GL_CONSTANT_COLOR
:
237 case GL_ONE_MINUS_CONSTANT_COLOR
:
238 case GL_CONSTANT_ALPHA
:
239 case GL_ONE_MINUS_CONSTANT_ALPHA
:
240 if (ctx
->Color
.BlendEnabled
)
243 b
|= RADEON_DST_BLEND_GL_ZERO
;
249 FALLBACK( rmesa
, RADEON_FALLBACK_BLEND_FUNC
, fallback
);
251 RADEON_STATECHANGE( rmesa
, ctx
);
252 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_BLENDCNTL
] = b
;
257 /* =============================================================
261 static void radeonDepthFunc( struct gl_context
*ctx
, GLenum func
)
263 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
265 RADEON_STATECHANGE( rmesa
, ctx
);
266 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] &= ~RADEON_Z_TEST_MASK
;
268 switch ( ctx
->Depth
.Func
) {
270 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_Z_TEST_NEVER
;
273 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_Z_TEST_LESS
;
276 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_Z_TEST_EQUAL
;
279 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_Z_TEST_LEQUAL
;
282 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_Z_TEST_GREATER
;
285 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_Z_TEST_NEQUAL
;
288 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_Z_TEST_GEQUAL
;
291 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_Z_TEST_ALWAYS
;
297 static void radeonDepthMask( struct gl_context
*ctx
, GLboolean flag
)
299 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
300 RADEON_STATECHANGE( rmesa
, ctx
);
302 if ( ctx
->Depth
.Mask
) {
303 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_Z_WRITE_ENABLE
;
305 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] &= ~RADEON_Z_WRITE_ENABLE
;
310 /* =============================================================
315 static void radeonFogfv( struct gl_context
*ctx
, GLenum pname
, const GLfloat
*param
)
317 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
318 union { int i
; float f
; } c
, d
;
323 if (!ctx
->Fog
.Enabled
)
325 RADEON_STATECHANGE(rmesa
, tcl
);
326 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] &= ~RADEON_TCL_FOG_MASK
;
327 switch (ctx
->Fog
.Mode
) {
329 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] |= RADEON_TCL_FOG_LINEAR
;
332 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] |= RADEON_TCL_FOG_EXP
;
335 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] |= RADEON_TCL_FOG_EXP2
;
344 if (!ctx
->Fog
.Enabled
)
346 c
.i
= rmesa
->hw
.fog
.cmd
[FOG_C
];
347 d
.i
= rmesa
->hw
.fog
.cmd
[FOG_D
];
348 switch (ctx
->Fog
.Mode
) {
351 /* While this is the opposite sign from the DDK, it makes the fog test
352 * pass, and matches r200.
354 d
.f
= -ctx
->Fog
.Density
;
358 d
.f
= -(ctx
->Fog
.Density
* ctx
->Fog
.Density
);
361 if (ctx
->Fog
.Start
== ctx
->Fog
.End
) {
365 c
.f
= ctx
->Fog
.End
/(ctx
->Fog
.End
-ctx
->Fog
.Start
);
366 /* While this is the opposite sign from the DDK, it makes the fog
367 * test pass, and matches r200.
369 d
.f
= -1.0/(ctx
->Fog
.End
-ctx
->Fog
.Start
);
375 if (c
.i
!= rmesa
->hw
.fog
.cmd
[FOG_C
] || d
.i
!= rmesa
->hw
.fog
.cmd
[FOG_D
]) {
376 RADEON_STATECHANGE( rmesa
, fog
);
377 rmesa
->hw
.fog
.cmd
[FOG_C
] = c
.i
;
378 rmesa
->hw
.fog
.cmd
[FOG_D
] = d
.i
;
382 RADEON_STATECHANGE( rmesa
, ctx
);
383 _mesa_unclamped_float_rgba_to_ubyte(col
, ctx
->Fog
.Color
);
384 rmesa
->hw
.ctx
.cmd
[CTX_PP_FOG_COLOR
] &= ~RADEON_FOG_COLOR_MASK
;
385 rmesa
->hw
.ctx
.cmd
[CTX_PP_FOG_COLOR
] |=
386 radeonPackColor( 4, col
[0], col
[1], col
[2], 0 );
388 case GL_FOG_COORD_SRC
:
389 radeonUpdateSpecular( ctx
);
396 /* =============================================================
400 static void radeonCullFace( struct gl_context
*ctx
, GLenum unused
)
402 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
403 GLuint s
= rmesa
->hw
.set
.cmd
[SET_SE_CNTL
];
404 GLuint t
= rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
];
406 s
|= RADEON_FFACE_SOLID
| RADEON_BFACE_SOLID
;
407 t
&= ~(RADEON_CULL_FRONT
| RADEON_CULL_BACK
);
409 if ( ctx
->Polygon
.CullFlag
) {
410 switch ( ctx
->Polygon
.CullFaceMode
) {
412 s
&= ~RADEON_FFACE_SOLID
;
413 t
|= RADEON_CULL_FRONT
;
416 s
&= ~RADEON_BFACE_SOLID
;
417 t
|= RADEON_CULL_BACK
;
419 case GL_FRONT_AND_BACK
:
420 s
&= ~(RADEON_FFACE_SOLID
| RADEON_BFACE_SOLID
);
421 t
|= (RADEON_CULL_FRONT
| RADEON_CULL_BACK
);
426 if ( rmesa
->hw
.set
.cmd
[SET_SE_CNTL
] != s
) {
427 RADEON_STATECHANGE(rmesa
, set
);
428 rmesa
->hw
.set
.cmd
[SET_SE_CNTL
] = s
;
431 if ( rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] != t
) {
432 RADEON_STATECHANGE(rmesa
, tcl
);
433 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] = t
;
437 static void radeonFrontFace( struct gl_context
*ctx
, GLenum mode
)
439 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
440 int cull_face
= (mode
== GL_CW
) ? RADEON_FFACE_CULL_CW
: RADEON_FFACE_CULL_CCW
;
442 RADEON_STATECHANGE( rmesa
, set
);
443 rmesa
->hw
.set
.cmd
[SET_SE_CNTL
] &= ~RADEON_FFACE_CULL_DIR_MASK
;
445 RADEON_STATECHANGE( rmesa
, tcl
);
446 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] &= ~RADEON_CULL_FRONT_IS_CCW
;
448 /* Winding is inverted when rendering to FBO */
449 if (ctx
->DrawBuffer
&& _mesa_is_user_fbo(ctx
->DrawBuffer
))
450 cull_face
= (mode
== GL_CCW
) ? RADEON_FFACE_CULL_CW
: RADEON_FFACE_CULL_CCW
;
451 rmesa
->hw
.set
.cmd
[SET_SE_CNTL
] |= cull_face
;
453 if ( mode
== GL_CCW
)
454 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] |= RADEON_CULL_FRONT_IS_CCW
;
458 /* =============================================================
461 static void radeonLineWidth( struct gl_context
*ctx
, GLfloat widthf
)
463 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
465 RADEON_STATECHANGE( rmesa
, lin
);
466 RADEON_STATECHANGE( rmesa
, set
);
468 /* Line width is stored in U6.4 format.
470 rmesa
->hw
.lin
.cmd
[LIN_SE_LINE_WIDTH
] = (GLuint
)(widthf
* 16.0);
471 if ( widthf
> 1.0 ) {
472 rmesa
->hw
.set
.cmd
[SET_SE_CNTL
] |= RADEON_WIDELINE_ENABLE
;
474 rmesa
->hw
.set
.cmd
[SET_SE_CNTL
] &= ~RADEON_WIDELINE_ENABLE
;
478 static void radeonLineStipple( struct gl_context
*ctx
, GLint factor
, GLushort pattern
)
480 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
482 RADEON_STATECHANGE( rmesa
, lin
);
483 rmesa
->hw
.lin
.cmd
[LIN_RE_LINE_PATTERN
] =
484 ((((GLuint
)factor
& 0xff) << 16) | ((GLuint
)pattern
));
488 /* =============================================================
491 static void radeonColorMask( struct gl_context
*ctx
,
492 GLboolean r
, GLboolean g
,
493 GLboolean b
, GLboolean a
)
495 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
496 struct radeon_renderbuffer
*rrb
;
499 rrb
= radeon_get_colorbuffer(&rmesa
->radeon
);
503 mask
= radeonPackColor( rrb
->cpp
,
504 ctx
->Color
.ColorMask
[0][RCOMP
],
505 ctx
->Color
.ColorMask
[0][GCOMP
],
506 ctx
->Color
.ColorMask
[0][BCOMP
],
507 ctx
->Color
.ColorMask
[0][ACOMP
] );
509 if ( rmesa
->hw
.msk
.cmd
[MSK_RB3D_PLANEMASK
] != mask
) {
510 RADEON_STATECHANGE( rmesa
, msk
);
511 rmesa
->hw
.msk
.cmd
[MSK_RB3D_PLANEMASK
] = mask
;
516 /* =============================================================
520 static void radeonPolygonOffset( struct gl_context
*ctx
,
521 GLfloat factor
, GLfloat units
)
523 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
524 const GLfloat depthScale
= 1.0F
/ ctx
->DrawBuffer
->_DepthMaxF
;
525 float_ui32_type constant
= { units
* depthScale
};
526 float_ui32_type factoru
= { factor
};
528 RADEON_STATECHANGE( rmesa
, zbs
);
529 rmesa
->hw
.zbs
.cmd
[ZBS_SE_ZBIAS_FACTOR
] = factoru
.ui32
;
530 rmesa
->hw
.zbs
.cmd
[ZBS_SE_ZBIAS_CONSTANT
] = constant
.ui32
;
533 static void radeonPolygonMode( struct gl_context
*ctx
, GLenum face
, GLenum mode
)
535 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
536 GLboolean unfilled
= (ctx
->Polygon
.FrontMode
!= GL_FILL
||
537 ctx
->Polygon
.BackMode
!= GL_FILL
);
539 /* Can't generally do unfilled via tcl, but some good special
542 TCL_FALLBACK( ctx
, RADEON_TCL_FALLBACK_UNFILLED
, unfilled
);
543 if (rmesa
->radeon
.TclFallback
) {
544 radeonChooseRenderState( ctx
);
545 radeonChooseVertexState( ctx
);
550 /* =============================================================
551 * Rendering attributes
553 * We really don't want to recalculate all this every time we bind a
554 * texture. These things shouldn't change all that often, so it makes
555 * sense to break them out of the core texture state update routines.
558 /* Examine lighting and texture state to determine if separate specular
561 static void radeonUpdateSpecular( struct gl_context
*ctx
)
563 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
564 uint32_t p
= rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
];
567 RADEON_STATECHANGE( rmesa
, tcl
);
569 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
] &= ~RADEON_TCL_COMPUTE_SPECULAR
;
570 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
] &= ~RADEON_TCL_COMPUTE_DIFFUSE
;
571 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] &= ~RADEON_TCL_VTX_PK_SPEC
;
572 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] &= ~RADEON_TCL_VTX_PK_DIFFUSE
;
573 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] &= ~RADEON_LIGHTING_ENABLE
;
575 p
&= ~RADEON_SPECULAR_ENABLE
;
577 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] |= RADEON_DIFFUSE_SPECULAR_COMBINE
;
580 if (ctx
->Light
.Enabled
&&
581 ctx
->Light
.Model
.ColorControl
== GL_SEPARATE_SPECULAR_COLOR
) {
582 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
] |= RADEON_TCL_COMPUTE_SPECULAR
;
583 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
] |= RADEON_TCL_COMPUTE_DIFFUSE
;
584 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] |= RADEON_TCL_VTX_PK_SPEC
;
585 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] |= RADEON_TCL_VTX_PK_DIFFUSE
;
586 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] |= RADEON_LIGHTING_ENABLE
;
587 p
|= RADEON_SPECULAR_ENABLE
;
588 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] &=
589 ~RADEON_DIFFUSE_SPECULAR_COMBINE
;
591 else if (ctx
->Light
.Enabled
) {
592 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
] |= RADEON_TCL_COMPUTE_DIFFUSE
;
593 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] |= RADEON_TCL_VTX_PK_DIFFUSE
;
594 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] |= RADEON_LIGHTING_ENABLE
;
595 } else if (ctx
->Fog
.ColorSumEnabled
) {
596 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] |= RADEON_TCL_VTX_PK_SPEC
;
597 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] |= RADEON_TCL_VTX_PK_DIFFUSE
;
598 p
|= RADEON_SPECULAR_ENABLE
;
600 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] |= RADEON_TCL_VTX_PK_DIFFUSE
;
603 if (ctx
->Fog
.Enabled
) {
604 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] |= RADEON_TCL_VTX_PK_SPEC
;
605 if (ctx
->Fog
.FogCoordinateSource
== GL_FRAGMENT_DEPTH
) {
606 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
] |= RADEON_TCL_COMPUTE_SPECULAR
;
607 /* Bizzare: have to leave lighting enabled to get fog. */
608 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] |= RADEON_LIGHTING_ENABLE
;
611 /* cannot do tcl fog factor calculation with fog coord source
612 * (send precomputed factors). Cannot use precomputed fog
613 * factors together with tcl spec light (need tcl fallback) */
614 flag
= (rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
] &
615 RADEON_TCL_COMPUTE_SPECULAR
) != 0;
619 TCL_FALLBACK( ctx
, RADEON_TCL_FALLBACK_FOGCOORDSPEC
, flag
);
621 if (_mesa_need_secondary_color(ctx
)) {
622 assert( (p
& RADEON_SPECULAR_ENABLE
) != 0 );
624 assert( (p
& RADEON_SPECULAR_ENABLE
) == 0 );
627 if ( rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] != p
) {
628 RADEON_STATECHANGE( rmesa
, ctx
);
629 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] = p
;
632 /* Update vertex/render formats
634 if (rmesa
->radeon
.TclFallback
) {
635 radeonChooseRenderState( ctx
);
636 radeonChooseVertexState( ctx
);
641 /* =============================================================
646 /* Update on colormaterial, material emmissive/ambient,
647 * lightmodel.globalambient
649 static void update_global_ambient( struct gl_context
*ctx
)
651 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
652 float *fcmd
= (float *)RADEON_DB_STATE( glt
);
654 /* Need to do more if both emmissive & ambient are PREMULT:
655 * Hope this is not needed for MULT
657 if ((rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] &
658 ((3 << RADEON_EMISSIVE_SOURCE_SHIFT
) |
659 (3 << RADEON_AMBIENT_SOURCE_SHIFT
))) == 0)
661 COPY_3V( &fcmd
[GLT_RED
],
662 ctx
->Light
.Material
.Attrib
[MAT_ATTRIB_FRONT_EMISSION
]);
663 ACC_SCALE_3V( &fcmd
[GLT_RED
],
664 ctx
->Light
.Model
.Ambient
,
665 ctx
->Light
.Material
.Attrib
[MAT_ATTRIB_FRONT_AMBIENT
]);
669 COPY_3V( &fcmd
[GLT_RED
], ctx
->Light
.Model
.Ambient
);
672 RADEON_DB_STATECHANGE(rmesa
, &rmesa
->hw
.glt
);
675 /* Update on change to
679 static void update_light_colors( struct gl_context
*ctx
, GLuint p
)
681 struct gl_light
*l
= &ctx
->Light
.Light
[p
];
683 /* fprintf(stderr, "%s\n", __FUNCTION__); */
686 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
687 float *fcmd
= (float *)RADEON_DB_STATE( lit
[p
] );
689 COPY_4V( &fcmd
[LIT_AMBIENT_RED
], l
->Ambient
);
690 COPY_4V( &fcmd
[LIT_DIFFUSE_RED
], l
->Diffuse
);
691 COPY_4V( &fcmd
[LIT_SPECULAR_RED
], l
->Specular
);
693 RADEON_DB_STATECHANGE( rmesa
, &rmesa
->hw
.lit
[p
] );
697 /* Also fallback for asym colormaterial mode in twoside lighting...
699 static void check_twoside_fallback( struct gl_context
*ctx
)
701 GLboolean fallback
= GL_FALSE
;
704 if (ctx
->Light
.Enabled
&& ctx
->Light
.Model
.TwoSide
) {
705 if (ctx
->Light
.ColorMaterialEnabled
&&
706 (ctx
->Light
._ColorMaterialBitmask
& BACK_MATERIAL_BITS
) !=
707 ((ctx
->Light
._ColorMaterialBitmask
& FRONT_MATERIAL_BITS
)<<1))
710 for (i
= MAT_ATTRIB_FRONT_AMBIENT
; i
< MAT_ATTRIB_FRONT_INDEXES
; i
+=2)
711 if (memcmp( ctx
->Light
.Material
.Attrib
[i
],
712 ctx
->Light
.Material
.Attrib
[i
+1],
713 sizeof(GLfloat
)*4) != 0) {
720 TCL_FALLBACK( ctx
, RADEON_TCL_FALLBACK_LIGHT_TWOSIDE
, fallback
);
724 static void radeonColorMaterial( struct gl_context
*ctx
, GLenum face
, GLenum mode
)
726 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
727 GLuint light_model_ctl1
= rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
];
729 light_model_ctl1
&= ~((3 << RADEON_EMISSIVE_SOURCE_SHIFT
) |
730 (3 << RADEON_AMBIENT_SOURCE_SHIFT
) |
731 (3 << RADEON_DIFFUSE_SOURCE_SHIFT
) |
732 (3 << RADEON_SPECULAR_SOURCE_SHIFT
));
734 if (ctx
->Light
.ColorMaterialEnabled
) {
735 GLuint mask
= ctx
->Light
._ColorMaterialBitmask
;
737 if (mask
& MAT_BIT_FRONT_EMISSION
) {
738 light_model_ctl1
|= (RADEON_LM_SOURCE_VERTEX_DIFFUSE
<<
739 RADEON_EMISSIVE_SOURCE_SHIFT
);
742 light_model_ctl1
|= (RADEON_LM_SOURCE_STATE_MULT
<<
743 RADEON_EMISSIVE_SOURCE_SHIFT
);
746 if (mask
& MAT_BIT_FRONT_AMBIENT
) {
747 light_model_ctl1
|= (RADEON_LM_SOURCE_VERTEX_DIFFUSE
<<
748 RADEON_AMBIENT_SOURCE_SHIFT
);
751 light_model_ctl1
|= (RADEON_LM_SOURCE_STATE_MULT
<<
752 RADEON_AMBIENT_SOURCE_SHIFT
);
755 if (mask
& MAT_BIT_FRONT_DIFFUSE
) {
756 light_model_ctl1
|= (RADEON_LM_SOURCE_VERTEX_DIFFUSE
<<
757 RADEON_DIFFUSE_SOURCE_SHIFT
);
760 light_model_ctl1
|= (RADEON_LM_SOURCE_STATE_MULT
<<
761 RADEON_DIFFUSE_SOURCE_SHIFT
);
764 if (mask
& MAT_BIT_FRONT_SPECULAR
) {
765 light_model_ctl1
|= (RADEON_LM_SOURCE_VERTEX_DIFFUSE
<<
766 RADEON_SPECULAR_SOURCE_SHIFT
);
769 light_model_ctl1
|= (RADEON_LM_SOURCE_STATE_MULT
<<
770 RADEON_SPECULAR_SOURCE_SHIFT
);
776 light_model_ctl1
|= (RADEON_LM_SOURCE_STATE_MULT
<< RADEON_EMISSIVE_SOURCE_SHIFT
) |
777 (RADEON_LM_SOURCE_STATE_MULT
<< RADEON_AMBIENT_SOURCE_SHIFT
) |
778 (RADEON_LM_SOURCE_STATE_MULT
<< RADEON_DIFFUSE_SOURCE_SHIFT
) |
779 (RADEON_LM_SOURCE_STATE_MULT
<< RADEON_SPECULAR_SOURCE_SHIFT
);
782 if (light_model_ctl1
!= rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
]) {
783 RADEON_STATECHANGE( rmesa
, tcl
);
784 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] = light_model_ctl1
;
788 void radeonUpdateMaterial( struct gl_context
*ctx
)
790 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
791 GLfloat (*mat
)[4] = ctx
->Light
.Material
.Attrib
;
792 GLfloat
*fcmd
= (GLfloat
*)RADEON_DB_STATE( mtl
);
795 if (ctx
->Light
.ColorMaterialEnabled
)
796 mask
&= ~ctx
->Light
._ColorMaterialBitmask
;
798 if (RADEON_DEBUG
& RADEON_STATE
)
799 fprintf(stderr
, "%s\n", __FUNCTION__
);
802 if (mask
& MAT_BIT_FRONT_EMISSION
) {
803 fcmd
[MTL_EMMISSIVE_RED
] = mat
[MAT_ATTRIB_FRONT_EMISSION
][0];
804 fcmd
[MTL_EMMISSIVE_GREEN
] = mat
[MAT_ATTRIB_FRONT_EMISSION
][1];
805 fcmd
[MTL_EMMISSIVE_BLUE
] = mat
[MAT_ATTRIB_FRONT_EMISSION
][2];
806 fcmd
[MTL_EMMISSIVE_ALPHA
] = mat
[MAT_ATTRIB_FRONT_EMISSION
][3];
808 if (mask
& MAT_BIT_FRONT_AMBIENT
) {
809 fcmd
[MTL_AMBIENT_RED
] = mat
[MAT_ATTRIB_FRONT_AMBIENT
][0];
810 fcmd
[MTL_AMBIENT_GREEN
] = mat
[MAT_ATTRIB_FRONT_AMBIENT
][1];
811 fcmd
[MTL_AMBIENT_BLUE
] = mat
[MAT_ATTRIB_FRONT_AMBIENT
][2];
812 fcmd
[MTL_AMBIENT_ALPHA
] = mat
[MAT_ATTRIB_FRONT_AMBIENT
][3];
814 if (mask
& MAT_BIT_FRONT_DIFFUSE
) {
815 fcmd
[MTL_DIFFUSE_RED
] = mat
[MAT_ATTRIB_FRONT_DIFFUSE
][0];
816 fcmd
[MTL_DIFFUSE_GREEN
] = mat
[MAT_ATTRIB_FRONT_DIFFUSE
][1];
817 fcmd
[MTL_DIFFUSE_BLUE
] = mat
[MAT_ATTRIB_FRONT_DIFFUSE
][2];
818 fcmd
[MTL_DIFFUSE_ALPHA
] = mat
[MAT_ATTRIB_FRONT_DIFFUSE
][3];
820 if (mask
& MAT_BIT_FRONT_SPECULAR
) {
821 fcmd
[MTL_SPECULAR_RED
] = mat
[MAT_ATTRIB_FRONT_SPECULAR
][0];
822 fcmd
[MTL_SPECULAR_GREEN
] = mat
[MAT_ATTRIB_FRONT_SPECULAR
][1];
823 fcmd
[MTL_SPECULAR_BLUE
] = mat
[MAT_ATTRIB_FRONT_SPECULAR
][2];
824 fcmd
[MTL_SPECULAR_ALPHA
] = mat
[MAT_ATTRIB_FRONT_SPECULAR
][3];
826 if (mask
& MAT_BIT_FRONT_SHININESS
) {
827 fcmd
[MTL_SHININESS
] = mat
[MAT_ATTRIB_FRONT_SHININESS
][0];
830 RADEON_DB_STATECHANGE( rmesa
, &rmesa
->hw
.mtl
);
832 check_twoside_fallback( ctx
);
833 /* update_global_ambient( ctx );*/
838 * _MESA_NEW_NEED_EYE_COORDS
840 * Uses derived state from mesa:
849 * which are calculated in light.c and are correct for the current
850 * lighting space (model or eye), hence dependencies on _NEW_MODELVIEW
851 * and _MESA_NEW_NEED_EYE_COORDS.
853 static void update_light( struct gl_context
*ctx
)
855 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
857 /* Have to check these, or have an automatic shortcircuit mechanism
858 * to remove noop statechanges. (Or just do a better job on the
862 GLuint tmp
= rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
];
864 if (ctx
->_NeedEyeCoords
)
865 tmp
&= ~RADEON_LIGHT_IN_MODELSPACE
;
867 tmp
|= RADEON_LIGHT_IN_MODELSPACE
;
870 /* Leave this test disabled: (unexplained q3 lockup) (even with
873 if (tmp
!= rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
])
875 RADEON_STATECHANGE( rmesa
, tcl
);
876 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] = tmp
;
881 GLfloat
*fcmd
= (GLfloat
*)RADEON_DB_STATE( eye
);
882 fcmd
[EYE_X
] = ctx
->_EyeZDir
[0];
883 fcmd
[EYE_Y
] = ctx
->_EyeZDir
[1];
884 fcmd
[EYE_Z
] = - ctx
->_EyeZDir
[2];
885 fcmd
[EYE_RESCALE_FACTOR
] = ctx
->_ModelViewInvScale
;
886 RADEON_DB_STATECHANGE( rmesa
, &rmesa
->hw
.eye
);
891 if (ctx
->Light
.Enabled
) {
893 for (p
= 0 ; p
< MAX_LIGHTS
; p
++) {
894 if (ctx
->Light
.Light
[p
].Enabled
) {
895 struct gl_light
*l
= &ctx
->Light
.Light
[p
];
896 GLfloat
*fcmd
= (GLfloat
*)RADEON_DB_STATE( lit
[p
] );
898 if (l
->EyePosition
[3] == 0.0) {
899 COPY_3FV( &fcmd
[LIT_POSITION_X
], l
->_VP_inf_norm
);
900 COPY_3FV( &fcmd
[LIT_DIRECTION_X
], l
->_h_inf_norm
);
901 fcmd
[LIT_POSITION_W
] = 0;
902 fcmd
[LIT_DIRECTION_W
] = 0;
904 COPY_4V( &fcmd
[LIT_POSITION_X
], l
->_Position
);
905 fcmd
[LIT_DIRECTION_X
] = -l
->_NormSpotDirection
[0];
906 fcmd
[LIT_DIRECTION_Y
] = -l
->_NormSpotDirection
[1];
907 fcmd
[LIT_DIRECTION_Z
] = -l
->_NormSpotDirection
[2];
908 fcmd
[LIT_DIRECTION_W
] = 0;
911 RADEON_DB_STATECHANGE( rmesa
, &rmesa
->hw
.lit
[p
] );
917 static void radeonLightfv( struct gl_context
*ctx
, GLenum light
,
918 GLenum pname
, const GLfloat
*params
)
920 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
921 GLint p
= light
- GL_LIGHT0
;
922 struct gl_light
*l
= &ctx
->Light
.Light
[p
];
923 GLfloat
*fcmd
= (GLfloat
*)rmesa
->hw
.lit
[p
].cmd
;
930 update_light_colors( ctx
, p
);
933 case GL_SPOT_DIRECTION
:
934 /* picked up in update_light */
938 /* positions picked up in update_light, but can do flag here */
940 GLuint idx
= TCL_PER_LIGHT_CTL_0
+ p
/2;
942 /* FIXME: Set RANGE_ATTEN only when needed */
944 flag
= RADEON_LIGHT_1_IS_LOCAL
;
946 flag
= RADEON_LIGHT_0_IS_LOCAL
;
948 RADEON_STATECHANGE(rmesa
, tcl
);
949 if (l
->EyePosition
[3] != 0.0F
)
950 rmesa
->hw
.tcl
.cmd
[idx
] |= flag
;
952 rmesa
->hw
.tcl
.cmd
[idx
] &= ~flag
;
956 case GL_SPOT_EXPONENT
:
957 RADEON_STATECHANGE(rmesa
, lit
[p
]);
958 fcmd
[LIT_SPOT_EXPONENT
] = params
[0];
961 case GL_SPOT_CUTOFF
: {
962 GLuint flag
= (p
&1) ? RADEON_LIGHT_1_IS_SPOT
: RADEON_LIGHT_0_IS_SPOT
;
963 GLuint idx
= TCL_PER_LIGHT_CTL_0
+ p
/2;
965 RADEON_STATECHANGE(rmesa
, lit
[p
]);
966 fcmd
[LIT_SPOT_CUTOFF
] = l
->_CosCutoff
;
968 RADEON_STATECHANGE(rmesa
, tcl
);
969 if (l
->SpotCutoff
!= 180.0F
)
970 rmesa
->hw
.tcl
.cmd
[idx
] |= flag
;
972 rmesa
->hw
.tcl
.cmd
[idx
] &= ~flag
;
977 case GL_CONSTANT_ATTENUATION
:
978 RADEON_STATECHANGE(rmesa
, lit
[p
]);
979 fcmd
[LIT_ATTEN_CONST
] = params
[0];
980 if ( params
[0] == 0.0 )
981 fcmd
[LIT_ATTEN_CONST_INV
] = FLT_MAX
;
983 fcmd
[LIT_ATTEN_CONST_INV
] = 1.0 / params
[0];
985 case GL_LINEAR_ATTENUATION
:
986 RADEON_STATECHANGE(rmesa
, lit
[p
]);
987 fcmd
[LIT_ATTEN_LINEAR
] = params
[0];
989 case GL_QUADRATIC_ATTENUATION
:
990 RADEON_STATECHANGE(rmesa
, lit
[p
]);
991 fcmd
[LIT_ATTEN_QUADRATIC
] = params
[0];
997 /* Set RANGE_ATTEN only when needed */
1000 case GL_CONSTANT_ATTENUATION
:
1001 case GL_LINEAR_ATTENUATION
:
1002 case GL_QUADRATIC_ATTENUATION
:
1004 GLuint
*icmd
= (GLuint
*)RADEON_DB_STATE( tcl
);
1005 GLuint idx
= TCL_PER_LIGHT_CTL_0
+ p
/2;
1006 GLuint atten_flag
= ( p
&1 ) ? RADEON_LIGHT_1_ENABLE_RANGE_ATTEN
1007 : RADEON_LIGHT_0_ENABLE_RANGE_ATTEN
;
1008 GLuint atten_const_flag
= ( p
&1 ) ? RADEON_LIGHT_1_CONSTANT_RANGE_ATTEN
1009 : RADEON_LIGHT_0_CONSTANT_RANGE_ATTEN
;
1011 if ( l
->EyePosition
[3] == 0.0F
||
1012 ( ( fcmd
[LIT_ATTEN_CONST
] == 0.0 || fcmd
[LIT_ATTEN_CONST
] == 1.0 ) &&
1013 fcmd
[LIT_ATTEN_QUADRATIC
] == 0.0 && fcmd
[LIT_ATTEN_LINEAR
] == 0.0 ) ) {
1014 /* Disable attenuation */
1015 icmd
[idx
] &= ~atten_flag
;
1017 if ( fcmd
[LIT_ATTEN_QUADRATIC
] == 0.0 && fcmd
[LIT_ATTEN_LINEAR
] == 0.0 ) {
1018 /* Enable only constant portion of attenuation calculation */
1019 icmd
[idx
] |= ( atten_flag
| atten_const_flag
);
1021 /* Enable full attenuation calculation */
1022 icmd
[idx
] &= ~atten_const_flag
;
1023 icmd
[idx
] |= atten_flag
;
1027 RADEON_DB_STATECHANGE( rmesa
, &rmesa
->hw
.tcl
);
1038 static void radeonLightModelfv( struct gl_context
*ctx
, GLenum pname
,
1039 const GLfloat
*param
)
1041 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
1044 case GL_LIGHT_MODEL_AMBIENT
:
1045 update_global_ambient( ctx
);
1048 case GL_LIGHT_MODEL_LOCAL_VIEWER
:
1049 RADEON_STATECHANGE( rmesa
, tcl
);
1050 if (ctx
->Light
.Model
.LocalViewer
)
1051 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] |= RADEON_LOCAL_VIEWER
;
1053 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] &= ~RADEON_LOCAL_VIEWER
;
1056 case GL_LIGHT_MODEL_TWO_SIDE
:
1057 RADEON_STATECHANGE( rmesa
, tcl
);
1058 if (ctx
->Light
.Model
.TwoSide
)
1059 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] |= RADEON_LIGHT_TWOSIDE
;
1061 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] &= ~RADEON_LIGHT_TWOSIDE
;
1063 check_twoside_fallback( ctx
);
1065 if (rmesa
->radeon
.TclFallback
) {
1066 radeonChooseRenderState( ctx
);
1067 radeonChooseVertexState( ctx
);
1071 case GL_LIGHT_MODEL_COLOR_CONTROL
:
1072 radeonUpdateSpecular(ctx
);
1080 static void radeonShadeModel( struct gl_context
*ctx
, GLenum mode
)
1082 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
1083 GLuint s
= rmesa
->hw
.set
.cmd
[SET_SE_CNTL
];
1085 s
&= ~(RADEON_DIFFUSE_SHADE_MASK
|
1086 RADEON_ALPHA_SHADE_MASK
|
1087 RADEON_SPECULAR_SHADE_MASK
|
1088 RADEON_FOG_SHADE_MASK
);
1092 s
|= (RADEON_DIFFUSE_SHADE_FLAT
|
1093 RADEON_ALPHA_SHADE_FLAT
|
1094 RADEON_SPECULAR_SHADE_FLAT
|
1095 RADEON_FOG_SHADE_FLAT
);
1098 s
|= (RADEON_DIFFUSE_SHADE_GOURAUD
|
1099 RADEON_ALPHA_SHADE_GOURAUD
|
1100 RADEON_SPECULAR_SHADE_GOURAUD
|
1101 RADEON_FOG_SHADE_GOURAUD
);
1107 if ( rmesa
->hw
.set
.cmd
[SET_SE_CNTL
] != s
) {
1108 RADEON_STATECHANGE( rmesa
, set
);
1109 rmesa
->hw
.set
.cmd
[SET_SE_CNTL
] = s
;
1114 /* =============================================================
1118 static void radeonClipPlane( struct gl_context
*ctx
, GLenum plane
, const GLfloat
*eq
)
1120 GLint p
= (GLint
) plane
- (GLint
) GL_CLIP_PLANE0
;
1121 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
1122 GLint
*ip
= (GLint
*)ctx
->Transform
._ClipUserPlane
[p
];
1124 RADEON_STATECHANGE( rmesa
, ucp
[p
] );
1125 rmesa
->hw
.ucp
[p
].cmd
[UCP_X
] = ip
[0];
1126 rmesa
->hw
.ucp
[p
].cmd
[UCP_Y
] = ip
[1];
1127 rmesa
->hw
.ucp
[p
].cmd
[UCP_Z
] = ip
[2];
1128 rmesa
->hw
.ucp
[p
].cmd
[UCP_W
] = ip
[3];
1131 static void radeonUpdateClipPlanes( struct gl_context
*ctx
)
1133 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
1136 for (p
= 0; p
< ctx
->Const
.MaxClipPlanes
; p
++) {
1137 if (ctx
->Transform
.ClipPlanesEnabled
& (1 << p
)) {
1138 GLint
*ip
= (GLint
*)ctx
->Transform
._ClipUserPlane
[p
];
1140 RADEON_STATECHANGE( rmesa
, ucp
[p
] );
1141 rmesa
->hw
.ucp
[p
].cmd
[UCP_X
] = ip
[0];
1142 rmesa
->hw
.ucp
[p
].cmd
[UCP_Y
] = ip
[1];
1143 rmesa
->hw
.ucp
[p
].cmd
[UCP_Z
] = ip
[2];
1144 rmesa
->hw
.ucp
[p
].cmd
[UCP_W
] = ip
[3];
1150 /* =============================================================
1155 radeonStencilFuncSeparate( struct gl_context
*ctx
, GLenum face
, GLenum func
,
1156 GLint ref
, GLuint mask
)
1158 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
1159 GLuint refmask
= (((ctx
->Stencil
.Ref
[0] & 0xff) << RADEON_STENCIL_REF_SHIFT
) |
1160 ((ctx
->Stencil
.ValueMask
[0] & 0xff) << RADEON_STENCIL_MASK_SHIFT
));
1162 RADEON_STATECHANGE( rmesa
, ctx
);
1163 RADEON_STATECHANGE( rmesa
, msk
);
1165 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] &= ~RADEON_STENCIL_TEST_MASK
;
1166 rmesa
->hw
.msk
.cmd
[MSK_RB3D_STENCILREFMASK
] &= ~(RADEON_STENCIL_REF_MASK
|
1167 RADEON_STENCIL_VALUE_MASK
);
1169 switch ( ctx
->Stencil
.Function
[0] ) {
1171 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_TEST_NEVER
;
1174 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_TEST_LESS
;
1177 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_TEST_EQUAL
;
1180 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_TEST_LEQUAL
;
1183 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_TEST_GREATER
;
1186 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_TEST_NEQUAL
;
1189 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_TEST_GEQUAL
;
1192 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_TEST_ALWAYS
;
1196 rmesa
->hw
.msk
.cmd
[MSK_RB3D_STENCILREFMASK
] |= refmask
;
1200 radeonStencilMaskSeparate( struct gl_context
*ctx
, GLenum face
, GLuint mask
)
1202 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
1204 RADEON_STATECHANGE( rmesa
, msk
);
1205 rmesa
->hw
.msk
.cmd
[MSK_RB3D_STENCILREFMASK
] &= ~RADEON_STENCIL_WRITE_MASK
;
1206 rmesa
->hw
.msk
.cmd
[MSK_RB3D_STENCILREFMASK
] |=
1207 ((ctx
->Stencil
.WriteMask
[0] & 0xff) << RADEON_STENCIL_WRITEMASK_SHIFT
);
1210 static void radeonStencilOpSeparate( struct gl_context
*ctx
, GLenum face
, GLenum fail
,
1211 GLenum zfail
, GLenum zpass
)
1213 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
1215 /* radeon 7200 have stencil bug, DEC and INC_WRAP will actually both do DEC_WRAP,
1216 and DEC_WRAP (and INVERT) will do INVERT. No way to get correct INC_WRAP and DEC,
1217 but DEC_WRAP can be fixed by using DEC and INC_WRAP at least use INC. */
1219 GLuint tempRADEON_STENCIL_FAIL_DEC_WRAP
;
1220 GLuint tempRADEON_STENCIL_FAIL_INC_WRAP
;
1221 GLuint tempRADEON_STENCIL_ZFAIL_DEC_WRAP
;
1222 GLuint tempRADEON_STENCIL_ZFAIL_INC_WRAP
;
1223 GLuint tempRADEON_STENCIL_ZPASS_DEC_WRAP
;
1224 GLuint tempRADEON_STENCIL_ZPASS_INC_WRAP
;
1226 if (rmesa
->radeon
.radeonScreen
->chip_flags
& RADEON_CHIPSET_BROKEN_STENCIL
) {
1227 tempRADEON_STENCIL_FAIL_DEC_WRAP
= RADEON_STENCIL_FAIL_DEC
;
1228 tempRADEON_STENCIL_FAIL_INC_WRAP
= RADEON_STENCIL_FAIL_INC
;
1229 tempRADEON_STENCIL_ZFAIL_DEC_WRAP
= RADEON_STENCIL_ZFAIL_DEC
;
1230 tempRADEON_STENCIL_ZFAIL_INC_WRAP
= RADEON_STENCIL_ZFAIL_INC
;
1231 tempRADEON_STENCIL_ZPASS_DEC_WRAP
= RADEON_STENCIL_ZPASS_DEC
;
1232 tempRADEON_STENCIL_ZPASS_INC_WRAP
= RADEON_STENCIL_ZPASS_INC
;
1235 tempRADEON_STENCIL_FAIL_DEC_WRAP
= RADEON_STENCIL_FAIL_DEC_WRAP
;
1236 tempRADEON_STENCIL_FAIL_INC_WRAP
= RADEON_STENCIL_FAIL_INC_WRAP
;
1237 tempRADEON_STENCIL_ZFAIL_DEC_WRAP
= RADEON_STENCIL_ZFAIL_DEC_WRAP
;
1238 tempRADEON_STENCIL_ZFAIL_INC_WRAP
= RADEON_STENCIL_ZFAIL_INC_WRAP
;
1239 tempRADEON_STENCIL_ZPASS_DEC_WRAP
= RADEON_STENCIL_ZPASS_DEC_WRAP
;
1240 tempRADEON_STENCIL_ZPASS_INC_WRAP
= RADEON_STENCIL_ZPASS_INC_WRAP
;
1243 RADEON_STATECHANGE( rmesa
, ctx
);
1244 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] &= ~(RADEON_STENCIL_FAIL_MASK
|
1245 RADEON_STENCIL_ZFAIL_MASK
|
1246 RADEON_STENCIL_ZPASS_MASK
);
1248 switch ( ctx
->Stencil
.FailFunc
[0] ) {
1250 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_FAIL_KEEP
;
1253 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_FAIL_ZERO
;
1256 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_FAIL_REPLACE
;
1259 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_FAIL_INC
;
1262 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_FAIL_DEC
;
1265 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= tempRADEON_STENCIL_FAIL_INC_WRAP
;
1268 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= tempRADEON_STENCIL_FAIL_DEC_WRAP
;
1271 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_FAIL_INVERT
;
1275 switch ( ctx
->Stencil
.ZFailFunc
[0] ) {
1277 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_ZFAIL_KEEP
;
1280 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_ZFAIL_ZERO
;
1283 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_ZFAIL_REPLACE
;
1286 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_ZFAIL_INC
;
1289 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_ZFAIL_DEC
;
1292 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= tempRADEON_STENCIL_ZFAIL_INC_WRAP
;
1295 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= tempRADEON_STENCIL_ZFAIL_DEC_WRAP
;
1298 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_ZFAIL_INVERT
;
1302 switch ( ctx
->Stencil
.ZPassFunc
[0] ) {
1304 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_ZPASS_KEEP
;
1307 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_ZPASS_ZERO
;
1310 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_ZPASS_REPLACE
;
1313 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_ZPASS_INC
;
1316 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_ZPASS_DEC
;
1319 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= tempRADEON_STENCIL_ZPASS_INC_WRAP
;
1322 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= tempRADEON_STENCIL_ZPASS_DEC_WRAP
;
1325 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= RADEON_STENCIL_ZPASS_INVERT
;
1332 /* =============================================================
1333 * Window position and viewport transformation
1337 * To correctly position primitives:
1339 #define SUBPIXEL_X 0.125
1340 #define SUBPIXEL_Y 0.125
1344 * Called when window size or position changes or viewport or depth range
1345 * state is changed. We update the hardware viewport state here.
1347 void radeonUpdateWindow( struct gl_context
*ctx
)
1349 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
1350 __DRIdrawable
*dPriv
= radeon_get_drawable(&rmesa
->radeon
);
1351 GLfloat xoffset
= 0.0;
1352 GLfloat yoffset
= dPriv
? (GLfloat
) dPriv
->h
: 0;
1353 const GLfloat
*v
= ctx
->Viewport
._WindowMap
.m
;
1354 const GLboolean render_to_fbo
= (ctx
->DrawBuffer
? _mesa_is_user_fbo(ctx
->DrawBuffer
) : 0);
1355 const GLfloat depthScale
= 1.0F
/ ctx
->DrawBuffer
->_DepthMaxF
;
1356 GLfloat y_scale
, y_bias
;
1358 if (render_to_fbo
) {
1366 float_ui32_type sx
= { v
[MAT_SX
] };
1367 float_ui32_type tx
= { v
[MAT_TX
] + xoffset
+ SUBPIXEL_X
};
1368 float_ui32_type sy
= { v
[MAT_SY
] * y_scale
};
1369 float_ui32_type ty
= { (v
[MAT_TY
] * y_scale
) + y_bias
+ SUBPIXEL_Y
};
1370 float_ui32_type sz
= { v
[MAT_SZ
] * depthScale
};
1371 float_ui32_type tz
= { v
[MAT_TZ
] * depthScale
};
1373 RADEON_STATECHANGE( rmesa
, vpt
);
1375 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_XSCALE
] = sx
.ui32
;
1376 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_XOFFSET
] = tx
.ui32
;
1377 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_YSCALE
] = sy
.ui32
;
1378 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_YOFFSET
] = ty
.ui32
;
1379 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_ZSCALE
] = sz
.ui32
;
1380 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_ZOFFSET
] = tz
.ui32
;
1384 static void radeonViewport( struct gl_context
*ctx
, GLint x
, GLint y
,
1385 GLsizei width
, GLsizei height
)
1387 /* Don't pipeline viewport changes, conflict with window offset
1388 * setting below. Could apply deltas to rescue pipelined viewport
1389 * values, or keep the originals hanging around.
1391 radeonUpdateWindow( ctx
);
1393 radeon_viewport(ctx
, x
, y
, width
, height
);
1396 static void radeonDepthRange( struct gl_context
*ctx
, GLclampd nearval
,
1399 radeonUpdateWindow( ctx
);
1402 void radeonUpdateViewportOffset( struct gl_context
*ctx
)
1404 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
1405 __DRIdrawable
*dPriv
= radeon_get_drawable(&rmesa
->radeon
);
1406 GLfloat xoffset
= 0.0;
1407 GLfloat yoffset
= (GLfloat
)dPriv
->h
;
1408 const GLfloat
*v
= ctx
->Viewport
._WindowMap
.m
;
1413 tx
.f
= v
[MAT_TX
] + xoffset
+ SUBPIXEL_X
;
1414 ty
.f
= (- v
[MAT_TY
]) + yoffset
+ SUBPIXEL_Y
;
1416 if ( rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_XOFFSET
] != tx
.ui32
||
1417 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_YOFFSET
] != ty
.ui32
)
1419 /* Note: this should also modify whatever data the context reset
1422 RADEON_STATECHANGE( rmesa
, vpt
);
1423 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_XOFFSET
] = tx
.ui32
;
1424 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_YOFFSET
] = ty
.ui32
;
1426 /* update polygon stipple x/y screen offset */
1429 GLuint m
= rmesa
->hw
.msc
.cmd
[MSC_RE_MISC
];
1431 m
&= ~(RADEON_STIPPLE_X_OFFSET_MASK
|
1432 RADEON_STIPPLE_Y_OFFSET_MASK
);
1434 /* add magic offsets, then invert */
1435 stx
= 31 - ((-1) & RADEON_STIPPLE_COORD_MASK
);
1436 sty
= 31 - ((dPriv
->h
- 1)
1437 & RADEON_STIPPLE_COORD_MASK
);
1439 m
|= ((stx
<< RADEON_STIPPLE_X_OFFSET_SHIFT
) |
1440 (sty
<< RADEON_STIPPLE_Y_OFFSET_SHIFT
));
1442 if ( rmesa
->hw
.msc
.cmd
[MSC_RE_MISC
] != m
) {
1443 RADEON_STATECHANGE( rmesa
, msc
);
1444 rmesa
->hw
.msc
.cmd
[MSC_RE_MISC
] = m
;
1449 radeonUpdateScissor( ctx
);
1454 /* =============================================================
1458 static void radeonRenderMode( struct gl_context
*ctx
, GLenum mode
)
1460 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
1461 FALLBACK( rmesa
, RADEON_FALLBACK_RENDER_MODE
, (mode
!= GL_RENDER
) );
1465 static GLuint radeon_rop_tab
[] = {
1468 RADEON_ROP_AND_REVERSE
,
1470 RADEON_ROP_AND_INVERTED
,
1477 RADEON_ROP_OR_REVERSE
,
1478 RADEON_ROP_COPY_INVERTED
,
1479 RADEON_ROP_OR_INVERTED
,
1484 static void radeonLogicOpCode( struct gl_context
*ctx
, GLenum opcode
)
1486 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
1487 GLuint rop
= (GLuint
)opcode
- GL_CLEAR
;
1491 RADEON_STATECHANGE( rmesa
, msk
);
1492 rmesa
->hw
.msk
.cmd
[MSK_RB3D_ROPCNTL
] = radeon_rop_tab
[rop
];
1495 /* =============================================================
1496 * State enable/disable
1499 static void radeonEnable( struct gl_context
*ctx
, GLenum cap
, GLboolean state
)
1501 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
1504 if ( RADEON_DEBUG
& RADEON_STATE
)
1505 fprintf( stderr
, "%s( %s = %s )\n", __FUNCTION__
,
1506 _mesa_lookup_enum_by_nr( cap
),
1507 state
? "GL_TRUE" : "GL_FALSE" );
1510 /* Fast track this one...
1518 RADEON_STATECHANGE( rmesa
, ctx
);
1520 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] |= RADEON_ALPHA_TEST_ENABLE
;
1522 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] &= ~RADEON_ALPHA_TEST_ENABLE
;
1527 RADEON_STATECHANGE( rmesa
, ctx
);
1529 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= RADEON_ALPHA_BLEND_ENABLE
;
1531 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] &= ~RADEON_ALPHA_BLEND_ENABLE
;
1533 if ( (ctx
->Color
.ColorLogicOpEnabled
|| (ctx
->Color
.BlendEnabled
1534 && ctx
->Color
.Blend
[0].EquationRGB
== GL_LOGIC_OP
)) ) {
1535 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= RADEON_ROP_ENABLE
;
1537 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] &= ~RADEON_ROP_ENABLE
;
1540 /* Catch a possible fallback:
1543 ctx
->Driver
.BlendEquationSeparate( ctx
,
1544 ctx
->Color
.Blend
[0].EquationRGB
,
1545 ctx
->Color
.Blend
[0].EquationA
);
1546 ctx
->Driver
.BlendFuncSeparate( ctx
, ctx
->Color
.Blend
[0].SrcRGB
,
1547 ctx
->Color
.Blend
[0].DstRGB
,
1548 ctx
->Color
.Blend
[0].SrcA
,
1549 ctx
->Color
.Blend
[0].DstA
);
1552 FALLBACK( rmesa
, RADEON_FALLBACK_BLEND_FUNC
, GL_FALSE
);
1553 FALLBACK( rmesa
, RADEON_FALLBACK_BLEND_EQ
, GL_FALSE
);
1557 case GL_CLIP_PLANE0
:
1558 case GL_CLIP_PLANE1
:
1559 case GL_CLIP_PLANE2
:
1560 case GL_CLIP_PLANE3
:
1561 case GL_CLIP_PLANE4
:
1562 case GL_CLIP_PLANE5
:
1563 p
= cap
-GL_CLIP_PLANE0
;
1564 RADEON_STATECHANGE( rmesa
, tcl
);
1566 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] |= (RADEON_UCP_ENABLE_0
<<p
);
1567 radeonClipPlane( ctx
, cap
, NULL
);
1570 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] &= ~(RADEON_UCP_ENABLE_0
<<p
);
1574 case GL_COLOR_MATERIAL
:
1575 radeonColorMaterial( ctx
, 0, 0 );
1576 radeonUpdateMaterial( ctx
);
1580 radeonCullFace( ctx
, 0 );
1584 RADEON_STATECHANGE(rmesa
, ctx
);
1586 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= RADEON_Z_ENABLE
;
1588 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] &= ~RADEON_Z_ENABLE
;
1593 RADEON_STATECHANGE(rmesa
, ctx
);
1595 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= RADEON_DITHER_ENABLE
;
1596 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] &= ~rmesa
->radeon
.state
.color
.roundEnable
;
1598 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] &= ~RADEON_DITHER_ENABLE
;
1599 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= rmesa
->radeon
.state
.color
.roundEnable
;
1604 RADEON_STATECHANGE(rmesa
, ctx
);
1606 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] |= RADEON_FOG_ENABLE
;
1607 radeonFogfv( ctx
, GL_FOG_MODE
, NULL
);
1609 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] &= ~RADEON_FOG_ENABLE
;
1610 RADEON_STATECHANGE(rmesa
, tcl
);
1611 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] &= ~RADEON_TCL_FOG_MASK
;
1613 radeonUpdateSpecular( ctx
); /* for PK_SPEC */
1614 _mesa_allow_light_in_model( ctx
, !state
);
1625 RADEON_STATECHANGE(rmesa
, tcl
);
1626 p
= cap
- GL_LIGHT0
;
1628 flag
= (RADEON_LIGHT_1_ENABLE
|
1629 RADEON_LIGHT_1_ENABLE_AMBIENT
|
1630 RADEON_LIGHT_1_ENABLE_SPECULAR
);
1632 flag
= (RADEON_LIGHT_0_ENABLE
|
1633 RADEON_LIGHT_0_ENABLE_AMBIENT
|
1634 RADEON_LIGHT_0_ENABLE_SPECULAR
);
1637 rmesa
->hw
.tcl
.cmd
[p
/2 + TCL_PER_LIGHT_CTL_0
] |= flag
;
1639 rmesa
->hw
.tcl
.cmd
[p
/2 + TCL_PER_LIGHT_CTL_0
] &= ~flag
;
1643 update_light_colors( ctx
, p
);
1647 RADEON_STATECHANGE(rmesa
, tcl
);
1648 radeonUpdateSpecular(ctx
);
1649 check_twoside_fallback( ctx
);
1652 case GL_LINE_SMOOTH
:
1653 RADEON_STATECHANGE( rmesa
, ctx
);
1655 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] |= RADEON_ANTI_ALIAS_LINE
;
1657 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] &= ~RADEON_ANTI_ALIAS_LINE
;
1661 case GL_LINE_STIPPLE
:
1662 RADEON_STATECHANGE( rmesa
, ctx
);
1664 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] |= RADEON_PATTERN_ENABLE
;
1666 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] &= ~RADEON_PATTERN_ENABLE
;
1670 case GL_COLOR_LOGIC_OP
:
1671 RADEON_STATECHANGE( rmesa
, ctx
);
1672 if ( (ctx
->Color
.ColorLogicOpEnabled
|| (ctx
->Color
.BlendEnabled
1673 && ctx
->Color
.Blend
[0].EquationRGB
== GL_LOGIC_OP
)) ) {
1674 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= RADEON_ROP_ENABLE
;
1676 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] &= ~RADEON_ROP_ENABLE
;
1681 RADEON_STATECHANGE( rmesa
, tcl
);
1683 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] |= RADEON_NORMALIZE_NORMALS
;
1685 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] &= ~RADEON_NORMALIZE_NORMALS
;
1689 case GL_POLYGON_OFFSET_POINT
:
1690 RADEON_STATECHANGE( rmesa
, set
);
1692 rmesa
->hw
.set
.cmd
[SET_SE_CNTL
] |= RADEON_ZBIAS_ENABLE_POINT
;
1694 rmesa
->hw
.set
.cmd
[SET_SE_CNTL
] &= ~RADEON_ZBIAS_ENABLE_POINT
;
1698 case GL_POLYGON_OFFSET_LINE
:
1699 RADEON_STATECHANGE( rmesa
, set
);
1701 rmesa
->hw
.set
.cmd
[SET_SE_CNTL
] |= RADEON_ZBIAS_ENABLE_LINE
;
1703 rmesa
->hw
.set
.cmd
[SET_SE_CNTL
] &= ~RADEON_ZBIAS_ENABLE_LINE
;
1707 case GL_POLYGON_OFFSET_FILL
:
1708 RADEON_STATECHANGE( rmesa
, set
);
1710 rmesa
->hw
.set
.cmd
[SET_SE_CNTL
] |= RADEON_ZBIAS_ENABLE_TRI
;
1712 rmesa
->hw
.set
.cmd
[SET_SE_CNTL
] &= ~RADEON_ZBIAS_ENABLE_TRI
;
1716 case GL_POLYGON_SMOOTH
:
1717 RADEON_STATECHANGE( rmesa
, ctx
);
1719 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] |= RADEON_ANTI_ALIAS_POLY
;
1721 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] &= ~RADEON_ANTI_ALIAS_POLY
;
1725 case GL_POLYGON_STIPPLE
:
1726 RADEON_STATECHANGE(rmesa
, ctx
);
1728 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] |= RADEON_STIPPLE_ENABLE
;
1730 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] &= ~RADEON_STIPPLE_ENABLE
;
1734 case GL_RESCALE_NORMAL_EXT
: {
1735 GLboolean tmp
= ctx
->_NeedEyeCoords
? state
: !state
;
1736 RADEON_STATECHANGE( rmesa
, tcl
);
1738 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] |= RADEON_RESCALE_NORMALS
;
1740 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] &= ~RADEON_RESCALE_NORMALS
;
1745 case GL_SCISSOR_TEST
:
1746 radeon_firevertices(&rmesa
->radeon
);
1747 rmesa
->radeon
.state
.scissor
.enabled
= state
;
1748 radeonUpdateScissor( ctx
);
1751 case GL_STENCIL_TEST
:
1753 GLboolean hw_stencil
= GL_FALSE
;
1754 if (ctx
->DrawBuffer
) {
1755 struct radeon_renderbuffer
*rrbStencil
1756 = radeon_get_renderbuffer(ctx
->DrawBuffer
, BUFFER_STENCIL
);
1757 hw_stencil
= (rrbStencil
&& rrbStencil
->bo
);
1761 RADEON_STATECHANGE( rmesa
, ctx
);
1763 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= RADEON_STENCIL_ENABLE
;
1765 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] &= ~RADEON_STENCIL_ENABLE
;
1768 FALLBACK( rmesa
, RADEON_FALLBACK_STENCIL
, state
);
1773 case GL_TEXTURE_GEN_Q
:
1774 case GL_TEXTURE_GEN_R
:
1775 case GL_TEXTURE_GEN_S
:
1776 case GL_TEXTURE_GEN_T
:
1777 /* Picked up in radeonUpdateTextureState.
1779 rmesa
->recheck_texgen
[ctx
->Texture
.CurrentUnit
] = GL_TRUE
;
1782 case GL_COLOR_SUM_EXT
:
1783 radeonUpdateSpecular ( ctx
);
1792 static void radeonLightingSpaceChange( struct gl_context
*ctx
)
1794 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
1796 RADEON_STATECHANGE( rmesa
, tcl
);
1798 if (RADEON_DEBUG
& RADEON_STATE
)
1799 fprintf(stderr
, "%s %d BEFORE %x\n", __FUNCTION__
, ctx
->_NeedEyeCoords
,
1800 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
]);
1802 if (ctx
->_NeedEyeCoords
)
1803 tmp
= ctx
->Transform
.RescaleNormals
;
1805 tmp
= !ctx
->Transform
.RescaleNormals
;
1808 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] |= RADEON_RESCALE_NORMALS
;
1810 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] &= ~RADEON_RESCALE_NORMALS
;
1813 if (RADEON_DEBUG
& RADEON_STATE
)
1814 fprintf(stderr
, "%s %d AFTER %x\n", __FUNCTION__
, ctx
->_NeedEyeCoords
,
1815 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
]);
1818 /* =============================================================
1819 * Deferred state management - matrices, textures, other?
1823 void radeonUploadTexMatrix( r100ContextPtr rmesa
,
1824 int unit
, GLboolean swapcols
)
1826 /* Here's how this works: on r100, only 3 tex coords can be submitted, so the
1827 vector looks like this probably: (s t r|q 0) (not sure if the last coord
1828 is hardwired to 0, could be 1 too). Interestingly, it actually looks like
1829 texgen generates all 4 coords, at least tests with projtex indicated that.
1830 So: if we need the q coord in the end (solely determined by the texture
1831 target, i.e. 2d / 1d / texrect targets) we swap the third and 4th row.
1832 Additionally, if we don't have texgen but 4 tex coords submitted, we swap
1833 column 3 and 4 (for the 2d / 1d / texrect targets) since the q coord
1834 will get submitted in the "wrong", i.e. 3rd, slot.
1835 If an app submits 3 coords for 2d targets, we assume it is saving on vertex
1836 size and using the texture matrix to swap the r and q coords around (ut2k3
1837 does exactly that), so we don't need the 3rd / 4th column swap - still need
1838 the 3rd / 4th row swap of course. This will potentially break for apps which
1839 use TexCoord3x just for fun. Additionally, it will never work if an app uses
1840 an "advanced" texture matrix and relies on all 4 texcoord inputs to generate
1841 the maximum needed 3. This seems impossible to do with hw tcl on r100, and
1842 incredibly hard to detect so we can't just fallback in such a case. Assume
1843 it never happens... - rs
1846 int idx
= TEXMAT_0
+ unit
;
1847 float *dest
= ((float *)RADEON_DB_STATE( mat
[idx
] )) + MAT_ELT_0
;
1849 struct gl_texture_unit tUnit
= rmesa
->radeon
.glCtx
.Texture
.Unit
[unit
];
1850 GLfloat
*src
= rmesa
->tmpmat
[unit
].m
;
1852 rmesa
->TexMatColSwap
&= ~(1 << unit
);
1853 if ((tUnit
._ReallyEnabled
& (TEXTURE_3D_BIT
| TEXTURE_CUBE_BIT
)) == 0) {
1855 rmesa
->TexMatColSwap
|= 1 << unit
;
1856 /* attention some elems are swapped 2 times! */
1869 /* those last 4 are probably never used */
1876 for (i
= 0; i
< 2; i
++) {
1880 *dest
++ = src
[i
+12];
1882 for (i
= 3; i
>= 2; i
--) {
1886 *dest
++ = src
[i
+12];
1891 for (i
= 0 ; i
< 4 ; i
++) {
1895 *dest
++ = src
[i
+12];
1899 RADEON_DB_STATECHANGE( rmesa
, &rmesa
->hw
.mat
[idx
] );
1903 static void upload_matrix( r100ContextPtr rmesa
, GLfloat
*src
, int idx
)
1905 float *dest
= ((float *)RADEON_DB_STATE( mat
[idx
] ))+MAT_ELT_0
;
1909 for (i
= 0 ; i
< 4 ; i
++) {
1913 *dest
++ = src
[i
+12];
1916 RADEON_DB_STATECHANGE( rmesa
, &rmesa
->hw
.mat
[idx
] );
1919 static void upload_matrix_t( r100ContextPtr rmesa
, GLfloat
*src
, int idx
)
1921 float *dest
= ((float *)RADEON_DB_STATE( mat
[idx
] ))+MAT_ELT_0
;
1922 memcpy(dest
, src
, 16*sizeof(float));
1923 RADEON_DB_STATECHANGE( rmesa
, &rmesa
->hw
.mat
[idx
] );
1927 static void update_texturematrix( struct gl_context
*ctx
)
1929 r100ContextPtr rmesa
= R100_CONTEXT( ctx
);
1930 GLuint tpc
= rmesa
->hw
.tcl
.cmd
[TCL_TEXTURE_PROC_CTL
];
1931 GLuint vs
= rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
];
1933 GLuint texMatEnabled
= 0;
1934 rmesa
->NeedTexMatrix
= 0;
1935 rmesa
->TexMatColSwap
= 0;
1937 for (unit
= 0 ; unit
< ctx
->Const
.MaxTextureUnits
; unit
++) {
1938 if (ctx
->Texture
.Unit
[unit
]._ReallyEnabled
) {
1939 GLboolean needMatrix
= GL_FALSE
;
1940 if (ctx
->TextureMatrixStack
[unit
].Top
->type
!= MATRIX_IDENTITY
) {
1941 needMatrix
= GL_TRUE
;
1942 texMatEnabled
|= (RADEON_TEXGEN_TEXMAT_0_ENABLE
|
1943 RADEON_TEXMAT_0_ENABLE
) << unit
;
1945 if (rmesa
->TexGenEnabled
& (RADEON_TEXMAT_0_ENABLE
<< unit
)) {
1946 /* Need to preconcatenate any active texgen
1947 * obj/eyeplane matrices:
1949 _math_matrix_mul_matrix( &rmesa
->tmpmat
[unit
],
1950 ctx
->TextureMatrixStack
[unit
].Top
,
1951 &rmesa
->TexGenMatrix
[unit
] );
1954 _math_matrix_copy( &rmesa
->tmpmat
[unit
],
1955 ctx
->TextureMatrixStack
[unit
].Top
);
1958 else if (rmesa
->TexGenEnabled
& (RADEON_TEXMAT_0_ENABLE
<< unit
)) {
1959 _math_matrix_copy( &rmesa
->tmpmat
[unit
], &rmesa
->TexGenMatrix
[unit
] );
1960 needMatrix
= GL_TRUE
;
1963 rmesa
->NeedTexMatrix
|= 1 << unit
;
1964 radeonUploadTexMatrix( rmesa
, unit
,
1965 !ctx
->Texture
.Unit
[unit
].TexGenEnabled
);
1970 tpc
= (texMatEnabled
| rmesa
->TexGenEnabled
);
1972 /* TCL_TEX_COMPUTED_x is TCL_TEX_INPUT_x | 0x8 */
1973 vs
&= ~((RADEON_TCL_TEX_COMPUTED_TEX_0
<< RADEON_TCL_TEX_0_OUTPUT_SHIFT
) |
1974 (RADEON_TCL_TEX_COMPUTED_TEX_0
<< RADEON_TCL_TEX_1_OUTPUT_SHIFT
) |
1975 (RADEON_TCL_TEX_COMPUTED_TEX_0
<< RADEON_TCL_TEX_2_OUTPUT_SHIFT
));
1977 vs
|= (((tpc
& RADEON_TEXGEN_TEXMAT_0_ENABLE
) <<
1978 (RADEON_TCL_TEX_0_OUTPUT_SHIFT
+ 3)) |
1979 ((tpc
& RADEON_TEXGEN_TEXMAT_1_ENABLE
) <<
1980 (RADEON_TCL_TEX_1_OUTPUT_SHIFT
+ 2)) |
1981 ((tpc
& RADEON_TEXGEN_TEXMAT_2_ENABLE
) <<
1982 (RADEON_TCL_TEX_2_OUTPUT_SHIFT
+ 1)));
1984 if (tpc
!= rmesa
->hw
.tcl
.cmd
[TCL_TEXTURE_PROC_CTL
] ||
1985 vs
!= rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
]) {
1987 RADEON_STATECHANGE(rmesa
, tcl
);
1988 rmesa
->hw
.tcl
.cmd
[TCL_TEXTURE_PROC_CTL
] = tpc
;
1989 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
] = vs
;
1993 static GLboolean
r100ValidateBuffers(struct gl_context
*ctx
)
1995 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
1996 struct radeon_renderbuffer
*rrb
;
1999 radeon_cs_space_reset_bos(rmesa
->radeon
.cmdbuf
.cs
);
2001 rrb
= radeon_get_colorbuffer(&rmesa
->radeon
);
2003 if (rrb
&& rrb
->bo
) {
2004 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
, rrb
->bo
,
2005 0, RADEON_GEM_DOMAIN_VRAM
);
2009 rrb
= radeon_get_depthbuffer(&rmesa
->radeon
);
2011 if (rrb
&& rrb
->bo
) {
2012 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
, rrb
->bo
,
2013 0, RADEON_GEM_DOMAIN_VRAM
);
2016 for (i
= 0; i
< ctx
->Const
.FragmentProgram
.MaxTextureImageUnits
; ++i
) {
2019 if (!ctx
->Texture
.Unit
[i
]._ReallyEnabled
)
2022 t
= rmesa
->state
.texture
.unit
[i
].texobj
;
2026 if (t
->image_override
&& t
->bo
)
2027 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
, t
->bo
,
2028 RADEON_GEM_DOMAIN_GTT
| RADEON_GEM_DOMAIN_VRAM
, 0);
2030 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
, t
->mt
->bo
,
2031 RADEON_GEM_DOMAIN_GTT
| RADEON_GEM_DOMAIN_VRAM
, 0);
2034 ret
= radeon_cs_space_check_with_bo(rmesa
->radeon
.cmdbuf
.cs
, first_elem(&rmesa
->radeon
.dma
.reserved
)->bo
, RADEON_GEM_DOMAIN_GTT
, 0);
2040 GLboolean
radeonValidateState( struct gl_context
*ctx
)
2042 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
2043 GLuint new_state
= rmesa
->radeon
.NewGLState
;
2045 if (new_state
& _NEW_BUFFERS
) {
2046 _mesa_update_framebuffer(ctx
);
2047 /* this updates the DrawBuffer's Width/Height if it's a FBO */
2048 _mesa_update_draw_buffer_bounds(ctx
);
2049 RADEON_STATECHANGE(rmesa
, ctx
);
2052 if (new_state
& _NEW_TEXTURE
) {
2053 radeonUpdateTextureState( ctx
);
2054 new_state
|= rmesa
->radeon
.NewGLState
; /* may add TEXTURE_MATRIX */
2057 /* we need to do a space check here */
2058 if (!r100ValidateBuffers(ctx
))
2061 /* Need an event driven matrix update?
2063 if (new_state
& (_NEW_MODELVIEW
|_NEW_PROJECTION
))
2064 upload_matrix( rmesa
, ctx
->_ModelProjectMatrix
.m
, MODEL_PROJ
);
2066 /* Need these for lighting (shouldn't upload otherwise)
2068 if (new_state
& (_NEW_MODELVIEW
)) {
2069 upload_matrix( rmesa
, ctx
->ModelviewMatrixStack
.Top
->m
, MODEL
);
2070 upload_matrix_t( rmesa
, ctx
->ModelviewMatrixStack
.Top
->inv
, MODEL_IT
);
2073 /* Does this need to be triggered on eg. modelview for
2074 * texgen-derived objplane/eyeplane matrices?
2076 if (new_state
& _NEW_TEXTURE_MATRIX
) {
2077 update_texturematrix( ctx
);
2080 if (new_state
& (_NEW_LIGHT
|_NEW_MODELVIEW
|_MESA_NEW_NEED_EYE_COORDS
)) {
2081 update_light( ctx
);
2084 /* emit all active clip planes if projection matrix changes.
2086 if (new_state
& (_NEW_PROJECTION
)) {
2087 if (ctx
->Transform
.ClipPlanesEnabled
)
2088 radeonUpdateClipPlanes( ctx
);
2092 rmesa
->radeon
.NewGLState
= 0;
2098 static void radeonInvalidateState( struct gl_context
*ctx
, GLuint new_state
)
2100 _swrast_InvalidateState( ctx
, new_state
);
2101 _swsetup_InvalidateState( ctx
, new_state
);
2102 _vbo_InvalidateState( ctx
, new_state
);
2103 _tnl_InvalidateState( ctx
, new_state
);
2104 _ae_invalidate_state( ctx
, new_state
);
2105 R100_CONTEXT(ctx
)->radeon
.NewGLState
|= new_state
;
2109 /* A hack. Need a faster way to find this out.
2111 static GLboolean
check_material( struct gl_context
*ctx
)
2113 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
2116 for (i
= _TNL_ATTRIB_MAT_FRONT_AMBIENT
;
2117 i
< _TNL_ATTRIB_MAT_BACK_INDEXES
;
2119 if (tnl
->vb
.AttribPtr
[i
] &&
2120 tnl
->vb
.AttribPtr
[i
]->stride
)
2127 static void radeonWrapRunPipeline( struct gl_context
*ctx
)
2129 r100ContextPtr rmesa
= R100_CONTEXT(ctx
);
2130 GLboolean has_material
;
2133 fprintf(stderr
, "%s, newstate: %x\n", __FUNCTION__
, rmesa
->radeon
.NewGLState
);
2137 if (rmesa
->radeon
.NewGLState
)
2138 if (!radeonValidateState( ctx
))
2139 FALLBACK(rmesa
, RADEON_FALLBACK_TEXTURE
, GL_TRUE
);
2141 has_material
= (ctx
->Light
.Enabled
&& check_material( ctx
));
2144 TCL_FALLBACK( ctx
, RADEON_TCL_FALLBACK_MATERIAL
, GL_TRUE
);
2147 /* Run the pipeline.
2149 _tnl_run_pipeline( ctx
);
2152 TCL_FALLBACK( ctx
, RADEON_TCL_FALLBACK_MATERIAL
, GL_FALSE
);
2156 static void radeonPolygonStipple( struct gl_context
*ctx
, const GLubyte
*mask
)
2158 r100ContextPtr r100
= R100_CONTEXT(ctx
);
2161 radeon_firevertices(&r100
->radeon
);
2163 RADEON_STATECHANGE(r100
, stp
);
2165 /* Must flip pattern upside down.
2167 for ( i
= 31 ; i
>= 0; i
--) {
2168 r100
->hw
.stp
.cmd
[3 + i
] = ((GLuint
*) mask
)[i
];
2173 /* Initialize the driver's state functions.
2174 * Many of the ctx->Driver functions might have been initialized to
2175 * software defaults in the earlier _mesa_init_driver_functions() call.
2177 void radeonInitStateFuncs( struct gl_context
*ctx
)
2179 ctx
->Driver
.UpdateState
= radeonInvalidateState
;
2180 ctx
->Driver
.LightingSpaceChange
= radeonLightingSpaceChange
;
2182 ctx
->Driver
.DrawBuffer
= radeonDrawBuffer
;
2183 ctx
->Driver
.ReadBuffer
= radeonReadBuffer
;
2184 ctx
->Driver
.CopyPixels
= _mesa_meta_CopyPixels
;
2185 ctx
->Driver
.DrawPixels
= _mesa_meta_DrawPixels
;
2186 ctx
->Driver
.ReadPixels
= radeonReadPixels
;
2188 ctx
->Driver
.AlphaFunc
= radeonAlphaFunc
;
2189 ctx
->Driver
.BlendEquationSeparate
= radeonBlendEquationSeparate
;
2190 ctx
->Driver
.BlendFuncSeparate
= radeonBlendFuncSeparate
;
2191 ctx
->Driver
.ClipPlane
= radeonClipPlane
;
2192 ctx
->Driver
.ColorMask
= radeonColorMask
;
2193 ctx
->Driver
.CullFace
= radeonCullFace
;
2194 ctx
->Driver
.DepthFunc
= radeonDepthFunc
;
2195 ctx
->Driver
.DepthMask
= radeonDepthMask
;
2196 ctx
->Driver
.DepthRange
= radeonDepthRange
;
2197 ctx
->Driver
.Enable
= radeonEnable
;
2198 ctx
->Driver
.Fogfv
= radeonFogfv
;
2199 ctx
->Driver
.FrontFace
= radeonFrontFace
;
2200 ctx
->Driver
.Hint
= NULL
;
2201 ctx
->Driver
.LightModelfv
= radeonLightModelfv
;
2202 ctx
->Driver
.Lightfv
= radeonLightfv
;
2203 ctx
->Driver
.LineStipple
= radeonLineStipple
;
2204 ctx
->Driver
.LineWidth
= radeonLineWidth
;
2205 ctx
->Driver
.LogicOpcode
= radeonLogicOpCode
;
2206 ctx
->Driver
.PolygonMode
= radeonPolygonMode
;
2207 ctx
->Driver
.PolygonOffset
= radeonPolygonOffset
;
2208 ctx
->Driver
.PolygonStipple
= radeonPolygonStipple
;
2209 ctx
->Driver
.RenderMode
= radeonRenderMode
;
2210 ctx
->Driver
.Scissor
= radeonScissor
;
2211 ctx
->Driver
.ShadeModel
= radeonShadeModel
;
2212 ctx
->Driver
.StencilFuncSeparate
= radeonStencilFuncSeparate
;
2213 ctx
->Driver
.StencilMaskSeparate
= radeonStencilMaskSeparate
;
2214 ctx
->Driver
.StencilOpSeparate
= radeonStencilOpSeparate
;
2215 ctx
->Driver
.Viewport
= radeonViewport
;
2217 TNL_CONTEXT(ctx
)->Driver
.NotifyMaterialChange
= radeonUpdateMaterial
;
2218 TNL_CONTEXT(ctx
)->Driver
.RunPipeline
= radeonWrapRunPipeline
;