1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCopyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThe Weather Channel (TM) funded Tungsten Graphics to develop the
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orginitial release of the Radeon 8500 driver under the XFree86 license.
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThis notice must be preserved.
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPermission is hereby granted, free of charge, to any person obtaining
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orga copy of this software and associated documentation files (the
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org"Software"), to deal in the Software without restriction, including
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwithout limitation the rights to use, copy, modify, merge, publish,
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdistribute, sublicense, and/or sell copies of the Software, and to
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpermit persons to whom the Software is furnished to do so, subject to
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgthe following conditions:
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThe above copyright notice and this permission notice (including the
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnext paragraph) shall be included in all copies or substantial
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgportions of the Software.
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org**************************************************************************/
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors:
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   Keith Whitwell <keith@tungstengraphics.com>
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/api_arrayelt.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/enums.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/colormac.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/light.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/framebuffer.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/fbobject.h"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/swrast.h"
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vbo/vbo.h"
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/tnl.h"
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/t_pipeline.h"
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast_setup/swrast_setup.h"
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "drivers/common/meta.h"
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeon_common.h"
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeon_mipmap_tree.h"
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_context.h"
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_ioctl.h"
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_state.h"
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_tcl.h"
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_tex.h"
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_swtcl.h"
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_vertprog.h"
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* =============================================================
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Alpha blending
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200AlphaFunc( struct gl_context *ctx, GLenum func, GLfloat ref )
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int pp_misc = rmesa->hw.ctx.cmd[CTX_PP_MISC];
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte refByte;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CLAMPED_FLOAT_TO_UBYTE(refByte, ref);
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, ctx );
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_misc &= ~(R200_ALPHA_TEST_OP_MASK | R200_REF_ALPHA_MASK);
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_misc |= (refByte & R200_REF_ALPHA_MASK);
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch ( func ) {
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_NEVER:
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pp_misc |= R200_ALPHA_TEST_FAIL;
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LESS:
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pp_misc |= R200_ALPHA_TEST_LESS;
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_EQUAL:
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pp_misc |= R200_ALPHA_TEST_EQUAL;
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LEQUAL:
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pp_misc |= R200_ALPHA_TEST_LEQUAL;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_GREATER:
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pp_misc |= R200_ALPHA_TEST_GREATER;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_NOTEQUAL:
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pp_misc |= R200_ALPHA_TEST_NEQUAL;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_GEQUAL:
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pp_misc |= R200_ALPHA_TEST_GEQUAL;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALWAYS:
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pp_misc |= R200_ALPHA_TEST_PASS;
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.ctx.cmd[CTX_PP_MISC] = pp_misc;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200BlendColor( struct gl_context *ctx, const GLfloat cf[4] )
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte color[4];
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, ctx );
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CLAMPED_FLOAT_TO_UBYTE(color[0], cf[0]);
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CLAMPED_FLOAT_TO_UBYTE(color[1], cf[1]);
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CLAMPED_FLOAT_TO_UBYTE(color[2], cf[2]);
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CLAMPED_FLOAT_TO_UBYTE(color[3], cf[3]);
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCOLOR] = radeonPackColor( 4, color[0], color[1], color[2], color[3] );
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Calculate the hardware blend factor setting.  This same function is used
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for source and destination of both alpha and RGB.
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \returns
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The hardware register value for the specified blend factor.  This value
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * will need to be shifted into the correct position for either source or
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * destination factor.
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \todo
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Since the two cases where source and destination are handled differently
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * are essentially error cases, they should never happen.  Determine if these
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * cases can be removed.
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int blend_factor( GLenum factor, GLboolean is_src )
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int func;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch ( factor ) {
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ZERO:
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func = R200_BLEND_GL_ZERO;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ONE:
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func = R200_BLEND_GL_ONE;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DST_COLOR:
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func = R200_BLEND_GL_DST_COLOR;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ONE_MINUS_DST_COLOR:
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func = R200_BLEND_GL_ONE_MINUS_DST_COLOR;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SRC_COLOR:
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func = R200_BLEND_GL_SRC_COLOR;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ONE_MINUS_SRC_COLOR:
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func = R200_BLEND_GL_ONE_MINUS_SRC_COLOR;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SRC_ALPHA:
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func = R200_BLEND_GL_SRC_ALPHA;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ONE_MINUS_SRC_ALPHA:
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func = R200_BLEND_GL_ONE_MINUS_SRC_ALPHA;
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DST_ALPHA:
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func = R200_BLEND_GL_DST_ALPHA;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ONE_MINUS_DST_ALPHA:
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func = R200_BLEND_GL_ONE_MINUS_DST_ALPHA;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SRC_ALPHA_SATURATE:
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func = (is_src) ? R200_BLEND_GL_SRC_ALPHA_SATURATE : R200_BLEND_GL_ZERO;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CONSTANT_COLOR:
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func = R200_BLEND_GL_CONST_COLOR;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ONE_MINUS_CONSTANT_COLOR:
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func = R200_BLEND_GL_ONE_MINUS_CONST_COLOR;
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CONSTANT_ALPHA:
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func = R200_BLEND_GL_CONST_ALPHA;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ONE_MINUS_CONSTANT_ALPHA:
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func = R200_BLEND_GL_ONE_MINUS_CONST_ALPHA;
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func = (is_src) ? R200_BLEND_GL_ONE : R200_BLEND_GL_ZERO;
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return func;
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Sets both the blend equation and the blend function.
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is done in a single
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * function because some blend equations (i.e., \c GL_MIN and \c GL_MAX)
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * change the interpretation of the blend function.
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Also, make sure that blend function and blend equation are set to their default
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * value if color blending is not enabled, since at least blend equations GL_MIN
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and GL_FUNC_REVERSE_SUBTRACT will cause wrong results otherwise for
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * unknown reasons.
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200_set_blend_state( struct gl_context * ctx )
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint cntl = rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ~(R200_ROP_ENABLE | R200_ALPHA_BLEND_ENABLE | R200_SEPARATE_ALPHA_ENABLE);
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT);
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int eqn = R200_COMB_FCN_ADD_CLAMP;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT);
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int eqnA = R200_COMB_FCN_ADD_CLAMP;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, ctx );
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Color.ColorLogicOpEnabled) {
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] =  cntl | R200_ROP_ENABLE;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ABLENDCNTL] = eqn | func;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_CBLENDCNTL] = eqn | func;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else if (ctx->Color.BlendEnabled) {
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] =  cntl | R200_ALPHA_BLEND_ENABLE | R200_SEPARATE_ALPHA_ENABLE;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = cntl;
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ABLENDCNTL] = eqn | func;
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_CBLENDCNTL] = eqn | func;
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   func = (blend_factor( ctx->Color.Blend[0].SrcRGB, GL_TRUE ) << R200_SRC_BLEND_SHIFT) |
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (blend_factor( ctx->Color.Blend[0].DstRGB, GL_FALSE ) << R200_DST_BLEND_SHIFT);
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch(ctx->Color.Blend[0].EquationRGB) {
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FUNC_ADD:
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eqn = R200_COMB_FCN_ADD_CLAMP;
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FUNC_SUBTRACT:
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eqn = R200_COMB_FCN_SUB_CLAMP;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FUNC_REVERSE_SUBTRACT:
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eqn = R200_COMB_FCN_RSUB_CLAMP;
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MIN:
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eqn = R200_COMB_FCN_MIN;
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MAX:
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eqn = R200_COMB_FCN_MAX;
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf( stderr, "[%s:%u] Invalid RGB blend equation (0x%04x).\n",
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         __FUNCTION__, __LINE__, ctx->Color.Blend[0].EquationRGB );
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   funcA = (blend_factor( ctx->Color.Blend[0].SrcA, GL_TRUE ) << R200_SRC_BLEND_SHIFT) |
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (blend_factor( ctx->Color.Blend[0].DstA, GL_FALSE ) << R200_DST_BLEND_SHIFT);
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch(ctx->Color.Blend[0].EquationA) {
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FUNC_ADD:
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eqnA = R200_COMB_FCN_ADD_CLAMP;
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FUNC_SUBTRACT:
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eqnA = R200_COMB_FCN_SUB_CLAMP;
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FUNC_REVERSE_SUBTRACT:
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eqnA = R200_COMB_FCN_RSUB_CLAMP;
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MIN:
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eqnA = R200_COMB_FCN_MIN;
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MAX:
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eqnA = R200_COMB_FCN_MAX;
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf( stderr, "[%s:%u] Invalid A blend equation (0x%04x).\n",
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         __FUNCTION__, __LINE__, ctx->Color.Blend[0].EquationA );
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.ctx.cmd[CTX_RB3D_ABLENDCNTL] = eqnA | funcA;
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.ctx.cmd[CTX_RB3D_CBLENDCNTL] = eqn | func;
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200BlendEquationSeparate( struct gl_context *ctx,
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       GLenum modeRGB, GLenum modeA )
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200_set_blend_state( ctx );
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200BlendFuncSeparate( struct gl_context *ctx,
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     GLenum sfactorRGB, GLenum dfactorRGB,
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     GLenum sfactorA, GLenum dfactorA )
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200_set_blend_state( ctx );
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* =============================================================
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Depth testing
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200DepthFunc( struct gl_context *ctx, GLenum func )
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, ctx );
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~R200_Z_TEST_MASK;
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch ( ctx->Depth.Func ) {
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_NEVER:
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_NEVER;
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LESS:
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_LESS;
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_EQUAL:
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_EQUAL;
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LEQUAL:
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_LEQUAL;
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_GREATER:
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_GREATER;
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_NOTEQUAL:
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_NEQUAL;
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_GEQUAL:
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_GEQUAL;
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALWAYS:
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_ALWAYS;
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200DepthMask( struct gl_context *ctx, GLboolean flag )
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, ctx );
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( ctx->Depth.Mask ) {
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |=  R200_Z_WRITE_ENABLE;
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~R200_Z_WRITE_ENABLE;
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* =============================================================
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fog
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200Fogfv( struct gl_context *ctx, GLenum pname, const GLfloat *param )
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   union { int i; float f; } c, d;
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte col[4];
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c.i = rmesa->hw.fog.cmd[FOG_C];
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   d.i = rmesa->hw.fog.cmd[FOG_D];
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (pname) {
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FOG_MODE:
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Fog.Enabled)
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return;
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE(rmesa, tcl);
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~R200_TCL_FOG_MASK;
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (ctx->Fog.Mode) {
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LINEAR:
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_TCL_FOG_LINEAR;
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (ctx->Fog.Start == ctx->Fog.End) {
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    c.f = 1.0F;
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    d.f = 1.0F;
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else {
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start);
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    d.f = -1.0/(ctx->Fog.End-ctx->Fog.Start);
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_EXP:
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_TCL_FOG_EXP;
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 c.f = 0.0;
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 d.f = -ctx->Fog.Density;
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_EXP2:
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_TCL_FOG_EXP2;
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 c.f = 0.0;
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 d.f = -(ctx->Fog.Density * ctx->Fog.Density);
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return;
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FOG_DENSITY:
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (ctx->Fog.Mode) {
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_EXP:
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 c.f = 0.0;
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 d.f = -ctx->Fog.Density;
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_EXP2:
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 c.f = 0.0;
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 d.f = -(ctx->Fog.Density * ctx->Fog.Density);
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FOG_START:
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FOG_END:
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Fog.Mode == GL_LINEAR) {
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (ctx->Fog.Start == ctx->Fog.End) {
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    c.f = 1.0F;
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    d.f = 1.0F;
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 } else {
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start);
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    d.f = -1.0/(ctx->Fog.End-ctx->Fog.Start);
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FOG_COLOR:
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, ctx );
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_unclamped_float_rgba_to_ubyte(col, ctx->Fog.Color );
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      i = radeonPackColor( 4, col[0], col[1], col[2], 0 );
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] &= ~R200_FOG_COLOR_MASK;
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] |= i;
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FOG_COORD_SRC: {
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint out_0 = rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0];
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint fog   = rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR];
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fog &= ~R200_FOG_USE_MASK;
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( ctx->Fog.FogCoordinateSource == GL_FOG_COORD || ctx->VertexProgram.Enabled) {
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 fog   |= R200_FOG_USE_VTX_FOG;
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 out_0 |= R200_VTX_DISCRETE_FOG;
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 fog   |=  R200_FOG_USE_SPEC_ALPHA;
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 out_0 &= ~R200_VTX_DISCRETE_FOG;
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( fog != rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] ) {
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, ctx );
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] = fog;
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (out_0 != rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0]) {
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, vtx );
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] = out_0;
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c.i != rmesa->hw.fog.cmd[FOG_C] || d.i != rmesa->hw.fog.cmd[FOG_D]) {
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, fog );
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.fog.cmd[FOG_C] = c.i;
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.fog.cmd[FOG_D] = d.i;
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* =============================================================
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Culling
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200CullFace( struct gl_context *ctx, GLenum unused )
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL];
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint t = rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL];
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   s |= R200_FFACE_SOLID | R200_BFACE_SOLID;
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   t &= ~(R200_CULL_FRONT | R200_CULL_BACK);
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( ctx->Polygon.CullFlag ) {
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch ( ctx->Polygon.CullFaceMode ) {
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_FRONT:
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 s &= ~R200_FFACE_SOLID;
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 t |= R200_CULL_FRONT;
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_BACK:
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 s &= ~R200_BFACE_SOLID;
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 t |= R200_CULL_BACK;
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_FRONT_AND_BACK:
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 s &= ~(R200_FFACE_SOLID | R200_BFACE_SOLID);
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 t |= (R200_CULL_FRONT | R200_CULL_BACK);
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) {
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE(rmesa, set );
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.set.cmd[SET_SE_CNTL] = s;
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] != t ) {
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE(rmesa, tcl );
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] = t;
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200FrontFace( struct gl_context *ctx, GLenum mode )
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int cull_face = (mode == GL_CW) ? R200_FFACE_CULL_CW : R200_FFACE_CULL_CCW;
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, set );
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_FFACE_CULL_DIR_MASK;
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, tcl );
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~R200_CULL_FRONT_IS_CCW;
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Winding is inverted when rendering to FBO */
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->DrawBuffer && _mesa_is_user_fbo(ctx->DrawBuffer))
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cull_face = (mode == GL_CCW) ? R200_FFACE_CULL_CW : R200_FFACE_CULL_CCW;
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.set.cmd[SET_SE_CNTL] |= cull_face;
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( mode == GL_CCW )
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_CULL_FRONT_IS_CCW;
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* =============================================================
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Point state
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200PointSize( struct gl_context *ctx, GLfloat size )
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat *fcmd = (GLfloat *)rmesa->hw.ptp.cmd;
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeon_print(RADEON_STATE, RADEON_TRACE,
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       "%s(%p) size: %f, fixed point result: %d.%d (%d/16)\n",
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       __func__, ctx, size,
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ((GLuint)(ctx->Point.Size * 16.0))/16,
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       (((GLuint)(ctx->Point.Size * 16.0))&15)*100/16,
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ((GLuint)(ctx->Point.Size * 16.0))&15);
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, cst );
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, ptp );
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.cst.cmd[CST_RE_POINTSIZE] &= ~0xffff;
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.cst.cmd[CST_RE_POINTSIZE] |= ((GLuint)(ctx->Point.Size * 16.0));
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* this is the size param of the point size calculation (point size reg value
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   is not used when calculation is active). */
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fcmd[PTP_VPORT_SCALE_PTSIZE] = ctx->Point.Size;
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200PointParameter( struct gl_context *ctx, GLenum pname, const GLfloat *params)
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat *fcmd = (GLfloat *)rmesa->hw.ptp.cmd;
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (pname) {
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POINT_SIZE_MIN:
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Can clamp both in tcl and setup - just set both (as does fglrx) */
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, lin );
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, ptp );
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] &= 0xffff;
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] |= (GLuint)(ctx->Point.MinSize * 16.0) << 16;
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[PTP_CLAMP_MIN] = ctx->Point.MinSize;
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POINT_SIZE_MAX:
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, cst );
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, ptp );
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.cst.cmd[CST_RE_POINTSIZE] &= 0xffff;
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.cst.cmd[CST_RE_POINTSIZE] |= (GLuint)(ctx->Point.MaxSize * 16.0) << 16;
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[PTP_CLAMP_MAX] = ctx->Point.MaxSize;
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POINT_DISTANCE_ATTENUATION:
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, vtx );
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, spr );
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, ptp );
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat *fcmd = (GLfloat *)rmesa->hw.ptp.cmd;
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] &=
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ~(R200_PS_MULT_MASK | R200_PS_LIN_ATT_ZERO | R200_PS_SE_SEL_STATE);
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* can't rely on ctx->Point._Attenuated here and test for NEW_POINT in
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 r200ValidateState looks like overkill */
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Point.Params[0] != 1.0 ||
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  ctx->Point.Params[1] != 0.0 ||
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  ctx->Point.Params[2] != 0.0 ||
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  (ctx->VertexProgram.Enabled && ctx->VertexProgram.PointSizeEnabled)) {
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* all we care for vp would be the ps_se_sel_state setting */
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 fcmd[PTP_ATT_CONST_QUAD] = ctx->Point.Params[2];
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 fcmd[PTP_ATT_CONST_LIN] = ctx->Point.Params[1];
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 fcmd[PTP_ATT_CONST_CON] = ctx->Point.Params[0];
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] |= R200_PS_MULT_ATTENCONST;
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (ctx->Point.Params[1] == 0.0)
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] |= R200_PS_LIN_ATT_ZERO;
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* FIXME: setting this here doesn't look quite ok - we only want to do
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          that if we're actually drawing points probably */
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_PT_SIZE;
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= R200_VTX_POINT_SIZE;
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] |=
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    R200_PS_SE_SEL_STATE | R200_PS_MULT_CONST;
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] &= ~R200_OUTPUT_PT_SIZE;
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] &= ~R200_VTX_POINT_SIZE;
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POINT_FADE_THRESHOLD_SIZE:
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* don't support multisampling, so doesn't matter. */
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* can't do these but don't need them.
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POINT_SPRITE_R_MODE_NV:
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POINT_SPRITE_COORD_ORIGIN: */
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "bad pname parameter in r200PointParameter\n");
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* =============================================================
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Line state
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200LineWidth( struct gl_context *ctx, GLfloat widthf )
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, lin );
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, set );
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Line width is stored in U6.4 format.
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Same min/max limits for AA, non-AA lines.
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] &= ~0xffff;
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] |= (GLuint)
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (CLAMP(widthf, ctx->Const.MinLineWidth, ctx->Const.MaxLineWidth) * 16.0);
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( widthf > 1.0 ) {
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.set.cmd[SET_SE_CNTL] |=  R200_WIDELINE_ENABLE;
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_WIDELINE_ENABLE;
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200LineStipple( struct gl_context *ctx, GLint factor, GLushort pattern )
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, lin );
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.lin.cmd[LIN_RE_LINE_PATTERN] =
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ((((GLuint)factor & 0xff) << 16) | ((GLuint)pattern));
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* =============================================================
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Masks
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200ColorMask( struct gl_context *ctx,
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   GLboolean r, GLboolean g,
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   GLboolean b, GLboolean a )
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint mask;
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct radeon_renderbuffer *rrb;
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint flag = rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] & ~R200_PLANE_MASK_ENABLE;
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rrb = radeon_get_colorbuffer(&rmesa->radeon);
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!rrb)
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     return;
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mask = radeonPackColor( rrb->cpp,
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   ctx->Color.ColorMask[0][RCOMP],
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   ctx->Color.ColorMask[0][GCOMP],
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   ctx->Color.ColorMask[0][BCOMP],
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   ctx->Color.ColorMask[0][ACOMP] );
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!(r && g && b && a))
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      flag |= R200_PLANE_MASK_ENABLE;
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] != flag ) {
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, ctx );
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = flag;
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] != mask ) {
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, msk );
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] = mask;
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* =============================================================
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Polygon state
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200PolygonOffset( struct gl_context *ctx,
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GLfloat factor, GLfloat units )
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat depthScale = 1.0F / ctx->DrawBuffer->_DepthMaxF;
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float_ui32_type constant =  { units * depthScale };
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float_ui32_type factoru = { factor };
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*    factor *= 2; */
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*    constant *= 2; */
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*    fprintf(stderr, "%s f:%f u:%f\n", __FUNCTION__, factor, constant); */
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, zbs );
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_FACTOR]   = factoru.ui32;
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_CONSTANT] = constant.ui32;
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200PolygonMode( struct gl_context *ctx, GLenum face, GLenum mode )
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean flag = (ctx->_TriangleCaps & DD_TRI_UNFILLED) != 0;
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Can't generally do unfilled via tcl, but some good special
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * cases work.
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TCL_FALLBACK( ctx, R200_TCL_FALLBACK_UNFILLED, flag);
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rmesa->radeon.TclFallback) {
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200ChooseRenderState( ctx );
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200ChooseVertexState( ctx );
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* =============================================================
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Rendering attributes
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We really don't want to recalculate all this every time we bind a
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture.  These things shouldn't change all that often, so it makes
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * sense to break them out of the core texture state update routines.
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Examine lighting and texture state to determine if separate specular
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * should be enabled.
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200UpdateSpecular( struct gl_context *ctx )
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t p = rmesa->hw.ctx.cmd[CTX_PP_CNTL];
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, tcl );
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, vtx );
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] &= ~(3<<R200_VTX_COLOR_0_SHIFT);
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] &= ~(3<<R200_VTX_COLOR_1_SHIFT);
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] &= ~R200_OUTPUT_COLOR_0;
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] &= ~R200_OUTPUT_COLOR_1;
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_LIGHTING_ENABLE;
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p &= ~R200_SPECULAR_ENABLE;
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_DIFFUSE_SPECULAR_COMBINE;
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Light.Enabled &&
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) {
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |=
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT) |
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  (R200_VTX_FP_RGBA << R200_VTX_COLOR_1_SHIFT));
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_0;
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_1;
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LIGHTING_ENABLE;
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p |=  R200_SPECULAR_ENABLE;
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &=
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ~R200_DIFFUSE_SPECULAR_COMBINE;
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (ctx->Light.Enabled) {
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |=
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT));
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_0;
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LIGHTING_ENABLE;
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else if (ctx->Fog.ColorSumEnabled ) {
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |=
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT) |
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  (R200_VTX_FP_RGBA << R200_VTX_COLOR_1_SHIFT));
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p |=  R200_SPECULAR_ENABLE;
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |=
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT));
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Fog.Enabled) {
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |=
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ((R200_VTX_FP_RGBA << R200_VTX_COLOR_1_SHIFT));
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_1;
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( rmesa->hw.ctx.cmd[CTX_PP_CNTL] != p ) {
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, ctx );
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_PP_CNTL] = p;
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Update vertex/render formats
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rmesa->radeon.TclFallback) {
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200ChooseRenderState( ctx );
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200ChooseVertexState( ctx );
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* =============================================================
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Materials
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Update on colormaterial, material emmissive/ambient,
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * lightmodel.globalambient
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void update_global_ambient( struct gl_context *ctx )
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float *fcmd = (float *)R200_DB_STATE( glt );
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Need to do more if both emmissive & ambient are PREMULT:
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * I believe this is not nessary when using source_material. This condition thus
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * will never happen currently, and the function has no dependencies on materials now
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1] &
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ((3 << R200_FRONT_EMISSIVE_SOURCE_SHIFT) |
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	(3 << R200_FRONT_AMBIENT_SOURCE_SHIFT))) == 0)
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      COPY_3V( &fcmd[GLT_RED],
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_EMISSION]);
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ACC_SCALE_3V( &fcmd[GLT_RED],
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   ctx->Light.Model.Ambient,
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT]);
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      COPY_3V( &fcmd[GLT_RED], ctx->Light.Model.Ambient );
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_DB_STATECHANGE(rmesa, &rmesa->hw.glt);
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Update on change to
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    - light[p].colors
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    - light[p].enabled
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void update_light_colors( struct gl_context *ctx, GLuint p )
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_light *l = &ctx->Light.Light[p];
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*     fprintf(stderr, "%s\n", __FUNCTION__); */
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (l->Enabled) {
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200ContextPtr rmesa = R200_CONTEXT(ctx);
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      float *fcmd = (float *)R200_DB_STATE( lit[p] );
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      COPY_4V( &fcmd[LIT_AMBIENT_RED], l->Ambient );
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      COPY_4V( &fcmd[LIT_DIFFUSE_RED], l->Diffuse );
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      COPY_4V( &fcmd[LIT_SPECULAR_RED], l->Specular );
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] );
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200ColorMaterial( struct gl_context *ctx, GLenum face, GLenum mode )
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200ContextPtr rmesa = R200_CONTEXT(ctx);
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint light_model_ctl1 = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1];
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      light_model_ctl1 &= ~((0xf << R200_FRONT_EMISSIVE_SOURCE_SHIFT) |
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   (0xf << R200_FRONT_AMBIENT_SOURCE_SHIFT) |
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   (0xf << R200_FRONT_DIFFUSE_SOURCE_SHIFT) |
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   (0xf << R200_FRONT_SPECULAR_SOURCE_SHIFT) |
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   (0xf << R200_BACK_EMISSIVE_SOURCE_SHIFT) |
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   (0xf << R200_BACK_AMBIENT_SOURCE_SHIFT) |
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   (0xf << R200_BACK_DIFFUSE_SOURCE_SHIFT) |
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   (0xf << R200_BACK_SPECULAR_SOURCE_SHIFT));
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Light.ColorMaterialEnabled) {
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint mask = ctx->Light._ColorMaterialBitmask;
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mask & MAT_BIT_FRONT_EMISSION) {
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     R200_FRONT_EMISSIVE_SOURCE_SHIFT);
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 <<
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     R200_FRONT_EMISSIVE_SOURCE_SHIFT);
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mask & MAT_BIT_FRONT_AMBIENT) {
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     R200_FRONT_AMBIENT_SOURCE_SHIFT);
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 <<
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     R200_FRONT_AMBIENT_SOURCE_SHIFT);
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mask & MAT_BIT_FRONT_DIFFUSE) {
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     R200_FRONT_DIFFUSE_SOURCE_SHIFT);
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 <<
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     R200_FRONT_DIFFUSE_SOURCE_SHIFT);
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mask & MAT_BIT_FRONT_SPECULAR) {
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     R200_FRONT_SPECULAR_SOURCE_SHIFT);
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 <<
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     R200_FRONT_SPECULAR_SOURCE_SHIFT);
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mask & MAT_BIT_BACK_EMISSION) {
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     R200_BACK_EMISSIVE_SOURCE_SHIFT);
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 <<
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     R200_BACK_EMISSIVE_SOURCE_SHIFT);
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mask & MAT_BIT_BACK_AMBIENT) {
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     R200_BACK_AMBIENT_SOURCE_SHIFT);
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 <<
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     R200_BACK_AMBIENT_SOURCE_SHIFT);
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mask & MAT_BIT_BACK_DIFFUSE) {
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     R200_BACK_DIFFUSE_SOURCE_SHIFT);
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 <<
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     R200_BACK_DIFFUSE_SOURCE_SHIFT);
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mask & MAT_BIT_BACK_SPECULAR) {
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     R200_BACK_SPECULAR_SOURCE_SHIFT);
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 <<
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     R200_BACK_SPECULAR_SOURCE_SHIFT);
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       /* Default to SOURCE_MATERIAL:
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        */
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     light_model_ctl1 |=
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_EMISSIVE_SOURCE_SHIFT) |
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_AMBIENT_SOURCE_SHIFT) |
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_DIFFUSE_SOURCE_SHIFT) |
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_SPECULAR_SOURCE_SHIFT) |
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_EMISSIVE_SOURCE_SHIFT) |
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_AMBIENT_SOURCE_SHIFT) |
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_DIFFUSE_SOURCE_SHIFT) |
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_SPECULAR_SOURCE_SHIFT);
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (light_model_ctl1 != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1]) {
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, tcl );
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1] = light_model_ctl1;
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200UpdateMaterial( struct gl_context *ctx )
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat (*mat)[4] = ctx->Light.Material.Attrib;
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat *fcmd = (GLfloat *)R200_DB_STATE( mtl[0] );
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat *fcmd2 = (GLfloat *)R200_DB_STATE( mtl[1] );
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint mask = ~0;
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Might be possible and faster to update everything unconditionally? */
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Light.ColorMaterialEnabled)
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mask &= ~ctx->Light._ColorMaterialBitmask;
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (R200_DEBUG & RADEON_STATE)
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s\n", __FUNCTION__);
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mask & MAT_BIT_FRONT_EMISSION) {
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[MTL_EMMISSIVE_RED]   = mat[MAT_ATTRIB_FRONT_EMISSION][0];
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[MTL_EMMISSIVE_GREEN] = mat[MAT_ATTRIB_FRONT_EMISSION][1];
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[MTL_EMMISSIVE_BLUE]  = mat[MAT_ATTRIB_FRONT_EMISSION][2];
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[MTL_EMMISSIVE_ALPHA] = mat[MAT_ATTRIB_FRONT_EMISSION][3];
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mask & MAT_BIT_FRONT_AMBIENT) {
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[MTL_AMBIENT_RED]     = mat[MAT_ATTRIB_FRONT_AMBIENT][0];
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[MTL_AMBIENT_GREEN]   = mat[MAT_ATTRIB_FRONT_AMBIENT][1];
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[MTL_AMBIENT_BLUE]    = mat[MAT_ATTRIB_FRONT_AMBIENT][2];
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[MTL_AMBIENT_ALPHA]   = mat[MAT_ATTRIB_FRONT_AMBIENT][3];
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mask & MAT_BIT_FRONT_DIFFUSE) {
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[MTL_DIFFUSE_RED]     = mat[MAT_ATTRIB_FRONT_DIFFUSE][0];
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[MTL_DIFFUSE_GREEN]   = mat[MAT_ATTRIB_FRONT_DIFFUSE][1];
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[MTL_DIFFUSE_BLUE]    = mat[MAT_ATTRIB_FRONT_DIFFUSE][2];
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[MTL_DIFFUSE_ALPHA]   = mat[MAT_ATTRIB_FRONT_DIFFUSE][3];
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mask & MAT_BIT_FRONT_SPECULAR) {
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[MTL_SPECULAR_RED]    = mat[MAT_ATTRIB_FRONT_SPECULAR][0];
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[MTL_SPECULAR_GREEN]  = mat[MAT_ATTRIB_FRONT_SPECULAR][1];
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[MTL_SPECULAR_BLUE]   = mat[MAT_ATTRIB_FRONT_SPECULAR][2];
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[MTL_SPECULAR_ALPHA]  = mat[MAT_ATTRIB_FRONT_SPECULAR][3];
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mask & MAT_BIT_FRONT_SHININESS) {
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[MTL_SHININESS]       = mat[MAT_ATTRIB_FRONT_SHININESS][0];
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mask & MAT_BIT_BACK_EMISSION) {
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd2[MTL_EMMISSIVE_RED]   = mat[MAT_ATTRIB_BACK_EMISSION][0];
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd2[MTL_EMMISSIVE_GREEN] = mat[MAT_ATTRIB_BACK_EMISSION][1];
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd2[MTL_EMMISSIVE_BLUE]  = mat[MAT_ATTRIB_BACK_EMISSION][2];
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd2[MTL_EMMISSIVE_ALPHA] = mat[MAT_ATTRIB_BACK_EMISSION][3];
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mask & MAT_BIT_BACK_AMBIENT) {
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd2[MTL_AMBIENT_RED]     = mat[MAT_ATTRIB_BACK_AMBIENT][0];
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd2[MTL_AMBIENT_GREEN]   = mat[MAT_ATTRIB_BACK_AMBIENT][1];
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd2[MTL_AMBIENT_BLUE]    = mat[MAT_ATTRIB_BACK_AMBIENT][2];
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd2[MTL_AMBIENT_ALPHA]   = mat[MAT_ATTRIB_BACK_AMBIENT][3];
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mask & MAT_BIT_BACK_DIFFUSE) {
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd2[MTL_DIFFUSE_RED]     = mat[MAT_ATTRIB_BACK_DIFFUSE][0];
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd2[MTL_DIFFUSE_GREEN]   = mat[MAT_ATTRIB_BACK_DIFFUSE][1];
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd2[MTL_DIFFUSE_BLUE]    = mat[MAT_ATTRIB_BACK_DIFFUSE][2];
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd2[MTL_DIFFUSE_ALPHA]   = mat[MAT_ATTRIB_BACK_DIFFUSE][3];
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mask & MAT_BIT_BACK_SPECULAR) {
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd2[MTL_SPECULAR_RED]    = mat[MAT_ATTRIB_BACK_SPECULAR][0];
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd2[MTL_SPECULAR_GREEN]  = mat[MAT_ATTRIB_BACK_SPECULAR][1];
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd2[MTL_SPECULAR_BLUE]   = mat[MAT_ATTRIB_BACK_SPECULAR][2];
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd2[MTL_SPECULAR_ALPHA]  = mat[MAT_ATTRIB_BACK_SPECULAR][3];
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mask & MAT_BIT_BACK_SHININESS) {
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd2[MTL_SHININESS]       = mat[MAT_ATTRIB_BACK_SHININESS][0];
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_DB_STATECHANGE( rmesa, &rmesa->hw.mtl[0] );
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_DB_STATECHANGE( rmesa, &rmesa->hw.mtl[1] );
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* currently material changes cannot trigger a global ambient change, I believe this is correct
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    update_global_ambient( ctx ); */
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* _NEW_LIGHT
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _NEW_MODELVIEW
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _MESA_NEW_NEED_EYE_COORDS
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Uses derived state from mesa:
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *       _VP_inf_norm
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *       _h_inf_norm
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *       _Position
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *       _NormSpotDirection
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *       _ModelViewInvScale
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *       _NeedEyeCoords
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *       _EyeZDir
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * which are calculated in light.c and are correct for the current
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * lighting space (model or eye), hence dependencies on _NEW_MODELVIEW
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and _MESA_NEW_NEED_EYE_COORDS.
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void update_light( struct gl_context *ctx )
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Have to check these, or have an automatic shortcircuit mechanism
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * to remove noop statechanges. (Or just do a better job on the
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * front end).
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint tmp = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0];
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->_NeedEyeCoords)
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp &= ~R200_LIGHT_IN_MODELSPACE;
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp |= R200_LIGHT_IN_MODELSPACE;
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (tmp != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0])
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, tcl );
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] = tmp;
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat *fcmd = (GLfloat *)R200_DB_STATE( eye );
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[EYE_X] = ctx->_EyeZDir[0];
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[EYE_Y] = ctx->_EyeZDir[1];
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[EYE_Z] = - ctx->_EyeZDir[2];
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[EYE_RESCALE_FACTOR] = ctx->_ModelViewInvScale;
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_DB_STATECHANGE( rmesa, &rmesa->hw.eye );
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Light.Enabled) {
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint p;
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (p = 0 ; p < MAX_LIGHTS; p++) {
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (ctx->Light.Light[p].Enabled) {
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    struct gl_light *l = &ctx->Light.Light[p];
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    GLfloat *fcmd = (GLfloat *)R200_DB_STATE( lit[p] );
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (l->EyePosition[3] == 0.0) {
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       COPY_3FV( &fcmd[LIT_POSITION_X], l->_VP_inf_norm );
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       COPY_3FV( &fcmd[LIT_DIRECTION_X], l->_h_inf_norm );
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       fcmd[LIT_POSITION_W] = 0;
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       fcmd[LIT_DIRECTION_W] = 0;
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    } else {
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       COPY_4V( &fcmd[LIT_POSITION_X], l->_Position );
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       fcmd[LIT_DIRECTION_X] = -l->_NormSpotDirection[0];
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       fcmd[LIT_DIRECTION_Y] = -l->_NormSpotDirection[1];
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       fcmd[LIT_DIRECTION_Z] = -l->_NormSpotDirection[2];
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       fcmd[LIT_DIRECTION_W] = 0;
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    R200_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] );
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200Lightfv( struct gl_context *ctx, GLenum light,
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   GLenum pname, const GLfloat *params )
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint p = light - GL_LIGHT0;
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_light *l = &ctx->Light.Light[p];
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat *fcmd = (GLfloat *)rmesa->hw.lit[p].cmd;
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (pname) {
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_AMBIENT:
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DIFFUSE:
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SPECULAR:
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      update_light_colors( ctx, p );
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SPOT_DIRECTION:
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* picked up in update_light */
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POSITION: {
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* positions picked up in update_light, but can do flag here */
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint flag = (p&1)? R200_LIGHT_1_IS_LOCAL : R200_LIGHT_0_IS_LOCAL;
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE(rmesa, tcl);
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (l->EyePosition[3] != 0.0F)
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tcl.cmd[idx] |= flag;
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tcl.cmd[idx] &= ~flag;
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SPOT_EXPONENT:
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE(rmesa, lit[p]);
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[LIT_SPOT_EXPONENT] = params[0];
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SPOT_CUTOFF: {
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint flag = (p&1) ? R200_LIGHT_1_IS_SPOT : R200_LIGHT_0_IS_SPOT;
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE(rmesa, lit[p]);
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[LIT_SPOT_CUTOFF] = l->_CosCutoff;
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE(rmesa, tcl);
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (l->SpotCutoff != 180.0F)
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tcl.cmd[idx] |= flag;
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tcl.cmd[idx] &= ~flag;
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CONSTANT_ATTENUATION:
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE(rmesa, lit[p]);
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[LIT_ATTEN_CONST] = params[0];
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( params[0] == 0.0 )
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 fcmd[LIT_ATTEN_CONST_INV] = FLT_MAX;
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 fcmd[LIT_ATTEN_CONST_INV] = 1.0 / params[0];
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LINEAR_ATTENUATION:
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE(rmesa, lit[p]);
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[LIT_ATTEN_LINEAR] = params[0];
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_QUADRATIC_ATTENUATION:
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE(rmesa, lit[p]);
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fcmd[LIT_ATTEN_QUADRATIC] = params[0];
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Set RANGE_ATTEN only when needed */
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (pname) {
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POSITION:
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CONSTANT_ATTENUATION:
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LINEAR_ATTENUATION:
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_QUADRATIC_ATTENUATION: {
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint *icmd = (GLuint *)R200_DB_STATE( tcl );
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint atten_flag = ( p&1 ) ? R200_LIGHT_1_ENABLE_RANGE_ATTEN
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  : R200_LIGHT_0_ENABLE_RANGE_ATTEN;
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint atten_const_flag = ( p&1 ) ? R200_LIGHT_1_CONSTANT_RANGE_ATTEN
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  : R200_LIGHT_0_CONSTANT_RANGE_ATTEN;
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( l->EyePosition[3] == 0.0F ||
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   ( ( fcmd[LIT_ATTEN_CONST] == 0.0 || fcmd[LIT_ATTEN_CONST] == 1.0 ) &&
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) ) {
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* Disable attenuation */
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 icmd[idx] &= ~atten_flag;
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if ( fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) {
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* Enable only constant portion of attenuation calculation */
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    icmd[idx] |= ( atten_flag | atten_const_flag );
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 } else {
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* Enable full attenuation calculation */
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    icmd[idx] &= ~atten_const_flag;
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    icmd[idx] |= atten_flag;
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_DB_STATECHANGE( rmesa, &rmesa->hw.tcl );
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     break;
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200UpdateLocalViewer ( struct gl_context *ctx )
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* It looks like for the texgen modes GL_SPHERE_MAP, GL_NORMAL_MAP and
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GL_REFLECTION_MAP we need R200_LOCAL_VIEWER set (fglrx does exactly that
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for these and only these modes). This means specular highlights may turn out
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wrong in some cases when lighting is enabled but GL_LIGHT_MODEL_LOCAL_VIEWER
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   is not set, though it seems to happen rarely and the effect seems quite
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   subtle. May need TCL fallback to fix it completely, though I'm not sure
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   how you'd identify the cases where the specular highlights indeed will
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   be wrong. Don't know if fglrx does something special in that case.
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, tcl );
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Light.Model.LocalViewer ||
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ctx->Texture._GenFlags & TEXGEN_NEED_NORMALS)
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LOCAL_VIEWER;
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_LOCAL_VIEWER;
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200LightModelfv( struct gl_context *ctx, GLenum pname,
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				const GLfloat *param )
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (pname) {
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LIGHT_MODEL_AMBIENT:
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 update_global_ambient( ctx );
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LIGHT_MODEL_LOCAL_VIEWER:
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 r200UpdateLocalViewer( ctx );
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LIGHT_MODEL_TWO_SIDE:
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, tcl );
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (ctx->Light.Model.TwoSide)
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LIGHT_TWOSIDE;
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~(R200_LIGHT_TWOSIDE);
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (rmesa->radeon.TclFallback) {
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    r200ChooseRenderState( ctx );
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    r200ChooseVertexState( ctx );
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LIGHT_MODEL_COLOR_CONTROL:
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 r200UpdateSpecular(ctx);
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200ShadeModel( struct gl_context *ctx, GLenum mode )
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL];
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   s &= ~(R200_DIFFUSE_SHADE_MASK |
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  R200_ALPHA_SHADE_MASK |
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  R200_SPECULAR_SHADE_MASK |
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  R200_FOG_SHADE_MASK |
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  R200_DISC_FOG_SHADE_MASK);
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch ( mode ) {
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FLAT:
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      s |= (R200_DIFFUSE_SHADE_FLAT |
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    R200_ALPHA_SHADE_FLAT |
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    R200_SPECULAR_SHADE_FLAT |
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    R200_FOG_SHADE_FLAT |
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    R200_DISC_FOG_SHADE_FLAT);
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SMOOTH:
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      s |= (R200_DIFFUSE_SHADE_GOURAUD |
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    R200_ALPHA_SHADE_GOURAUD |
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    R200_SPECULAR_SHADE_GOURAUD |
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    R200_FOG_SHADE_GOURAUD |
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    R200_DISC_FOG_SHADE_GOURAUD);
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) {
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, set );
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.set.cmd[SET_SE_CNTL] = s;
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* =============================================================
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * User clip planes
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200ClipPlane( struct gl_context *ctx, GLenum plane, const GLfloat *eq )
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint p = (GLint) plane - (GLint) GL_CLIP_PLANE0;
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p];
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, ucp[p] );
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.ucp[p].cmd[UCP_X] = ip[0];
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1];
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2];
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.ucp[p].cmd[UCP_W] = ip[3];
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200UpdateClipPlanes( struct gl_context *ctx )
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint p;
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (p = 0; p < ctx->Const.MaxClipPlanes; p++) {
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Transform.ClipPlanesEnabled & (1 << p)) {
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p];
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, ucp[p] );
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ucp[p].cmd[UCP_X] = ip[0];
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1];
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2];
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ucp[p].cmd[UCP_W] = ip[3];
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* =============================================================
1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Stencil
1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgr200StencilFuncSeparate( struct gl_context *ctx, GLenum face, GLenum func,
1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint ref, GLuint mask )
1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint refmask = (((ctx->Stencil.Ref[0] & 0xff) << R200_STENCIL_REF_SHIFT) |
1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     ((ctx->Stencil.ValueMask[0] & 0xff) << R200_STENCIL_MASK_SHIFT));
1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, ctx );
1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, msk );
1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~R200_STENCIL_TEST_MASK;
1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~(R200_STENCIL_REF_MASK|
1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						   R200_STENCIL_VALUE_MASK);
1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch ( ctx->Stencil.Function[0] ) {
1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_NEVER:
1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_NEVER;
1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LESS:
1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_LESS;
1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_EQUAL:
1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_EQUAL;
1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LEQUAL:
1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_LEQUAL;
1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_GREATER:
1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_GREATER;
1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_NOTEQUAL:
1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_NEQUAL;
1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_GEQUAL:
1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_GEQUAL;
1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALWAYS:
1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_ALWAYS;
1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |= refmask;
1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgr200StencilMaskSeparate( struct gl_context *ctx, GLenum face, GLuint mask )
1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, msk );
1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~R200_STENCIL_WRITE_MASK;
1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |=
1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ((ctx->Stencil.WriteMask[0] & 0xff) << R200_STENCIL_WRITEMASK_SHIFT);
1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgr200StencilOpSeparate( struct gl_context *ctx, GLenum face, GLenum fail,
1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       GLenum zfail, GLenum zpass )
1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, ctx );
1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~(R200_STENCIL_FAIL_MASK |
1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       R200_STENCIL_ZFAIL_MASK |
1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       R200_STENCIL_ZPASS_MASK);
1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch ( ctx->Stencil.FailFunc[0] ) {
1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_KEEP:
1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_KEEP;
1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ZERO:
1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_ZERO;
1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_REPLACE:
1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_REPLACE;
1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INCR:
1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_INC;
1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DECR:
1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_DEC;
1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INCR_WRAP_EXT:
1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_INC_WRAP;
1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DECR_WRAP_EXT:
1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_DEC_WRAP;
1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INVERT:
1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_INVERT;
1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch ( ctx->Stencil.ZFailFunc[0] ) {
1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_KEEP:
1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_KEEP;
1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ZERO:
1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_ZERO;
1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_REPLACE:
1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_REPLACE;
1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INCR:
1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_INC;
1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DECR:
1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_DEC;
1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INCR_WRAP_EXT:
1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_INC_WRAP;
1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DECR_WRAP_EXT:
1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_DEC_WRAP;
1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INVERT:
1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_INVERT;
1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch ( ctx->Stencil.ZPassFunc[0] ) {
1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_KEEP:
1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_KEEP;
1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ZERO:
1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_ZERO;
1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_REPLACE:
1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_REPLACE;
1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INCR:
1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_INC;
1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DECR:
1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_DEC;
1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INCR_WRAP_EXT:
1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_INC_WRAP;
1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DECR_WRAP_EXT:
1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_DEC_WRAP;
1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INVERT:
1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_INVERT;
1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* =============================================================
1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Window position and viewport transformation
1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called when window size or position changes or viewport or depth range
1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * state is changed.  We update the hardware viewport state here.
1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200UpdateWindow( struct gl_context *ctx )
1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __DRIdrawable *dPriv = radeon_get_drawable(&rmesa->radeon);
1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat xoffset = 0;
1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat yoffset = dPriv ? (GLfloat) dPriv->h : 0;
1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat *v = ctx->Viewport._WindowMap.m;
1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean render_to_fbo = (ctx->DrawBuffer ? _mesa_is_user_fbo(ctx->DrawBuffer) : 0);
1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat depthScale = 1.0F / ctx->DrawBuffer->_DepthMaxF;
1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat y_scale, y_bias;
1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (render_to_fbo) {
1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      y_scale = 1.0;
1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      y_bias = 0;
1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      y_scale = -1.0;
1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      y_bias = yoffset;
1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float_ui32_type sx = { v[MAT_SX] };
1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float_ui32_type tx = { v[MAT_TX] + xoffset };
1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float_ui32_type sy = { v[MAT_SY] * y_scale };
1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float_ui32_type ty = { (v[MAT_TY] * y_scale) + y_bias };
1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float_ui32_type sz = { v[MAT_SZ] * depthScale };
1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float_ui32_type tz = { v[MAT_TZ] * depthScale };
1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, vpt );
1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE]  = sx.ui32;
1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = tx.ui32;
1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE]  = sy.ui32;
1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = ty.ui32;
1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE]  = sz.ui32;
1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = tz.ui32;
1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200_vtbl_update_scissor( struct gl_context *ctx )
1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr r200 = R200_CONTEXT(ctx);
1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned x1, y1, x2, y2;
1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct radeon_renderbuffer *rrb;
1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_SET_STATE(r200, set, SET_RE_CNTL, R200_SCISSOR_ENABLE | r200->hw.set.cmd[SET_RE_CNTL]);
1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (r200->radeon.state.scissor.enabled) {
1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      x1 = r200->radeon.state.scissor.rect.x1;
1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      y1 = r200->radeon.state.scissor.rect.y1;
1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      x2 = r200->radeon.state.scissor.rect.x2;
1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      y2 = r200->radeon.state.scissor.rect.y2;
1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rrb = radeon_get_colorbuffer(&r200->radeon);
1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      x1 = 0;
1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      y1 = 0;
1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      x2 = rrb->base.Base.Width - 1;
1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      y2 = rrb->base.Base.Height - 1;
1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_SET_STATE(r200, sci, SCI_XY_1, x1 | (y1 << 16));
1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_SET_STATE(r200, sci, SCI_XY_2, x2 | (y2 << 16));
1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200Viewport( struct gl_context *ctx, GLint x, GLint y,
1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    GLsizei width, GLsizei height )
1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Don't pipeline viewport changes, conflict with window offset
1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * setting below.  Could apply deltas to rescue pipelined viewport
1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * values, or keep the originals hanging around.
1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200UpdateWindow( ctx );
1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeon_viewport(ctx, x, y, width, height);
1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200DepthRange( struct gl_context *ctx, GLclampd nearval,
1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLclampd farval )
1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200UpdateWindow( ctx );
1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200UpdateViewportOffset( struct gl_context *ctx )
1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __DRIdrawable *dPriv = radeon_get_drawable(&rmesa->radeon);
1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat xoffset = (GLfloat)0;
1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat yoffset = (GLfloat)dPriv->h;
1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat *v = ctx->Viewport._WindowMap.m;
1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float_ui32_type tx;
1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float_ui32_type ty;
1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tx.f = v[MAT_TX] + xoffset;
1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ty.f = (- v[MAT_TY]) + yoffset;
1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] != tx.ui32 ||
1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] != ty.ui32 )
1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Note: this should also modify whatever data the context reset
1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * code uses...
1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, vpt );
1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = tx.ui32;
1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = ty.ui32;
1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* update polygon stipple x/y screen offset */
1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLuint stx, sty;
1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLuint m = rmesa->hw.msc.cmd[MSC_RE_MISC];
1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         m &= ~(R200_STIPPLE_X_OFFSET_MASK |
1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                R200_STIPPLE_Y_OFFSET_MASK);
1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* add magic offsets, then invert */
1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         stx = 31 - ((-1) & R200_STIPPLE_COORD_MASK);
1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         sty = 31 - ((dPriv->h - 1)
1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     & R200_STIPPLE_COORD_MASK);
1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         m |= ((stx << R200_STIPPLE_X_OFFSET_SHIFT) |
1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               (sty << R200_STIPPLE_Y_OFFSET_SHIFT));
1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if ( rmesa->hw.msc.cmd[MSC_RE_MISC] != m ) {
1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            R200_STATECHANGE( rmesa, msc );
1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->hw.msc.cmd[MSC_RE_MISC] = m;
1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeonUpdateScissor( ctx );
1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* =============================================================
1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Miscellaneous
1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200RenderMode( struct gl_context *ctx, GLenum mode )
1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FALLBACK( rmesa, R200_FALLBACK_RENDER_MODE, (mode != GL_RENDER) );
1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint r200_rop_tab[] = {
1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_ROP_CLEAR,
1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_ROP_AND,
1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_ROP_AND_REVERSE,
1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_ROP_COPY,
1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_ROP_AND_INVERTED,
1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_ROP_NOOP,
1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_ROP_XOR,
1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_ROP_OR,
1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_ROP_NOR,
1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_ROP_EQUIV,
1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_ROP_INVERT,
1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_ROP_OR_REVERSE,
1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_ROP_COPY_INVERTED,
1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_ROP_OR_INVERTED,
1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_ROP_NAND,
1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_ROP_SET,
1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200LogicOpCode( struct gl_context *ctx, GLenum opcode )
1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint rop = (GLuint)opcode - GL_CLEAR;
1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT( rop < 16 );
1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, msk );
1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.msk.cmd[MSK_RB3D_ROPCNTL] = r200_rop_tab[rop];
1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* =============================================================
1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * State enable/disable
1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200Enable( struct gl_context *ctx, GLenum cap, GLboolean state )
1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint p, flag;
1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( R200_DEBUG & RADEON_STATE )
1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf( stderr, "%s( %s = %s )\n", __FUNCTION__,
1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       _mesa_lookup_enum_by_nr( cap ),
1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       state ? "GL_TRUE" : "GL_FALSE" );
1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch ( cap ) {
1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Fast track this one...
1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D:
1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D:
1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_3D:
1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA_TEST:
1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, ctx );
1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (state) {
1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_ALPHA_TEST_ENABLE;
1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_ALPHA_TEST_ENABLE;
1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BLEND:
1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COLOR_LOGIC_OP:
1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200_set_blend_state( ctx );
1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CLIP_PLANE0:
1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CLIP_PLANE1:
1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CLIP_PLANE2:
1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CLIP_PLANE3:
1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CLIP_PLANE4:
1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CLIP_PLANE5:
1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p = cap-GL_CLIP_PLANE0;
1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, tcl );
1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (state) {
1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= (R200_UCP_ENABLE_0<<p);
1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 r200ClipPlane( ctx, cap, NULL );
1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~(R200_UCP_ENABLE_0<<p);
1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COLOR_MATERIAL:
1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200ColorMaterial( ctx, 0, 0 );
1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200UpdateMaterial( ctx );
1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CULL_FACE:
1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200CullFace( ctx, 0 );
1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DEPTH_TEST:
1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE(rmesa, ctx );
1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( state ) {
1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  R200_Z_ENABLE;
1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_Z_ENABLE;
1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DITHER:
1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE(rmesa, ctx );
1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( state ) {
1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  R200_DITHER_ENABLE;
1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~rmesa->radeon.state.color.roundEnable;
1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_DITHER_ENABLE;
1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  rmesa->radeon.state.color.roundEnable;
1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FOG:
1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE(rmesa, ctx );
1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( state ) {
1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_FOG_ENABLE;
1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 r200Fogfv( ctx, GL_FOG_MODE, NULL );
1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_FOG_ENABLE;
1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE(rmesa, tcl);
1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~R200_TCL_FOG_MASK;
1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200UpdateSpecular( ctx ); /* for PK_SPEC */
1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (rmesa->radeon.TclFallback)
1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 r200ChooseVertexState( ctx );
1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_allow_light_in_model( ctx, !state );
1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LIGHT0:
1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LIGHT1:
1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LIGHT2:
1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LIGHT3:
1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LIGHT4:
1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LIGHT5:
1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LIGHT6:
1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LIGHT7:
1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE(rmesa, tcl);
1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p = cap - GL_LIGHT0;
1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (p&1)
1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 flag = (R200_LIGHT_1_ENABLE |
1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 R200_LIGHT_1_ENABLE_AMBIENT |
1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 R200_LIGHT_1_ENABLE_SPECULAR);
1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 flag = (R200_LIGHT_0_ENABLE |
1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 R200_LIGHT_0_ENABLE_AMBIENT |
1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 R200_LIGHT_0_ENABLE_SPECULAR);
1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (state)
1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] |= flag;
1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] &= ~flag;
1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /*
1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      update_light_colors( ctx, p );
1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LIGHTING:
1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200UpdateSpecular(ctx);
1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* for reflection map fixup - might set recheck_texgen for all units too */
1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->radeon.NewGLState |= _NEW_TEXTURE;
1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LINE_SMOOTH:
1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, ctx );
1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( state ) {
1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  R200_ANTI_ALIAS_LINE;
1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_ANTI_ALIAS_LINE;
1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LINE_STIPPLE:
1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, set );
1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( state ) {
1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.set.cmd[SET_RE_CNTL] |=  R200_PATTERN_ENABLE;
1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.set.cmd[SET_RE_CNTL] &= ~R200_PATTERN_ENABLE;
1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_NORMALIZE:
1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, tcl );
1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( state ) {
1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |=  R200_NORMALIZE_NORMALS;
1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_NORMALIZE_NORMALS;
1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Pointsize registers on r200 only work for point sprites, and point smooth
1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * doesn't work for point sprites (and isn't needed for 1.0 sized aa points).
1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * In any case, setting pointmin == pointsizemax == 1.0 for aa points
1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * is enough to satisfy conform.
1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POINT_SMOOTH:
1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* These don't really do anything, as we don't use the 3vtx
1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * primitives yet.
1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POLYGON_OFFSET_POINT:
1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, set );
1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( state ) {
1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  R200_ZBIAS_ENABLE_POINT;
1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_ZBIAS_ENABLE_POINT;
1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POLYGON_OFFSET_LINE:
1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, set );
1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( state ) {
1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  R200_ZBIAS_ENABLE_LINE;
1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_ZBIAS_ENABLE_LINE;
1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POINT_SPRITE_ARB:
1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, spr );
1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( state ) {
1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 int i;
1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (i = 0; i < 6; i++) {
1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] |=
1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->Point.CoordReplace[i] << (R200_PS_GEN_TEX_0_SHIFT + i);
1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] &= ~R200_PS_GEN_TEX_MASK;
1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POLYGON_OFFSET_FILL:
1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, set );
1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( state ) {
1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  R200_ZBIAS_ENABLE_TRI;
1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_ZBIAS_ENABLE_TRI;
1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POLYGON_SMOOTH:
1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, ctx );
1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( state ) {
1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  R200_ANTI_ALIAS_POLY;
1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_ANTI_ALIAS_POLY;
1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POLYGON_STIPPLE:
1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE(rmesa, set );
1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( state ) {
1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.set.cmd[SET_RE_CNTL] |=  R200_STIPPLE_ENABLE;
1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.set.cmd[SET_RE_CNTL] &= ~R200_STIPPLE_ENABLE;
1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RESCALE_NORMAL_EXT: {
1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLboolean tmp = ctx->_NeedEyeCoords ? state : !state;
1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, tcl );
1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( tmp ) {
1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |=  R200_RESCALE_NORMALS;
1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_RESCALE_NORMALS;
1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SCISSOR_TEST:
1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      radeon_firevertices(&rmesa->radeon);
1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->radeon.state.scissor.enabled = state;
1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      radeonUpdateScissor( ctx );
1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_STENCIL_TEST:
1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLboolean hw_stencil = GL_FALSE;
1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (ctx->DrawBuffer) {
1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    struct radeon_renderbuffer *rrbStencil
1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       = radeon_get_renderbuffer(ctx->DrawBuffer, BUFFER_STENCIL);
1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    hw_stencil = (rrbStencil && rrbStencil->bo);
1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (hw_stencil) {
1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    R200_STATECHANGE( rmesa, ctx );
1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if ( state ) {
1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  R200_STENCIL_ENABLE;
1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    } else {
1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_STENCIL_ENABLE;
1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 } else {
1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    FALLBACK( rmesa, R200_FALLBACK_STENCIL, state );
1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_GEN_Q:
1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_GEN_R:
1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_GEN_S:
1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_GEN_T:
1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Picked up in r200UpdateTextureState.
1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->recheck_texgen[ctx->Texture.CurrentUnit] = GL_TRUE;
1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COLOR_SUM_EXT:
1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200UpdateSpecular ( ctx );
1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_VERTEX_PROGRAM_ARB:
1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!state) {
1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLuint i;
1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->curr_vp_hw = NULL;
1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, vap );
2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL] &= ~R200_VAP_PROG_VTX_SHADER_ENABLE;
2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* mark all tcl atoms (tcl vector state got overwritten) dirty
2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    not sure about tcl scalar state - we need at least grd
2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    with vert progs too.
2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ucp looks like it doesn't get overwritten (may even work
2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    with vp for pos-invariant progs if we're lucky) */
2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, mtl[0] );
2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, mtl[1] );
2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, fog );
2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, glt );
2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, eye );
2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (i = R200_MTX_MV; i <= R200_MTX_TEX5; i++) {
2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    R200_STATECHANGE( rmesa, mat[i] );
2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (i = 0 ; i < 8; i++) {
2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    R200_STATECHANGE( rmesa, lit[i] );
2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, tcl );
2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (i = 0; i <= ctx->Const.MaxClipPlanes; i++) {
2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (ctx->Transform.ClipPlanesEnabled & (1 << i)) {
2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= (R200_UCP_ENABLE_0 << i);
2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*	    else {
2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~(R200_UCP_ENABLE_0 << i);
2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }*/
2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* ugly. Need to call everything which might change compsel. */
2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 r200UpdateSpecular( ctx );
2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* shouldn't be necessary, as it's picked up anyway in r200ValidateState (_NEW_PROGRAM),
2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   but without it doom3 locks up at always the same places. Why? */
2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* FIXME: This can (and should) be replaced by a call to the TCL_STATE_FLUSH reg before
2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   accessing VAP_SE_VAP_CNTL. Requires drm changes (done). Remove after some time... */
2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 r200UpdateTextureState( ctx );
2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* if we call r200UpdateTextureState we need the code below because we are calling it with
2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    non-current derived enabled values which may revert the state atoms for frag progs even when
2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    they already got disabled... ugh
2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    Should really figure out why we need to call r200UpdateTextureState in the first place */
2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLuint unit;
2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (unit = 0; unit < R200_MAX_TEXTURE_UNITS; unit++) {
2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    R200_STATECHANGE( rmesa, pix[unit] );
2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    R200_STATECHANGE( rmesa, tex[unit] );
2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT] &=
2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		~(R200_TXFORMAT_ST_ROUTE_MASK | R200_TXFORMAT_LOOKUP_DISABLE);
2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT] |= unit << R200_TXFORMAT_ST_ROUTE_SHIFT;
2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* need to guard this with drmSupportsFragmentShader? Should never get here if
2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       we don't announce ATI_fs, right? */
2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->hw.tex[unit].cmd[TEX_PP_TXMULTI_CTL] = 0;
2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, cst );
2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, tf );
2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.cst.cmd[CST_PP_CNTL_X] = 0;
2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* picked up later */
2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* call functions which change hw state based on ARB_vp enabled or not. */
2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200PointParameter( ctx, GL_POINT_DISTANCE_ATTENUATION, NULL );
2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200Fogfv( ctx, GL_FOG_COORD_SRC, NULL );
2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_VERTEX_PROGRAM_POINT_SIZE_ARB:
2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200PointParameter( ctx, GL_POINT_DISTANCE_ATTENUATION, NULL );
2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FRAGMENT_SHADER_ATI:
2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( !state ) {
2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* restore normal tex env colors and make sure tex env combine will get updated
2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    mark env atoms dirty (as their data was overwritten by afs even
2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if they didn't change) and restore tex coord routing */
2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLuint unit;
2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (unit = 0; unit < R200_MAX_TEXTURE_UNITS; unit++) {
2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    R200_STATECHANGE( rmesa, pix[unit] );
2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    R200_STATECHANGE( rmesa, tex[unit] );
2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT] &=
2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		~(R200_TXFORMAT_ST_ROUTE_MASK | R200_TXFORMAT_LOOKUP_DISABLE);
2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT] |= unit << R200_TXFORMAT_ST_ROUTE_SHIFT;
2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->hw.tex[unit].cmd[TEX_PP_TXMULTI_CTL] = 0;
2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, cst );
2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, tf );
2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.cst.cmd[CST_PP_CNTL_X] = 0;
2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* need to mark this dirty as pix/tf atoms have overwritten the data
2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    even if the data in the atoms didn't change */
2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, atf );
2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, afs[1] );
2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* everything else picked up in r200UpdateTextureState hopefully */
2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200LightingSpaceChange( struct gl_context *ctx )
2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean tmp;
2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (R200_DEBUG & RADEON_STATE)
2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s %d BEFORE %x\n", __FUNCTION__, ctx->_NeedEyeCoords,
2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0]);
2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->_NeedEyeCoords)
2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tmp = ctx->Transform.RescaleNormals;
2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tmp = !ctx->Transform.RescaleNormals;
2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, tcl );
2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( tmp ) {
2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |=  R200_RESCALE_NORMALS;
2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_RESCALE_NORMALS;
2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (R200_DEBUG & RADEON_STATE)
2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s %d AFTER %x\n", __FUNCTION__, ctx->_NeedEyeCoords,
2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0]);
2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* =============================================================
2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Deferred state management - matrices, textures, other?
2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void upload_matrix( r200ContextPtr rmesa, GLfloat *src, int idx )
2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float *dest = ((float *)R200_DB_STATE( mat[idx] ))+MAT_ELT_0;
2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0 ; i < 4 ; i++) {
2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *dest++ = src[i];
2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *dest++ = src[i+4];
2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *dest++ = src[i+8];
2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *dest++ = src[i+12];
2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );
2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void upload_matrix_t( r200ContextPtr rmesa, const GLfloat *src, int idx )
2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float *dest = ((float *)R200_DB_STATE( mat[idx] ))+MAT_ELT_0;
2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy(dest, src, 16*sizeof(float));
2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );
2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void update_texturematrix( struct gl_context *ctx )
2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT( ctx );
2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint tpc = rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_0];
2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint compsel = rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL];
2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int unit;
2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (R200_DEBUG & RADEON_STATE)
2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s before COMPSEL: %x\n", __FUNCTION__,
2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL]);
2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->TexMatEnabled = 0;
2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->TexMatCompSel = 0;
2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (unit = 0 ; unit < ctx->Const.MaxTextureUnits; unit++) {
2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Texture.Unit[unit]._ReallyEnabled)
2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 continue;
2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->TextureMatrixStack[unit].Top->type != MATRIX_IDENTITY) {
2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->TexMatEnabled |= (R200_TEXGEN_TEXMAT_0_ENABLE|
2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  R200_TEXMAT_0_ENABLE) << unit;
2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->TexMatCompSel |= R200_OUTPUT_TEX_0 << unit;
2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (rmesa->TexGenEnabled & (R200_TEXMAT_0_ENABLE << unit)) {
2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* Need to preconcatenate any active texgen
2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     * obj/eyeplane matrices:
2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     */
2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    _math_matrix_mul_matrix( &rmesa->tmpmat,
2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     ctx->TextureMatrixStack[unit].Top,
2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     &rmesa->TexGenMatrix[unit] );
2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    upload_matrix( rmesa, rmesa->tmpmat.m, R200_MTX_TEX0+unit );
2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else {
2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    upload_matrix( rmesa, ctx->TextureMatrixStack[unit].Top->m,
2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   R200_MTX_TEX0+unit );
2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (rmesa->TexGenEnabled & (R200_TEXMAT_0_ENABLE << unit)) {
2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 upload_matrix( rmesa, rmesa->TexGenMatrix[unit].m,
2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			R200_MTX_TEX0+unit );
2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tpc = (rmesa->TexMatEnabled | rmesa->TexGenEnabled);
2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (tpc != rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_0]) {
2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE(rmesa, tcg);
2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_0] = tpc;
2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   compsel &= ~R200_OUTPUT_TEX_MASK;
2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   compsel |= rmesa->TexMatCompSel | rmesa->TexGenCompSel;
2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (compsel != rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL]) {
2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE(rmesa, vtx);
2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] = compsel;
2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean r200ValidateBuffers(struct gl_context *ctx)
2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct radeon_renderbuffer *rrb;
2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct radeon_dma_bo *dma_bo;
2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i, ret;
2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (RADEON_DEBUG & RADEON_IOCTL)
2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		fprintf(stderr, "%s\n", __FUNCTION__);
2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeon_cs_space_reset_bos(rmesa->radeon.cmdbuf.cs);
2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rrb = radeon_get_colorbuffer(&rmesa->radeon);
2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* color buffer */
2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rrb && rrb->bo) {
2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, rrb->bo,
2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       0, RADEON_GEM_DOMAIN_VRAM);
2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* depth buffer */
2232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rrb = radeon_get_depthbuffer(&rmesa->radeon);
2233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* color buffer */
2234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rrb && rrb->bo) {
2235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, rrb->bo,
2236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       0, RADEON_GEM_DOMAIN_VRAM);
2237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < ctx->Const.MaxTextureImageUnits; ++i) {
2240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      radeonTexObj *t;
2241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Texture.Unit[i]._ReallyEnabled)
2243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 continue;
2244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t = radeon_tex_obj(ctx->Texture.Unit[i]._Current);
2246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (t->image_override && t->bo)
2247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, t->bo,
2248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
2249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (t->mt->bo)
2250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, t->mt->bo,
2251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
2252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dma_bo = first_elem(&rmesa->radeon.dma.reserved);
2255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
2256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs, dma_bo->bo, RADEON_GEM_DOMAIN_GTT, 0);
2257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       if (ret)
2258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   return GL_FALSE;
2259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
2261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean r200ValidateState( struct gl_context *ctx )
2264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
2266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint new_state = rmesa->radeon.NewGLState;
2267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (new_state & _NEW_BUFFERS) {
2269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_update_framebuffer(ctx);
2270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* this updates the DrawBuffer's Width/Height if it's a FBO */
2271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_update_draw_buffer_bounds(ctx);
2272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE(rmesa, ctx);
2274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (new_state & (_NEW_TEXTURE | _NEW_PROGRAM | _NEW_PROGRAM_CONSTANTS)) {
2277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200UpdateTextureState( ctx );
2278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      new_state |= rmesa->radeon.NewGLState; /* may add TEXTURE_MATRIX */
2279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200UpdateLocalViewer( ctx );
2280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* we need to do a space check here */
2283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!r200ValidateBuffers(ctx))
2284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     return GL_FALSE;
2285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* FIXME: don't really need most of these when vertex progs are enabled */
2287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Need an event driven matrix update?
2289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
2290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (new_state & (_NEW_MODELVIEW|_NEW_PROJECTION))
2291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      upload_matrix( rmesa, ctx->_ModelProjectMatrix.m, R200_MTX_MVP );
2292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Need these for lighting (shouldn't upload otherwise)
2294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
2295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (new_state & (_NEW_MODELVIEW)) {
2296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      upload_matrix( rmesa, ctx->ModelviewMatrixStack.Top->m, R200_MTX_MV );
2297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      upload_matrix_t( rmesa, ctx->ModelviewMatrixStack.Top->inv, R200_MTX_IMV );
2298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Does this need to be triggered on eg. modelview for
2301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * texgen-derived objplane/eyeplane matrices?
2302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
2303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (new_state & (_NEW_TEXTURE|_NEW_TEXTURE_MATRIX)) {
2304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      update_texturematrix( ctx );
2305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (new_state & (_NEW_LIGHT|_NEW_MODELVIEW|_MESA_NEW_NEED_EYE_COORDS)) {
2308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      update_light( ctx );
2309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* emit all active clip planes if projection matrix changes.
2312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
2313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (new_state & (_NEW_PROJECTION)) {
2314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Transform.ClipPlanesEnabled)
2315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 r200UpdateClipPlanes( ctx );
2316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (new_state & (_NEW_PROGRAM|
2319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    _NEW_PROGRAM_CONSTANTS |
2320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* need to test for pretty much anything due to possible parameter bindings */
2321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	_NEW_MODELVIEW|_NEW_PROJECTION|_NEW_TRANSFORM|
2322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	_NEW_LIGHT|_NEW_TEXTURE|_NEW_TEXTURE_MATRIX|
2323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	_NEW_FOG|_NEW_POINT|_NEW_TRACK_MATRIX)) {
2324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->VertexProgram._Enabled) {
2325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 r200SetupVertexProg( ctx );
2326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else TCL_FALLBACK(ctx, R200_TCL_FALLBACK_VERTEX_PROGRAM, 0);
2328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->radeon.NewGLState = 0;
2331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
2332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200InvalidateState( struct gl_context *ctx, GLuint new_state )
2336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _swrast_InvalidateState( ctx, new_state );
2338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _swsetup_InvalidateState( ctx, new_state );
2339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _vbo_InvalidateState( ctx, new_state );
2340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _tnl_InvalidateState( ctx, new_state );
2341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _ae_invalidate_state( ctx, new_state );
2342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_CONTEXT(ctx)->radeon.NewGLState |= new_state;
2343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* A hack.  The r200 can actually cope just fine with materials
2346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * between begin/ends, so fix this.
2347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Should map to inputs just like the generic vertex arrays for vertex progs.
2348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In theory there could still be too many and we'd still need a fallback.
2349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean check_material( struct gl_context *ctx )
2351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TNLcontext *tnl = TNL_CONTEXT(ctx);
2353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint i;
2354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = _TNL_ATTRIB_MAT_FRONT_AMBIENT;
2356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	i < _TNL_ATTRIB_MAT_BACK_INDEXES;
2357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	i++)
2358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (tnl->vb.AttribPtr[i] &&
2359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  tnl->vb.AttribPtr[i]->stride)
2360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_TRUE;
2361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_FALSE;
2363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200WrapRunPipeline( struct gl_context *ctx )
2366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
2368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean has_material;
2369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (0)
2371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s, newstate: %x\n", __FUNCTION__, rmesa->radeon.NewGLState);
2372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Validate state:
2374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
2375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rmesa->radeon.NewGLState)
2376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!r200ValidateState( ctx ))
2377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 FALLBACK(rmesa, RADEON_FALLBACK_TEXTURE, GL_TRUE);
2378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   has_material = !ctx->VertexProgram._Enabled && ctx->Light.Enabled && check_material( ctx );
2380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (has_material) {
2382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TCL_FALLBACK( ctx, R200_TCL_FALLBACK_MATERIAL, GL_TRUE );
2383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Run the pipeline.
2386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
2387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _tnl_run_pipeline( ctx );
2388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (has_material) {
2390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TCL_FALLBACK( ctx, R200_TCL_FALLBACK_MATERIAL, GL_FALSE );
2391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200PolygonStipple( struct gl_context *ctx, const GLubyte *mask )
2396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr r200 = R200_CONTEXT(ctx);
2398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint i;
2399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeon_firevertices(&r200->radeon);
2401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeon_print(RADEON_STATE, RADEON_TRACE,
2403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   "%s(%p) first 32 bits are %x.\n",
2404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   __func__,
2405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   ctx,
2406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   *(uint32_t*)mask);
2407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE(r200, stp);
2409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Must flip pattern upside down.
2411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
2412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for ( i = 31 ; i >= 0; i--) {
2413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     r200->hw.stp.cmd[3 + i] = ((GLuint *) mask)[i];
2414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Initialize the driver's state functions.
2417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200InitStateFuncs( radeonContextPtr radeon, struct dd_function_table *functions )
2419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->UpdateState		= r200InvalidateState;
2421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->LightingSpaceChange	= r200LightingSpaceChange;
2422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->DrawBuffer		= radeonDrawBuffer;
2424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->ReadBuffer		= radeonReadBuffer;
2425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->CopyPixels                = _mesa_meta_CopyPixels;
2427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->DrawPixels                = _mesa_meta_DrawPixels;
2428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->ReadPixels                = radeonReadPixels;
2429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->AlphaFunc			= r200AlphaFunc;
2431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->BlendColor		= r200BlendColor;
2432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->BlendEquationSeparate	= r200BlendEquationSeparate;
2433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->BlendFuncSeparate		= r200BlendFuncSeparate;
2434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->ClipPlane			= r200ClipPlane;
2435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->ColorMask			= r200ColorMask;
2436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->CullFace			= r200CullFace;
2437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->DepthFunc			= r200DepthFunc;
2438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->DepthMask			= r200DepthMask;
2439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->DepthRange		= r200DepthRange;
2440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->Enable			= r200Enable;
2441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->Fogfv			= r200Fogfv;
2442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->FrontFace			= r200FrontFace;
2443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->Hint			= NULL;
2444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->LightModelfv		= r200LightModelfv;
2445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->Lightfv			= r200Lightfv;
2446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->LineStipple		= r200LineStipple;
2447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->LineWidth			= r200LineWidth;
2448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->LogicOpcode		= r200LogicOpCode;
2449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->PolygonMode		= r200PolygonMode;
2450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->PolygonOffset		= r200PolygonOffset;
2451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->PolygonStipple		= r200PolygonStipple;
2452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->PointParameterfv		= r200PointParameter;
2453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->PointSize			= r200PointSize;
2454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->RenderMode		= r200RenderMode;
2455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->Scissor			= radeonScissor;
2456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->ShadeModel		= r200ShadeModel;
2457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->StencilFuncSeparate	= r200StencilFuncSeparate;
2458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->StencilMaskSeparate	= r200StencilMaskSeparate;
2459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->StencilOpSeparate		= r200StencilOpSeparate;
2460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->Viewport			= r200Viewport;
2461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200InitTnlFuncs( struct gl_context *ctx )
2465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange = r200UpdateMaterial;
2467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TNL_CONTEXT(ctx)->Driver.RunPipeline = r200WrapRunPipeline;
2468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2469