1adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/**************************************************************************
2adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
3adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellCopyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved.
4adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
5adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellThe Weather Channel (TM) funded Tungsten Graphics to develop the
6adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellinitial release of the Radeon 8500 driver under the XFree86 license.
7adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellThis notice must be preserved.
8adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
9adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellPermission is hereby granted, free of charge, to any person obtaining
10adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwella copy of this software and associated documentation files (the
11adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell"Software"), to deal in the Software without restriction, including
12adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellwithout limitation the rights to use, copy, modify, merge, publish,
13adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwelldistribute, sublicense, and/or sell copies of the Software, and to
14adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellpermit persons to whom the Software is furnished to do so, subject to
15adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellthe following conditions:
16adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
17adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellThe above copyright notice and this permission notice (including the
18adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellnext paragraph) shall be included in all copies or substantial
19adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellportions of the Software.
20adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
21adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
24adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
25adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
29adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell**************************************************************************/
30adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
31adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/*
32adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Authors:
33adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell *   Keith Whitwell <keith@tungstengraphics.com>
34adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
35adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
36ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h"
37ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/imports.h"
38ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/api_arrayelt.h"
39ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/enums.h"
40ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/colormac.h"
41ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/light.h"
42ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/framebuffer.h"
4347941bfaea6e8a60e2c31f7a2c8c233f2a10ecb1Brian Paul#include "main/fbobject.h"
44adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
45adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "swrast/swrast.h"
4680c88304fc9d09531b2530b74973821e47b46753Keith Whitwell#include "vbo/vbo.h"
47adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "tnl/tnl.h"
48adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "tnl/t_pipeline.h"
49adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "swrast_setup/swrast_setup.h"
50e167403e5809c447870644bd9ea09fad369706cfAlex Deucher#include "drivers/common/meta.h"
51adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
52dc8a707c672918b88dd4135930bef60ed148d8ceDave Airlie#include "radeon_common.h"
53e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie#include "radeon_mipmap_tree.h"
54adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "r200_context.h"
55adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "r200_ioctl.h"
56adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "r200_state.h"
57adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "r200_tcl.h"
58adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "r200_tex.h"
59adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "r200_swtcl.h"
6098c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger#include "r200_vertprog.h"
61adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
62adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
63adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* =============================================================
64adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Alpha blending
65adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
66adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
67f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200AlphaFunc( struct gl_context *ctx, GLenum func, GLfloat ref )
68adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
69adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
70adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   int pp_misc = rmesa->hw.ctx.cmd[CTX_PP_MISC];
71adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLubyte refByte;
72adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
73adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   CLAMPED_FLOAT_TO_UBYTE(refByte, ref);
74adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
75adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, ctx );
76adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
77adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   pp_misc &= ~(R200_ALPHA_TEST_OP_MASK | R200_REF_ALPHA_MASK);
78adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   pp_misc |= (refByte & R200_REF_ALPHA_MASK);
79adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
80adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   switch ( func ) {
81adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_NEVER:
827dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      pp_misc |= R200_ALPHA_TEST_FAIL;
83adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
84adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_LESS:
85adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      pp_misc |= R200_ALPHA_TEST_LESS;
86adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
87adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_EQUAL:
88adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      pp_misc |= R200_ALPHA_TEST_EQUAL;
89adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
90adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_LEQUAL:
91adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      pp_misc |= R200_ALPHA_TEST_LEQUAL;
92adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
93adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_GREATER:
94adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      pp_misc |= R200_ALPHA_TEST_GREATER;
95adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
96adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_NOTEQUAL:
97adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      pp_misc |= R200_ALPHA_TEST_NEQUAL;
98adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
99adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_GEQUAL:
100adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      pp_misc |= R200_ALPHA_TEST_GEQUAL;
101adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
102adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_ALWAYS:
103adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      pp_misc |= R200_ALPHA_TEST_PASS;
104adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
105adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
106adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
107adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.ctx.cmd[CTX_PP_MISC] = pp_misc;
108adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
109adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
110f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200BlendColor( struct gl_context *ctx, const GLfloat cf[4] )
111033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger{
112033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   GLubyte color[4];
113033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   r200ContextPtr rmesa = R200_CONTEXT(ctx);
114033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   R200_STATECHANGE( rmesa, ctx );
115033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   CLAMPED_FLOAT_TO_UBYTE(color[0], cf[0]);
116033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   CLAMPED_FLOAT_TO_UBYTE(color[1], cf[1]);
117033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   CLAMPED_FLOAT_TO_UBYTE(color[2], cf[2]);
118033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   CLAMPED_FLOAT_TO_UBYTE(color[3], cf[3]);
11956d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie   rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCOLOR] = radeonPackColor( 4, color[0], color[1], color[2], color[3] );
120033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger}
121033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger
122b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger/**
123b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * Calculate the hardware blend factor setting.  This same function is used
124b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * for source and destination of both alpha and RGB.
125b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger *
126b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * \returns
127b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * The hardware register value for the specified blend factor.  This value
128b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * will need to be shifted into the correct position for either source or
129b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * destination factor.
130b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger *
131b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * \todo
132b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * Since the two cases where source and destination are handled differently
133b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * are essentially error cases, they should never happen.  Determine if these
134b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * cases can be removed.
135b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger */
136b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheideggerstatic int blend_factor( GLenum factor, GLboolean is_src )
137adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
138b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger   int func;
139adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
140b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger   switch ( factor ) {
141adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_ZERO:
142b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      func = R200_BLEND_GL_ZERO;
143adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
144adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_ONE:
145b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      func = R200_BLEND_GL_ONE;
146adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
147adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_DST_COLOR:
148b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      func = R200_BLEND_GL_DST_COLOR;
149adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
150adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_ONE_MINUS_DST_COLOR:
151b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      func = R200_BLEND_GL_ONE_MINUS_DST_COLOR;
152adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
153adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_SRC_COLOR:
154b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      func = R200_BLEND_GL_SRC_COLOR;
155adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
156adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_ONE_MINUS_SRC_COLOR:
157b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      func = R200_BLEND_GL_ONE_MINUS_SRC_COLOR;
158adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
159adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_SRC_ALPHA:
160b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      func = R200_BLEND_GL_SRC_ALPHA;
161adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
162adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_ONE_MINUS_SRC_ALPHA:
163b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      func = R200_BLEND_GL_ONE_MINUS_SRC_ALPHA;
164adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
165adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_DST_ALPHA:
166b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      func = R200_BLEND_GL_DST_ALPHA;
167adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
168adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_ONE_MINUS_DST_ALPHA:
169b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      func = R200_BLEND_GL_ONE_MINUS_DST_ALPHA;
170adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
171adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_SRC_ALPHA_SATURATE:
172b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      func = (is_src) ? R200_BLEND_GL_SRC_ALPHA_SATURATE : R200_BLEND_GL_ZERO;
173adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
174adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_CONSTANT_COLOR:
175b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      func = R200_BLEND_GL_CONST_COLOR;
176adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
177adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_ONE_MINUS_CONSTANT_COLOR:
178b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      func = R200_BLEND_GL_ONE_MINUS_CONST_COLOR;
179adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
180adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_CONSTANT_ALPHA:
181b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      func = R200_BLEND_GL_CONST_ALPHA;
182adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
183adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_ONE_MINUS_CONSTANT_ALPHA:
184b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      func = R200_BLEND_GL_ONE_MINUS_CONST_ALPHA;
185adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
186adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   default:
187b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      func = (is_src) ? R200_BLEND_GL_ONE : R200_BLEND_GL_ZERO;
188adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
189b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger   return func;
190b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger}
191adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
192b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger/**
193b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * Sets both the blend equation and the blend function.
194b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * This is done in a single
195b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * function because some blend equations (i.e., \c GL_MIN and \c GL_MAX)
196b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * change the interpretation of the blend function.
197b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * Also, make sure that blend function and blend equation are set to their default
198b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * value if color blending is not enabled, since at least blend equations GL_MIN
199b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * and GL_FUNC_REVERSE_SUBTRACT will cause wrong results otherwise for
200b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * unknown reasons.
201b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger */
202f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200_set_blend_state( struct gl_context * ctx )
203b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger{
204b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger   r200ContextPtr rmesa = R200_CONTEXT(ctx);
205b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger   GLuint cntl = rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &
206033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger      ~(R200_ROP_ENABLE | R200_ALPHA_BLEND_ENABLE | R200_SEPARATE_ALPHA_ENABLE);
207b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger
208b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger   int func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
209b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT);
210b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger   int eqn = R200_COMB_FCN_ADD_CLAMP;
211033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   int funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
212033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger      (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT);
213033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   int eqnA = R200_COMB_FCN_ADD_CLAMP;
214b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger
215b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger   R200_STATECHANGE( rmesa, ctx );
216b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger
21756d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie   if (ctx->Color.ColorLogicOpEnabled) {
21856d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie      rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] =  cntl | R200_ROP_ENABLE;
21956d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie      rmesa->hw.ctx.cmd[CTX_RB3D_ABLENDCNTL] = eqn | func;
22056d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie      rmesa->hw.ctx.cmd[CTX_RB3D_CBLENDCNTL] = eqn | func;
22156d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie      return;
22256d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie   } else if (ctx->Color.BlendEnabled) {
22356d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie      rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] =  cntl | R200_ALPHA_BLEND_ENABLE | R200_SEPARATE_ALPHA_ENABLE;
224b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger   }
225b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger   else {
22656d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie      rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = cntl;
22756d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie      rmesa->hw.ctx.cmd[CTX_RB3D_ABLENDCNTL] = eqn | func;
22856d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie      rmesa->hw.ctx.cmd[CTX_RB3D_CBLENDCNTL] = eqn | func;
22956d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie      return;
230b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger   }
231b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger
23274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   func = (blend_factor( ctx->Color.Blend[0].SrcRGB, GL_TRUE ) << R200_SRC_BLEND_SHIFT) |
23374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      (blend_factor( ctx->Color.Blend[0].DstRGB, GL_FALSE ) << R200_DST_BLEND_SHIFT);
234b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger
23574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   switch(ctx->Color.Blend[0].EquationRGB) {
236b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger   case GL_FUNC_ADD:
237b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      eqn = R200_COMB_FCN_ADD_CLAMP;
238adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
239b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger
240b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger   case GL_FUNC_SUBTRACT:
241b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      eqn = R200_COMB_FCN_SUB_CLAMP;
242adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
243b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger
244b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger   case GL_FUNC_REVERSE_SUBTRACT:
245b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      eqn = R200_COMB_FCN_RSUB_CLAMP;
246adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
247b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger
248b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger   case GL_MIN:
249b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      eqn = R200_COMB_FCN_MIN;
250b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
251b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger         (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
252adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
253b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger
254b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger   case GL_MAX:
255b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      eqn = R200_COMB_FCN_MAX;
256b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
257b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger         (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
258adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
259b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger
260adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   default:
261b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      fprintf( stderr, "[%s:%u] Invalid RGB blend equation (0x%04x).\n",
26274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul         __FUNCTION__, __LINE__, ctx->Color.Blend[0].EquationRGB );
263b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      return;
264adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
265adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
26674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   funcA = (blend_factor( ctx->Color.Blend[0].SrcA, GL_TRUE ) << R200_SRC_BLEND_SHIFT) |
26774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      (blend_factor( ctx->Color.Blend[0].DstA, GL_FALSE ) << R200_DST_BLEND_SHIFT);
268033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger
26974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   switch(ctx->Color.Blend[0].EquationA) {
270033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   case GL_FUNC_ADD:
271033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger      eqnA = R200_COMB_FCN_ADD_CLAMP;
272033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger      break;
273033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger
274033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   case GL_FUNC_SUBTRACT:
275033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger      eqnA = R200_COMB_FCN_SUB_CLAMP;
276033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger      break;
277033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger
278033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   case GL_FUNC_REVERSE_SUBTRACT:
279033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger      eqnA = R200_COMB_FCN_RSUB_CLAMP;
280033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger      break;
281033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger
282033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   case GL_MIN:
283033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger      eqnA = R200_COMB_FCN_MIN;
284033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger      funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
285033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger         (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
286033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger      break;
287033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger
288033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   case GL_MAX:
289033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger      eqnA = R200_COMB_FCN_MAX;
290033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger      funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
291033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger         (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
292033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger      break;
293033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger
294033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   default:
295033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger      fprintf( stderr, "[%s:%u] Invalid A blend equation (0x%04x).\n",
29674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul         __FUNCTION__, __LINE__, ctx->Color.Blend[0].EquationA );
297033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger      return;
298033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   }
299033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger
300033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   rmesa->hw.ctx.cmd[CTX_RB3D_ABLENDCNTL] = eqnA | funcA;
301033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   rmesa->hw.ctx.cmd[CTX_RB3D_CBLENDCNTL] = eqn | func;
302033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger
303b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger}
304b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger
305f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200BlendEquationSeparate( struct gl_context *ctx,
306b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger				       GLenum modeRGB, GLenum modeA )
307b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger{
308b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      r200_set_blend_state( ctx );
309b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger}
310b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger
311f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200BlendFuncSeparate( struct gl_context *ctx,
312b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger				     GLenum sfactorRGB, GLenum dfactorRGB,
313b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger				     GLenum sfactorA, GLenum dfactorA )
314b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger{
315b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      r200_set_blend_state( ctx );
316adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
317adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
318adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
319adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* =============================================================
320adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Depth testing
321adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
322adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
323f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200DepthFunc( struct gl_context *ctx, GLenum func )
324adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
325adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
326adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
327adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, ctx );
328adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~R200_Z_TEST_MASK;
329adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
330adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   switch ( ctx->Depth.Func ) {
331adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_NEVER:
332adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_NEVER;
333adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
334adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_LESS:
335adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_LESS;
336adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
337adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_EQUAL:
338adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_EQUAL;
339adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
340adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_LEQUAL:
341adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_LEQUAL;
342adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
343adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_GREATER:
344adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_GREATER;
345adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
346adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_NOTEQUAL:
347adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_NEQUAL;
348adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
349adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_GEQUAL:
350adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_GEQUAL;
351adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
352adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_ALWAYS:
353adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_ALWAYS;
354adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
355adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
356adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
357adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
358f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200DepthMask( struct gl_context *ctx, GLboolean flag )
359adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
360adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
361adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, ctx );
362adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
363adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if ( ctx->Depth.Mask ) {
364adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |=  R200_Z_WRITE_ENABLE;
365adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   } else {
366adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~R200_Z_WRITE_ENABLE;
367adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
368adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
369adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
370adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
371adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* =============================================================
372adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Fog
373adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
374adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
375adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
376f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200Fogfv( struct gl_context *ctx, GLenum pname, const GLfloat *param )
377adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
378adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
379adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   union { int i; float f; } c, d;
3808530d72c4e6ca8b8c741554ac446dd2ba8150e2eBrian Paul   GLubyte col[4];
381adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLuint i;
382adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
383adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   c.i = rmesa->hw.fog.cmd[FOG_C];
384adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   d.i = rmesa->hw.fog.cmd[FOG_D];
385adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
386adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   switch (pname) {
387adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_FOG_MODE:
388adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if (!ctx->Fog.Enabled)
389adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 return;
390adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE(rmesa, tcl);
391adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~R200_TCL_FOG_MASK;
392adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      switch (ctx->Fog.Mode) {
393adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      case GL_LINEAR:
394adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_TCL_FOG_LINEAR;
395adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 if (ctx->Fog.Start == ctx->Fog.End) {
396adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    c.f = 1.0F;
397adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    d.f = 1.0F;
398adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 }
399adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 else {
400adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start);
401adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    d.f = -1.0/(ctx->Fog.End-ctx->Fog.Start);
402adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 }
403adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 break;
404adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      case GL_EXP:
405adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_TCL_FOG_EXP;
406adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 c.f = 0.0;
407adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 d.f = -ctx->Fog.Density;
408adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 break;
409adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      case GL_EXP2:
410adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_TCL_FOG_EXP2;
411adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 c.f = 0.0;
412adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 d.f = -(ctx->Fog.Density * ctx->Fog.Density);
413adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 break;
414adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      default:
415adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 return;
416adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
417adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
418adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_FOG_DENSITY:
419adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      switch (ctx->Fog.Mode) {
420adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      case GL_EXP:
421adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 c.f = 0.0;
422adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 d.f = -ctx->Fog.Density;
423adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 break;
424adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      case GL_EXP2:
425adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 c.f = 0.0;
426adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 d.f = -(ctx->Fog.Density * ctx->Fog.Density);
427adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 break;
428adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      default:
429adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 break;
430adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
431adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
432adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_FOG_START:
433adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_FOG_END:
434adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if (ctx->Fog.Mode == GL_LINEAR) {
435adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 if (ctx->Fog.Start == ctx->Fog.End) {
436adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    c.f = 1.0F;
437adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    d.f = 1.0F;
438adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 } else {
439adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start);
440adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    d.f = -1.0/(ctx->Fog.End-ctx->Fog.Start);
441adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 }
442adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
443adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
4447dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   case GL_FOG_COLOR:
445adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE( rmesa, ctx );
4468530d72c4e6ca8b8c741554ac446dd2ba8150e2eBrian Paul      _mesa_unclamped_float_rgba_to_ubyte(col, ctx->Fog.Color );
447692ca82116485a9c6191e5265c5b369d5b4f82f3Dave Airlie      i = radeonPackColor( 4, col[0], col[1], col[2], 0 );
448adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] &= ~R200_FOG_COLOR_MASK;
449adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] |= i;
450adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
451d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger   case GL_FOG_COORD_SRC: {
452d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger      GLuint out_0 = rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0];
453d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger      GLuint fog   = rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR];
454d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger
455d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger      fog &= ~R200_FOG_USE_MASK;
456fc606f7db9072d4f40081aea8f92f1d4489a5115Roland Scheidegger      if ( ctx->Fog.FogCoordinateSource == GL_FOG_COORD || ctx->VertexProgram.Enabled) {
457d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger	 fog   |= R200_FOG_USE_VTX_FOG;
458d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger	 out_0 |= R200_VTX_DISCRETE_FOG;
459d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger      }
460d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger      else {
461d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger	 fog   |=  R200_FOG_USE_SPEC_ALPHA;
462d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger	 out_0 &= ~R200_VTX_DISCRETE_FOG;
463d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger      }
464d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger
465d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger      if ( fog != rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] ) {
466d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger	 R200_STATECHANGE( rmesa, ctx );
467d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger	 rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] = fog;
468d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger      }
469d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger
4701c0f11046a6dff2568bf42f213983df583b765b9Roland Scheidegger      if (out_0 != rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0]) {
471d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger	 R200_STATECHANGE( rmesa, vtx );
4727dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	 rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] = out_0;
473d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger      }
474d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger
475adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
476d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger   }
477adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   default:
478adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      return;
479adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
480adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
481adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (c.i != rmesa->hw.fog.cmd[FOG_C] || d.i != rmesa->hw.fog.cmd[FOG_D]) {
482adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE( rmesa, fog );
483adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.fog.cmd[FOG_C] = c.i;
484adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.fog.cmd[FOG_D] = d.i;
485adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
486adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
487adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
488adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* =============================================================
489adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Culling
490adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
491adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
492f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200CullFace( struct gl_context *ctx, GLenum unused )
493adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
494adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
495adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL];
496adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLuint t = rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL];
497adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
498adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   s |= R200_FFACE_SOLID | R200_BFACE_SOLID;
499adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   t &= ~(R200_CULL_FRONT | R200_CULL_BACK);
500adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
501adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if ( ctx->Polygon.CullFlag ) {
502adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      switch ( ctx->Polygon.CullFaceMode ) {
503adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      case GL_FRONT:
504adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 s &= ~R200_FFACE_SOLID;
505adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 t |= R200_CULL_FRONT;
506adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 break;
507adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      case GL_BACK:
508adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 s &= ~R200_BFACE_SOLID;
509adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 t |= R200_CULL_BACK;
510adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 break;
511adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      case GL_FRONT_AND_BACK:
512adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 s &= ~(R200_FFACE_SOLID | R200_BFACE_SOLID);
513adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 t |= (R200_CULL_FRONT | R200_CULL_BACK);
514adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 break;
515adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
516adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
517adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
518adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) {
519adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE(rmesa, set );
520adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.set.cmd[SET_SE_CNTL] = s;
521adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
522adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
523adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if ( rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] != t ) {
524adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE(rmesa, tcl );
525adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] = t;
526adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
527adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
528adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
529f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200FrontFace( struct gl_context *ctx, GLenum mode )
530adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
531adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
532320b5abda5026f23f327c6f60c1b6287cc507e78smoki   int cull_face = (mode == GL_CW) ? R200_FFACE_CULL_CW : R200_FFACE_CULL_CCW;
533adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
534adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, set );
535adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_FFACE_CULL_DIR_MASK;
536adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
537adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, tcl );
538adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~R200_CULL_FRONT_IS_CCW;
539adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
54060e60bb3026a269fefe1cfd3312fdf3a7e4c595fMichel Dänzer   /* Winding is inverted when rendering to FBO */
54147941bfaea6e8a60e2c31f7a2c8c233f2a10ecb1Brian Paul   if (ctx->DrawBuffer && _mesa_is_user_fbo(ctx->DrawBuffer))
542320b5abda5026f23f327c6f60c1b6287cc507e78smoki      cull_face = (mode == GL_CCW) ? R200_FFACE_CULL_CW : R200_FFACE_CULL_CCW;
543320b5abda5026f23f327c6f60c1b6287cc507e78smoki   rmesa->hw.set.cmd[SET_SE_CNTL] |= cull_face;
54460e60bb3026a269fefe1cfd3312fdf3a7e4c595fMichel Dänzer
545320b5abda5026f23f327c6f60c1b6287cc507e78smoki   if ( mode == GL_CCW )
546adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_CULL_FRONT_IS_CCW;
547adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
548adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
549adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* =============================================================
550adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Point state
551adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
552f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200PointSize( struct gl_context *ctx, GLfloat size )
553adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
55444dace86eaf9eded8e6465adfadf6345658686ddRoland Scheidegger   r200ContextPtr rmesa = R200_CONTEXT(ctx);
555cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   GLfloat *fcmd = (GLfloat *)rmesa->hw.ptp.cmd;
55644dace86eaf9eded8e6465adfadf6345658686ddRoland Scheidegger
55705b04084892cc54e52010837de8fd85cd64d3b7aPauli Nieminen   radeon_print(RADEON_STATE, RADEON_TRACE,
55805b04084892cc54e52010837de8fd85cd64d3b7aPauli Nieminen       "%s(%p) size: %f, fixed point result: %d.%d (%d/16)\n",
55905b04084892cc54e52010837de8fd85cd64d3b7aPauli Nieminen       __func__, ctx, size,
56005b04084892cc54e52010837de8fd85cd64d3b7aPauli Nieminen       ((GLuint)(ctx->Point.Size * 16.0))/16,
56105b04084892cc54e52010837de8fd85cd64d3b7aPauli Nieminen       (((GLuint)(ctx->Point.Size * 16.0))&15)*100/16,
56205b04084892cc54e52010837de8fd85cd64d3b7aPauli Nieminen       ((GLuint)(ctx->Point.Size * 16.0))&15);
56305b04084892cc54e52010837de8fd85cd64d3b7aPauli Nieminen
56444dace86eaf9eded8e6465adfadf6345658686ddRoland Scheidegger   R200_STATECHANGE( rmesa, cst );
565cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   R200_STATECHANGE( rmesa, ptp );
56644dace86eaf9eded8e6465adfadf6345658686ddRoland Scheidegger   rmesa->hw.cst.cmd[CST_RE_POINTSIZE] &= ~0xffff;
56744dace86eaf9eded8e6465adfadf6345658686ddRoland Scheidegger   rmesa->hw.cst.cmd[CST_RE_POINTSIZE] |= ((GLuint)(ctx->Point.Size * 16.0));
568cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger/* this is the size param of the point size calculation (point size reg value
569cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   is not used when calculation is active). */
570cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   fcmd[PTP_VPORT_SCALE_PTSIZE] = ctx->Point.Size;
571cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger}
572cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger
573f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200PointParameter( struct gl_context *ctx, GLenum pname, const GLfloat *params)
574cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger{
575cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   r200ContextPtr rmesa = R200_CONTEXT(ctx);
576cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   GLfloat *fcmd = (GLfloat *)rmesa->hw.ptp.cmd;
577cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger
578cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   switch (pname) {
579cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   case GL_POINT_SIZE_MIN:
580cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   /* Can clamp both in tcl and setup - just set both (as does fglrx) */
581cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      R200_STATECHANGE( rmesa, lin );
582cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      R200_STATECHANGE( rmesa, ptp );
583cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] &= 0xffff;
584cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] |= (GLuint)(ctx->Point.MinSize * 16.0) << 16;
585cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      fcmd[PTP_CLAMP_MIN] = ctx->Point.MinSize;
586cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      break;
587cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   case GL_POINT_SIZE_MAX:
588cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      R200_STATECHANGE( rmesa, cst );
589cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      R200_STATECHANGE( rmesa, ptp );
590cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      rmesa->hw.cst.cmd[CST_RE_POINTSIZE] &= 0xffff;
591cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      rmesa->hw.cst.cmd[CST_RE_POINTSIZE] |= (GLuint)(ctx->Point.MaxSize * 16.0) << 16;
592cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      fcmd[PTP_CLAMP_MAX] = ctx->Point.MaxSize;
593cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      break;
594cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   case GL_POINT_DISTANCE_ATTENUATION:
595cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      R200_STATECHANGE( rmesa, vtx );
596cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      R200_STATECHANGE( rmesa, spr );
597cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      R200_STATECHANGE( rmesa, ptp );
598cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      GLfloat *fcmd = (GLfloat *)rmesa->hw.ptp.cmd;
599cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] &=
600cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	 ~(R200_PS_MULT_MASK | R200_PS_LIN_ATT_ZERO | R200_PS_SE_SEL_STATE);
601cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      /* can't rely on ctx->Point._Attenuated here and test for NEW_POINT in
602cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	 r200ValidateState looks like overkill */
603cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      if (ctx->Point.Params[0] != 1.0 ||
604cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	  ctx->Point.Params[1] != 0.0 ||
605cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	  ctx->Point.Params[2] != 0.0 ||
606cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	  (ctx->VertexProgram.Enabled && ctx->VertexProgram.PointSizeEnabled)) {
607cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	 /* all we care for vp would be the ps_se_sel_state setting */
608cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	 fcmd[PTP_ATT_CONST_QUAD] = ctx->Point.Params[2];
609cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	 fcmd[PTP_ATT_CONST_LIN] = ctx->Point.Params[1];
610cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	 fcmd[PTP_ATT_CONST_CON] = ctx->Point.Params[0];
611cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	 rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] |= R200_PS_MULT_ATTENCONST;
612cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	 if (ctx->Point.Params[1] == 0.0)
613cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	    rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] |= R200_PS_LIN_ATT_ZERO;
614cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger/* FIXME: setting this here doesn't look quite ok - we only want to do
615cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger          that if we're actually drawing points probably */
616cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	 rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_PT_SIZE;
617cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	 rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= R200_VTX_POINT_SIZE;
618cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      }
619cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      else {
620cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	 rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] |=
621cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	    R200_PS_SE_SEL_STATE | R200_PS_MULT_CONST;
622cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	 rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] &= ~R200_OUTPUT_PT_SIZE;
623cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	 rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] &= ~R200_VTX_POINT_SIZE;
624cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      }
625cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      break;
626cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   case GL_POINT_FADE_THRESHOLD_SIZE:
627cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      /* don't support multisampling, so doesn't matter. */
628cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      break;
629cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   /* can't do these but don't need them.
630cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   case GL_POINT_SPRITE_R_MODE_NV:
631cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   case GL_POINT_SPRITE_COORD_ORIGIN: */
632cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   default:
633cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      fprintf(stderr, "bad pname parameter in r200PointParameter\n");
634cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      return;
635cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   }
636adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
637adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
638adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* =============================================================
639adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Line state
640adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
641f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200LineWidth( struct gl_context *ctx, GLfloat widthf )
642adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
643adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
644adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
645adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, lin );
646adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, set );
647adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
648adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   /* Line width is stored in U6.4 format.
649af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian    * Same min/max limits for AA, non-AA lines.
650adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell    */
651adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] &= ~0xffff;
652af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian   rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] |= (GLuint)
653af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian      (CLAMP(widthf, ctx->Const.MinLineWidth, ctx->Const.MaxLineWidth) * 16.0);
654adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
655adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if ( widthf > 1.0 ) {
656adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.set.cmd[SET_SE_CNTL] |=  R200_WIDELINE_ENABLE;
657adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   } else {
658adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_WIDELINE_ENABLE;
659adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
660adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
661adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
662f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200LineStipple( struct gl_context *ctx, GLint factor, GLushort pattern )
663adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
664adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
665adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
666adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, lin );
6677dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   rmesa->hw.lin.cmd[LIN_RE_LINE_PATTERN] =
668adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      ((((GLuint)factor & 0xff) << 16) | ((GLuint)pattern));
669adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
670adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
671adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
672adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* =============================================================
673adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Masks
674adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
675f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200ColorMask( struct gl_context *ctx,
676adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell			   GLboolean r, GLboolean g,
677adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell			   GLboolean b, GLboolean a )
678adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
679adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
680504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie   GLuint mask;
681504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie   struct radeon_renderbuffer *rrb;
682adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLuint flag = rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] & ~R200_PLANE_MASK_ENABLE;
683adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
684504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie   rrb = radeon_get_colorbuffer(&rmesa->radeon);
685504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie   if (!rrb)
686504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie     return;
687504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie   mask = radeonPackColor( rrb->cpp,
688fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul			   ctx->Color.ColorMask[0][RCOMP],
689fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul			   ctx->Color.ColorMask[0][GCOMP],
690fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul			   ctx->Color.ColorMask[0][BCOMP],
691fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul			   ctx->Color.ColorMask[0][ACOMP] );
692504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie
693504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie
694adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (!(r && g && b && a))
695adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      flag |= R200_PLANE_MASK_ENABLE;
696adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
6977dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   if ( rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] != flag ) {
6987dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      R200_STATECHANGE( rmesa, ctx );
6997dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = flag;
7007dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   }
701adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
702adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if ( rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] != mask ) {
703adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE( rmesa, msk );
704adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] = mask;
705adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
706adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
707adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
708adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
709adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* =============================================================
710adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Polygon state
711adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
712adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
713f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200PolygonOffset( struct gl_context *ctx,
714adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell			       GLfloat factor, GLfloat units )
715adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
716adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
7178c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie   const GLfloat depthScale = 1.0F / ctx->DrawBuffer->_DepthMaxF;
7188c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie   float_ui32_type constant =  { units * depthScale };
71908e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   float_ui32_type factoru = { factor };
720adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
721adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/*    factor *= 2; */
722adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/*    constant *= 2; */
72308e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger
724adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/*    fprintf(stderr, "%s f:%f u:%f\n", __FUNCTION__, factor, constant); */
725adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
726adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, zbs );
72708e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_FACTOR]   = factoru.ui32;
72808e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_CONSTANT] = constant.ui32;
729adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
730adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
731f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200PolygonMode( struct gl_context *ctx, GLenum face, GLenum mode )
732adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
733adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
734adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLboolean flag = (ctx->_TriangleCaps & DD_TRI_UNFILLED) != 0;
735adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
736adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   /* Can't generally do unfilled via tcl, but some good special
7377dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle    * cases work.
738adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell    */
739adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   TCL_FALLBACK( ctx, R200_TCL_FALLBACK_UNFILLED, flag);
7404637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (rmesa->radeon.TclFallback) {
741adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      r200ChooseRenderState( ctx );
742adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      r200ChooseVertexState( ctx );
743adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
744adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
745adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
746adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
747adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* =============================================================
748adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Rendering attributes
749adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell *
750adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * We really don't want to recalculate all this every time we bind a
751adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * texture.  These things shouldn't change all that often, so it makes
752adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * sense to break them out of the core texture state update routines.
753adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
754adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
755adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* Examine lighting and texture state to determine if separate specular
756adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * should be enabled.
757adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
758f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200UpdateSpecular( struct gl_context *ctx )
759adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
760adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
7615a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell   uint32_t p = rmesa->hw.ctx.cmd[CTX_PP_CNTL];
762adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
763adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, tcl );
764adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, vtx );
765adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
766adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] &= ~(3<<R200_VTX_COLOR_0_SHIFT);
767adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] &= ~(3<<R200_VTX_COLOR_1_SHIFT);
768adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] &= ~R200_OUTPUT_COLOR_0;
769adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] &= ~R200_OUTPUT_COLOR_1;
770adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_LIGHTING_ENABLE;
771adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
772adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   p &= ~R200_SPECULAR_ENABLE;
773adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
774adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_DIFFUSE_SPECULAR_COMBINE;
775adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
776adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
777adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (ctx->Light.Enabled &&
778adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell       ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) {
7797dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |=
780adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT) |
7817dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	  (R200_VTX_FP_RGBA << R200_VTX_COLOR_1_SHIFT));
782adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_0;
783adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_1;
784adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LIGHTING_ENABLE;
785adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      p |=  R200_SPECULAR_ENABLE;
7867dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &=
787adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 ~R200_DIFFUSE_SPECULAR_COMBINE;
788adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
789adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   else if (ctx->Light.Enabled) {
7907dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |=
7917dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	 ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT));
792adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_0;
793adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LIGHTING_ENABLE;
794adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   } else if (ctx->Fog.ColorSumEnabled ) {
7957dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |=
796adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT) |
7977dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	  (R200_VTX_FP_RGBA << R200_VTX_COLOR_1_SHIFT));
798adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      p |=  R200_SPECULAR_ENABLE;
799adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   } else {
8007dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |=
8017dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	 ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT));
802adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
803adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
804adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (ctx->Fog.Enabled) {
8057dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |=
8067dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	 ((R200_VTX_FP_RGBA << R200_VTX_COLOR_1_SHIFT));
807adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_1;
808adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
809adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
810adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if ( rmesa->hw.ctx.cmd[CTX_PP_CNTL] != p ) {
811adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE( rmesa, ctx );
812adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_PP_CNTL] = p;
813adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
814adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
815adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   /* Update vertex/render formats
816adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell    */
8177dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   if (rmesa->radeon.TclFallback) {
818adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      r200ChooseRenderState( ctx );
819adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      r200ChooseVertexState( ctx );
820adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
821adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
822adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
823adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
824adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* =============================================================
825adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Materials
826adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
827adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
828adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
8297dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle/* Update on colormaterial, material emmissive/ambient,
830adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * lightmodel.globalambient
831adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
832f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void update_global_ambient( struct gl_context *ctx )
833adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
834adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
835adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   float *fcmd = (float *)R200_DB_STATE( glt );
836adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
837adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   /* Need to do more if both emmissive & ambient are PREMULT:
838a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger    * I believe this is not nessary when using source_material. This condition thus
839a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger    * will never happen currently, and the function has no dependencies on materials now
840adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell    */
841adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if ((rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1] &
842adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell       ((3 << R200_FRONT_EMISSIVE_SOURCE_SHIFT) |
8437dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	(3 << R200_FRONT_AMBIENT_SOURCE_SHIFT))) == 0)
844adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   {
8457dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      COPY_3V( &fcmd[GLT_RED],
846adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	       ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_EMISSION]);
847adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      ACC_SCALE_3V( &fcmd[GLT_RED],
848adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell		   ctx->Light.Model.Ambient,
849adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell		   ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT]);
8507dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   }
851adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   else
852adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   {
853adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      COPY_3V( &fcmd[GLT_RED], ctx->Light.Model.Ambient );
854adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
8557dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
856adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_DB_STATECHANGE(rmesa, &rmesa->hw.glt);
857adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
858adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
8597dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle/* Update on change to
860adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell *    - light[p].colors
861adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell *    - light[p].enabled
862adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
863f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void update_light_colors( struct gl_context *ctx, GLuint p )
864adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
865adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   struct gl_light *l = &ctx->Light.Light[p];
866adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
867adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/*     fprintf(stderr, "%s\n", __FUNCTION__); */
868adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
869adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (l->Enabled) {
870adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      r200ContextPtr rmesa = R200_CONTEXT(ctx);
871adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      float *fcmd = (float *)R200_DB_STATE( lit[p] );
872adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
8737dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      COPY_4V( &fcmd[LIT_AMBIENT_RED], l->Ambient );
874adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      COPY_4V( &fcmd[LIT_DIFFUSE_RED], l->Diffuse );
875adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      COPY_4V( &fcmd[LIT_SPECULAR_RED], l->Specular );
8767dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
877adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] );
878adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
879adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
880adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
881f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200ColorMaterial( struct gl_context *ctx, GLenum face, GLenum mode )
882adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
883adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      r200ContextPtr rmesa = R200_CONTEXT(ctx);
884adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      GLuint light_model_ctl1 = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1];
885adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      light_model_ctl1 &= ~((0xf << R200_FRONT_EMISSIVE_SOURCE_SHIFT) |
886adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell			   (0xf << R200_FRONT_AMBIENT_SOURCE_SHIFT) |
887adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell			   (0xf << R200_FRONT_DIFFUSE_SOURCE_SHIFT) |
888a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger		   (0xf << R200_FRONT_SPECULAR_SOURCE_SHIFT) |
889a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger		   (0xf << R200_BACK_EMISSIVE_SOURCE_SHIFT) |
890a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger		   (0xf << R200_BACK_AMBIENT_SOURCE_SHIFT) |
891a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger		   (0xf << R200_BACK_DIFFUSE_SOURCE_SHIFT) |
892a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger		   (0xf << R200_BACK_SPECULAR_SOURCE_SHIFT));
893a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger
894a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   if (ctx->Light.ColorMaterialEnabled) {
8954cb3579e52fed48d623698610e31d05ac8c8946fBrian Paul      GLuint mask = ctx->Light._ColorMaterialBitmask;
8967dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
897adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if (mask & MAT_BIT_FRONT_EMISSION) {
898adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<
899adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell			     R200_FRONT_EMISSIVE_SOURCE_SHIFT);
900adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
901a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      else
902a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger	 light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 <<
903a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger			     R200_FRONT_EMISSIVE_SOURCE_SHIFT);
904adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
905adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if (mask & MAT_BIT_FRONT_AMBIENT) {
906adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<
907adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell			     R200_FRONT_AMBIENT_SOURCE_SHIFT);
908adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
909a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      else
910a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger         light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 <<
911a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger			     R200_FRONT_AMBIENT_SOURCE_SHIFT);
9127dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
913adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if (mask & MAT_BIT_FRONT_DIFFUSE) {
914adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<
915adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell			     R200_FRONT_DIFFUSE_SOURCE_SHIFT);
916adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
917a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      else
918a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger         light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 <<
919a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger			     R200_FRONT_DIFFUSE_SOURCE_SHIFT);
9207dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
921adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if (mask & MAT_BIT_FRONT_SPECULAR) {
922adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<
923adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell			     R200_FRONT_SPECULAR_SOURCE_SHIFT);
924adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
925a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      else {
926a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger         light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 <<
927a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger			     R200_FRONT_SPECULAR_SOURCE_SHIFT);
928a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      }
9297dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
930a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      if (mask & MAT_BIT_BACK_EMISSION) {
931a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<
932a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger			     R200_BACK_EMISSIVE_SOURCE_SHIFT);
933a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      }
934adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
935a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      else light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 <<
936a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger			     R200_BACK_EMISSIVE_SOURCE_SHIFT);
937adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
938a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      if (mask & MAT_BIT_BACK_AMBIENT) {
939a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<
940a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger			     R200_BACK_AMBIENT_SOURCE_SHIFT);
941a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      }
942a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      else light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 <<
943a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger			     R200_BACK_AMBIENT_SOURCE_SHIFT);
944a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger
945a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      if (mask & MAT_BIT_BACK_DIFFUSE) {
946a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<
947a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger			     R200_BACK_DIFFUSE_SOURCE_SHIFT);
948a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   }
949a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      else light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 <<
950a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger			     R200_BACK_DIFFUSE_SOURCE_SHIFT);
951a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger
952a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      if (mask & MAT_BIT_BACK_SPECULAR) {
953a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<
954a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger			     R200_BACK_SPECULAR_SOURCE_SHIFT);
955a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      }
956a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      else {
957a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger         light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 <<
958a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger			     R200_BACK_SPECULAR_SOURCE_SHIFT);
959a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      }
960adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
961a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   else {
962a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger       /* Default to SOURCE_MATERIAL:
963a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger        */
964a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger     light_model_ctl1 |=
965a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger        (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_EMISSIVE_SOURCE_SHIFT) |
966a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger        (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_AMBIENT_SOURCE_SHIFT) |
967a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger        (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_DIFFUSE_SOURCE_SHIFT) |
968a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger        (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_SPECULAR_SOURCE_SHIFT) |
969a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger        (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_EMISSIVE_SOURCE_SHIFT) |
970a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger        (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_AMBIENT_SOURCE_SHIFT) |
971a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger        (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_DIFFUSE_SOURCE_SHIFT) |
972a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger        (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_SPECULAR_SOURCE_SHIFT);
973a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   }
974a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger
975a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   if (light_model_ctl1 != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1]) {
976a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      R200_STATECHANGE( rmesa, tcl );
977a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1] = light_model_ctl1;
978adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
9797dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
9807dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
981adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
982adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
983f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid r200UpdateMaterial( struct gl_context *ctx )
984adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
985adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
986adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLfloat (*mat)[4] = ctx->Light.Material.Attrib;
987adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLfloat *fcmd = (GLfloat *)R200_DB_STATE( mtl[0] );
988a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   GLfloat *fcmd2 = (GLfloat *)R200_DB_STATE( mtl[1] );
989adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLuint mask = ~0;
9907dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
991a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   /* Might be possible and faster to update everything unconditionally? */
992adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (ctx->Light.ColorMaterialEnabled)
9934cb3579e52fed48d623698610e31d05ac8c8946fBrian Paul      mask &= ~ctx->Light._ColorMaterialBitmask;
994adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
995239105c6c87da0b0c5c15ae54b19fe39492b0f29Pauli Nieminen   if (R200_DEBUG & RADEON_STATE)
996adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fprintf(stderr, "%s\n", __FUNCTION__);
997adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
998adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (mask & MAT_BIT_FRONT_EMISSION) {
999adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[MTL_EMMISSIVE_RED]   = mat[MAT_ATTRIB_FRONT_EMISSION][0];
1000adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[MTL_EMMISSIVE_GREEN] = mat[MAT_ATTRIB_FRONT_EMISSION][1];
1001adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[MTL_EMMISSIVE_BLUE]  = mat[MAT_ATTRIB_FRONT_EMISSION][2];
1002adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[MTL_EMMISSIVE_ALPHA] = mat[MAT_ATTRIB_FRONT_EMISSION][3];
1003adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1004adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (mask & MAT_BIT_FRONT_AMBIENT) {
1005adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[MTL_AMBIENT_RED]     = mat[MAT_ATTRIB_FRONT_AMBIENT][0];
1006adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[MTL_AMBIENT_GREEN]   = mat[MAT_ATTRIB_FRONT_AMBIENT][1];
1007adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[MTL_AMBIENT_BLUE]    = mat[MAT_ATTRIB_FRONT_AMBIENT][2];
1008adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[MTL_AMBIENT_ALPHA]   = mat[MAT_ATTRIB_FRONT_AMBIENT][3];
1009adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1010adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (mask & MAT_BIT_FRONT_DIFFUSE) {
1011adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[MTL_DIFFUSE_RED]     = mat[MAT_ATTRIB_FRONT_DIFFUSE][0];
1012adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[MTL_DIFFUSE_GREEN]   = mat[MAT_ATTRIB_FRONT_DIFFUSE][1];
1013adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[MTL_DIFFUSE_BLUE]    = mat[MAT_ATTRIB_FRONT_DIFFUSE][2];
1014adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[MTL_DIFFUSE_ALPHA]   = mat[MAT_ATTRIB_FRONT_DIFFUSE][3];
1015adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1016adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (mask & MAT_BIT_FRONT_SPECULAR) {
1017adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[MTL_SPECULAR_RED]    = mat[MAT_ATTRIB_FRONT_SPECULAR][0];
1018adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[MTL_SPECULAR_GREEN]  = mat[MAT_ATTRIB_FRONT_SPECULAR][1];
1019adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[MTL_SPECULAR_BLUE]   = mat[MAT_ATTRIB_FRONT_SPECULAR][2];
1020adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[MTL_SPECULAR_ALPHA]  = mat[MAT_ATTRIB_FRONT_SPECULAR][3];
1021adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1022adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (mask & MAT_BIT_FRONT_SHININESS) {
1023adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[MTL_SHININESS]       = mat[MAT_ATTRIB_FRONT_SHININESS][0];
1024adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1025adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1026a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   if (mask & MAT_BIT_BACK_EMISSION) {
1027a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      fcmd2[MTL_EMMISSIVE_RED]   = mat[MAT_ATTRIB_BACK_EMISSION][0];
1028a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      fcmd2[MTL_EMMISSIVE_GREEN] = mat[MAT_ATTRIB_BACK_EMISSION][1];
1029a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      fcmd2[MTL_EMMISSIVE_BLUE]  = mat[MAT_ATTRIB_BACK_EMISSION][2];
1030a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      fcmd2[MTL_EMMISSIVE_ALPHA] = mat[MAT_ATTRIB_BACK_EMISSION][3];
1031a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   }
1032a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   if (mask & MAT_BIT_BACK_AMBIENT) {
1033a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      fcmd2[MTL_AMBIENT_RED]     = mat[MAT_ATTRIB_BACK_AMBIENT][0];
1034a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      fcmd2[MTL_AMBIENT_GREEN]   = mat[MAT_ATTRIB_BACK_AMBIENT][1];
1035a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      fcmd2[MTL_AMBIENT_BLUE]    = mat[MAT_ATTRIB_BACK_AMBIENT][2];
1036a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      fcmd2[MTL_AMBIENT_ALPHA]   = mat[MAT_ATTRIB_BACK_AMBIENT][3];
1037a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   }
1038a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   if (mask & MAT_BIT_BACK_DIFFUSE) {
1039a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      fcmd2[MTL_DIFFUSE_RED]     = mat[MAT_ATTRIB_BACK_DIFFUSE][0];
1040a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      fcmd2[MTL_DIFFUSE_GREEN]   = mat[MAT_ATTRIB_BACK_DIFFUSE][1];
1041a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      fcmd2[MTL_DIFFUSE_BLUE]    = mat[MAT_ATTRIB_BACK_DIFFUSE][2];
1042a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      fcmd2[MTL_DIFFUSE_ALPHA]   = mat[MAT_ATTRIB_BACK_DIFFUSE][3];
1043a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   }
1044a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   if (mask & MAT_BIT_BACK_SPECULAR) {
1045a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      fcmd2[MTL_SPECULAR_RED]    = mat[MAT_ATTRIB_BACK_SPECULAR][0];
1046a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      fcmd2[MTL_SPECULAR_GREEN]  = mat[MAT_ATTRIB_BACK_SPECULAR][1];
1047a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      fcmd2[MTL_SPECULAR_BLUE]   = mat[MAT_ATTRIB_BACK_SPECULAR][2];
1048a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      fcmd2[MTL_SPECULAR_ALPHA]  = mat[MAT_ATTRIB_BACK_SPECULAR][3];
1049a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   }
1050a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   if (mask & MAT_BIT_BACK_SHININESS) {
1051a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger      fcmd2[MTL_SHININESS]       = mat[MAT_ATTRIB_BACK_SHININESS][0];
1052a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   }
1053adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1054a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   R200_DB_STATECHANGE( rmesa, &rmesa->hw.mtl[0] );
1055a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   R200_DB_STATECHANGE( rmesa, &rmesa->hw.mtl[1] );
1056a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer
1057a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger   /* currently material changes cannot trigger a global ambient change, I believe this is correct
1058a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger    update_global_ambient( ctx ); */
1059adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
1060adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1061adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* _NEW_LIGHT
1062adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * _NEW_MODELVIEW
1063adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * _MESA_NEW_NEED_EYE_COORDS
1064adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell *
1065adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Uses derived state from mesa:
1066adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell *       _VP_inf_norm
1067adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell *       _h_inf_norm
1068adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell *       _Position
10697391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul *       _NormSpotDirection
1070adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell *       _ModelViewInvScale
1071adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell *       _NeedEyeCoords
1072adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell *       _EyeZDir
1073adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell *
1074adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * which are calculated in light.c and are correct for the current
1075adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * lighting space (model or eye), hence dependencies on _NEW_MODELVIEW
10767dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle * and _MESA_NEW_NEED_EYE_COORDS.
1077adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
1078f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void update_light( struct gl_context *ctx )
1079adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
1080adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1081adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1082adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   /* Have to check these, or have an automatic shortcircuit mechanism
1083adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell    * to remove noop statechanges. (Or just do a better job on the
1084adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell    * front end).
1085adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell    */
1086adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   {
1087adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      GLuint tmp = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0];
1088adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1089adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if (ctx->_NeedEyeCoords)
1090adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 tmp &= ~R200_LIGHT_IN_MODELSPACE;
1091adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      else
1092adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 tmp |= R200_LIGHT_IN_MODELSPACE;
10937dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
10947dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      if (tmp != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0])
1095adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      {
1096adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 R200_STATECHANGE( rmesa, tcl );
1097adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] = tmp;
1098adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1099adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1100adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1101adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   {
1102adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      GLfloat *fcmd = (GLfloat *)R200_DB_STATE( eye );
1103adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[EYE_X] = ctx->_EyeZDir[0];
1104adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[EYE_Y] = ctx->_EyeZDir[1];
1105adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[EYE_Z] = - ctx->_EyeZDir[2];
1106adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[EYE_RESCALE_FACTOR] = ctx->_ModelViewInvScale;
1107adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_DB_STATECHANGE( rmesa, &rmesa->hw.eye );
1108adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1109adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1110adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1111adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1112adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (ctx->Light.Enabled) {
1113adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      GLint p;
1114adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      for (p = 0 ; p < MAX_LIGHTS; p++) {
1115adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 if (ctx->Light.Light[p].Enabled) {
1116adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    struct gl_light *l = &ctx->Light.Light[p];
1117adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    GLfloat *fcmd = (GLfloat *)R200_DB_STATE( lit[p] );
11187dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
1119adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    if (l->EyePosition[3] == 0.0) {
11207dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	       COPY_3FV( &fcmd[LIT_POSITION_X], l->_VP_inf_norm );
11217dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	       COPY_3FV( &fcmd[LIT_DIRECTION_X], l->_h_inf_norm );
1122adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	       fcmd[LIT_POSITION_W] = 0;
1123adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	       fcmd[LIT_DIRECTION_W] = 0;
1124adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    } else {
1125adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	       COPY_4V( &fcmd[LIT_POSITION_X], l->_Position );
11267391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul	       fcmd[LIT_DIRECTION_X] = -l->_NormSpotDirection[0];
11277391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul	       fcmd[LIT_DIRECTION_Y] = -l->_NormSpotDirection[1];
11287391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul	       fcmd[LIT_DIRECTION_Z] = -l->_NormSpotDirection[2];
1129adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	       fcmd[LIT_DIRECTION_W] = 0;
1130adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    }
1131adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1132adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    R200_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] );
1133adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 }
1134adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1135adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1136adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
1137adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1138f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200Lightfv( struct gl_context *ctx, GLenum light,
1139adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell			   GLenum pname, const GLfloat *params )
1140adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
1141adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1142adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLint p = light - GL_LIGHT0;
1143adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   struct gl_light *l = &ctx->Light.Light[p];
1144adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLfloat *fcmd = (GLfloat *)rmesa->hw.lit[p].cmd;
11457dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
1146adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1147adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   switch (pname) {
11487dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   case GL_AMBIENT:
1149adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_DIFFUSE:
1150adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_SPECULAR:
1151adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      update_light_colors( ctx, p );
1152adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1153adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
11547dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   case GL_SPOT_DIRECTION:
11557dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      /* picked up in update_light */
1156adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1157adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1158adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_POSITION: {
11597dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      /* positions picked up in update_light, but can do flag here */
1160adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      GLuint flag = (p&1)? R200_LIGHT_1_IS_LOCAL : R200_LIGHT_0_IS_LOCAL;
1161adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;
1162adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1163adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE(rmesa, tcl);
1164adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if (l->EyePosition[3] != 0.0F)
1165adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.tcl.cmd[idx] |= flag;
1166adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      else
1167adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.tcl.cmd[idx] &= ~flag;
1168adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1169adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1170adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1171adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_SPOT_EXPONENT:
1172adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE(rmesa, lit[p]);
1173adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[LIT_SPOT_EXPONENT] = params[0];
1174adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1175adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1176adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_SPOT_CUTOFF: {
1177adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      GLuint flag = (p&1) ? R200_LIGHT_1_IS_SPOT : R200_LIGHT_0_IS_SPOT;
1178adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;
1179adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1180adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE(rmesa, lit[p]);
1181adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[LIT_SPOT_CUTOFF] = l->_CosCutoff;
1182adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1183adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE(rmesa, tcl);
1184adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if (l->SpotCutoff != 180.0F)
1185adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.tcl.cmd[idx] |= flag;
1186adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      else
1187adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.tcl.cmd[idx] &= ~flag;
1188adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1189adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1190adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1191adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1192adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_CONSTANT_ATTENUATION:
1193adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE(rmesa, lit[p]);
1194adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[LIT_ATTEN_CONST] = params[0];
11955d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      if ( params[0] == 0.0 )
11965d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 fcmd[LIT_ATTEN_CONST_INV] = FLT_MAX;
11975d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      else
11985d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 fcmd[LIT_ATTEN_CONST_INV] = 1.0 / params[0];
1199adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1200adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_LINEAR_ATTENUATION:
1201adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE(rmesa, lit[p]);
1202adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[LIT_ATTEN_LINEAR] = params[0];
1203adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1204adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_QUADRATIC_ATTENUATION:
1205adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE(rmesa, lit[p]);
1206adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fcmd[LIT_ATTEN_QUADRATIC] = params[0];
1207adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1208adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   default:
1209adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      return;
1210adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1211adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
12125d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer   /* Set RANGE_ATTEN only when needed */
12135d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer   switch (pname) {
12145d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer   case GL_POSITION:
12155d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer   case GL_CONSTANT_ATTENUATION:
12165d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer   case GL_LINEAR_ATTENUATION:
12175d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer   case GL_QUADRATIC_ATTENUATION: {
12185d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      GLuint *icmd = (GLuint *)R200_DB_STATE( tcl );
12195d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;
12205d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      GLuint atten_flag = ( p&1 ) ? R200_LIGHT_1_ENABLE_RANGE_ATTEN
12215d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer				  : R200_LIGHT_0_ENABLE_RANGE_ATTEN;
12225d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      GLuint atten_const_flag = ( p&1 ) ? R200_LIGHT_1_CONSTANT_RANGE_ATTEN
12235d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer				  : R200_LIGHT_0_CONSTANT_RANGE_ATTEN;
12245d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer
12255d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      if ( l->EyePosition[3] == 0.0F ||
12265d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	   ( ( fcmd[LIT_ATTEN_CONST] == 0.0 || fcmd[LIT_ATTEN_CONST] == 1.0 ) &&
12275d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	     fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) ) {
12285d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 /* Disable attenuation */
12295d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 icmd[idx] &= ~atten_flag;
12305d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      } else {
12315d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 if ( fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) {
12325d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    /* Enable only constant portion of attenuation calculation */
12335d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    icmd[idx] |= ( atten_flag | atten_const_flag );
12345d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 } else {
12355d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    /* Enable full attenuation calculation */
12365d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    icmd[idx] &= ~atten_const_flag;
12375d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    icmd[idx] |= atten_flag;
12385d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 }
12395d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      }
12405d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer
12415d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      R200_DB_STATECHANGE( rmesa, &rmesa->hw.tcl );
12425d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      break;
12435d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer   }
12445d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer   default:
12455d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer     break;
12465d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer   }
1247adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
1248adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1249f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200UpdateLocalViewer ( struct gl_context *ctx )
12509dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger{
12519dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger/* It looks like for the texgen modes GL_SPHERE_MAP, GL_NORMAL_MAP and
12529dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger   GL_REFLECTION_MAP we need R200_LOCAL_VIEWER set (fglrx does exactly that
12539dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger   for these and only these modes). This means specular highlights may turn out
12549dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger   wrong in some cases when lighting is enabled but GL_LIGHT_MODEL_LOCAL_VIEWER
12559dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger   is not set, though it seems to happen rarely and the effect seems quite
12569dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger   subtle. May need TCL fallback to fix it completely, though I'm not sure
12579dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger   how you'd identify the cases where the specular highlights indeed will
12589dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger   be wrong. Don't know if fglrx does something special in that case.
12599dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger*/
12609dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger   r200ContextPtr rmesa = R200_CONTEXT(ctx);
12619dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger   R200_STATECHANGE( rmesa, tcl );
12629dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger   if (ctx->Light.Model.LocalViewer ||
12639dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger       ctx->Texture._GenFlags & TEXGEN_NEED_NORMALS)
12649dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LOCAL_VIEWER;
12659dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger   else
12669dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_LOCAL_VIEWER;
12679dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger}
1268adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1269f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200LightModelfv( struct gl_context *ctx, GLenum pname,
1270adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell				const GLfloat *param )
1271adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
1272adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1273adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1274adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   switch (pname) {
12757dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      case GL_LIGHT_MODEL_AMBIENT:
1276adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 update_global_ambient( ctx );
1277adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 break;
1278adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1279adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      case GL_LIGHT_MODEL_LOCAL_VIEWER:
12809dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger	 r200UpdateLocalViewer( ctx );
1281adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell         break;
1282adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1283adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      case GL_LIGHT_MODEL_TWO_SIDE:
1284adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 R200_STATECHANGE( rmesa, tcl );
1285adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 if (ctx->Light.Model.TwoSide)
1286adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LIGHT_TWOSIDE;
1287adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 else
1288a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger	    rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~(R200_LIGHT_TWOSIDE);
12894637235183b80963536f2364e4d50fcb894886ddDave Airlie	 if (rmesa->radeon.TclFallback) {
1290adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    r200ChooseRenderState( ctx );
1291adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    r200ChooseVertexState( ctx );
1292adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 }
1293adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell         break;
1294adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1295adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      case GL_LIGHT_MODEL_COLOR_CONTROL:
1296adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 r200UpdateSpecular(ctx);
1297adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell         break;
1298adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1299adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      default:
1300adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell         break;
1301adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1302adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
1303adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1304f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200ShadeModel( struct gl_context *ctx, GLenum mode )
1305adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
1306adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1307adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL];
1308adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1309adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   s &= ~(R200_DIFFUSE_SHADE_MASK |
1310adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	  R200_ALPHA_SHADE_MASK |
1311adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	  R200_SPECULAR_SHADE_MASK |
1312cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	  R200_FOG_SHADE_MASK |
1313cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	  R200_DISC_FOG_SHADE_MASK);
1314adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1315adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   switch ( mode ) {
1316adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_FLAT:
1317adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      s |= (R200_DIFFUSE_SHADE_FLAT |
1318adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    R200_ALPHA_SHADE_FLAT |
1319adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    R200_SPECULAR_SHADE_FLAT |
1320cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	    R200_FOG_SHADE_FLAT |
1321cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	    R200_DISC_FOG_SHADE_FLAT);
1322adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1323adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_SMOOTH:
1324adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      s |= (R200_DIFFUSE_SHADE_GOURAUD |
1325adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    R200_ALPHA_SHADE_GOURAUD |
1326adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    R200_SPECULAR_SHADE_GOURAUD |
1327cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	    R200_FOG_SHADE_GOURAUD |
1328cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	    R200_DISC_FOG_SHADE_GOURAUD);
1329adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1330adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   default:
1331adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      return;
1332adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1333adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1334adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) {
1335adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE( rmesa, set );
1336adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.set.cmd[SET_SE_CNTL] = s;
1337adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1338adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
1339adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1340adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1341adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* =============================================================
1342adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * User clip planes
1343adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
1344adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1345f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200ClipPlane( struct gl_context *ctx, GLenum plane, const GLfloat *eq )
1346adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
1347adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLint p = (GLint) plane - (GLint) GL_CLIP_PLANE0;
1348adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1349adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p];
1350adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1351adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, ucp[p] );
1352adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.ucp[p].cmd[UCP_X] = ip[0];
1353adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1];
1354adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2];
1355adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.ucp[p].cmd[UCP_W] = ip[3];
1356adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
1357adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1358f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200UpdateClipPlanes( struct gl_context *ctx )
1359adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
1360adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1361adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLuint p;
1362adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1363adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   for (p = 0; p < ctx->Const.MaxClipPlanes; p++) {
1364adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if (ctx->Transform.ClipPlanesEnabled & (1 << p)) {
1365adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p];
1366adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1367adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 R200_STATECHANGE( rmesa, ucp[p] );
1368adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.ucp[p].cmd[UCP_X] = ip[0];
1369adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1];
1370adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2];
1371adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.ucp[p].cmd[UCP_W] = ip[3];
1372adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1373adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1374adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
1375adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1376adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1377adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* =============================================================
1378adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Stencil
1379adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
1380adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1381878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void
1382f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergr200StencilFuncSeparate( struct gl_context *ctx, GLenum face, GLenum func,
1383878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul                         GLint ref, GLuint mask )
1384adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
1385adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
138671b2504e0390fa19f133647c8686d830f8f40eb6Keith Whitwell   GLuint refmask = (((ctx->Stencil.Ref[0] & 0xff) << R200_STENCIL_REF_SHIFT) |
138771b2504e0390fa19f133647c8686d830f8f40eb6Keith Whitwell		     ((ctx->Stencil.ValueMask[0] & 0xff) << R200_STENCIL_MASK_SHIFT));
1388adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1389adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, ctx );
1390adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, msk );
1391adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1392adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~R200_STENCIL_TEST_MASK;
1393adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~(R200_STENCIL_REF_MASK|
1394adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell						   R200_STENCIL_VALUE_MASK);
1395adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1396adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   switch ( ctx->Stencil.Function[0] ) {
1397adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_NEVER:
1398adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_NEVER;
1399adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1400adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_LESS:
1401adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_LESS;
1402adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1403adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_EQUAL:
1404adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_EQUAL;
1405adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1406adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_LEQUAL:
1407adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_LEQUAL;
1408adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1409adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_GREATER:
1410adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_GREATER;
1411adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1412adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_NOTEQUAL:
1413adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_NEQUAL;
1414adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1415adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_GEQUAL:
1416adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_GEQUAL;
1417adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1418adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_ALWAYS:
1419adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_ALWAYS;
1420adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1421adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1422adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1423adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |= refmask;
1424adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
1425adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1426878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void
1427f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergr200StencilMaskSeparate( struct gl_context *ctx, GLenum face, GLuint mask )
1428adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
1429adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1430adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1431adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, msk );
1432adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~R200_STENCIL_WRITE_MASK;
1433adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |=
143471b2504e0390fa19f133647c8686d830f8f40eb6Keith Whitwell      ((ctx->Stencil.WriteMask[0] & 0xff) << R200_STENCIL_WRITEMASK_SHIFT);
1435adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
1436adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1437878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void
1438f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergr200StencilOpSeparate( struct gl_context *ctx, GLenum face, GLenum fail,
1439878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul                       GLenum zfail, GLenum zpass )
1440adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
1441adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1442adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1443adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, ctx );
1444adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~(R200_STENCIL_FAIL_MASK |
1445adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell					       R200_STENCIL_ZFAIL_MASK |
1446adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell					       R200_STENCIL_ZPASS_MASK);
1447adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1448adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   switch ( ctx->Stencil.FailFunc[0] ) {
1449adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_KEEP:
1450adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_KEEP;
1451adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1452adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_ZERO:
1453adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_ZERO;
1454adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1455adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_REPLACE:
1456adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_REPLACE;
1457adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1458adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_INCR:
1459adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_INC;
1460adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1461adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_DECR:
1462adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_DEC;
1463adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1464adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_INCR_WRAP_EXT:
1465adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_INC_WRAP;
1466adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1467adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_DECR_WRAP_EXT:
1468adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_DEC_WRAP;
1469adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1470adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_INVERT:
1471adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_INVERT;
1472adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1473adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1474adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1475adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   switch ( ctx->Stencil.ZFailFunc[0] ) {
1476adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_KEEP:
1477adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_KEEP;
1478adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1479adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_ZERO:
1480adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_ZERO;
1481adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1482adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_REPLACE:
1483adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_REPLACE;
1484adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1485adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_INCR:
1486adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_INC;
1487adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1488adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_DECR:
1489adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_DEC;
1490adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1491adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_INCR_WRAP_EXT:
1492adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_INC_WRAP;
1493adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1494adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_DECR_WRAP_EXT:
1495adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_DEC_WRAP;
1496adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1497adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_INVERT:
1498adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_INVERT;
1499adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1500adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1501adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1502adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   switch ( ctx->Stencil.ZPassFunc[0] ) {
1503adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_KEEP:
1504adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_KEEP;
1505adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1506adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_ZERO:
1507adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_ZERO;
1508adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1509adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_REPLACE:
1510adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_REPLACE;
1511adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1512adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_INCR:
1513adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_INC;
1514adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1515adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_DECR:
1516adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_DEC;
1517adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1518adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_INCR_WRAP_EXT:
1519adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_INC_WRAP;
1520adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1521adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_DECR_WRAP_EXT:
1522adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_DEC_WRAP;
1523adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1524adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_INVERT:
1525adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_INVERT;
1526adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1527adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1528adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
1529adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1530adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1531adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* =============================================================
1532adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Window position and viewport transformation
1533adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
1534adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1535d0a3400f66b8c4ace7ebef6d0a944376d5203756Alan Swanson/**
1536d0a3400f66b8c4ace7ebef6d0a944376d5203756Alan Swanson * Called when window size or position changes or viewport or depth range
1537d0a3400f66b8c4ace7ebef6d0a944376d5203756Alan Swanson * state is changed.  We update the hardware viewport state here.
1538d0a3400f66b8c4ace7ebef6d0a944376d5203756Alan Swanson */
1539f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid r200UpdateWindow( struct gl_context *ctx )
1540adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
1541adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1542d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIdrawable *dPriv = radeon_get_drawable(&rmesa->radeon);
1543d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg   GLfloat xoffset = 0;
1544d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg   GLfloat yoffset = dPriv ? (GLfloat) dPriv->h : 0;
1545adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   const GLfloat *v = ctx->Viewport._WindowMap.m;
154647941bfaea6e8a60e2c31f7a2c8c233f2a10ecb1Brian Paul   const GLboolean render_to_fbo = (ctx->DrawBuffer ? _mesa_is_user_fbo(ctx->DrawBuffer) : 0);
15478c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie   const GLfloat depthScale = 1.0F / ctx->DrawBuffer->_DepthMaxF;
15486c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie   GLfloat y_scale, y_bias;
15496c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie
15506c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie   if (render_to_fbo) {
15516c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie      y_scale = 1.0;
15526c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie      y_bias = 0;
15536c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie   } else {
15546c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie      y_scale = -1.0;
15556c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie      y_bias = yoffset;
15566c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie   }
1557adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
155808e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   float_ui32_type sx = { v[MAT_SX] };
15593856c3cc46813ad96ae6f02dec19460193d986acFrederic Crozat   float_ui32_type tx = { v[MAT_TX] + xoffset };
15606c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie   float_ui32_type sy = { v[MAT_SY] * y_scale };
15613856c3cc46813ad96ae6f02dec19460193d986acFrederic Crozat   float_ui32_type ty = { (v[MAT_TY] * y_scale) + y_bias };
15628c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie   float_ui32_type sz = { v[MAT_SZ] * depthScale };
15638c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie   float_ui32_type tz = { v[MAT_TZ] * depthScale };
1564adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1565adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, vpt );
1566adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
156708e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE]  = sx.ui32;
156808e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = tx.ui32;
156908e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE]  = sy.ui32;
157008e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = ty.ui32;
157108e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE]  = sz.ui32;
157208e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = tz.ui32;
1573adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
1574adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1575f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid r200_vtbl_update_scissor( struct gl_context *ctx )
1576dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen{
1577dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen   r200ContextPtr r200 = R200_CONTEXT(ctx);
1578dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen   unsigned x1, y1, x2, y2;
1579dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen   struct radeon_renderbuffer *rrb;
1580dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen
1581dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen   R200_SET_STATE(r200, set, SET_RE_CNTL, R200_SCISSOR_ENABLE | r200->hw.set.cmd[SET_RE_CNTL]);
1582dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen
1583dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen   if (r200->radeon.state.scissor.enabled) {
1584dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen      x1 = r200->radeon.state.scissor.rect.x1;
1585dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen      y1 = r200->radeon.state.scissor.rect.y1;
1586d0cb1036aa98d35ae5233d326fbb0ba592a26e26Dave Airlie      x2 = r200->radeon.state.scissor.rect.x2;
1587d0cb1036aa98d35ae5233d326fbb0ba592a26e26Dave Airlie      y2 = r200->radeon.state.scissor.rect.y2;
1588dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen   } else {
1589dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen      rrb = radeon_get_colorbuffer(&r200->radeon);
1590dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen      x1 = 0;
1591dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen      y1 = 0;
1592c080202db5363a18a759a9a7c82b40ac558c8abeBrian Paul      x2 = rrb->base.Base.Width - 1;
1593c080202db5363a18a759a9a7c82b40ac558c8abeBrian Paul      y2 = rrb->base.Base.Height - 1;
1594dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen   }
1595dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen
1596dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen   R200_SET_STATE(r200, sci, SCI_XY_1, x1 | (y1 << 16));
1597dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen   R200_SET_STATE(r200, sci, SCI_XY_2, x2 | (y2 << 16));
1598dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen}
1599adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1600adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1601f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200Viewport( struct gl_context *ctx, GLint x, GLint y,
1602adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell			    GLsizei width, GLsizei height )
1603adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
1604adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   /* Don't pipeline viewport changes, conflict with window offset
1605adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell    * setting below.  Could apply deltas to rescue pipelined viewport
1606adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell    * values, or keep the originals hanging around.
1607adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell    */
1608adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200UpdateWindow( ctx );
16092b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie
16102b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie   radeon_viewport(ctx, x, y, width, height);
1611adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
1612adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1613f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200DepthRange( struct gl_context *ctx, GLclampd nearval,
1614adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell			      GLclampd farval )
1615adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
1616adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200UpdateWindow( ctx );
1617adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
1618adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1619f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid r200UpdateViewportOffset( struct gl_context *ctx )
1620adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
1621adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1622d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIdrawable *dPriv = radeon_get_drawable(&rmesa->radeon);
1623d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg   GLfloat xoffset = (GLfloat)0;
1624d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg   GLfloat yoffset = (GLfloat)dPriv->h;
1625adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   const GLfloat *v = ctx->Viewport._WindowMap.m;
1626adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
162708e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   float_ui32_type tx;
162808e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   float_ui32_type ty;
162908e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger
16303856c3cc46813ad96ae6f02dec19460193d986acFrederic Crozat   tx.f = v[MAT_TX] + xoffset;
16313856c3cc46813ad96ae6f02dec19460193d986acFrederic Crozat   ty.f = (- v[MAT_TY]) + yoffset;
1632adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
163308e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   if ( rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] != tx.ui32 ||
163408e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger	rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] != ty.ui32 )
1635adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   {
1636adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      /* Note: this should also modify whatever data the context reset
1637adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell       * code uses...
1638adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell       */
163908e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger      R200_STATECHANGE( rmesa, vpt );
164008e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger      rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = tx.ui32;
164108e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger      rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = ty.ui32;
164208e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger
1643adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      /* update polygon stipple x/y screen offset */
1644adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      {
1645adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell         GLuint stx, sty;
1646adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell         GLuint m = rmesa->hw.msc.cmd[MSC_RE_MISC];
1647adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1648adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell         m &= ~(R200_STIPPLE_X_OFFSET_MASK |
1649adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell                R200_STIPPLE_Y_OFFSET_MASK);
1650adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1651adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell         /* add magic offsets, then invert */
1652d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg         stx = 31 - ((-1) & R200_STIPPLE_COORD_MASK);
1653d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg         sty = 31 - ((dPriv->h - 1)
1654adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell                     & R200_STIPPLE_COORD_MASK);
1655adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1656adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell         m |= ((stx << R200_STIPPLE_X_OFFSET_SHIFT) |
1657adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell               (sty << R200_STIPPLE_Y_OFFSET_SHIFT));
1658adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1659adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell         if ( rmesa->hw.msc.cmd[MSC_RE_MISC] != m ) {
1660adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell            R200_STATECHANGE( rmesa, msc );
1661adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    rmesa->hw.msc.cmd[MSC_RE_MISC] = m;
1662adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell         }
1663adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1664adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1665adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
166661da612a4f8862e0aac4ff4fc87c133cb8a1c4a5Dave Airlie   radeonUpdateScissor( ctx );
1667adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
1668adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1669adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1670adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1671adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* =============================================================
1672adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Miscellaneous
1673adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
1674adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1675f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200RenderMode( struct gl_context *ctx, GLenum mode )
1676adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
1677adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1678adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   FALLBACK( rmesa, R200_FALLBACK_RENDER_MODE, (mode != GL_RENDER) );
1679adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
1680adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1681adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1682adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellstatic GLuint r200_rop_tab[] = {
1683adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_ROP_CLEAR,
1684adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_ROP_AND,
1685adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_ROP_AND_REVERSE,
1686adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_ROP_COPY,
1687adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_ROP_AND_INVERTED,
1688adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_ROP_NOOP,
1689adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_ROP_XOR,
1690adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_ROP_OR,
1691adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_ROP_NOR,
1692adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_ROP_EQUIV,
1693adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_ROP_INVERT,
1694adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_ROP_OR_REVERSE,
1695adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_ROP_COPY_INVERTED,
1696adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_ROP_OR_INVERTED,
1697adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_ROP_NAND,
1698adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_ROP_SET,
1699adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell};
1700adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1701f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200LogicOpCode( struct gl_context *ctx, GLenum opcode )
1702adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
1703adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1704adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLuint rop = (GLuint)opcode - GL_CLEAR;
1705adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1706adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   ASSERT( rop < 16 );
1707adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1708adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, msk );
1709adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->hw.msk.cmd[MSK_RB3D_ROPCNTL] = r200_rop_tab[rop];
1710adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
1711adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1712adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* =============================================================
1713adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * State enable/disable
1714adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
1715adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1716f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200Enable( struct gl_context *ctx, GLenum cap, GLboolean state )
1717adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
1718adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1719adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLuint p, flag;
1720adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1721239105c6c87da0b0c5c15ae54b19fe39492b0f29Pauli Nieminen   if ( R200_DEBUG & RADEON_STATE )
1722adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fprintf( stderr, "%s( %s = %s )\n", __FUNCTION__,
1723adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	       _mesa_lookup_enum_by_nr( cap ),
1724adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	       state ? "GL_TRUE" : "GL_FALSE" );
1725adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1726adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   switch ( cap ) {
1727adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      /* Fast track this one...
1728adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell       */
1729adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_TEXTURE_1D:
1730adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_TEXTURE_2D:
1731adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_TEXTURE_3D:
1732adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1733adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1734adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_ALPHA_TEST:
1735adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE( rmesa, ctx );
1736adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if (state) {
1737adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_ALPHA_TEST_ENABLE;
1738adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      } else {
1739adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_ALPHA_TEST_ENABLE;
1740adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1741adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1742adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1743adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_BLEND:
1744b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger   case GL_COLOR_LOGIC_OP:
1745b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger      r200_set_blend_state( ctx );
1746adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1747adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1748adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_CLIP_PLANE0:
1749adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_CLIP_PLANE1:
1750adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_CLIP_PLANE2:
1751adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_CLIP_PLANE3:
1752adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_CLIP_PLANE4:
17537dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   case GL_CLIP_PLANE5:
1754adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      p = cap-GL_CLIP_PLANE0;
1755adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE( rmesa, tcl );
1756adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if (state) {
1757adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= (R200_UCP_ENABLE_0<<p);
1758adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 r200ClipPlane( ctx, cap, NULL );
1759adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1760adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      else {
1761adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~(R200_UCP_ENABLE_0<<p);
1762adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1763adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1764adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1765adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_COLOR_MATERIAL:
1766adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      r200ColorMaterial( ctx, 0, 0 );
1767a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer      r200UpdateMaterial( ctx );
1768adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1769adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1770adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_CULL_FACE:
1771adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      r200CullFace( ctx, 0 );
1772adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1773adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1774adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_DEPTH_TEST:
1775adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE(rmesa, ctx );
1776adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if ( state ) {
1777adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  R200_Z_ENABLE;
1778adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      } else {
1779adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_Z_ENABLE;
1780adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1781adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1782adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1783adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_DITHER:
1784adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE(rmesa, ctx );
1785adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if ( state ) {
1786adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  R200_DITHER_ENABLE;
1787d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~rmesa->radeon.state.color.roundEnable;
1788adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      } else {
1789adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_DITHER_ENABLE;
1790d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  rmesa->radeon.state.color.roundEnable;
1791adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1792adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1793adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1794adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_FOG:
1795adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE(rmesa, ctx );
1796adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if ( state ) {
1797adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_FOG_ENABLE;
17980846e52d46b36c411f79908df010072e03bb6437Brian Paul	 r200Fogfv( ctx, GL_FOG_MODE, NULL );
1799adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      } else {
1800adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_FOG_ENABLE;
1801adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 R200_STATECHANGE(rmesa, tcl);
1802adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~R200_TCL_FOG_MASK;
1803adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1804adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      r200UpdateSpecular( ctx ); /* for PK_SPEC */
18057dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      if (rmesa->radeon.TclFallback)
18067a57932a025cf786527d31f4951c8a6d0f25aeecKeith Whitwell	 r200ChooseVertexState( ctx );
18077a57932a025cf786527d31f4951c8a6d0f25aeecKeith Whitwell      _mesa_allow_light_in_model( ctx, !state );
1808adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1809adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1810adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_LIGHT0:
1811adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_LIGHT1:
1812adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_LIGHT2:
1813adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_LIGHT3:
1814adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_LIGHT4:
1815adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_LIGHT5:
1816adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_LIGHT6:
1817adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_LIGHT7:
1818adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE(rmesa, tcl);
1819adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      p = cap - GL_LIGHT0;
18207dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      if (p&1)
1821adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 flag = (R200_LIGHT_1_ENABLE |
18227dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle		 R200_LIGHT_1_ENABLE_AMBIENT |
1823adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell		 R200_LIGHT_1_ENABLE_SPECULAR);
1824adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      else
1825adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 flag = (R200_LIGHT_0_ENABLE |
18267dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle		 R200_LIGHT_0_ENABLE_AMBIENT |
1827adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell		 R200_LIGHT_0_ENABLE_SPECULAR);
1828adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1829adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if (state)
1830adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] |= flag;
1831adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      else
1832adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] &= ~flag;
1833adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
18347dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      /*
1835adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell       */
1836adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      update_light_colors( ctx, p );
1837adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1838adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1839adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_LIGHTING:
1840adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      r200UpdateSpecular(ctx);
1841cb08dcbbf29dfa82128c8302f7aa69e90478a5eaRoland Scheidegger      /* for reflection map fixup - might set recheck_texgen for all units too */
18424637235183b80963536f2364e4d50fcb894886ddDave Airlie      rmesa->radeon.NewGLState |= _NEW_TEXTURE;
1843adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1844adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1845adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_LINE_SMOOTH:
1846adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE( rmesa, ctx );
1847adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if ( state ) {
1848adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  R200_ANTI_ALIAS_LINE;
1849adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      } else {
1850adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_ANTI_ALIAS_LINE;
1851adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1852adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1853adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1854adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_LINE_STIPPLE:
1855adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE( rmesa, set );
1856adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if ( state ) {
1857adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.set.cmd[SET_RE_CNTL] |=  R200_PATTERN_ENABLE;
1858adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      } else {
1859adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.set.cmd[SET_RE_CNTL] &= ~R200_PATTERN_ENABLE;
1860adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1861adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1862adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1863adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_NORMALIZE:
1864adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE( rmesa, tcl );
1865adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if ( state ) {
1866adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |=  R200_NORMALIZE_NORMALS;
1867adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      } else {
1868adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_NORMALIZE_NORMALS;
1869adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1870adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1871adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
187244dace86eaf9eded8e6465adfadf6345658686ddRoland Scheidegger      /* Pointsize registers on r200 only work for point sprites, and point smooth
187344dace86eaf9eded8e6465adfadf6345658686ddRoland Scheidegger       * doesn't work for point sprites (and isn't needed for 1.0 sized aa points).
187444dace86eaf9eded8e6465adfadf6345658686ddRoland Scheidegger       * In any case, setting pointmin == pointsizemax == 1.0 for aa points
187544dace86eaf9eded8e6465adfadf6345658686ddRoland Scheidegger       * is enough to satisfy conform.
1876adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell       */
1877adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_POINT_SMOOTH:
1878adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1879adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1880adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      /* These don't really do anything, as we don't use the 3vtx
1881adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell       * primitives yet.
1882adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell       */
1883adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#if 0
1884adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_POLYGON_OFFSET_POINT:
1885adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE( rmesa, set );
1886adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if ( state ) {
1887adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  R200_ZBIAS_ENABLE_POINT;
1888adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      } else {
1889adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_ZBIAS_ENABLE_POINT;
1890adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1891adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1892adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1893adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_POLYGON_OFFSET_LINE:
1894adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE( rmesa, set );
1895adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if ( state ) {
1896adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  R200_ZBIAS_ENABLE_LINE;
1897adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      } else {
1898adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_ZBIAS_ENABLE_LINE;
1899adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1900adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1901adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#endif
1902adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1903cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   case GL_POINT_SPRITE_ARB:
1904cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      R200_STATECHANGE( rmesa, spr );
1905cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      if ( state ) {
1906cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	 int i;
1907cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	 for (i = 0; i < 6; i++) {
1908cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	    rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] |=
1909cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger		ctx->Point.CoordReplace[i] << (R200_PS_GEN_TEX_0_SHIFT + i);
1910cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	 }
1911cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      } else {
1912cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger	 rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] &= ~R200_PS_GEN_TEX_MASK;
1913cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      }
1914cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      break;
1915cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger
1916adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_POLYGON_OFFSET_FILL:
1917adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE( rmesa, set );
1918adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if ( state ) {
1919adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  R200_ZBIAS_ENABLE_TRI;
1920adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      } else {
1921adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_ZBIAS_ENABLE_TRI;
1922adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1923adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1924adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1925adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_POLYGON_SMOOTH:
1926adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE( rmesa, ctx );
1927adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if ( state ) {
1928adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  R200_ANTI_ALIAS_POLY;
1929adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      } else {
1930adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_ANTI_ALIAS_POLY;
1931adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1932adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1933adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1934adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_POLYGON_STIPPLE:
1935adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE(rmesa, set );
1936adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if ( state ) {
1937adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.set.cmd[SET_RE_CNTL] |=  R200_STIPPLE_ENABLE;
1938adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      } else {
1939adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.set.cmd[SET_RE_CNTL] &= ~R200_STIPPLE_ENABLE;
1940adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1941adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1942adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1943adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_RESCALE_NORMAL_EXT: {
1944adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      GLboolean tmp = ctx->_NeedEyeCoords ? state : !state;
1945adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE( rmesa, tcl );
1946adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if ( tmp ) {
1947adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |=  R200_RESCALE_NORMALS;
1948adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      } else {
1949adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_RESCALE_NORMALS;
1950adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1951adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1952adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
1953adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1954adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_SCISSOR_TEST:
19551090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie      radeon_firevertices(&rmesa->radeon);
1956d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie      rmesa->radeon.state.scissor.enabled = state;
195761da612a4f8862e0aac4ff4fc87c133cb8a1c4a5Dave Airlie      radeonUpdateScissor( ctx );
1958adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1959adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1960adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_STENCIL_TEST:
19618c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie      {
19628c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	 GLboolean hw_stencil = GL_FALSE;
19638c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	 if (ctx->DrawBuffer) {
19648c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    struct radeon_renderbuffer *rrbStencil
19658c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	       = radeon_get_renderbuffer(ctx->DrawBuffer, BUFFER_STENCIL);
19668c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    hw_stencil = (rrbStencil && rrbStencil->bo);
19678c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	 }
19688c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
19698c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	 if (hw_stencil) {
19708c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    R200_STATECHANGE( rmesa, ctx );
19718c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    if ( state ) {
19728c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	       rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  R200_STENCIL_ENABLE;
19738c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    } else {
19748c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	       rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_STENCIL_ENABLE;
19758c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    }
1976adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 } else {
19778c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    FALLBACK( rmesa, R200_FALLBACK_STENCIL, state );
1978adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 }
1979adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
1980adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1981adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1982adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_TEXTURE_GEN_Q:
1983adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_TEXTURE_GEN_R:
1984adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_TEXTURE_GEN_S:
1985adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_TEXTURE_GEN_T:
1986adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      /* Picked up in r200UpdateTextureState.
1987adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell       */
19887dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      rmesa->recheck_texgen[ctx->Texture.CurrentUnit] = GL_TRUE;
1989adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1990adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
1991adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   case GL_COLOR_SUM_EXT:
1992adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      r200UpdateSpecular ( ctx );
1993adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      break;
1994adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
19950866b67fdb8503b38715da310ddf78dd15c92f8fDave Airlie   case GL_VERTEX_PROGRAM_ARB:
199698c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger      if (!state) {
199798c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 GLuint i;
199891650469aeb01f249bcd553d9d309b3016c2f93cRoland Scheidegger	 rmesa->curr_vp_hw = NULL;
199998c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 R200_STATECHANGE( rmesa, vap );
200098c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL] &= ~R200_VAP_PROG_VTX_SHADER_ENABLE;
200198c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 /* mark all tcl atoms (tcl vector state got overwritten) dirty
200298c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	    not sure about tcl scalar state - we need at least grd
200398c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	    with vert progs too.
200498c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	    ucp looks like it doesn't get overwritten (may even work
200598c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	    with vp for pos-invariant progs if we're lucky) */
200698c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 R200_STATECHANGE( rmesa, mtl[0] );
200798c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 R200_STATECHANGE( rmesa, mtl[1] );
200898c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 R200_STATECHANGE( rmesa, fog );
200998c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 R200_STATECHANGE( rmesa, glt );
201098c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 R200_STATECHANGE( rmesa, eye );
201198c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 for (i = R200_MTX_MV; i <= R200_MTX_TEX5; i++) {
201298c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	    R200_STATECHANGE( rmesa, mat[i] );
201398c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 }
201498c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 for (i = 0 ; i < 8; i++) {
201598c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	    R200_STATECHANGE( rmesa, lit[i] );
201698c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 }
201798c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 R200_STATECHANGE( rmesa, tcl );
201898c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 for (i = 0; i <= ctx->Const.MaxClipPlanes; i++) {
201998c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	    if (ctx->Transform.ClipPlanesEnabled & (1 << i)) {
202098c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	       rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= (R200_UCP_ENABLE_0 << i);
202198c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	    }
202298c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger/*	    else {
202398c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	       rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~(R200_UCP_ENABLE_0 << i);
202498c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	    }*/
202598c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 }
2026fc606f7db9072d4f40081aea8f92f1d4489a5115Roland Scheidegger	 /* ugly. Need to call everything which might change compsel. */
202798c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 r200UpdateSpecular( ctx );
2028fc606f7db9072d4f40081aea8f92f1d4489a5115Roland Scheidegger#if 0
202998c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	/* shouldn't be necessary, as it's picked up anyway in r200ValidateState (_NEW_PROGRAM),
203098c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	   but without it doom3 locks up at always the same places. Why? */
203191650469aeb01f249bcd553d9d309b3016c2f93cRoland Scheidegger	/* FIXME: This can (and should) be replaced by a call to the TCL_STATE_FLUSH reg before
203291650469aeb01f249bcd553d9d309b3016c2f93cRoland Scheidegger	   accessing VAP_SE_VAP_CNTL. Requires drm changes (done). Remove after some time... */
203398c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 r200UpdateTextureState( ctx );
203498c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 /* if we call r200UpdateTextureState we need the code below because we are calling it with
203598c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	    non-current derived enabled values which may revert the state atoms for frag progs even when
203698c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	    they already got disabled... ugh
203798c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	    Should really figure out why we need to call r200UpdateTextureState in the first place */
203898c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 GLuint unit;
203998c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 for (unit = 0; unit < R200_MAX_TEXTURE_UNITS; unit++) {
204098c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	    R200_STATECHANGE( rmesa, pix[unit] );
204198c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	    R200_STATECHANGE( rmesa, tex[unit] );
204298c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	    rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT] &=
204398c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger		~(R200_TXFORMAT_ST_ROUTE_MASK | R200_TXFORMAT_LOOKUP_DISABLE);
204498c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	    rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT] |= unit << R200_TXFORMAT_ST_ROUTE_SHIFT;
204598c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	    /* need to guard this with drmSupportsFragmentShader? Should never get here if
204698c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	       we don't announce ATI_fs, right? */
204798c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	    rmesa->hw.tex[unit].cmd[TEX_PP_TXMULTI_CTL] = 0;
204898c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger         }
204998c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 R200_STATECHANGE( rmesa, cst );
205098c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 R200_STATECHANGE( rmesa, tf );
205198c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 rmesa->hw.cst.cmd[CST_PP_CNTL_X] = 0;
205291650469aeb01f249bcd553d9d309b3016c2f93cRoland Scheidegger#endif
205398c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger      }
205498c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger      else {
205591650469aeb01f249bcd553d9d309b3016c2f93cRoland Scheidegger	 /* picked up later */
205698c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger      }
2057fc606f7db9072d4f40081aea8f92f1d4489a5115Roland Scheidegger      /* call functions which change hw state based on ARB_vp enabled or not. */
2058cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      r200PointParameter( ctx, GL_POINT_DISTANCE_ATTENUATION, NULL );
2059fc606f7db9072d4f40081aea8f92f1d4489a5115Roland Scheidegger      r200Fogfv( ctx, GL_FOG_COORD_SRC, NULL );
2060cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      break;
2061cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger
2062cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   case GL_VERTEX_PROGRAM_POINT_SIZE_ARB:
2063cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger      r200PointParameter( ctx, GL_POINT_DISTANCE_ATTENUATION, NULL );
20640866b67fdb8503b38715da310ddf78dd15c92f8fDave Airlie      break;
20650866b67fdb8503b38715da310ddf78dd15c92f8fDave Airlie
2066f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger   case GL_FRAGMENT_SHADER_ATI:
2067f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger      if ( !state ) {
2068f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger	 /* restore normal tex env colors and make sure tex env combine will get updated
2069f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger	    mark env atoms dirty (as their data was overwritten by afs even
2070f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger	    if they didn't change) and restore tex coord routing */
2071f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger	 GLuint unit;
2072f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger	 for (unit = 0; unit < R200_MAX_TEXTURE_UNITS; unit++) {
20738a6182105772280e2727de4a00809c8fb7b13c87Roland Scheidegger	    R200_STATECHANGE( rmesa, pix[unit] );
20748a6182105772280e2727de4a00809c8fb7b13c87Roland Scheidegger	    R200_STATECHANGE( rmesa, tex[unit] );
2075f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger	    rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT] &=
2076f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger		~(R200_TXFORMAT_ST_ROUTE_MASK | R200_TXFORMAT_LOOKUP_DISABLE);
2077f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger	    rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT] |= unit << R200_TXFORMAT_ST_ROUTE_SHIFT;
2078f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger	    rmesa->hw.tex[unit].cmd[TEX_PP_TXMULTI_CTL] = 0;
2079f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger         }
2080f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger	 R200_STATECHANGE( rmesa, cst );
2081f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger	 R200_STATECHANGE( rmesa, tf );
20828a6182105772280e2727de4a00809c8fb7b13c87Roland Scheidegger	 rmesa->hw.cst.cmd[CST_PP_CNTL_X] = 0;
2083f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger      }
2084f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger      else {
2085f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger	 /* need to mark this dirty as pix/tf atoms have overwritten the data
2086f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger	    even if the data in the atoms didn't change */
2087f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger	 R200_STATECHANGE( rmesa, atf );
2088f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger	 R200_STATECHANGE( rmesa, afs[1] );
2089f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger	 /* everything else picked up in r200UpdateTextureState hopefully */
2090f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger      }
2091f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger      break;
2092adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   default:
2093adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      return;
2094adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
2095adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
2096adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2097adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2098f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid r200LightingSpaceChange( struct gl_context *ctx )
2099adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
2100adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
2101adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLboolean tmp;
2102adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2103239105c6c87da0b0c5c15ae54b19fe39492b0f29Pauli Nieminen   if (R200_DEBUG & RADEON_STATE)
2104adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fprintf(stderr, "%s %d BEFORE %x\n", __FUNCTION__, ctx->_NeedEyeCoords,
2105adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0]);
2106adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2107adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (ctx->_NeedEyeCoords)
2108adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      tmp = ctx->Transform.RescaleNormals;
2109adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   else
2110adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      tmp = !ctx->Transform.RescaleNormals;
2111adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2112adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_STATECHANGE( rmesa, tcl );
2113adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if ( tmp ) {
2114adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |=  R200_RESCALE_NORMALS;
2115adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   } else {
2116adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_RESCALE_NORMALS;
2117adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
2118adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2119239105c6c87da0b0c5c15ae54b19fe39492b0f29Pauli Nieminen   if (R200_DEBUG & RADEON_STATE)
2120adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fprintf(stderr, "%s %d AFTER %x\n", __FUNCTION__, ctx->_NeedEyeCoords,
2121adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0]);
2122adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
2123adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2124adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* =============================================================
2125adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Deferred state management - matrices, textures, other?
2126adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
2127adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2128adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2129adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2130adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2131adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellstatic void upload_matrix( r200ContextPtr rmesa, GLfloat *src, int idx )
2132adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
2133adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   float *dest = ((float *)R200_DB_STATE( mat[idx] ))+MAT_ELT_0;
2134adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   int i;
2135adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2136adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2137adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   for (i = 0 ; i < 4 ; i++) {
2138adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      *dest++ = src[i];
2139adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      *dest++ = src[i+4];
2140adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      *dest++ = src[i+8];
2141adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      *dest++ = src[i+12];
2142adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
2143adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2144adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );
2145adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
2146adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2147adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellstatic void upload_matrix_t( r200ContextPtr rmesa, const GLfloat *src, int idx )
2148adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
2149adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   float *dest = ((float *)R200_DB_STATE( mat[idx] ))+MAT_ELT_0;
2150adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   memcpy(dest, src, 16*sizeof(float));
2151adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   R200_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );
2152adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
2153adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2154adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2155f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void update_texturematrix( struct gl_context *ctx )
2156adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
2157adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT( ctx );
2158adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLuint tpc = rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_0];
2159adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   GLuint compsel = rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL];
2160adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   int unit;
2161adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2162239105c6c87da0b0c5c15ae54b19fe39492b0f29Pauli Nieminen   if (R200_DEBUG & RADEON_STATE)
2163adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      fprintf(stderr, "%s before COMPSEL: %x\n", __FUNCTION__,
2164adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL]);
2165adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2166adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->TexMatEnabled = 0;
2167adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   rmesa->TexMatCompSel = 0;
2168adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2169aaaf38d37215aa1536ff34ec370ecfc04111af22Roland Scheidegger   for (unit = 0 ; unit < ctx->Const.MaxTextureUnits; unit++) {
21707dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      if (!ctx->Texture.Unit[unit]._ReallyEnabled)
2171adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 continue;
2172adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2173adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      if (ctx->TextureMatrixStack[unit].Top->type != MATRIX_IDENTITY) {
2174adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->TexMatEnabled |= (R200_TEXGEN_TEXMAT_0_ENABLE|
2175adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell				  R200_TEXMAT_0_ENABLE) << unit;
2176adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2177adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 rmesa->TexMatCompSel |= R200_OUTPUT_TEX_0 << unit;
2178adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2179adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 if (rmesa->TexGenEnabled & (R200_TEXMAT_0_ENABLE << unit)) {
21807dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	    /* Need to preconcatenate any active texgen
2181adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	     * obj/eyeplane matrices:
2182adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	     */
2183b1ebd306bf4fdc4076d3d3daa410b08f477cb4c4Eric Anholt	    _math_matrix_mul_matrix( &rmesa->tmpmat,
21847dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle				     ctx->TextureMatrixStack[unit].Top,
2185b1ebd306bf4fdc4076d3d3daa410b08f477cb4c4Eric Anholt				     &rmesa->TexGenMatrix[unit] );
2186adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	    upload_matrix( rmesa, rmesa->tmpmat.m, R200_MTX_TEX0+unit );
21877dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	 }
2188adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 else {
21897dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	    upload_matrix( rmesa, ctx->TextureMatrixStack[unit].Top->m,
2190adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell			   R200_MTX_TEX0+unit );
2191adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 }
2192adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
2193adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      else if (rmesa->TexGenEnabled & (R200_TEXMAT_0_ENABLE << unit)) {
21947dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	 upload_matrix( rmesa, rmesa->TexGenMatrix[unit].m,
2195adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell			R200_MTX_TEX0+unit );
2196adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      }
2197adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
2198adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2199adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   tpc = (rmesa->TexMatEnabled | rmesa->TexGenEnabled);
2200b1ebd306bf4fdc4076d3d3daa410b08f477cb4c4Eric Anholt   if (tpc != rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_0]) {
2201adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE(rmesa, tcg);
2202adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_0] = tpc;
2203adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
2204adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2205adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   compsel &= ~R200_OUTPUT_TEX_MASK;
2206adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   compsel |= rmesa->TexMatCompSel | rmesa->TexGenCompSel;
2207adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (compsel != rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL]) {
2208adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      R200_STATECHANGE(rmesa, vtx);
2209adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] = compsel;
2210adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
2211adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
2212adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2213f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic GLboolean r200ValidateBuffers(struct gl_context *ctx)
2214e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie{
2215e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie   r200ContextPtr rmesa = R200_CONTEXT(ctx);
2216e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie   struct radeon_renderbuffer *rrb;
2217bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen   struct radeon_dma_bo *dma_bo;
2218c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie   int i, ret;
221905304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie
2220239105c6c87da0b0c5c15ae54b19fe39492b0f29Pauli Nieminen	if (RADEON_DEBUG & RADEON_IOCTL)
2221bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen		fprintf(stderr, "%s\n", __FUNCTION__);
2222c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie   radeon_cs_space_reset_bos(rmesa->radeon.cmdbuf.cs);
22237dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
2224e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie   rrb = radeon_get_colorbuffer(&rmesa->radeon);
2225e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie   /* color buffer */
2226e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie   if (rrb && rrb->bo) {
2227c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie     radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, rrb->bo,
2228c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie				       0, RADEON_GEM_DOMAIN_VRAM);
2229e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie   }
2230e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie
2231e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie   /* depth buffer */
2232e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie   rrb = radeon_get_depthbuffer(&rmesa->radeon);
2233e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie   /* color buffer */
2234e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie   if (rrb && rrb->bo) {
2235c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie     radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, rrb->bo,
2236c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie				       0, RADEON_GEM_DOMAIN_VRAM);
2237e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie   }
2238e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie
2239e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie   for (i = 0; i < ctx->Const.MaxTextureImageUnits; ++i) {
2240e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie      radeonTexObj *t;
22417dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
2242e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie      if (!ctx->Texture.Unit[i]._ReallyEnabled)
2243e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie	 continue;
224405304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie
2245e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie      t = radeon_tex_obj(ctx->Texture.Unit[i]._Current);
224605304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie      if (t->image_override && t->bo)
2247c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie	radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, t->bo,
224805304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie			   RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
224905304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie      else if (t->mt->bo)
2250c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie	radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, t->mt->bo,
225105304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie			   RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
2252e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie   }
225305304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie
2254bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen   dma_bo = first_elem(&rmesa->radeon.dma.reserved);
2255bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen   {
2256bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen       ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs, dma_bo->bo, RADEON_GEM_DOMAIN_GTT, 0);
2257bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen       if (ret)
2258bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen	   return GL_FALSE;
2259bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen   }
2260c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie   return GL_TRUE;
2261e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie}
2262fcbfeb5d28aea87c60f2d02daa213d0c0c2516e8Brian Paul
2263f9995b30756140724f41daf963fa06167912be7fKristian HøgsbergGLboolean r200ValidateState( struct gl_context *ctx )
2264adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
2265adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
22664637235183b80963536f2364e4d50fcb894886ddDave Airlie   GLuint new_state = rmesa->radeon.NewGLState;
2267adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2268c514c1f99493147bbba7a1dbe157c0492f4cf2ebJerome Glisse   if (new_state & _NEW_BUFFERS) {
22692b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie      _mesa_update_framebuffer(ctx);
22702b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie      /* this updates the DrawBuffer's Width/Height if it's a FBO */
22712b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie      _mesa_update_draw_buffer_bounds(ctx);
22727dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
22732b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie      R200_STATECHANGE(rmesa, ctx);
2274fcbfeb5d28aea87c60f2d02daa213d0c0c2516e8Brian Paul   }
2275fcbfeb5d28aea87c60f2d02daa213d0c0c2516e8Brian Paul
2276f48473e42511f8d37a239a07f791bc0a87209e5bBrian Paul   if (new_state & (_NEW_TEXTURE | _NEW_PROGRAM | _NEW_PROGRAM_CONSTANTS)) {
2277adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      r200UpdateTextureState( ctx );
22784637235183b80963536f2364e4d50fcb894886ddDave Airlie      new_state |= rmesa->radeon.NewGLState; /* may add TEXTURE_MATRIX */
22799dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger      r200UpdateLocalViewer( ctx );
2280adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
2281adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2282e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie   /* we need to do a space check here */
2283e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie   if (!r200ValidateBuffers(ctx))
2284e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie     return GL_FALSE;
2285e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie
228698c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger/* FIXME: don't really need most of these when vertex progs are enabled */
228798c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger
2288adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   /* Need an event driven matrix update?
2289adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell    */
22907dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   if (new_state & (_NEW_MODELVIEW|_NEW_PROJECTION))
2291adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      upload_matrix( rmesa, ctx->_ModelProjectMatrix.m, R200_MTX_MVP );
2292adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2293adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   /* Need these for lighting (shouldn't upload otherwise)
2294adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell    */
2295adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (new_state & (_NEW_MODELVIEW)) {
2296adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      upload_matrix( rmesa, ctx->ModelviewMatrixStack.Top->m, R200_MTX_MV );
2297adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      upload_matrix_t( rmesa, ctx->ModelviewMatrixStack.Top->inv, R200_MTX_IMV );
2298adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
2299adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2300adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   /* Does this need to be triggered on eg. modelview for
2301adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell    * texgen-derived objplane/eyeplane matrices?
2302adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell    */
2303adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (new_state & (_NEW_TEXTURE|_NEW_TEXTURE_MATRIX)) {
2304adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      update_texturematrix( ctx );
2305f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger   }
2306adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2307adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (new_state & (_NEW_LIGHT|_NEW_MODELVIEW|_MESA_NEW_NEED_EYE_COORDS)) {
2308adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      update_light( ctx );
2309adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
2310adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2311adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   /* emit all active clip planes if projection matrix changes.
2312adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell    */
2313adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (new_state & (_NEW_PROJECTION)) {
23147dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      if (ctx->Transform.ClipPlanesEnabled)
2315adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell	 r200UpdateClipPlanes( ctx );
2316adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
2317adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
231898c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger   if (new_state & (_NEW_PROGRAM|
2319f48473e42511f8d37a239a07f791bc0a87209e5bBrian Paul                    _NEW_PROGRAM_CONSTANTS |
232098c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger   /* need to test for pretty much anything due to possible parameter bindings */
232198c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	_NEW_MODELVIEW|_NEW_PROJECTION|_NEW_TRANSFORM|
232298c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	_NEW_LIGHT|_NEW_TEXTURE|_NEW_TEXTURE_MATRIX|
232398c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	_NEW_FOG|_NEW_POINT|_NEW_TRACK_MATRIX)) {
232498c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger      if (ctx->VertexProgram._Enabled) {
232598c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger	 r200SetupVertexProg( ctx );
232698c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger      }
232798c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger      else TCL_FALLBACK(ctx, R200_TCL_FALLBACK_VERTEX_PROGRAM, 0);
232898c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger   }
2329adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
23304637235183b80963536f2364e4d50fcb894886ddDave Airlie   rmesa->radeon.NewGLState = 0;
2331e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie   return GL_TRUE;
2332adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
2333adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2334adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2335f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200InvalidateState( struct gl_context *ctx, GLuint new_state )
2336adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
2337adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   _swrast_InvalidateState( ctx, new_state );
2338adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   _swsetup_InvalidateState( ctx, new_state );
233980c88304fc9d09531b2530b74973821e47b46753Keith Whitwell   _vbo_InvalidateState( ctx, new_state );
2340adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   _tnl_InvalidateState( ctx, new_state );
2341adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   _ae_invalidate_state( ctx, new_state );
23424637235183b80963536f2364e4d50fcb894886ddDave Airlie   R200_CONTEXT(ctx)->radeon.NewGLState |= new_state;
2343adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
2344adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
234557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell/* A hack.  The r200 can actually cope just fine with materials
23462a441c488f4bcf11fe032ea7ba448bbfb7449c66Roland Scheidegger * between begin/ends, so fix this.
23472a441c488f4bcf11fe032ea7ba448bbfb7449c66Roland Scheidegger * Should map to inputs just like the generic vertex arrays for vertex progs.
23482a441c488f4bcf11fe032ea7ba448bbfb7449c66Roland Scheidegger * In theory there could still be too many and we'd still need a fallback.
234957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell */
2350f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic GLboolean check_material( struct gl_context *ctx )
235157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell{
235257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   TNLcontext *tnl = TNL_CONTEXT(ctx);
235357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   GLint i;
235457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
23552a441c488f4bcf11fe032ea7ba448bbfb7449c66Roland Scheidegger   for (i = _TNL_ATTRIB_MAT_FRONT_AMBIENT;
23562a441c488f4bcf11fe032ea7ba448bbfb7449c66Roland Scheidegger	i < _TNL_ATTRIB_MAT_BACK_INDEXES;
235757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	i++)
235857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (tnl->vb.AttribPtr[i] &&
235957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	  tnl->vb.AttribPtr[i]->stride)
236057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 return GL_TRUE;
236157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
236257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   return GL_FALSE;
236357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell}
23642a441c488f4bcf11fe032ea7ba448bbfb7449c66Roland Scheidegger
2365f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200WrapRunPipeline( struct gl_context *ctx )
2366adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
2367adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   r200ContextPtr rmesa = R200_CONTEXT(ctx);
236857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   GLboolean has_material;
2369adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2370adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   if (0)
23714637235183b80963536f2364e4d50fcb894886ddDave Airlie      fprintf(stderr, "%s, newstate: %x\n", __FUNCTION__, rmesa->radeon.NewGLState);
2372adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2373adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   /* Validate state:
2374adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell    */
23754637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (rmesa->radeon.NewGLState)
2376e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie      if (!r200ValidateState( ctx ))
2377e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie	 FALLBACK(rmesa, RADEON_FALLBACK_TEXTURE, GL_TRUE);
2378adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
23792a441c488f4bcf11fe032ea7ba448bbfb7449c66Roland Scheidegger   has_material = !ctx->VertexProgram._Enabled && ctx->Light.Enabled && check_material( ctx );
238057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
238157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   if (has_material) {
2382adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      TCL_FALLBACK( ctx, R200_TCL_FALLBACK_MATERIAL, GL_TRUE );
2383adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
2384adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2385adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   /* Run the pipeline.
23867dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle    */
2387adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   _tnl_run_pipeline( ctx );
2388adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
238957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   if (has_material) {
2390adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell      TCL_FALLBACK( ctx, R200_TCL_FALLBACK_MATERIAL, GL_FALSE );
2391adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   }
2392adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
2393adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2394adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2395f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200PolygonStipple( struct gl_context *ctx, const GLubyte *mask )
23967d361537661b93a501c9533271458a41b965ea79Dave Airlie{
23977d361537661b93a501c9533271458a41b965ea79Dave Airlie   r200ContextPtr r200 = R200_CONTEXT(ctx);
23987d361537661b93a501c9533271458a41b965ea79Dave Airlie   GLint i;
23997d361537661b93a501c9533271458a41b965ea79Dave Airlie
24007d361537661b93a501c9533271458a41b965ea79Dave Airlie   radeon_firevertices(&r200->radeon);
24017d361537661b93a501c9533271458a41b965ea79Dave Airlie
240277768cdd73acc512a6d3171731a9c1b20c996f3fPauli Nieminen   radeon_print(RADEON_STATE, RADEON_TRACE,
240377768cdd73acc512a6d3171731a9c1b20c996f3fPauli Nieminen		   "%s(%p) first 32 bits are %x.\n",
240477768cdd73acc512a6d3171731a9c1b20c996f3fPauli Nieminen		   __func__,
240577768cdd73acc512a6d3171731a9c1b20c996f3fPauli Nieminen		   ctx,
240677768cdd73acc512a6d3171731a9c1b20c996f3fPauli Nieminen		   *(uint32_t*)mask);
240777768cdd73acc512a6d3171731a9c1b20c996f3fPauli Nieminen
24087d361537661b93a501c9533271458a41b965ea79Dave Airlie   R200_STATECHANGE(r200, stp);
24097d361537661b93a501c9533271458a41b965ea79Dave Airlie
24107d361537661b93a501c9533271458a41b965ea79Dave Airlie   /* Must flip pattern upside down.
24117d361537661b93a501c9533271458a41b965ea79Dave Airlie    */
24127d361537661b93a501c9533271458a41b965ea79Dave Airlie   for ( i = 31 ; i >= 0; i--) {
24137d361537661b93a501c9533271458a41b965ea79Dave Airlie     r200->hw.stp.cmd[3 + i] = ((GLuint *) mask)[i];
24147d361537661b93a501c9533271458a41b965ea79Dave Airlie   }
24157d361537661b93a501c9533271458a41b965ea79Dave Airlie}
2416adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* Initialize the driver's state functions.
2417adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */
2418d1ca1599f0319f5c99852ce24420aa592e806db0Alex Deuchervoid r200InitStateFuncs( radeonContextPtr radeon, struct dd_function_table *functions )
2419adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{
2420d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->UpdateState		= r200InvalidateState;
2421d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->LightingSpaceChange	= r200LightingSpaceChange;
2422d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul
24232b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie   functions->DrawBuffer		= radeonDrawBuffer;
24242b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie   functions->ReadBuffer		= radeonReadBuffer;
2425d1ca1599f0319f5c99852ce24420aa592e806db0Alex Deucher
2426d9a19d8649e49acfac98c240bff88931be7743d7Alex Deucher   functions->CopyPixels                = _mesa_meta_CopyPixels;
2427d9a19d8649e49acfac98c240bff88931be7743d7Alex Deucher   functions->DrawPixels                = _mesa_meta_DrawPixels;
24284a2f00889ba481c117057da5fac7585327458cc3Eric Anholt   functions->ReadPixels                = radeonReadPixels;
2429d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul
2430d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->AlphaFunc			= r200AlphaFunc;
2431033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger   functions->BlendColor		= r200BlendColor;
2432c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   functions->BlendEquationSeparate	= r200BlendEquationSeparate;
2433d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->BlendFuncSeparate		= r200BlendFuncSeparate;
2434d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->ClipPlane			= r200ClipPlane;
2435d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->ColorMask			= r200ColorMask;
2436d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->CullFace			= r200CullFace;
2437d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->DepthFunc			= r200DepthFunc;
2438d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->DepthMask			= r200DepthMask;
2439d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->DepthRange		= r200DepthRange;
2440d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->Enable			= r200Enable;
2441d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->Fogfv			= r200Fogfv;
2442d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->FrontFace			= r200FrontFace;
2443d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->Hint			= NULL;
2444d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->LightModelfv		= r200LightModelfv;
2445d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->Lightfv			= r200Lightfv;
2446d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->LineStipple		= r200LineStipple;
2447d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->LineWidth			= r200LineWidth;
2448d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->LogicOpcode		= r200LogicOpCode;
2449d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->PolygonMode		= r200PolygonMode;
2450d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->PolygonOffset		= r200PolygonOffset;
24512b5618fc5bdcbee3434f8b5aa3a31eb06fb479c0Alex Deucher   functions->PolygonStipple		= r200PolygonStipple;
2452cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger   functions->PointParameterfv		= r200PointParameter;
2453d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->PointSize			= r200PointSize;
2454d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->RenderMode		= r200RenderMode;
24551090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   functions->Scissor			= radeonScissor;
2456d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->ShadeModel		= r200ShadeModel;
2457878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul   functions->StencilFuncSeparate	= r200StencilFuncSeparate;
2458878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul   functions->StencilMaskSeparate	= r200StencilMaskSeparate;
2459878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul   functions->StencilOpSeparate		= r200StencilOpSeparate;
2460d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->Viewport			= r200Viewport;
2461d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul}
2462d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul
2463adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
2464f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid r200InitTnlFuncs( struct gl_context *ctx )
2465d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul{
2466adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange = r200UpdateMaterial;
2467adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell   TNL_CONTEXT(ctx)->Driver.RunPipeline = r200WrapRunPipeline;
2468adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
2469