radeon_state.c revision f64f940281f0d716e0ddc641e7ef1728f143d67f
15df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_state.c,v 1.8 2002/12/16 16:18:58 dawes Exp $ */
25df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**************************************************************************
35df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
45df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulCopyright 2000, 2001 VA Linux Systems Inc., Fremont, California.
55df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
65df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulAll Rights Reserved.
75df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
85df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulPermission is hereby granted, free of charge, to any person obtaining
95df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paula copy of this software and associated documentation files (the
105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul"Software"), to deal in the Software without restriction, including
115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulwithout limitation the rights to use, copy, modify, merge, publish,
125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Pauldistribute, sublicense, and/or sell copies of the Software, and to
135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulpermit persons to whom the Software is furnished to do so, subject to
145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulthe following conditions:
155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulThe above copyright notice and this permission notice (including the
175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulnext paragraph) shall be included in all copies or substantial
185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulportions of the Software.
195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul**************************************************************************/
295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Authors:
325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *   Gareth Hughes <gareth@valinux.com>
335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *   Keith Whitwell <keith@tungstengraphics.com>
345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "glheader.h"
375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "imports.h"
385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "api_arrayelt.h"
395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "enums.h"
405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "colormac.h"
415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "state.h"
42cc5d04574406a86d9a4d7991370359dc3c94f9a7Felix Kuehling#include "context.h"
435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "swrast/swrast.h"
455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "array_cache/acache.h"
465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/tnl.h"
475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_pipeline.h"
485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "main/light.h"
495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "swrast_setup/swrast_setup.h"
505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_context.h"
525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_ioctl.h"
535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_state.h"
545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tcl.h"
555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tex.h"
565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_swtcl.h"
575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_vtxfmt.h"
585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Alpha blending
615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonAlphaFunc( GLcontext *ctx, GLenum func, GLfloat ref )
645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int pp_misc = rmesa->hw.ctx.cmd[CTX_PP_MISC];
675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLubyte refByte;
685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   CLAMPED_FLOAT_TO_UBYTE(refByte, ref);
705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   pp_misc &= ~(RADEON_ALPHA_TEST_OP_MASK | RADEON_REF_ALPHA_MASK);
745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   pp_misc |= (refByte & RADEON_REF_ALPHA_MASK);
755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( func ) {
775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NEVER:
785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_FAIL;
795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LESS:
815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_LESS;
825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_EQUAL:
845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_EQUAL;
855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LEQUAL:
875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_LEQUAL;
885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GREATER:
905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_GREATER;
915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NOTEQUAL:
935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_NEQUAL;
945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GEQUAL:
965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_GEQUAL;
975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALWAYS:
995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_PASS;
1005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ctx.cmd[CTX_PP_MISC] = pp_misc;
1045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
106c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanickstatic void radeonBlendEquationSeparate( GLcontext *ctx,
107c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick					 GLenum modeRGB, GLenum modeA )
1085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
1095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
1105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint b = rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] & ~RADEON_COMB_FCN_MASK;
1115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean fallback = GL_FALSE;
1125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
113c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   assert( modeRGB == modeA );
114c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick
115c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   switch ( modeRGB ) {
1165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FUNC_ADD:
1175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LOGIC_OP:
1185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_COMB_FCN_ADD_CLAMP;
1195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FUNC_SUBTRACT:
1225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_COMB_FCN_SUB_CLAMP;
1235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
1265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Color.BlendEnabled)
1275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fallback = GL_TRUE;
1285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
1295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b |= RADEON_COMB_FCN_ADD_CLAMP;
1305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   FALLBACK( rmesa, RADEON_FALLBACK_BLEND_EQ, fallback );
1345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( !fallback ) {
1355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
1365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = b;
13778bb0803cf722ad5273fc495791eb573bf8b4d21Michel Dänzer      if ( ctx->Color._LogicOpEnabled ) {
1385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_ROP_ENABLE;
1395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
1405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE;
1415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14520a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanickstatic void radeonBlendFuncSeparate( GLcontext *ctx,
14620a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick				     GLenum sfactorRGB, GLenum dfactorRGB,
14720a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick				     GLenum sfactorA, GLenum dfactorA )
1485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
1495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
1505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint b = rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] &
1515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      ~(RADEON_SRC_BLEND_MASK | RADEON_DST_BLEND_MASK);
1525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean fallback = GL_FALSE;
1535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Color.BlendSrcRGB ) {
1555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
1565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ZERO;
1575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE:
1595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE;
1605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DST_COLOR:
1625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_DST_COLOR;
1635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_DST_COLOR:
1655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE_MINUS_DST_COLOR;
1665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_COLOR:
1685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_SRC_COLOR;
1695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_SRC_COLOR:
1715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE_MINUS_SRC_COLOR;
1725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_ALPHA:
1745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_SRC_ALPHA;
1755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_SRC_ALPHA:
1775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE_MINUS_SRC_ALPHA;
1785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DST_ALPHA:
1805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_DST_ALPHA;
1815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_DST_ALPHA:
1835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE_MINUS_DST_ALPHA;
1845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_ALPHA_SATURATE:
1865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_SRC_ALPHA_SATURATE;
1875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_COLOR:
1895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_CONSTANT_COLOR:
1905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_ALPHA:
1915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_CONSTANT_ALPHA:
1925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Color.BlendEnabled)
1935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fallback = GL_TRUE;
1945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
1955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b |= RADEON_SRC_BLEND_GL_ONE;
1965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
1985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Color.BlendDstRGB ) {
2025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
2035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ZERO;
2045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE:
2065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE;
2075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_COLOR:
2095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_SRC_COLOR;
2105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_SRC_COLOR:
2125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE_MINUS_SRC_COLOR;
2135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_ALPHA:
2155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_SRC_ALPHA;
2165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_SRC_ALPHA:
2185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE_MINUS_SRC_ALPHA;
2195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DST_COLOR:
2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_DST_COLOR;
2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_DST_COLOR:
2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE_MINUS_DST_COLOR;
2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DST_ALPHA:
2275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_DST_ALPHA;
2285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_DST_ALPHA:
2305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE_MINUS_DST_ALPHA;
2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_COLOR:
2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_CONSTANT_COLOR:
2345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_ALPHA:
2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_CONSTANT_ALPHA:
2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Color.BlendEnabled)
2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fallback = GL_TRUE;
2385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
2395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b |= RADEON_DST_BLEND_GL_ZERO;
2405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
2425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   FALLBACK( rmesa, RADEON_FALLBACK_BLEND_FUNC, fallback );
2465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( !fallback ) {
2475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
2485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = b;
2495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Depth testing
2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
2565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDepthFunc( GLcontext *ctx, GLenum func )
2585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
2605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
2625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_Z_TEST_MASK;
2635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Depth.Func ) {
2655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NEVER:
2665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_NEVER;
2675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LESS:
2695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_LESS;
2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_EQUAL:
2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_EQUAL;
2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LEQUAL:
2755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_LEQUAL;
2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GREATER:
2785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_GREATER;
2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NOTEQUAL:
2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_NEQUAL;
2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GEQUAL:
2845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_GEQUAL;
2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALWAYS:
2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_ALWAYS;
2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDepthMask( GLcontext *ctx, GLboolean flag )
2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
2975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( ctx->Depth.Mask ) {
2995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |=  RADEON_Z_WRITE_ENABLE;
3005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
3015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_Z_WRITE_ENABLE;
3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClearDepth( GLcontext *ctx, GLclampd d )
3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
3085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint format = (rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &
3095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		    RADEON_DEPTH_FORMAT_MASK);
3105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( format ) {
3125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_DEPTH_FORMAT_16BIT_INT_Z:
3135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.depth.clear = d * 0x0000ffff;
3145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_DEPTH_FORMAT_24BIT_INT_Z:
3165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.depth.clear = d * 0x00ffffff;
3175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
3235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Fog
3245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
3255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonFogfv( GLcontext *ctx, GLenum pname, const GLfloat *param )
3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
3305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   union { int i; float f; } c, d;
3315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLchan col[4];
3325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   c.i = rmesa->hw.fog.cmd[FOG_C];
3345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   d.i = rmesa->hw.fog.cmd[FOG_D];
3355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (pname) {
3375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG_MODE:
3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (!ctx->Fog.Enabled)
3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return;
3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_TCL_FOG_MASK;
3425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch (ctx->Fog.Mode) {
3435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR:
3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_LINEAR;
3455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (ctx->Fog.Start == ctx->Fog.End) {
3465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    c.f = 1.0F;
3475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    d.f = 1.0F;
3485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
3495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 else {
3505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start);
3515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    d.f = 1.0/(ctx->Fog.End-ctx->Fog.Start);
3525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
3535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_EXP:
3555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_EXP;
3565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 c.f = 0.0;
3575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 d.f = ctx->Fog.Density;
3585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_EXP2:
3605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_EXP2;
3615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 c.f = 0.0;
3625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 d.f = -(ctx->Fog.Density * ctx->Fog.Density);
3635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      default:
3655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return;
3665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG_DENSITY:
3695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch (ctx->Fog.Mode) {
3705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_EXP:
3715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 c.f = 0.0;
3725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 d.f = ctx->Fog.Density;
3735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_EXP2:
3755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 c.f = 0.0;
3765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 d.f = -(ctx->Fog.Density * ctx->Fog.Density);
3775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      default:
3795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG_START:
3835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG_END:
3845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Fog.Mode == GL_LINEAR) {
3855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (ctx->Fog.Start == ctx->Fog.End) {
3865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    c.f = 1.0F;
3875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    d.f = 1.0F;
3885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 } else {
3895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start);
3905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    d.f = 1.0/(ctx->Fog.End-ctx->Fog.Start);
3915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
3925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG_COLOR:
3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
3965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      UNCLAMPED_FLOAT_TO_RGB_CHAN( col, ctx->Fog.Color );
3975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] =
3985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonPackColor( 4, col[0], col[1], col[2], 0 );
3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
4005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG_COORDINATE_SOURCE_EXT:
4015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* What to do?
4025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
4035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
4045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
4055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
4065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (c.i != rmesa->hw.fog.cmd[FOG_C] || d.i != rmesa->hw.fog.cmd[FOG_D]) {
4095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, fog );
4105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.fog.cmd[FOG_C] = c.i;
4115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.fog.cmd[FOG_D] = d.i;
4125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
4175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Scissoring
4185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
4195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic GLboolean intersect_rect( XF86DRIClipRectPtr out,
4225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				 XF86DRIClipRectPtr a,
4235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				 XF86DRIClipRectPtr b )
4245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   *out = *a;
4265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( b->x1 > out->x1 ) out->x1 = b->x1;
4275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( b->y1 > out->y1 ) out->y1 = b->y1;
4285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( b->x2 < out->x2 ) out->x2 = b->x2;
4295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( b->y2 < out->y2 ) out->y2 = b->y2;
4305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( out->x1 >= out->x2 ) return GL_FALSE;
4315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( out->y1 >= out->y2 ) return GL_FALSE;
4325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return GL_TRUE;
4335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonRecalcScissorRects( radeonContextPtr rmesa )
4375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   XF86DRIClipRectPtr out;
4395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i;
4405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Grow cliprect store?
4425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
4435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (rmesa->state.scissor.numAllocedClipRects < rmesa->numClipRects) {
4445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      while (rmesa->state.scissor.numAllocedClipRects < rmesa->numClipRects) {
4455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->state.scissor.numAllocedClipRects += 1;	/* zero case */
4465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->state.scissor.numAllocedClipRects *= 2;
4475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
4485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (rmesa->state.scissor.pClipRects)
4505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 FREE(rmesa->state.scissor.pClipRects);
4515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.scissor.pClipRects =
4535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 MALLOC( rmesa->state.scissor.numAllocedClipRects *
4545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 sizeof(XF86DRIClipRectRec) );
4555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( rmesa->state.scissor.pClipRects == NULL ) {
4575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->state.scissor.numAllocedClipRects = 0;
4585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return;
4595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
4605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   out = rmesa->state.scissor.pClipRects;
4635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->state.scissor.numClipRects = 0;
4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for ( i = 0 ; i < rmesa->numClipRects ;  i++ ) {
4665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( intersect_rect( out,
4675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			   &rmesa->pClipRects[i],
4685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			   &rmesa->state.scissor.rect ) ) {
4695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->state.scissor.numClipRects++;
4705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 out++;
4715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
4725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonUpdateScissor( GLcontext *ctx )
4775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
4795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->dri.drawable ) {
4815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;
4825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      int x = ctx->Scissor.X;
4845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      int y = dPriv->h - ctx->Scissor.Y - ctx->Scissor.Height;
4855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      int w = ctx->Scissor.X + ctx->Scissor.Width - 1;
4865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      int h = dPriv->h - ctx->Scissor.Y - 1;
4875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.scissor.rect.x1 = x + dPriv->x;
4895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.scissor.rect.y1 = y + dPriv->y;
4905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.scissor.rect.x2 = w + dPriv->x + 1;
4915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.scissor.rect.y2 = h + dPriv->y + 1;
4925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonRecalcScissorRects( rmesa );
4945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonScissor( GLcontext *ctx,
4995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			   GLint x, GLint y, GLsizei w, GLsizei h )
5005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
5025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( ctx->Scissor.Enabled ) {
5045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_FIREVERTICES( rmesa );	/* don't pipeline cliprect changes */
5055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateScissor( ctx );
5065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
5125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Culling
5135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
5145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonCullFace( GLcontext *ctx, GLenum unused )
5165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
5185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL];
5195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint t = rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL];
5205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   s |= RADEON_FFACE_SOLID | RADEON_BFACE_SOLID;
5225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t &= ~(RADEON_CULL_FRONT | RADEON_CULL_BACK);
5235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( ctx->Polygon.CullFlag ) {
5255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch ( ctx->Polygon.CullFaceMode ) {
5265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_FRONT:
5275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 s &= ~RADEON_FFACE_SOLID;
5285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t |= RADEON_CULL_FRONT;
5295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
5305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_BACK:
5315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 s &= ~RADEON_BFACE_SOLID;
5325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t |= RADEON_CULL_BACK;
5335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
5345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_FRONT_AND_BACK:
5355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 s &= ~(RADEON_FFACE_SOLID | RADEON_BFACE_SOLID);
5365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t |= (RADEON_CULL_FRONT | RADEON_CULL_BACK);
5375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
5385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
5395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) {
5425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, set );
5435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] = s;
5445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] != t ) {
5475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl );
5485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] = t;
5495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonFrontFace( GLcontext *ctx, GLenum mode )
5535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
5555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, set );
5575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_FFACE_CULL_DIR_MASK;
5585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, tcl );
5605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_CULL_FRONT_IS_CCW;
5615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( mode ) {
5635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CW:
5645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_FFACE_CULL_CW;
5655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
5665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CCW:
5675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_FFACE_CULL_CCW;
5685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_CULL_FRONT_IS_CCW;
5695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
5705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
5755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Line state
5765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
5775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLineWidth( GLcontext *ctx, GLfloat widthf )
5785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
5805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, lin );
5825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, set );
5835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Line width is stored in U6.4 format.
5855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
5865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] = (GLuint)(widthf * 16.0);
5875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( widthf > 1.0 ) {
5885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_WIDELINE_ENABLE;
5895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
5905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_WIDELINE_ENABLE;
5915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLineStipple( GLcontext *ctx, GLint factor, GLushort pattern )
5955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
5975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, lin );
5995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.lin.cmd[LIN_RE_LINE_PATTERN] =
6005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      ((((GLuint)factor & 0xff) << 16) | ((GLuint)pattern));
6015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
6055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Masks
6065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
6075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonColorMask( GLcontext *ctx,
6085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     GLboolean r, GLboolean g,
6095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     GLboolean b, GLboolean a )
6105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
6125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint mask = radeonPackColor( rmesa->radeonScreen->cpp,
6135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				  ctx->Color.ColorMask[RCOMP],
6145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				  ctx->Color.ColorMask[GCOMP],
6155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				  ctx->Color.ColorMask[BCOMP],
6165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				  ctx->Color.ColorMask[ACOMP] );
6175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] != mask ) {
6195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, msk );
6205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] = mask;
6215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
6265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Polygon state
6275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
6285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonPolygonOffset( GLcontext *ctx,
6305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				 GLfloat factor, GLfloat units )
6315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
6335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat constant = units * rmesa->state.depth.scale;
6345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, zbs );
6365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_FACTOR]   = *(GLuint *)&factor;
6375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_CONSTANT] = *(GLuint *)&constant;
6385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonPolygonStipple( GLcontext *ctx, const GLubyte *mask )
6415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
6435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint i;
6445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   drmRadeonStipple stipple;
6455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Must flip pattern upside down.
6475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
6485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for ( i = 0 ; i < 32 ; i++ ) {
6495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.stipple.mask[31 - i] = ((GLuint *) mask)[i];
6505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* TODO: push this into cmd mechanism
6535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
6545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_FIREVERTICES( rmesa );
6555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   LOCK_HARDWARE( rmesa );
6565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* FIXME: Use window x,y offsets into stipple RAM.
6585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
6595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   stipple.mask = rmesa->state.stipple.mask;
6605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   drmCommandWrite( rmesa->dri.fd, DRM_RADEON_STIPPLE,
6615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                    &stipple, sizeof(drmRadeonStipple) );
6625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   UNLOCK_HARDWARE( rmesa );
6635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonPolygonMode( GLcontext *ctx, GLenum face, GLenum mode )
6665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
6685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean flag = (ctx->_TriangleCaps & DD_TRI_UNFILLED) != 0;
6695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Can't generally do unfilled via tcl, but some good special
6715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * cases work.
6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
6735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_UNFILLED, flag);
6745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (rmesa->TclFallback) {
6755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonChooseRenderState( ctx );
6765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonChooseVertexState( ctx );
6775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
6825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Rendering attributes
6835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
6845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * We really don't want to recalculate all this every time we bind a
6855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * texture.  These things shouldn't change all that often, so it makes
6865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * sense to break them out of the core texture state update routines.
6875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
6885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Examine lighting and texture state to determine if separate specular
6905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * should be enabled.
6915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonUpdateSpecular( GLcontext *ctx )
6935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
6955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   CARD32 p = rmesa->hw.ctx.cmd[CTX_PP_CNTL];
6965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, tcl );
6985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_SPECULAR;
7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_DIFFUSE;
7015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] &= ~RADEON_TCL_VTX_PK_SPEC;
7025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] &= ~RADEON_TCL_VTX_PK_DIFFUSE;
7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_LIGHTING_ENABLE;
7045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   p &= ~RADEON_SPECULAR_ENABLE;
7065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_DIFFUSE_SPECULAR_COMBINE;
7085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Light.Enabled &&
7115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) {
7125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_SPECULAR;
7135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_DIFFUSE;
7145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC;
7155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;
7165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE;
7175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      p |=  RADEON_SPECULAR_ENABLE;
7185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &=
7195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 ~RADEON_DIFFUSE_SPECULAR_COMBINE;
7205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else if (ctx->Light.Enabled) {
7225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_DIFFUSE;
7235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;
7245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE;
7255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else if (ctx->Fog.ColorSumEnabled ) {
7265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC;
7275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;
7285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      p |= RADEON_SPECULAR_ENABLE;
7295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
7305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;
7315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Fog.Enabled) {
7345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_SPECULAR;
7355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC;
7365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Bizzare: have to leave lighting enabled to get fog.
7385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
7395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE;
7405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
74243b57728340e70827a114c384192ed319abdb5c6Keith Whitwell   if (NEED_SECONDARY_COLOR(ctx)) {
7435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      assert( (p & RADEON_SPECULAR_ENABLE) != 0 );
7445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
7455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      assert( (p & RADEON_SPECULAR_ENABLE) == 0 );
7465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.ctx.cmd[CTX_PP_CNTL] != p ) {
7495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
7505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_PP_CNTL] = p;
7515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Update vertex/render formats
7545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
7555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (rmesa->TclFallback) {
7565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonChooseRenderState( ctx );
7575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonChooseVertexState( ctx );
7585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
7635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Materials
7645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
7655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Update on colormaterial, material emmissive/ambient,
7685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * lightmodel.globalambient
7695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
7705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_global_ambient( GLcontext *ctx )
7715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
7735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   float *fcmd = (float *)RADEON_DB_STATE( glt );
7745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Need to do more if both emmissive & ambient are PREMULT:
776f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger    * Hope this is not needed for MULT
7775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
7785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ((rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &
7795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       ((3 << RADEON_EMISSIVE_SOURCE_SHIFT) |
7805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	(3 << RADEON_AMBIENT_SOURCE_SHIFT))) == 0)
7815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
7825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      COPY_3V( &fcmd[GLT_RED],
7835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_EMISSION]);
7845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      ACC_SCALE_3V( &fcmd[GLT_RED],
7855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		   ctx->Light.Model.Ambient,
7865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		   ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT]);
7875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else
7895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
7905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      COPY_3V( &fcmd[GLT_RED], ctx->Light.Model.Ambient );
7915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_DB_STATECHANGE(rmesa, &rmesa->hw.glt);
7945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Update on change to
7975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *    - light[p].colors
7985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *    - light[p].enabled
7995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
8005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_light_colors( GLcontext *ctx, GLuint p )
8015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct gl_light *l = &ctx->Light.Light[p];
8035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*     fprintf(stderr, "%s\n", __FUNCTION__); */
8055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (l->Enabled) {
8075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
8085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      float *fcmd = (float *)RADEON_DB_STATE( lit[p] );
8095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      COPY_4V( &fcmd[LIT_AMBIENT_RED], l->Ambient );
8115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      COPY_4V( &fcmd[LIT_DIFFUSE_RED], l->Diffuse );
8125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      COPY_4V( &fcmd[LIT_SPECULAR_RED], l->Specular );
8135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] );
8155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Also fallback for asym colormaterial mode in twoside lighting...
8195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
8205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void check_twoside_fallback( GLcontext *ctx )
8215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean fallback = GL_FALSE;
8235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLint i;
8245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Light.Enabled && ctx->Light.Model.TwoSide) {
8265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Light.ColorMaterialEnabled &&
8275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  (ctx->Light.ColorMaterialBitmask & BACK_MATERIAL_BITS) !=
8285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  ((ctx->Light.ColorMaterialBitmask & FRONT_MATERIAL_BITS)<<1))
8295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fallback = GL_TRUE;
8305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else {
8315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 for (i = MAT_ATTRIB_FRONT_AMBIENT; i < MAT_ATTRIB_FRONT_INDEXES; i+=2)
8325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (memcmp( ctx->Light.Material.Attrib[i],
8335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			ctx->Light.Material.Attrib[i+1],
8345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			sizeof(GLfloat)*4) != 0) {
8355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fallback = GL_TRUE;
8365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       break;
8375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
8385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
8395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_LIGHT_TWOSIDE, fallback );
8425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonColorMaterial( GLcontext *ctx, GLenum face, GLenum mode )
8465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
8485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint light_model_ctl1 = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL];
8495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
85027889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling      light_model_ctl1 &= ~((3 << RADEON_EMISSIVE_SOURCE_SHIFT) |
85127889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling			   (3 << RADEON_AMBIENT_SOURCE_SHIFT) |
85227889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling			   (3 << RADEON_DIFFUSE_SOURCE_SHIFT) |
85327889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling			   (3 << RADEON_SPECULAR_SOURCE_SHIFT));
8545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
855f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   if (ctx->Light.ColorMaterialEnabled) {
856f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      GLuint mask = ctx->Light.ColorMaterialBitmask;
857f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger
8585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (mask & MAT_BIT_FRONT_EMISSION) {
85927889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling	 light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE <<
8605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     RADEON_EMISSIVE_SOURCE_SHIFT);
8615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
862f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      else {
863f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger	 light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT <<
864f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger			     RADEON_EMISSIVE_SOURCE_SHIFT);
865f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      }
8665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (mask & MAT_BIT_FRONT_AMBIENT) {
86827889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling	 light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE <<
8695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     RADEON_AMBIENT_SOURCE_SHIFT);
8705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
871f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      else {
872f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger	 light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT <<
873f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger			     RADEON_AMBIENT_SOURCE_SHIFT);
874f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      }
8755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (mask & MAT_BIT_FRONT_DIFFUSE) {
87727889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling	 light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE <<
8785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     RADEON_DIFFUSE_SOURCE_SHIFT);
8795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
880f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      else {
881f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger	 light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT <<
882f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger			     RADEON_DIFFUSE_SOURCE_SHIFT);
883f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      }
8845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (mask & MAT_BIT_FRONT_SPECULAR) {
88627889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling	 light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE <<
8875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     RADEON_SPECULAR_SOURCE_SHIFT);
8885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
889f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      else {
890f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger	 light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT <<
891f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger			     RADEON_SPECULAR_SOURCE_SHIFT);
892f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      }
893f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   }
894f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   else {
895f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   /* Default to MULT:
896f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger    */
897f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << RADEON_EMISSIVE_SOURCE_SHIFT) |
898f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger		   (RADEON_LM_SOURCE_STATE_MULT << RADEON_AMBIENT_SOURCE_SHIFT) |
899f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger		   (RADEON_LM_SOURCE_STATE_MULT << RADEON_DIFFUSE_SOURCE_SHIFT) |
900f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger		   (RADEON_LM_SOURCE_STATE_MULT << RADEON_SPECULAR_SOURCE_SHIFT);
901f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   }
9025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (light_model_ctl1 != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]) {
9045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tcl );
9055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] = light_model_ctl1;
9065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
9085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonUpdateMaterial( GLcontext *ctx )
9105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
9115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
9125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat (*mat)[4] = ctx->Light.Material.Attrib;
9135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( mtl );
9145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint mask = ~0;
9155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Light.ColorMaterialEnabled)
9175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      mask &= ~ctx->Light.ColorMaterialBitmask;
9185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_DEBUG & DEBUG_STATE)
9205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s\n", __FUNCTION__);
9215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_EMISSION) {
9245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_EMMISSIVE_RED]   = mat[MAT_ATTRIB_FRONT_EMISSION][0];
9255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_EMMISSIVE_GREEN] = mat[MAT_ATTRIB_FRONT_EMISSION][1];
9265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_EMMISSIVE_BLUE]  = mat[MAT_ATTRIB_FRONT_EMISSION][2];
9275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_EMMISSIVE_ALPHA] = mat[MAT_ATTRIB_FRONT_EMISSION][3];
9285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_AMBIENT) {
9305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_AMBIENT_RED]     = mat[MAT_ATTRIB_FRONT_AMBIENT][0];
9315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_AMBIENT_GREEN]   = mat[MAT_ATTRIB_FRONT_AMBIENT][1];
9325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_AMBIENT_BLUE]    = mat[MAT_ATTRIB_FRONT_AMBIENT][2];
9335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_AMBIENT_ALPHA]   = mat[MAT_ATTRIB_FRONT_AMBIENT][3];
9345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_DIFFUSE) {
9365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_DIFFUSE_RED]     = mat[MAT_ATTRIB_FRONT_DIFFUSE][0];
9375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_DIFFUSE_GREEN]   = mat[MAT_ATTRIB_FRONT_DIFFUSE][1];
9385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_DIFFUSE_BLUE]    = mat[MAT_ATTRIB_FRONT_DIFFUSE][2];
9395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_DIFFUSE_ALPHA]   = mat[MAT_ATTRIB_FRONT_DIFFUSE][3];
9405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_SPECULAR) {
9425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SPECULAR_RED]    = mat[MAT_ATTRIB_FRONT_SPECULAR][0];
9435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SPECULAR_GREEN]  = mat[MAT_ATTRIB_FRONT_SPECULAR][1];
9445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SPECULAR_BLUE]   = mat[MAT_ATTRIB_FRONT_SPECULAR][2];
9455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SPECULAR_ALPHA]  = mat[MAT_ATTRIB_FRONT_SPECULAR][3];
9465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_SHININESS) {
9485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SHININESS]       = mat[MAT_ATTRIB_FRONT_SHININESS][0];
9495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
951a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer   RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mtl );
9525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
953a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer   check_twoside_fallback( ctx );
954f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger/*   update_global_ambient( ctx );*/
9555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
9565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* _NEW_LIGHT
9585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _NEW_MODELVIEW
9595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _MESA_NEW_NEED_EYE_COORDS
9605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
9615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Uses derived state from mesa:
9625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _VP_inf_norm
9635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _h_inf_norm
9645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _Position
9655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _NormDirection
9665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _ModelViewInvScale
9675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _NeedEyeCoords
9685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _EyeZDir
9695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
9705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * which are calculated in light.c and are correct for the current
9715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * lighting space (model or eye), hence dependencies on _NEW_MODELVIEW
9725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * and _MESA_NEW_NEED_EYE_COORDS.
9735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
9745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_light( GLcontext *ctx )
9755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
9765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
9775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Have to check these, or have an automatic shortcircuit mechanism
9795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * to remove noop statechanges. (Or just do a better job on the
9805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * front end).
9815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
9825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
9835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint tmp = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL];
9845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->_NeedEyeCoords)
9865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tmp &= ~RADEON_LIGHT_IN_MODELSPACE;
9875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
9885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tmp |= RADEON_LIGHT_IN_MODELSPACE;
9895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Leave this test disabled: (unexplained q3 lockup) (even with
9925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         new packets)
9935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      */
9945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (tmp != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL])
9955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      {
9965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tcl );
9975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] = tmp;
9985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
9995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
10025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( eye );
10035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[EYE_X] = ctx->_EyeZDir[0];
10045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[EYE_Y] = ctx->_EyeZDir[1];
10055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[EYE_Z] = - ctx->_EyeZDir[2];
10065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[EYE_RESCALE_FACTOR] = ctx->_ModelViewInvScale;
10075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.eye );
10085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Light.Enabled) {
10135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLint p;
10145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      for (p = 0 ; p < MAX_LIGHTS; p++) {
10155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (ctx->Light.Light[p].Enabled) {
10165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    struct gl_light *l = &ctx->Light.Light[p];
10175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( lit[p] );
10185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (l->EyePosition[3] == 0.0) {
10205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       COPY_3FV( &fcmd[LIT_POSITION_X], l->_VP_inf_norm );
10215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       COPY_3FV( &fcmd[LIT_DIRECTION_X], l->_h_inf_norm );
10225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_POSITION_W] = 0;
10235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_DIRECTION_W] = 0;
10245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    } else {
10255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       COPY_4V( &fcmd[LIT_POSITION_X], l->_Position );
10265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_DIRECTION_X] = -l->_NormDirection[0];
10275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_DIRECTION_Y] = -l->_NormDirection[1];
10285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_DIRECTION_Z] = -l->_NormDirection[2];
10295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_DIRECTION_W] = 0;
10305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
10315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] );
10335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
10345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
10355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
10375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLightfv( GLcontext *ctx, GLenum light,
10395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			   GLenum pname, const GLfloat *params )
10405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
10415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
10425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLint p = light - GL_LIGHT0;
10435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct gl_light *l = &ctx->Light.Light[p];
10445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat *fcmd = (GLfloat *)rmesa->hw.lit[p].cmd;
10455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (pname) {
10485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_AMBIENT:
10495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DIFFUSE:
10505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SPECULAR:
10515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      update_light_colors( ctx, p );
10525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SPOT_DIRECTION:
10555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* picked up in update_light */
10565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POSITION: {
10595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* positions picked up in update_light, but can do flag here */
10605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint flag;
10615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;
10625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* FIXME: Set RANGE_ATTEN only when needed */
10645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (p&1)
10655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 flag = RADEON_LIGHT_1_IS_LOCAL;
10665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
10675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 flag = RADEON_LIGHT_0_IS_LOCAL;
10685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
10705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (l->EyePosition[3] != 0.0F)
10715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[idx] |= flag;
10725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
10735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[idx] &= ~flag;
10745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SPOT_EXPONENT:
10785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
10795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_SPOT_EXPONENT] = params[0];
10805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SPOT_CUTOFF: {
10835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint flag = (p&1) ? RADEON_LIGHT_1_IS_SPOT : RADEON_LIGHT_0_IS_SPOT;
10845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;
10855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
10875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_SPOT_CUTOFF] = l->_CosCutoff;
10885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
10905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (l->SpotCutoff != 180.0F)
10915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[idx] |= flag;
10925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
10935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[idx] &= ~flag;
10945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_ATTENUATION:
10995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
11005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_ATTEN_CONST] = params[0];
11015d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      if ( params[0] == 0.0 )
11025d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 fcmd[LIT_ATTEN_CONST_INV] = FLT_MAX;
11035d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      else
11045d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 fcmd[LIT_ATTEN_CONST_INV] = 1.0 / params[0];
11055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINEAR_ATTENUATION:
11075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
11085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_ATTEN_LINEAR] = params[0];
11095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_QUADRATIC_ATTENUATION:
11115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
11125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_ATTEN_QUADRATIC] = params[0];
11135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
11155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
11165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
11175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Set RANGE_ATTEN only when needed */
11195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (pname) {
11205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POSITION:
11215d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer   case GL_CONSTANT_ATTENUATION:
11225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINEAR_ATTENUATION:
11235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_QUADRATIC_ATTENUATION:
11245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
11255d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      GLuint *icmd = (GLuint *)RADEON_DB_STATE( tcl );
11265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;
11275d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      GLuint atten_flag = ( p&1 ) ? RADEON_LIGHT_1_ENABLE_RANGE_ATTEN
11285d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer				  : RADEON_LIGHT_0_ENABLE_RANGE_ATTEN;
11295d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      GLuint atten_const_flag = ( p&1 ) ? RADEON_LIGHT_1_CONSTANT_RANGE_ATTEN
11305d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer				  : RADEON_LIGHT_0_CONSTANT_RANGE_ATTEN;
11315d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer
11325d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      if ( l->EyePosition[3] == 0.0F ||
11335d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	   ( ( fcmd[LIT_ATTEN_CONST] == 0.0 || fcmd[LIT_ATTEN_CONST] == 1.0 ) &&
11345d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	     fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) ) {
11355d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 /* Disable attenuation */
11365d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 icmd[idx] &= ~atten_flag;
11375d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      } else {
11385d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 if ( fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) {
11395d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    /* Enable only constant portion of attenuation calculation */
11405d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    icmd[idx] |= ( atten_flag | atten_const_flag );
11415d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 } else {
11425d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    /* Enable full attenuation calculation */
11435d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    icmd[idx] &= ~atten_const_flag;
11445d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    icmd[idx] |= atten_flag;
11455d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 }
11465d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      }
11475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11485d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.tcl );
11495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
11515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
11525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
11545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
11555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLightModelfv( GLcontext *ctx, GLenum pname,
11605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				const GLfloat *param )
11615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
11625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
11635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (pname) {
11655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LIGHT_MODEL_AMBIENT:
11665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 update_global_ambient( ctx );
11675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
11685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LIGHT_MODEL_LOCAL_VIEWER:
11705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tcl );
11715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (ctx->Light.Model.LocalViewer)
11725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LOCAL_VIEWER;
11735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 else
11745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_LOCAL_VIEWER;
11755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         break;
11765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LIGHT_MODEL_TWO_SIDE:
11785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tcl );
11795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (ctx->Light.Model.TwoSide)
11805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_LIGHT_TWOSIDE;
11815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 else
11825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_LIGHT_TWOSIDE;
11835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 check_twoside_fallback( ctx );
11855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (rmesa->TclFallback) {
11875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    radeonChooseRenderState( ctx );
11885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    radeonChooseVertexState( ctx );
11895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
11905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         break;
11915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LIGHT_MODEL_COLOR_CONTROL:
11935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonUpdateSpecular(ctx);
11945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         break;
11955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      default:
11975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         break;
11985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
11995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
12005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonShadeModel( GLcontext *ctx, GLenum mode )
12025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
12035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
12045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL];
12055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   s &= ~(RADEON_DIFFUSE_SHADE_MASK |
12075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  RADEON_ALPHA_SHADE_MASK |
12085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  RADEON_SPECULAR_SHADE_MASK |
12095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  RADEON_FOG_SHADE_MASK);
12105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( mode ) {
12125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FLAT:
12135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      s |= (RADEON_DIFFUSE_SHADE_FLAT |
12145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_ALPHA_SHADE_FLAT |
12155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_SPECULAR_SHADE_FLAT |
12165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_FOG_SHADE_FLAT);
12175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SMOOTH:
12195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      s |= (RADEON_DIFFUSE_SHADE_GOURAUD |
12205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_ALPHA_SHADE_GOURAUD |
12215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_SPECULAR_SHADE_GOURAUD |
12225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_FOG_SHADE_GOURAUD);
12235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
12255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
12265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
12275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) {
12295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, set );
12305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] = s;
12315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
12325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
12335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
12365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * User clip planes
12375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
12385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClipPlane( GLcontext *ctx, GLenum plane, const GLfloat *eq )
12405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
12415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLint p = (GLint) plane - (GLint) GL_CLIP_PLANE0;
12425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
12435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p];
12445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ucp[p] );
12465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ucp[p].cmd[UCP_X] = ip[0];
12475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1];
12485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2];
12495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ucp[p].cmd[UCP_W] = ip[3];
12505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
12515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonUpdateClipPlanes( GLcontext *ctx )
12535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
12545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
12555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint p;
12565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for (p = 0; p < ctx->Const.MaxClipPlanes; p++) {
12585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Transform.ClipPlanesEnabled & (1 << p)) {
12595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p];
12605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, ucp[p] );
12625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ucp[p].cmd[UCP_X] = ip[0];
12635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1];
12645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2];
12655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ucp[p].cmd[UCP_W] = ip[3];
12665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
12675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
12685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
12695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
12725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Stencil
12735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
12745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonStencilFunc( GLcontext *ctx, GLenum func,
12765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			       GLint ref, GLuint mask )
12775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
12785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
12795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint refmask = ((ctx->Stencil.Ref[0] << RADEON_STENCIL_REF_SHIFT) |
12805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		     (ctx->Stencil.ValueMask[0] << RADEON_STENCIL_MASK_SHIFT));
12815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
12835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, msk );
12845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_STENCIL_TEST_MASK;
12865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~(RADEON_STENCIL_REF_MASK|
12875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul						   RADEON_STENCIL_VALUE_MASK);
12885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Stencil.Function[0] ) {
12905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NEVER:
12915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_NEVER;
12925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LESS:
12945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_LESS;
12955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_EQUAL:
12975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_EQUAL;
12985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LEQUAL:
13005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_LEQUAL;
13015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GREATER:
13035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_GREATER;
13045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NOTEQUAL:
13065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_NEQUAL;
13075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GEQUAL:
13095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_GEQUAL;
13105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALWAYS:
13125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_ALWAYS;
13135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
13155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |= refmask;
13175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
13185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonStencilMask( GLcontext *ctx, GLuint mask )
13205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
13215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
13225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, msk );
13245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~RADEON_STENCIL_WRITE_MASK;
13255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |=
13265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      (ctx->Stencil.WriteMask[0] << RADEON_STENCIL_WRITEMASK_SHIFT);
13275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
13285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonStencilOp( GLcontext *ctx, GLenum fail,
13305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     GLenum zfail, GLenum zpass )
13315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
13325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
13335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
13355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~(RADEON_STENCIL_FAIL_MASK |
13365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul					       RADEON_STENCIL_ZFAIL_MASK |
13375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul					       RADEON_STENCIL_ZPASS_MASK);
13385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Stencil.FailFunc[0] ) {
13405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_KEEP:
13415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_KEEP;
13425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
13445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_ZERO;
13455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_REPLACE:
13475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_REPLACE;
13485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INCR:
13505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_INC;
13515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DECR:
13535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_DEC;
13545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INVERT:
13565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_INVERT;
13575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
13595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Stencil.ZFailFunc[0] ) {
13615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_KEEP:
13625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_KEEP;
13635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
13655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_ZERO;
13665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_REPLACE:
13685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_REPLACE;
13695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INCR:
13715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_INC;
13725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DECR:
13745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_DEC;
13755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INVERT:
13775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_INVERT;
13785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
13805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Stencil.ZPassFunc[0] ) {
13825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_KEEP:
13835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_KEEP;
13845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
13865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_ZERO;
13875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_REPLACE:
13895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_REPLACE;
13905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INCR:
13925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_INC;
13935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DECR:
13955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_DEC;
13965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INVERT:
13985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_INVERT;
13995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
14005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
14015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
14025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClearStencil( GLcontext *ctx, GLint s )
14045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
14055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
14065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->state.stencil.clear =
14085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      ((GLuint) ctx->Stencil.Clear |
14095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       (0xff << RADEON_STENCIL_MASK_SHIFT) |
14105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       (ctx->Stencil.WriteMask[0] << RADEON_STENCIL_WRITEMASK_SHIFT));
14115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
14125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
14155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Window position and viewport transformation
14165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
14175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
14195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * To correctly position primitives:
14205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
14215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define SUBPIXEL_X 0.125
14225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define SUBPIXEL_Y 0.125
14235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonUpdateWindow( GLcontext *ctx )
14255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
14265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
14275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;
14285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat xoffset = (GLfloat)dPriv->x;
14295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat yoffset = (GLfloat)dPriv->y + dPriv->h;
14305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const GLfloat *v = ctx->Viewport._WindowMap.m;
14315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat sx = v[MAT_SX];
14335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat tx = v[MAT_TX] + xoffset + SUBPIXEL_X;
14345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat sy = - v[MAT_SY];
14355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat ty = (- v[MAT_TY]) + yoffset + SUBPIXEL_Y;
14365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat sz = v[MAT_SZ] * rmesa->state.depth.scale;
14375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat tz = v[MAT_TZ] * rmesa->state.depth.scale;
14385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_FIREVERTICES( rmesa );
14395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, vpt );
14405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE]  = *(GLuint *)&sx;
14425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = *(GLuint *)&tx;
14435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE]  = *(GLuint *)&sy;
14445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = *(GLuint *)&ty;
14455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE]  = *(GLuint *)&sz;
14465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = *(GLuint *)&tz;
14475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
14485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonViewport( GLcontext *ctx, GLint x, GLint y,
14525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			    GLsizei width, GLsizei height )
14535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
14545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Don't pipeline viewport changes, conflict with window offset
14555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * setting below.  Could apply deltas to rescue pipelined viewport
14565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * values, or keep the originals hanging around.
14575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
14585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_FIREVERTICES( RADEON_CONTEXT(ctx) );
14595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonUpdateWindow( ctx );
14605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
14615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDepthRange( GLcontext *ctx, GLclampd nearval,
14635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			      GLclampd farval )
14645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
14655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonUpdateWindow( ctx );
14665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
14675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonUpdateViewportOffset( GLcontext *ctx )
14695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
14705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
14715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;
14725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat xoffset = (GLfloat)dPriv->x;
14735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat yoffset = (GLfloat)dPriv->y + dPriv->h;
14745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const GLfloat *v = ctx->Viewport._WindowMap.m;
14755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat tx = v[MAT_TX] + xoffset;
14775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat ty = (- v[MAT_TY]) + yoffset;
14785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] != *(GLuint *)&tx ||
14805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] != *(GLuint *)&ty )
14815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
14825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Note: this should also modify whatever data the context reset
14835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       * code uses...
14845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
14855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = *(GLuint *)&tx;
14865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = *(GLuint *)&ty;
14875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* update polygon stipple x/y screen offset */
14895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      {
14905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         GLuint stx, sty;
14915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         GLuint m = rmesa->hw.msc.cmd[MSC_RE_MISC];
14925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         m &= ~(RADEON_STIPPLE_X_OFFSET_MASK |
14945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                RADEON_STIPPLE_Y_OFFSET_MASK);
14955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         /* add magic offsets, then invert */
14975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         stx = 31 - ((rmesa->dri.drawable->x - 1) & RADEON_STIPPLE_COORD_MASK);
14985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         sty = 31 - ((rmesa->dri.drawable->y + rmesa->dri.drawable->h - 1)
14995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                     & RADEON_STIPPLE_COORD_MASK);
15005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         m |= ((stx << RADEON_STIPPLE_X_OFFSET_SHIFT) |
15025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul               (sty << RADEON_STIPPLE_Y_OFFSET_SHIFT));
15035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         if ( rmesa->hw.msc.cmd[MSC_RE_MISC] != m ) {
15055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            RADEON_STATECHANGE( rmesa, msc );
15065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.msc.cmd[MSC_RE_MISC] = m;
15075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         }
15085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
15095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
15105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonUpdateScissor( ctx );
15125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
15135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
15175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Miscellaneous
15185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
15195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClearColor( GLcontext *ctx, const GLfloat color[4] )
15215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
15225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
15235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLubyte c[4];
15245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]);
15255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]);
15265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]);
15275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]);
15285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->state.color.clear = radeonPackColor( rmesa->radeonScreen->cpp,
15295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul					       c[0], c[1], c[2], c[3] );
15305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
15315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderMode( GLcontext *ctx, GLenum mode )
15345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
15355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
15365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   FALLBACK( rmesa, RADEON_FALLBACK_RENDER_MODE, (mode != GL_RENDER) );
15375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
15385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic GLuint radeon_rop_tab[] = {
15415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_CLEAR,
15425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_AND,
15435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_AND_REVERSE,
15445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_COPY,
15455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_AND_INVERTED,
15465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_NOOP,
15475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_XOR,
15485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_OR,
15495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_NOR,
15505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_EQUIV,
15515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_INVERT,
15525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_OR_REVERSE,
15535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_COPY_INVERTED,
15545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_OR_INVERTED,
15555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_NAND,
15565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_SET,
15575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
15585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLogicOpCode( GLcontext *ctx, GLenum opcode )
15605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
15615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
15625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint rop = (GLuint)opcode - GL_CLEAR;
15635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ASSERT( rop < 16 );
15655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, msk );
15675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.msk.cmd[MSK_RB3D_ROPCNTL] = radeon_rop_tab[rop];
15685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
15695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonSetCliprects( radeonContextPtr rmesa, GLenum mode )
15725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
15735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;
15745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( mode ) {
15765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FRONT_LEFT:
15775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->numClipRects = dPriv->numClipRects;
15785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->pClipRects = (XF86DRIClipRectPtr)dPriv->pClipRects;
15795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
15805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_BACK_LEFT:
15815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Can't ignore 2d windows if we are page flipping.
15825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
15835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( dPriv->numBackClipRects == 0 || rmesa->doPageFlip ) {
15845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->numClipRects = dPriv->numClipRects;
15855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->pClipRects = (XF86DRIClipRectPtr)dPriv->pClipRects;
15865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
15875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else {
15885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->numClipRects = dPriv->numBackClipRects;
15895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->pClipRects = (XF86DRIClipRectPtr)dPriv->pBackClipRects;
15905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
15915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
15925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
15935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "bad mode in radeonSetCliprects\n");
15945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
15955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
15965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (rmesa->state.scissor.enabled)
15985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonRecalcScissorRects( rmesa );
15995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
16005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDrawBuffer( GLcontext *ctx, GLenum mode )
16035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
16045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
16055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_DEBUG & DEBUG_DRI)
16075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s %s\n", __FUNCTION__,
16085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      _mesa_lookup_enum_by_nr( mode ));
16095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_FIREVERTICES(rmesa);	/* don't pipeline cliprect changes */
16115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /*
16135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * _DrawDestMask is easier to cope with than <mode>.
16145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
16155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Color._DrawDestMask ) {
16165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case FRONT_LEFT_BIT:
16175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      FALLBACK( rmesa, RADEON_FALLBACK_DRAW_BUFFER, GL_FALSE );
16185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonSetCliprects( rmesa, GL_FRONT_LEFT );
16195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case BACK_LEFT_BIT:
16215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      FALLBACK( rmesa, RADEON_FALLBACK_DRAW_BUFFER, GL_FALSE );
16225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonSetCliprects( rmesa, GL_BACK_LEFT );
16235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
16255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* GL_NONE or GL_FRONT_AND_BACK or stereo left&right, etc */
16265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      FALLBACK( rmesa, RADEON_FALLBACK_DRAW_BUFFER, GL_TRUE );
16275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
16285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
16295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* We want to update the s/w rast state too so that r200SetBuffer()
16315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * gets called.
16325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
16335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _swrast_DrawBuffer(ctx, mode);
16345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
163699ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane   rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = ((rmesa->state.color.drawOffset +
163799ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane					       rmesa->radeonScreen->fbLocation)
163899ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane					      & RADEON_COLOROFFSET_MASK);
16395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] = rmesa->state.color.drawPitch;
16405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
16415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonReadBuffer( GLcontext *ctx, GLenum mode )
16435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
16445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* nothing, until we implement h/w glRead/CopyPixels or CopyTexImage */
16455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
16465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
16495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * State enable/disable
16505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
16515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonEnable( GLcontext *ctx, GLenum cap, GLboolean state )
16535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
16545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
16555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint p, flag;
16565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( RADEON_DEBUG & DEBUG_STATE )
16585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf( stderr, "%s( %s = %s )\n", __FUNCTION__,
16595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       _mesa_lookup_enum_by_nr( cap ),
16605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       state ? "GL_TRUE" : "GL_FALSE" );
16615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( cap ) {
16635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Fast track this one...
16645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
16655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_1D:
16665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_2D:
16675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_3D:
16685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALPHA_TEST:
16715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
16725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state) {
16735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_ALPHA_TEST_ENABLE;
16745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
16755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ALPHA_TEST_ENABLE;
16765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
16775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_BLEND:
16805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
16815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state) {
16825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_ALPHA_BLEND_ENABLE;
16835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
16845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ALPHA_BLEND_ENABLE;
16855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
168678bb0803cf722ad5273fc495791eb573bf8b4d21Michel Dänzer      if ( ctx->Color._LogicOpEnabled ) {
16875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_ROP_ENABLE;
16885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
16895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE;
16905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
16915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Catch a possible fallback:
16935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
16945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state) {
1695c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick	 ctx->Driver.BlendEquationSeparate( ctx,
1696c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick					    ctx->Color.BlendEquationRGB,
1697c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick					    ctx->Color.BlendEquationA );
169820a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick	 ctx->Driver.BlendFuncSeparate( ctx, ctx->Color.BlendSrcRGB,
169920a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick					ctx->Color.BlendDstRGB,
1700253428f06a45d59cc50c9ccc4c8d17cd8c02c25dIan Romanick					ctx->Color.BlendSrcA,
1701253428f06a45d59cc50c9ccc4c8d17cd8c02c25dIan Romanick					ctx->Color.BlendDstA );
17025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else {
17045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 FALLBACK( rmesa, RADEON_FALLBACK_BLEND_FUNC, GL_FALSE );
17055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 FALLBACK( rmesa, RADEON_FALLBACK_BLEND_EQ, GL_FALSE );
17065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE0:
17105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE1:
17115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE2:
17125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE3:
17135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE4:
17145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE5:
17155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      p = cap-GL_CLIP_PLANE0;
17165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, tcl );
17175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state) {
17185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= (RADEON_UCP_ENABLE_0<<p);
17195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonClipPlane( ctx, cap, NULL );
17205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else {
17225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~(RADEON_UCP_ENABLE_0<<p);
17235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_COLOR_MATERIAL:
17275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonColorMaterial( ctx, 0, 0 );
1728a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer      radeonUpdateMaterial( ctx );
17295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CULL_FACE:
17325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonCullFace( ctx, 0 );
17335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DEPTH_TEST:
17365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, ctx );
17375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
17385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_Z_ENABLE;
17395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
17405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_Z_ENABLE;
17415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DITHER:
17455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, ctx );
17465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
17475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_DITHER_ENABLE;
174899ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~rmesa->state.color.roundEnable;
17495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
17505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_DITHER_ENABLE;
175199ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  rmesa->state.color.roundEnable;
17525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG:
17565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, ctx );
17575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
17585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_FOG_ENABLE;
17595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonFogfv( ctx, GL_FOG_MODE, 0 );
17605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
17615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_FOG_ENABLE;
17625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE(rmesa, tcl);
17635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_TCL_FOG_MASK;
17645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateSpecular( ctx ); /* for PK_SPEC */
17665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (rmesa->TclFallback)
17675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonChooseVertexState( ctx );
17685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      _mesa_allow_light_in_model( ctx, !state );
17695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT0:
17725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT1:
17735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT2:
17745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT3:
17755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT4:
17765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT5:
17775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT6:
17785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT7:
17795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
17805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      p = cap - GL_LIGHT0;
17815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (p&1)
17825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 flag = (RADEON_LIGHT_1_ENABLE |
17835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 RADEON_LIGHT_1_ENABLE_AMBIENT |
17845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 RADEON_LIGHT_1_ENABLE_SPECULAR);
17855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
17865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 flag = (RADEON_LIGHT_0_ENABLE |
17875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 RADEON_LIGHT_0_ENABLE_AMBIENT |
17885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 RADEON_LIGHT_0_ENABLE_SPECULAR);
17895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state)
17915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] |= flag;
17925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
17935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] &= ~flag;
17945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /*
17965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
17975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      update_light_colors( ctx, p );
17985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHTING:
18015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
18025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateSpecular(ctx);
18035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      check_twoside_fallback( ctx );
18045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINE_SMOOTH:
18075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
18085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
18095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_ANTI_ALIAS_LINE;
18105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
18115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ANTI_ALIAS_LINE;
18125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
18135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINE_STIPPLE:
18165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
18175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
18185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_PATTERN_ENABLE;
18195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
18205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_PATTERN_ENABLE;
18215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
18225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_COLOR_LOGIC_OP:
18255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
182678bb0803cf722ad5273fc495791eb573bf8b4d21Michel Dänzer      if ( ctx->Color._LogicOpEnabled ) {
18275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_ROP_ENABLE;
18285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
18295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE;
18305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
18315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NORMALIZE:
18345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, tcl );
18355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
18365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |=  RADEON_NORMALIZE_NORMALS;
18375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
18385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_NORMALIZE_NORMALS;
18395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
18405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_OFFSET_POINT:
18435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (rmesa->dri.drmMinor == 1) {
18445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonChooseRenderState( ctx );
18455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
18465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else {
18475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, set );
18485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if ( state ) {
18495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_ZBIAS_ENABLE_POINT;
18505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 } else {
18515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_POINT;
18525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
18535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
18545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_OFFSET_LINE:
18575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (rmesa->dri.drmMinor == 1) {
18585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonChooseRenderState( ctx );
18595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
18605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else {
18615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, set );
18625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if ( state ) {
18635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_ZBIAS_ENABLE_LINE;
18645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 } else {
18655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_LINE;
18665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
18675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
18685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_OFFSET_FILL:
18715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (rmesa->dri.drmMinor == 1) {
18725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonChooseRenderState( ctx );
18735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
18745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else {
18755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, set );
18765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if ( state ) {
18775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_ZBIAS_ENABLE_TRI;
18785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 } else {
18795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_TRI;
18805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
18815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
18825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_SMOOTH:
18855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
18865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
18875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_ANTI_ALIAS_POLY;
18885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
18895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ANTI_ALIAS_POLY;
18905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
18915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_STIPPLE:
18945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, ctx );
18955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
18965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_STIPPLE_ENABLE;
18975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
18985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_STIPPLE_ENABLE;
18995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
19005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
19015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RESCALE_NORMAL_EXT: {
19035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLboolean tmp = ctx->_NeedEyeCoords ? state : !state;
19045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, tcl );
19055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( tmp ) {
19065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |=  RADEON_RESCALE_NORMALS;
19075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
19085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_RESCALE_NORMALS;
19095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
19105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
19115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
19125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SCISSOR_TEST:
19145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_FIREVERTICES( rmesa );
19155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.scissor.enabled = state;
19165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateScissor( ctx );
19175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
19185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_STENCIL_TEST:
19205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( rmesa->state.stencil.hwBuffer ) {
19215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, ctx );
19225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if ( state ) {
19235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_STENCIL_ENABLE;
19245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 } else {
19255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_STENCIL_ENABLE;
19265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
19275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
19285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 FALLBACK( rmesa, RADEON_FALLBACK_STENCIL, state );
19295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
19305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
19315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_GEN_Q:
19335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_GEN_R:
19345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_GEN_S:
19355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_GEN_T:
19365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Picked up in radeonUpdateTextureState.
19375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
19385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->recheck_texgen[ctx->Texture.CurrentUnit] = GL_TRUE;
19395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
19405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_COLOR_SUM_EXT:
19425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateSpecular ( ctx );
19435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
19445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
19465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
19475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
19485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
19495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLightingSpaceChange( GLcontext *ctx )
19525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
19535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
19545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean tmp;
19555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, tcl );
19565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_DEBUG & DEBUG_STATE)
19585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s %d BEFORE %x\n", __FUNCTION__, ctx->_NeedEyeCoords,
19595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]);
19605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->_NeedEyeCoords)
19625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tmp = ctx->Transform.RescaleNormals;
19635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else
19645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tmp = !ctx->Transform.RescaleNormals;
19655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( tmp ) {
19675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |=  RADEON_RESCALE_NORMALS;
19685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
19695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_RESCALE_NORMALS;
19705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
19715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_DEBUG & DEBUG_STATE)
19735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s %d AFTER %x\n", __FUNCTION__, ctx->_NeedEyeCoords,
19745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]);
19755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
19765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
19785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Deferred state management - matrices, textures, other?
19795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
19805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void upload_matrix( radeonContextPtr rmesa, GLfloat *src, int idx )
19855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
19865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   float *dest = ((float *)RADEON_DB_STATE( mat[idx] ))+MAT_ELT_0;
19875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i;
19885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for (i = 0 ; i < 4 ; i++) {
19915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      *dest++ = src[i];
19925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      *dest++ = src[i+4];
19935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      *dest++ = src[i+8];
19945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      *dest++ = src[i+12];
19955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
19965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );
19985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
19995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void upload_matrix_t( radeonContextPtr rmesa, GLfloat *src, int idx )
20015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
20025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   float *dest = ((float *)RADEON_DB_STATE( mat[idx] ))+MAT_ELT_0;
20035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   memcpy(dest, src, 16*sizeof(float));
20045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );
20055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
20065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_texturematrix( GLcontext *ctx )
20095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
20105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT( ctx );
20115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint tpc = rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL];
20125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint vs = rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL];
20135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int unit;
20145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->TexMatEnabled = 0;
20165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for (unit = 0 ; unit < 2; unit++) {
20185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (!ctx->Texture.Unit[unit]._ReallyEnabled) {
20195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
20205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else if (ctx->TextureMatrixStack[unit].Top->type != MATRIX_IDENTITY) {
20215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 GLuint inputshift = RADEON_TEXGEN_0_INPUT_SHIFT + unit*4;
20225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->TexMatEnabled |= (RADEON_TEXGEN_TEXMAT_0_ENABLE|
20245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				  RADEON_TEXMAT_0_ENABLE) << unit;
20255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (rmesa->TexGenEnabled & (RADEON_TEXMAT_0_ENABLE << unit)) {
20275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    /* Need to preconcatenate any active texgen
20285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	     * obj/eyeplane matrices:
20295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	     */
20305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    _math_matrix_mul_matrix( &rmesa->tmpmat,
20315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				     &rmesa->TexGenMatrix[unit],
20325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				     ctx->TextureMatrixStack[unit].Top );
20335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    upload_matrix( rmesa, rmesa->tmpmat.m, TEXMAT_0+unit );
20345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
20355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 else {
20365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->TexMatEnabled |=
20375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       (RADEON_TEXGEN_INPUT_TEXCOORD_0+unit) << inputshift;
20385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    upload_matrix( rmesa, ctx->TextureMatrixStack[unit].Top->m,
20395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			   TEXMAT_0+unit );
20405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
20415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
20425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else if (rmesa->TexGenEnabled & (RADEON_TEXMAT_0_ENABLE << unit)) {
20435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 upload_matrix( rmesa, rmesa->TexGenMatrix[unit].m,
20445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			TEXMAT_0+unit );
20455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
20465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
20475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tpc = (rmesa->TexMatEnabled | rmesa->TexGenEnabled);
20505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   vs &= ~((0xf << RADEON_TCL_TEX_0_OUTPUT_SHIFT) |
20525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	   (0xf << RADEON_TCL_TEX_1_OUTPUT_SHIFT));
20535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (tpc & RADEON_TEXGEN_TEXMAT_0_ENABLE)
20555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      vs |= RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_0_OUTPUT_SHIFT;
20565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else
20575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      vs |= RADEON_TCL_TEX_INPUT_TEX_0 << RADEON_TCL_TEX_0_OUTPUT_SHIFT;
20585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (tpc & RADEON_TEXGEN_TEXMAT_1_ENABLE)
20605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      vs |= RADEON_TCL_TEX_COMPUTED_TEX_1 << RADEON_TCL_TEX_1_OUTPUT_SHIFT;
20615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else
20625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      vs |= RADEON_TCL_TEX_INPUT_TEX_1 << RADEON_TCL_TEX_1_OUTPUT_SHIFT;
20635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (tpc != rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL] ||
20655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       vs != rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL]) {
20665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
20685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL] = tpc;
20695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] = vs;
20705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
20715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
20725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonValidateState( GLcontext *ctx )
20765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
20775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
20785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint new_state = rmesa->NewGLState;
20795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & _NEW_TEXTURE) {
20815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateTextureState( ctx );
20825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      new_state |= rmesa->NewGLState; /* may add TEXTURE_MATRIX */
20835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
20845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Need an event driven matrix update?
20865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
20875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & (_NEW_MODELVIEW|_NEW_PROJECTION))
20885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      upload_matrix( rmesa, ctx->_ModelProjectMatrix.m, MODEL_PROJ );
20895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Need these for lighting (shouldn't upload otherwise)
20915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
20925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & (_NEW_MODELVIEW)) {
20935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      upload_matrix( rmesa, ctx->ModelviewMatrixStack.Top->m, MODEL );
20945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      upload_matrix_t( rmesa, ctx->ModelviewMatrixStack.Top->inv, MODEL_IT );
20955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
20965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Does this need to be triggered on eg. modelview for
20985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * texgen-derived objplane/eyeplane matrices?
20995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
21005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & _NEW_TEXTURE_MATRIX) {
21015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      update_texturematrix( ctx );
21025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
21035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & (_NEW_LIGHT|_NEW_MODELVIEW|_MESA_NEW_NEED_EYE_COORDS)) {
21055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      update_light( ctx );
21065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
21075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* emit all active clip planes if projection matrix changes.
21095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
21105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & (_NEW_PROJECTION)) {
21115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Transform.ClipPlanesEnabled)
21125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonUpdateClipPlanes( ctx );
21135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
21145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->NewGLState = 0;
21175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
21185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonInvalidateState( GLcontext *ctx, GLuint new_state )
21215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
21225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _swrast_InvalidateState( ctx, new_state );
21235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _swsetup_InvalidateState( ctx, new_state );
21245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _ac_InvalidateState( ctx, new_state );
21255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _tnl_InvalidateState( ctx, new_state );
21265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _ae_invalidate_state( ctx, new_state );
21275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CONTEXT(ctx)->NewGLState |= new_state;
21285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonVtxfmtInvalidate( ctx );
21295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
21305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
213157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
213257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell/* A hack.  Need a faster way to find this out.
213357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell */
213457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwellstatic GLboolean check_material( GLcontext *ctx )
213557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell{
213657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   TNLcontext *tnl = TNL_CONTEXT(ctx);
213757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   GLint i;
213857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
213957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   for (i = _TNL_ATTRIB_MAT_FRONT_AMBIENT;
214057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	i < _TNL_ATTRIB_MAT_BACK_INDEXES;
214157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	i++)
214257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (tnl->vb.AttribPtr[i] &&
214357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	  tnl->vb.AttribPtr[i]->stride)
214457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 return GL_TRUE;
214557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
214657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   return GL_FALSE;
214757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell}
214857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
214957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
21505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonWrapRunPipeline( GLcontext *ctx )
21515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
21525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
215357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   GLboolean has_material;
21545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (0)
21565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s, newstate: %x\n", __FUNCTION__, rmesa->NewGLState);
21575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Validate state:
21595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
21605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (rmesa->NewGLState)
21615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonValidateState( ctx );
21625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
216357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   has_material = (ctx->Light.Enabled && check_material( ctx ));
216457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
216557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   if (has_material) {
21665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_MATERIAL, GL_TRUE );
21675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
21685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Run the pipeline.
21705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
21715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _tnl_run_pipeline( ctx );
21725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
217357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   if (has_material) {
21745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_MATERIAL, GL_FALSE );
21755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
21765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
21775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Initialize the driver's state functions.
21805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
21815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonInitStateFuncs( GLcontext *ctx )
21825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
21835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.UpdateState		= radeonInvalidateState;
21845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LightingSpaceChange      = radeonLightingSpaceChange;
21855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.DrawBuffer		= radeonDrawBuffer;
21875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ReadBuffer		= radeonReadBuffer;
21885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.AlphaFunc		= radeonAlphaFunc;
2190c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   ctx->Driver.BlendEquationSeparate	= radeonBlendEquationSeparate;
21915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.BlendFuncSeparate	= radeonBlendFuncSeparate;
21925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ClearColor		= radeonClearColor;
21935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ClearDepth		= radeonClearDepth;
21945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ClearIndex		= NULL;
21955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ClearStencil		= radeonClearStencil;
21965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ClipPlane		= radeonClipPlane;
21975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ColorMask		= radeonColorMask;
21985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.CullFace			= radeonCullFace;
21995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.DepthFunc		= radeonDepthFunc;
22005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.DepthMask		= radeonDepthMask;
22015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.DepthRange		= radeonDepthRange;
22025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Enable			= radeonEnable;
22035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Fogfv			= radeonFogfv;
22045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.FrontFace		= radeonFrontFace;
22055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Hint			= NULL;
22065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.IndexMask		= NULL;
22075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LightModelfv		= radeonLightModelfv;
22085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Lightfv			= radeonLightfv;
22095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LineStipple              = radeonLineStipple;
22105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LineWidth                = radeonLineWidth;
22115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LogicOpcode		= radeonLogicOpCode;
22125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.PolygonMode		= radeonPolygonMode;
22135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
22145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_CONTEXT(ctx)->dri.drmMinor > 1)
22155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      ctx->Driver.PolygonOffset		= radeonPolygonOffset;
22165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
22175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.PolygonStipple		= radeonPolygonStipple;
22185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.RenderMode		= radeonRenderMode;
22195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Scissor			= radeonScissor;
22205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ShadeModel		= radeonShadeModel;
22215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.StencilFunc		= radeonStencilFunc;
22225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.StencilMask		= radeonStencilMask;
22235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.StencilOp		= radeonStencilOp;
22245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Viewport			= radeonViewport;
22255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
22265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Pixel path fallbacks
22275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
22285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Accum                    = _swrast_Accum;
22295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Bitmap                   = _swrast_Bitmap;
22305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.CopyPixels               = _swrast_CopyPixels;
22315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.DrawPixels               = _swrast_DrawPixels;
22325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ReadPixels               = _swrast_ReadPixels;
22335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
22345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Swrast hooks for imaging extensions:
22355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
22365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.CopyColorTable		= _swrast_CopyColorTable;
22375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.CopyColorSubTable	= _swrast_CopyColorSubTable;
22385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.CopyConvolutionFilter1D	= _swrast_CopyConvolutionFilter1D;
22395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.CopyConvolutionFilter2D	= _swrast_CopyConvolutionFilter2D;
22405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
22415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange = radeonUpdateMaterial;
22425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNL_CONTEXT(ctx)->Driver.RunPipeline = radeonWrapRunPipeline;
22435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2244