1 /* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_state.c,v 1.5 2002/09/16 18:05:20 eich Exp $ */
3 * Copyright 2000, 2001 VA Linux Systems Inc., Fremont, California.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * on the rights to use, copy, modify, merge, publish, distribute, sub
11 * license, and/or sell copies of the Software, and to permit persons to whom
12 * the Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice (including the next
15 * paragraph) shall be included in all copies or substantial portions of the
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
22 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24 * OTHER DEALINGS IN THE SOFTWARE.
27 * Gareth Hughes <gareth@valinux.com>
28 * Keith Whitwell <keith@tungstengraphics.com>
33 #include "api_arrayelt.h"
34 /* #include "mmath.h" */
39 #include "radeon_context.h"
40 #include "radeon_ioctl.h"
41 #include "radeon_state.h"
42 #include "radeon_tcl.h"
43 #include "radeon_tex.h"
44 #include "radeon_vtxfmt.h"
48 /* =============================================================
53 /* Update on colormaterial, material emmissive/ambient,
54 * lightmodel.globalambient
56 void update_global_ambient( GLcontext
*ctx
)
58 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
59 float *fcmd
= (float *)RADEON_DB_STATE( glt
);
61 /* Need to do more if both emmissive & ambient are PREMULT:
63 if ((rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] &
64 ((3 << RADEON_EMISSIVE_SOURCE_SHIFT
) |
65 (3 << RADEON_AMBIENT_SOURCE_SHIFT
))) == 0)
67 COPY_3V( &fcmd
[GLT_RED
],
68 ctx
->Light
.Material
[0].Emission
);
69 ACC_SCALE_3V( &fcmd
[GLT_RED
],
70 ctx
->Light
.Model
.Ambient
,
71 ctx
->Light
.Material
[0].Ambient
);
75 COPY_3V( &fcmd
[GLT_RED
], ctx
->Light
.Model
.Ambient
);
78 RADEON_DB_STATECHANGE(rmesa
, &rmesa
->hw
.glt
);
81 /* Update on change to
85 * - colormaterial enabled
86 * - colormaterial bitmask
88 void update_light_colors( GLcontext
*ctx
, GLuint p
)
90 struct gl_light
*l
= &ctx
->Light
.Light
[p
];
92 /* fprintf(stderr, "%s\n", __FUNCTION__); */
95 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
96 float *fcmd
= (float *)RADEON_DB_STATE( lit
[p
] );
97 GLuint bitmask
= ctx
->Light
.ColorMaterialBitmask
;
98 struct gl_material
*mat
= &ctx
->Light
.Material
[0];
100 COPY_4V( &fcmd
[LIT_AMBIENT_RED
], l
->Ambient
);
101 COPY_4V( &fcmd
[LIT_DIFFUSE_RED
], l
->Diffuse
);
102 COPY_4V( &fcmd
[LIT_SPECULAR_RED
], l
->Specular
);
104 if (!ctx
->Light
.ColorMaterialEnabled
)
107 if ((bitmask
& FRONT_AMBIENT_BIT
) == 0)
108 SELF_SCALE_3V( &fcmd
[LIT_AMBIENT_RED
], mat
->Ambient
);
110 if ((bitmask
& FRONT_DIFFUSE_BIT
) == 0)
111 SELF_SCALE_3V( &fcmd
[LIT_DIFFUSE_RED
], mat
->Diffuse
);
113 if ((bitmask
& FRONT_SPECULAR_BIT
) == 0)
114 SELF_SCALE_3V( &fcmd
[LIT_SPECULAR_RED
], mat
->Specular
);
116 RADEON_DB_STATECHANGE( rmesa
, &rmesa
->hw
.lit
[p
] );
120 /* Also fallback for asym colormaterial mode in twoside lighting...
122 void check_twoside_fallback( GLcontext
*ctx
)
124 GLboolean fallback
= GL_FALSE
;
126 if (ctx
->Light
.Enabled
&& ctx
->Light
.Model
.TwoSide
) {
127 if (memcmp( &ctx
->Light
.Material
[0],
128 &ctx
->Light
.Material
[1],
129 sizeof(struct gl_material
)) != 0)
131 else if (ctx
->Light
.ColorMaterialEnabled
&&
132 (ctx
->Light
.ColorMaterialBitmask
& BACK_MATERIAL_BITS
) !=
133 ((ctx
->Light
.ColorMaterialBitmask
& FRONT_MATERIAL_BITS
)<<1))
137 TCL_FALLBACK( ctx
, RADEON_TCL_FALLBACK_LIGHT_TWOSIDE
, fallback
);
140 void radeonColorMaterial( GLcontext
*ctx
, GLenum face
, GLenum mode
)
142 if (ctx
->Light
.ColorMaterialEnabled
) {
143 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
144 GLuint light_model_ctl
= rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
];
145 GLuint mask
= ctx
->Light
.ColorMaterialBitmask
;
147 /* Default to PREMULT:
149 light_model_ctl
&= ~((3 << RADEON_EMISSIVE_SOURCE_SHIFT
) |
150 (3 << RADEON_AMBIENT_SOURCE_SHIFT
) |
151 (3 << RADEON_DIFFUSE_SOURCE_SHIFT
) |
152 (3 << RADEON_SPECULAR_SOURCE_SHIFT
));
154 if (mask
& FRONT_EMISSION_BIT
) {
155 light_model_ctl
|= (RADEON_LM_SOURCE_VERTEX_DIFFUSE
<<
156 RADEON_EMISSIVE_SOURCE_SHIFT
);
159 if (mask
& FRONT_AMBIENT_BIT
) {
160 light_model_ctl
|= (RADEON_LM_SOURCE_VERTEX_DIFFUSE
<<
161 RADEON_AMBIENT_SOURCE_SHIFT
);
164 if (mask
& FRONT_DIFFUSE_BIT
) {
165 light_model_ctl
|= (RADEON_LM_SOURCE_VERTEX_DIFFUSE
<<
166 RADEON_DIFFUSE_SOURCE_SHIFT
);
169 if (mask
& FRONT_SPECULAR_BIT
) {
170 light_model_ctl
|= (RADEON_LM_SOURCE_VERTEX_DIFFUSE
<<
171 RADEON_SPECULAR_SOURCE_SHIFT
);
174 if (light_model_ctl
!= rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
]) {
177 RADEON_STATECHANGE( rmesa
, tcl
);
178 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] = light_model_ctl
;
180 for (p
= 0 ; p
< MAX_LIGHTS
; p
++)
181 update_light_colors( ctx
, p
);
182 update_global_ambient( ctx
);
186 check_twoside_fallback( ctx
);
189 void radeonUpdateMaterial( GLcontext
*ctx
)
191 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
192 GLfloat
*fcmd
= (GLfloat
*)RADEON_DB_STATE( mtl
);
196 if (ctx
->Light
.ColorMaterialEnabled
)
197 mask
&= ~ctx
->Light
.ColorMaterialBitmask
;
199 if (RADEON_DEBUG
& DEBUG_STATE
)
200 fprintf(stderr
, "%s\n", __FUNCTION__
);
203 if (mask
& FRONT_EMISSION_BIT
) {
204 fcmd
[MTL_EMMISSIVE_RED
] = ctx
->Light
.Material
[0].Emission
[0];
205 fcmd
[MTL_EMMISSIVE_GREEN
] = ctx
->Light
.Material
[0].Emission
[1];
206 fcmd
[MTL_EMMISSIVE_BLUE
] = ctx
->Light
.Material
[0].Emission
[2];
207 fcmd
[MTL_EMMISSIVE_ALPHA
] = ctx
->Light
.Material
[0].Emission
[3];
209 if (mask
& FRONT_AMBIENT_BIT
) {
210 fcmd
[MTL_AMBIENT_RED
] = ctx
->Light
.Material
[0].Ambient
[0];
211 fcmd
[MTL_AMBIENT_GREEN
] = ctx
->Light
.Material
[0].Ambient
[1];
212 fcmd
[MTL_AMBIENT_BLUE
] = ctx
->Light
.Material
[0].Ambient
[2];
213 fcmd
[MTL_AMBIENT_ALPHA
] = ctx
->Light
.Material
[0].Ambient
[3];
215 if (mask
& FRONT_DIFFUSE_BIT
) {
216 fcmd
[MTL_DIFFUSE_RED
] = ctx
->Light
.Material
[0].Diffuse
[0];
217 fcmd
[MTL_DIFFUSE_GREEN
] = ctx
->Light
.Material
[0].Diffuse
[1];
218 fcmd
[MTL_DIFFUSE_BLUE
] = ctx
->Light
.Material
[0].Diffuse
[2];
219 fcmd
[MTL_DIFFUSE_ALPHA
] = ctx
->Light
.Material
[0].Diffuse
[3];
221 if (mask
& FRONT_SPECULAR_BIT
) {
222 fcmd
[MTL_SPECULAR_RED
] = ctx
->Light
.Material
[0].Specular
[0];
223 fcmd
[MTL_SPECULAR_GREEN
] = ctx
->Light
.Material
[0].Specular
[1];
224 fcmd
[MTL_SPECULAR_BLUE
] = ctx
->Light
.Material
[0].Specular
[2];
225 fcmd
[MTL_SPECULAR_ALPHA
] = ctx
->Light
.Material
[0].Specular
[3];
227 if (mask
& FRONT_SHININESS_BIT
) {
228 fcmd
[MTL_SHININESS
] = ctx
->Light
.Material
[0].Shininess
;
231 if (RADEON_DB_STATECHANGE( rmesa
, &rmesa
->hw
.mtl
)) {
232 for (p
= 0 ; p
< MAX_LIGHTS
; p
++)
233 update_light_colors( ctx
, p
);
235 check_twoside_fallback( ctx
);
236 update_global_ambient( ctx
);
238 else if (RADEON_DEBUG
& (DEBUG_PRIMS
|DEBUG_STATE
))
239 fprintf(stderr
, "%s: Elided noop material call\n", __FUNCTION__
);
244 * _MESA_NEW_NEED_EYE_COORDS
246 * Uses derived state from mesa:
255 * which are calculated in light.c and are correct for the current
256 * lighting space (model or eye), hence dependencies on _NEW_MODELVIEW
257 * and _MESA_NEW_NEED_EYE_COORDS.
259 void radeonUpdateLighting( GLcontext
*ctx
)
261 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
263 /* Have to check these, or have an automatic shortcircuit mechanism
264 * to remove noop statechanges. (Or just do a better job on the
268 GLuint tmp
= rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
];
270 if (ctx
->_NeedEyeCoords
)
271 tmp
&= ~RADEON_LIGHT_IN_MODELSPACE
;
273 tmp
|= RADEON_LIGHT_IN_MODELSPACE
;
276 /* Leave this test disabled: (unexplained q3 lockup) (even with
279 if (tmp
!= rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
])
281 RADEON_STATECHANGE( rmesa
, tcl
);
282 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] = tmp
;
287 GLfloat
*fcmd
= (GLfloat
*)RADEON_DB_STATE( eye
);
288 fcmd
[EYE_X
] = ctx
->_EyeZDir
[0];
289 fcmd
[EYE_Y
] = ctx
->_EyeZDir
[1];
290 fcmd
[EYE_Z
] = - ctx
->_EyeZDir
[2];
291 fcmd
[EYE_RESCALE_FACTOR
] = ctx
->_ModelViewInvScale
;
292 RADEON_DB_STATECHANGE( rmesa
, &rmesa
->hw
.eye
);
296 /* RADEON_STATECHANGE( rmesa, glt ); */
298 if (ctx
->Light
.Enabled
) {
300 for (p
= 0 ; p
< MAX_LIGHTS
; p
++) {
301 if (ctx
->Light
.Light
[p
].Enabled
) {
302 struct gl_light
*l
= &ctx
->Light
.Light
[p
];
303 GLfloat
*fcmd
= (GLfloat
*)RADEON_DB_STATE( lit
[p
] );
305 if (l
->EyePosition
[3] == 0.0) {
306 COPY_3FV( &fcmd
[LIT_POSITION_X
], l
->_VP_inf_norm
);
307 COPY_3FV( &fcmd
[LIT_DIRECTION_X
], l
->_h_inf_norm
);
308 fcmd
[LIT_POSITION_W
] = 0;
309 fcmd
[LIT_DIRECTION_W
] = 0;
311 COPY_4V( &fcmd
[LIT_POSITION_X
], l
->_Position
);
312 fcmd
[LIT_DIRECTION_X
] = -l
->_NormDirection
[0];
313 fcmd
[LIT_DIRECTION_Y
] = -l
->_NormDirection
[1];
314 fcmd
[LIT_DIRECTION_Z
] = -l
->_NormDirection
[2];
315 fcmd
[LIT_DIRECTION_W
] = 0;
318 RADEON_DB_STATECHANGE( rmesa
, &rmesa
->hw
.lit
[p
] );
325 void radeonLightfv( GLcontext
*ctx
, GLenum light
,
326 GLenum pname
, const GLfloat
*params
)
328 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
329 GLint p
= light
- GL_LIGHT0
;
330 struct gl_light
*l
= &ctx
->Light
.Light
[p
];
331 GLfloat
*fcmd
= (GLfloat
*)rmesa
->hw
.lit
[p
].cmd
;
338 update_light_colors( ctx
, p
);
341 case GL_SPOT_DIRECTION
:
342 /* picked up in update_light */
346 /* positions picked up in update_light, but can do flag here */
347 GLuint flag
= (p
&1)? RADEON_LIGHT_1_IS_LOCAL
: RADEON_LIGHT_0_IS_LOCAL
;
348 GLuint idx
= TCL_PER_LIGHT_CTL_0
+ p
/2;
350 RADEON_STATECHANGE(rmesa
, tcl
);
351 if (l
->EyePosition
[3] != 0.0F
)
352 rmesa
->hw
.tcl
.cmd
[idx
] |= flag
;
354 rmesa
->hw
.tcl
.cmd
[idx
] &= ~flag
;
358 case GL_SPOT_EXPONENT
:
359 RADEON_STATECHANGE(rmesa
, lit
[p
]);
360 fcmd
[LIT_SPOT_EXPONENT
] = params
[0];
363 case GL_SPOT_CUTOFF
: {
364 GLuint flag
= (p
&1) ? RADEON_LIGHT_1_IS_SPOT
: RADEON_LIGHT_0_IS_SPOT
;
365 GLuint idx
= TCL_PER_LIGHT_CTL_0
+ p
/2;
367 RADEON_STATECHANGE(rmesa
, lit
[p
]);
368 fcmd
[LIT_SPOT_CUTOFF
] = l
->_CosCutoff
;
370 RADEON_STATECHANGE(rmesa
, tcl
);
371 if (l
->SpotCutoff
!= 180.0F
)
372 rmesa
->hw
.tcl
.cmd
[idx
] |= flag
;
374 rmesa
->hw
.tcl
.cmd
[idx
] &= ~flag
;
378 case GL_CONSTANT_ATTENUATION
:
379 RADEON_STATECHANGE(rmesa
, lit
[p
]);
380 fcmd
[LIT_ATTEN_CONST
] = params
[0];
382 case GL_LINEAR_ATTENUATION
:
383 RADEON_STATECHANGE(rmesa
, lit
[p
]);
384 fcmd
[LIT_ATTEN_LINEAR
] = params
[0];
386 case GL_QUADRATIC_ATTENUATION
:
387 RADEON_STATECHANGE(rmesa
, lit
[p
]);
388 fcmd
[LIT_ATTEN_QUADRATIC
] = params
[0];
399 void radeonLightModelfv( GLcontext
*ctx
, GLenum pname
,
400 const GLfloat
*param
)
402 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
405 case GL_LIGHT_MODEL_AMBIENT
:
406 update_global_ambient( ctx
);
409 case GL_LIGHT_MODEL_LOCAL_VIEWER
:
410 RADEON_STATECHANGE( rmesa
, tcl
);
411 if (ctx
->Light
.Model
.LocalViewer
)
412 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] |= RADEON_LOCAL_VIEWER
;
414 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] &= ~RADEON_LOCAL_VIEWER
;
417 case GL_LIGHT_MODEL_TWO_SIDE
:
418 RADEON_STATECHANGE( rmesa
, tcl
);
419 if (ctx
->Light
.Model
.TwoSide
)
420 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] |= RADEON_LIGHT_TWOSIDE
;
422 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] &= ~RADEON_LIGHT_TWOSIDE
;
424 check_twoside_fallback( ctx
);
427 if (rmesa
->TclFallback
) {
428 radeonChooseRenderState( ctx
);
429 radeonChooseVertexState( ctx
);
434 case GL_LIGHT_MODEL_COLOR_CONTROL
:
435 radeonUpdateSpecular(ctx
);
437 RADEON_STATECHANGE( rmesa
, tcl
);
438 if (ctx
->Light
.Model
.ColorControl
== GL_SEPARATE_SPECULAR_COLOR
)
439 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] &=
440 ~RADEON_DIFFUSE_SPECULAR_COMBINE
;
442 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] |=
443 RADEON_DIFFUSE_SPECULAR_COMBINE
;
452 /* =============================================================
457 static void radeonFogfv( GLcontext
*ctx
, GLenum pname
, const GLfloat
*param
)
459 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
460 union { int i
; float f
; } c
, d
;
463 c
.i
= rmesa
->hw
.fog
.cmd
[FOG_C
];
464 d
.i
= rmesa
->hw
.fog
.cmd
[FOG_D
];
468 if (!ctx
->Fog
.Enabled
)
470 RADEON_STATECHANGE(rmesa
, tcl
);
471 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] &= ~RADEON_TCL_FOG_MASK
;
472 switch (ctx
->Fog
.Mode
) {
474 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] |= RADEON_TCL_FOG_LINEAR
;
475 if (ctx
->Fog
.Start
== ctx
->Fog
.End
) {
480 c
.f
= ctx
->Fog
.End
/(ctx
->Fog
.End
-ctx
->Fog
.Start
);
481 d
.f
= 1.0/(ctx
->Fog
.End
-ctx
->Fog
.Start
);
485 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] |= RADEON_TCL_FOG_EXP
;
487 d
.f
= ctx
->Fog
.Density
;
490 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] |= RADEON_TCL_FOG_EXP2
;
492 d
.f
= -(ctx
->Fog
.Density
* ctx
->Fog
.Density
);
499 switch (ctx
->Fog
.Mode
) {
502 d
.f
= ctx
->Fog
.Density
;
506 d
.f
= -(ctx
->Fog
.Density
* ctx
->Fog
.Density
);
514 if (ctx
->Fog
.Mode
== GL_LINEAR
) {
515 if (ctx
->Fog
.Start
== ctx
->Fog
.End
) {
519 c
.f
= ctx
->Fog
.End
/(ctx
->Fog
.End
-ctx
->Fog
.Start
);
520 d
.f
= 1.0/(ctx
->Fog
.End
-ctx
->Fog
.Start
);
525 RADEON_STATECHANGE( rmesa
, ctx
);
526 UNCLAMPED_FLOAT_TO_RGB_CHAN( col
, ctx
->Fog
.Color
);
527 rmesa
->hw
.ctx
.cmd
[CTX_PP_FOG_COLOR
] =
528 radeonPackColor( 4, col
[0], col
[1], col
[2], 0 );
530 case GL_FOG_COORDINATE_SOURCE_EXT
:
538 if (c
.i
!= rmesa
->hw
.fog
.cmd
[FOG_C
] || d
.i
!= rmesa
->hw
.fog
.cmd
[FOG_D
]) {
539 RADEON_STATECHANGE( rmesa
, fog
);
540 rmesa
->hw
.fog
.cmd
[FOG_C
] = c
.i
;
541 rmesa
->hw
.fog
.cmd
[FOG_D
] = d
.i
;
545 /* Examine lighting and texture state to determine if separate specular
548 void radeonUpdateSpecular( GLcontext
*ctx
)
550 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
551 GLuint p
= rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
];
553 if (NEED_SECONDARY_COLOR(ctx
)) {
554 p
|= RADEON_SPECULAR_ENABLE
;
556 p
&= ~RADEON_SPECULAR_ENABLE
;
559 if ( rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] != p
) {
560 RADEON_STATECHANGE( rmesa
, ctx
);
561 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] = p
;
564 /* Bizzare: have to leave lighting enabled to get fog.
566 RADEON_STATECHANGE( rmesa
, tcl
);
567 if ((ctx
->Light
.Enabled
&&
568 ctx
->Light
.Model
.ColorControl
== GL_SEPARATE_SPECULAR_COLOR
)) {
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 else if (ctx
->Fog
.Enabled
) {
576 if (ctx
->Light
.Enabled
) {
577 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
] |= RADEON_TCL_COMPUTE_SPECULAR
;
578 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
] |= RADEON_TCL_COMPUTE_DIFFUSE
;
579 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] |= RADEON_TCL_VTX_PK_SPEC
;
580 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] |= RADEON_TCL_VTX_PK_DIFFUSE
;
581 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] |= RADEON_LIGHTING_ENABLE
;
583 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
] |= RADEON_TCL_COMPUTE_SPECULAR
;
584 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
] &= ~RADEON_TCL_COMPUTE_DIFFUSE
;
585 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] |= RADEON_TCL_VTX_PK_SPEC
;
586 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] |= RADEON_TCL_VTX_PK_DIFFUSE
;
587 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] |= RADEON_LIGHTING_ENABLE
;
590 else if (ctx
->Light
.Enabled
) {
591 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
] &= ~RADEON_TCL_COMPUTE_SPECULAR
;
592 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
] |= RADEON_TCL_COMPUTE_DIFFUSE
;
593 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] &= ~RADEON_TCL_VTX_PK_SPEC
;
594 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] |= RADEON_TCL_VTX_PK_DIFFUSE
;
595 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] |= RADEON_LIGHTING_ENABLE
;
596 } else if (ctx
->Fog
.ColorSumEnabled
) {
597 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
] &= ~RADEON_TCL_COMPUTE_SPECULAR
;
598 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
] &= ~RADEON_TCL_COMPUTE_DIFFUSE
;
599 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] |= RADEON_TCL_VTX_PK_SPEC
;
600 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] |= RADEON_TCL_VTX_PK_DIFFUSE
;
601 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] &= ~RADEON_LIGHTING_ENABLE
;
603 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
] &= ~RADEON_TCL_COMPUTE_SPECULAR
;
604 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXSEL
] &= ~RADEON_TCL_COMPUTE_DIFFUSE
;
605 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] &= ~RADEON_TCL_VTX_PK_SPEC
;
606 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] |= RADEON_TCL_VTX_PK_DIFFUSE
;
607 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] &= ~RADEON_LIGHTING_ENABLE
;
611 /* Update vertex/render formats
613 if (rmesa
->TclFallback
) {
614 radeonChooseRenderState( ctx
);
615 radeonChooseVertexState( ctx
);
622 static void radeonLightingSpaceChange( GLcontext
*ctx
)
624 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
626 RADEON_STATECHANGE( rmesa
, tcl
);
628 if (RADEON_DEBUG
& DEBUG_STATE
)
629 fprintf(stderr
, "%s %d\n", __FUNCTION__
, ctx
->_NeedEyeCoords
);
631 if (ctx
->_NeedEyeCoords
)
632 tmp
= ctx
->Transform
.RescaleNormals
;
634 tmp
= !ctx
->Transform
.RescaleNormals
;
637 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] |= RADEON_RESCALE_NORMALS
;
639 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL
] &= ~RADEON_RESCALE_NORMALS
;
643 void radeonInitLightStateFuncs( GLcontext
*ctx
)
645 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
648 ctx
->Driver
.LightModelfv
= radeonLightModelfv
;
649 ctx
->Driver
.Lightfv
= radeonLightfv
;
650 ctx
->Driver
.Fogfv
= radeonFogfv
;
651 ctx
->Driver
.LightingSpaceChange
= radeonLightingSpaceChange
;
653 for (i
= 0 ; i
< 8; i
++) {
654 struct gl_light
*l
= &ctx
->Light
.Light
[i
];
655 GLenum p
= GL_LIGHT0
+ i
;
656 *(float *)&(rmesa
->hw
.lit
[i
].cmd
[LIT_RANGE_CUTOFF
]) = FLT_MAX
;
658 ctx
->Driver
.Lightfv( ctx
, p
, GL_AMBIENT
, l
->Ambient
);
659 ctx
->Driver
.Lightfv( ctx
, p
, GL_DIFFUSE
, l
->Diffuse
);
660 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPECULAR
, l
->Specular
);
661 ctx
->Driver
.Lightfv( ctx
, p
, GL_POSITION
, 0 );
662 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPOT_DIRECTION
, 0 );
663 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPOT_EXPONENT
, &l
->SpotExponent
);
664 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPOT_CUTOFF
, &l
->SpotCutoff
);
665 ctx
->Driver
.Lightfv( ctx
, p
, GL_CONSTANT_ATTENUATION
,
666 &l
->ConstantAttenuation
);
667 ctx
->Driver
.Lightfv( ctx
, p
, GL_LINEAR_ATTENUATION
,
668 &l
->LinearAttenuation
);
669 ctx
->Driver
.Lightfv( ctx
, p
, GL_QUADRATIC_ATTENUATION
,
670 &l
->QuadraticAttenuation
);
673 ctx
->Driver
.LightModelfv( ctx
, GL_LIGHT_MODEL_AMBIENT
,
674 ctx
->Light
.Model
.Ambient
);
676 ctx
->Driver
.Fogfv( ctx
, GL_FOG_MODE
, 0 );
677 ctx
->Driver
.Fogfv( ctx
, GL_FOG_DENSITY
, &ctx
->Fog
.Density
);
678 ctx
->Driver
.Fogfv( ctx
, GL_FOG_START
, &ctx
->Fog
.Start
);
679 ctx
->Driver
.Fogfv( ctx
, GL_FOG_END
, &ctx
->Fog
.End
);
680 ctx
->Driver
.Fogfv( ctx
, GL_FOG_COLOR
, ctx
->Fog
.Color
);
681 ctx
->Driver
.Fogfv( ctx
, GL_FOG_COORDINATE_SOURCE_EXT
, 0 );