radeon_state.c revision 30daa7529331057ecb470efb500152e9c4aa1ae5
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"
40e42a31350df04ae9d68b7ab4a14408f5d013b42fBrian Paul#include "light.h"
415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "state.h"
42cc5d04574406a86d9a4d7991370359dc3c94f9a7Felix Kuehling#include "context.h"
435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "array_cache/acache.h"
455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/tnl.h"
465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_pipeline.h"
475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "swrast_setup/swrast_setup.h"
485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_context.h"
505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_ioctl.h"
515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_state.h"
525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tcl.h"
535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tex.h"
545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_swtcl.h"
555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_vtxfmt.h"
56982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul#include "drirenderbuffer.h"
575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Alpha blending
605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonAlphaFunc( GLcontext *ctx, GLenum func, GLfloat ref )
635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int pp_misc = rmesa->hw.ctx.cmd[CTX_PP_MISC];
665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLubyte refByte;
675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   CLAMPED_FLOAT_TO_UBYTE(refByte, ref);
695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   pp_misc &= ~(RADEON_ALPHA_TEST_OP_MASK | RADEON_REF_ALPHA_MASK);
735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   pp_misc |= (refByte & RADEON_REF_ALPHA_MASK);
745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( func ) {
765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NEVER:
775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_FAIL;
785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LESS:
805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_LESS;
815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_EQUAL:
835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_EQUAL;
845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LEQUAL:
865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_LEQUAL;
875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GREATER:
895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_GREATER;
905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NOTEQUAL:
925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_NEQUAL;
935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GEQUAL:
955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_GEQUAL;
965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALWAYS:
985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_PASS;
995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ctx.cmd[CTX_PP_MISC] = pp_misc;
1035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
105c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanickstatic void radeonBlendEquationSeparate( GLcontext *ctx,
106c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick					 GLenum modeRGB, GLenum modeA )
1075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
1085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
1095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint b = rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] & ~RADEON_COMB_FCN_MASK;
1105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean fallback = GL_FALSE;
1115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
112c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   assert( modeRGB == modeA );
113c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick
114c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   switch ( modeRGB ) {
1155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FUNC_ADD:
1165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LOGIC_OP:
1175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_COMB_FCN_ADD_CLAMP;
1185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FUNC_SUBTRACT:
1215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_COMB_FCN_SUB_CLAMP;
1225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
1255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Color.BlendEnabled)
1265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fallback = GL_TRUE;
1275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
1285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b |= RADEON_COMB_FCN_ADD_CLAMP;
1295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   FALLBACK( rmesa, RADEON_FALLBACK_BLEND_EQ, fallback );
1335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( !fallback ) {
1345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
1355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = b;
13678bb0803cf722ad5273fc495791eb573bf8b4d21Michel Dänzer      if ( ctx->Color._LogicOpEnabled ) {
1375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_ROP_ENABLE;
1385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
1395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE;
1405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14420a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanickstatic void radeonBlendFuncSeparate( GLcontext *ctx,
14520a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick				     GLenum sfactorRGB, GLenum dfactorRGB,
14620a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick				     GLenum sfactorA, GLenum dfactorA )
1475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
1485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
1495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint b = rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] &
1505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      ~(RADEON_SRC_BLEND_MASK | RADEON_DST_BLEND_MASK);
1515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean fallback = GL_FALSE;
1525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Color.BlendSrcRGB ) {
1545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
1555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ZERO;
1565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE:
1585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE;
1595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DST_COLOR:
1615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_DST_COLOR;
1625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_DST_COLOR:
1645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE_MINUS_DST_COLOR;
1655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_COLOR:
1675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_SRC_COLOR;
1685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_SRC_COLOR:
1705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE_MINUS_SRC_COLOR;
1715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_ALPHA:
1735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_SRC_ALPHA;
1745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_SRC_ALPHA:
1765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE_MINUS_SRC_ALPHA;
1775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DST_ALPHA:
1795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_DST_ALPHA;
1805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_DST_ALPHA:
1825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE_MINUS_DST_ALPHA;
1835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_ALPHA_SATURATE:
1855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_SRC_ALPHA_SATURATE;
1865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_COLOR:
1885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_CONSTANT_COLOR:
1895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_ALPHA:
1905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_CONSTANT_ALPHA:
1915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Color.BlendEnabled)
1925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fallback = GL_TRUE;
1935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
1945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b |= RADEON_SRC_BLEND_GL_ONE;
1955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
1975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Color.BlendDstRGB ) {
2015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
2025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ZERO;
2035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE:
2055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE;
2065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_COLOR:
2085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_SRC_COLOR;
2095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_SRC_COLOR:
2115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE_MINUS_SRC_COLOR;
2125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_ALPHA:
2145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_SRC_ALPHA;
2155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_SRC_ALPHA:
2175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE_MINUS_SRC_ALPHA;
2185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DST_COLOR:
2205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_DST_COLOR;
2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_DST_COLOR:
2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE_MINUS_DST_COLOR;
2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DST_ALPHA:
2265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_DST_ALPHA;
2275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_DST_ALPHA:
2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE_MINUS_DST_ALPHA;
2305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_COLOR:
2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_CONSTANT_COLOR:
2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_ALPHA:
2345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_CONSTANT_ALPHA:
2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Color.BlendEnabled)
2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fallback = GL_TRUE;
2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
2385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b |= RADEON_DST_BLEND_GL_ZERO;
2395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
2415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   FALLBACK( rmesa, RADEON_FALLBACK_BLEND_FUNC, fallback );
2455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( !fallback ) {
2465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
2475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = b;
2485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Depth testing
2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDepthFunc( GLcontext *ctx, GLenum func )
2575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
2595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
2615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_Z_TEST_MASK;
2625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Depth.Func ) {
2645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NEVER:
2655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_NEVER;
2665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LESS:
2685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_LESS;
2695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_EQUAL:
2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_EQUAL;
2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LEQUAL:
2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_LEQUAL;
2755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GREATER:
2775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_GREATER;
2785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NOTEQUAL:
2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_NEQUAL;
2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GEQUAL:
2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_GEQUAL;
2845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALWAYS:
2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_ALWAYS;
2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDepthMask( GLcontext *ctx, GLboolean flag )
2935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( ctx->Depth.Mask ) {
2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |=  RADEON_Z_WRITE_ENABLE;
2995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
3005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_Z_WRITE_ENABLE;
3015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClearDepth( GLcontext *ctx, GLclampd d )
3055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint format = (rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &
3085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		    RADEON_DEPTH_FORMAT_MASK);
3095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( format ) {
3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_DEPTH_FORMAT_16BIT_INT_Z:
3125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.depth.clear = d * 0x0000ffff;
3135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_DEPTH_FORMAT_24BIT_INT_Z:
3155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.depth.clear = d * 0x00ffffff;
3165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
3225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Fog
3235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
3245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonFogfv( GLcontext *ctx, GLenum pname, const GLfloat *param )
3275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
3295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   union { int i; float f; } c, d;
3305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLchan col[4];
3315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   c.i = rmesa->hw.fog.cmd[FOG_C];
3335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   d.i = rmesa->hw.fog.cmd[FOG_D];
3345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (pname) {
3365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG_MODE:
3375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (!ctx->Fog.Enabled)
3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return;
3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_TCL_FOG_MASK;
3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch (ctx->Fog.Mode) {
3425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR:
3435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_LINEAR;
3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (ctx->Fog.Start == ctx->Fog.End) {
3455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    c.f = 1.0F;
3465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    d.f = 1.0F;
3475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
3485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 else {
3495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start);
3505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    d.f = 1.0/(ctx->Fog.End-ctx->Fog.Start);
3515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
3525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_EXP:
3545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_EXP;
3555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 c.f = 0.0;
3565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 d.f = ctx->Fog.Density;
3575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_EXP2:
3595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_EXP2;
3605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 c.f = 0.0;
3615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 d.f = -(ctx->Fog.Density * ctx->Fog.Density);
3625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      default:
3645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return;
3655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG_DENSITY:
3685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch (ctx->Fog.Mode) {
3695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_EXP:
3705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 c.f = 0.0;
3715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 d.f = ctx->Fog.Density;
3725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_EXP2:
3745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 c.f = 0.0;
3755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 d.f = -(ctx->Fog.Density * ctx->Fog.Density);
3765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      default:
3785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG_START:
3825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG_END:
3835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Fog.Mode == GL_LINEAR) {
3845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (ctx->Fog.Start == ctx->Fog.End) {
3855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    c.f = 1.0F;
3865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    d.f = 1.0F;
3875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 } else {
3885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start);
3895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    d.f = 1.0/(ctx->Fog.End-ctx->Fog.Start);
3905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
3915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG_COLOR:
3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      UNCLAMPED_FLOAT_TO_RGB_CHAN( col, ctx->Fog.Color );
3965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] =
3975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonPackColor( 4, col[0], col[1], col[2], 0 );
3985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG_COORDINATE_SOURCE_EXT:
4005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* What to do?
4015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
4025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
4035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
4045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
4055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (c.i != rmesa->hw.fog.cmd[FOG_C] || d.i != rmesa->hw.fog.cmd[FOG_D]) {
4085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, fog );
4095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.fog.cmd[FOG_C] = c.i;
4105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.fog.cmd[FOG_D] = d.i;
4115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
4165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Scissoring
4175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
4185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
420ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirlstatic GLboolean intersect_rect( drm_clip_rect_t *out,
421ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl				 drm_clip_rect_t *a,
422ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl				 drm_clip_rect_t *b )
4235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   *out = *a;
4255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( b->x1 > out->x1 ) out->x1 = b->x1;
4265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( b->y1 > out->y1 ) out->y1 = b->y1;
4275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( b->x2 < out->x2 ) out->x2 = b->x2;
4285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( b->y2 < out->y2 ) out->y2 = b->y2;
4295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( out->x1 >= out->x2 ) return GL_FALSE;
4305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( out->y1 >= out->y2 ) return GL_FALSE;
4315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return GL_TRUE;
4325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonRecalcScissorRects( radeonContextPtr rmesa )
4365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
437ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl   drm_clip_rect_t *out;
4385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i;
4395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Grow cliprect store?
4415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
4425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (rmesa->state.scissor.numAllocedClipRects < rmesa->numClipRects) {
4435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      while (rmesa->state.scissor.numAllocedClipRects < rmesa->numClipRects) {
4445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->state.scissor.numAllocedClipRects += 1;	/* zero case */
4455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->state.scissor.numAllocedClipRects *= 2;
4465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
4475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (rmesa->state.scissor.pClipRects)
4495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 FREE(rmesa->state.scissor.pClipRects);
4505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.scissor.pClipRects =
4525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 MALLOC( rmesa->state.scissor.numAllocedClipRects *
453ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl		 sizeof(drm_clip_rect_t) );
4545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( rmesa->state.scissor.pClipRects == NULL ) {
4565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->state.scissor.numAllocedClipRects = 0;
4575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return;
4585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
4595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   out = rmesa->state.scissor.pClipRects;
4625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->state.scissor.numClipRects = 0;
4635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for ( i = 0 ; i < rmesa->numClipRects ;  i++ ) {
4655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( intersect_rect( out,
4665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			   &rmesa->pClipRects[i],
4675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			   &rmesa->state.scissor.rect ) ) {
4685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->state.scissor.numClipRects++;
4695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 out++;
4705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
4715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonUpdateScissor( GLcontext *ctx )
4765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
4785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->dri.drawable ) {
4805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;
4815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      int x = ctx->Scissor.X;
4835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      int y = dPriv->h - ctx->Scissor.Y - ctx->Scissor.Height;
4845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      int w = ctx->Scissor.X + ctx->Scissor.Width - 1;
4855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      int h = dPriv->h - ctx->Scissor.Y - 1;
4865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.scissor.rect.x1 = x + dPriv->x;
4885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.scissor.rect.y1 = y + dPriv->y;
4895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.scissor.rect.x2 = w + dPriv->x + 1;
4905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.scissor.rect.y2 = h + dPriv->y + 1;
4915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonRecalcScissorRects( rmesa );
4935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonScissor( GLcontext *ctx,
4985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			   GLint x, GLint y, GLsizei w, GLsizei h )
4995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
5015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( ctx->Scissor.Enabled ) {
5035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_FIREVERTICES( rmesa );	/* don't pipeline cliprect changes */
5045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateScissor( ctx );
5055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
5115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Culling
5125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
5135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonCullFace( GLcontext *ctx, GLenum unused )
5155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
5175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL];
5185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint t = rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL];
5195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   s |= RADEON_FFACE_SOLID | RADEON_BFACE_SOLID;
5215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t &= ~(RADEON_CULL_FRONT | RADEON_CULL_BACK);
5225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( ctx->Polygon.CullFlag ) {
5245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch ( ctx->Polygon.CullFaceMode ) {
5255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_FRONT:
5265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 s &= ~RADEON_FFACE_SOLID;
5275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t |= RADEON_CULL_FRONT;
5285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
5295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_BACK:
5305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 s &= ~RADEON_BFACE_SOLID;
5315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t |= RADEON_CULL_BACK;
5325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
5335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_FRONT_AND_BACK:
5345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 s &= ~(RADEON_FFACE_SOLID | RADEON_BFACE_SOLID);
5355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t |= (RADEON_CULL_FRONT | RADEON_CULL_BACK);
5365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
5375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
5385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) {
5415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, set );
5425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] = s;
5435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] != t ) {
5465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl );
5475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] = t;
5485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonFrontFace( GLcontext *ctx, GLenum mode )
5525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
5545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, set );
5565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_FFACE_CULL_DIR_MASK;
5575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, tcl );
5595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_CULL_FRONT_IS_CCW;
5605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( mode ) {
5625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CW:
5635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_FFACE_CULL_CW;
5645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
5655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CCW:
5665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_FFACE_CULL_CCW;
5675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_CULL_FRONT_IS_CCW;
5685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
5695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
5745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Line state
5755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
5765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLineWidth( GLcontext *ctx, GLfloat widthf )
5775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
5795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, lin );
5815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, set );
5825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Line width is stored in U6.4 format.
5845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
5855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] = (GLuint)(widthf * 16.0);
5865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( widthf > 1.0 ) {
5875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_WIDELINE_ENABLE;
5885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
5895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_WIDELINE_ENABLE;
5905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLineStipple( GLcontext *ctx, GLint factor, GLushort pattern )
5945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
5965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, lin );
5985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.lin.cmd[LIN_RE_LINE_PATTERN] =
5995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      ((((GLuint)factor & 0xff) << 16) | ((GLuint)pattern));
6005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
6045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Masks
6055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
6065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonColorMask( GLcontext *ctx,
6075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     GLboolean r, GLboolean g,
6085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     GLboolean b, GLboolean a )
6095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
6115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint mask = radeonPackColor( rmesa->radeonScreen->cpp,
6125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				  ctx->Color.ColorMask[RCOMP],
6135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				  ctx->Color.ColorMask[GCOMP],
6145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				  ctx->Color.ColorMask[BCOMP],
6155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				  ctx->Color.ColorMask[ACOMP] );
6165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] != mask ) {
6185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, msk );
6195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] = mask;
6205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
6255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Polygon state
6265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
6275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonPolygonOffset( GLcontext *ctx,
6295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				 GLfloat factor, GLfloat units )
6305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
6325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat constant = units * rmesa->state.depth.scale;
6335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, zbs );
6355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_FACTOR]   = *(GLuint *)&factor;
6365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_CONSTANT] = *(GLuint *)&constant;
6375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonPolygonStipple( GLcontext *ctx, const GLubyte *mask )
6405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
6425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint i;
643ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl   drm_radeon_stipple_t stipple;
6445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Must flip pattern upside down.
6465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
6475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for ( i = 0 ; i < 32 ; i++ ) {
6485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.stipple.mask[31 - i] = ((GLuint *) mask)[i];
6495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* TODO: push this into cmd mechanism
6525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
6535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_FIREVERTICES( rmesa );
6545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   LOCK_HARDWARE( rmesa );
6555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* FIXME: Use window x,y offsets into stipple RAM.
6575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
6585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   stipple.mask = rmesa->state.stipple.mask;
6595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   drmCommandWrite( rmesa->dri.fd, DRM_RADEON_STIPPLE,
660ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl                    &stipple, sizeof(drm_radeon_stipple_t) );
6615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   UNLOCK_HARDWARE( rmesa );
6625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonPolygonMode( GLcontext *ctx, GLenum face, GLenum mode )
6655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
6675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean flag = (ctx->_TriangleCaps & DD_TRI_UNFILLED) != 0;
6685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Can't generally do unfilled via tcl, but some good special
6705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * cases work.
6715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_UNFILLED, flag);
6735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (rmesa->TclFallback) {
6745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonChooseRenderState( ctx );
6755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonChooseVertexState( ctx );
6765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
6815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Rendering attributes
6825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
6835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * We really don't want to recalculate all this every time we bind a
6845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * texture.  These things shouldn't change all that often, so it makes
6855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * sense to break them out of the core texture state update routines.
6865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
6875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Examine lighting and texture state to determine if separate specular
6895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * should be enabled.
6905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
6915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonUpdateSpecular( GLcontext *ctx )
6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
69438b317d508a2a3a4cc6d700ebca80c3b06c913e2Alan Hourihane   u_int32_t p = rmesa->hw.ctx.cmd[CTX_PP_CNTL];
6955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, tcl );
6975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_SPECULAR;
6995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_DIFFUSE;
7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] &= ~RADEON_TCL_VTX_PK_SPEC;
7015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] &= ~RADEON_TCL_VTX_PK_DIFFUSE;
7025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_LIGHTING_ENABLE;
7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   p &= ~RADEON_SPECULAR_ENABLE;
7055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_DIFFUSE_SPECULAR_COMBINE;
7075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Light.Enabled &&
7105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) {
7115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_SPECULAR;
7125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_DIFFUSE;
7135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC;
7145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;
7155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE;
7165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      p |=  RADEON_SPECULAR_ENABLE;
7175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &=
7185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 ~RADEON_DIFFUSE_SPECULAR_COMBINE;
7195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else if (ctx->Light.Enabled) {
7215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_DIFFUSE;
7225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;
7235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE;
7245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else if (ctx->Fog.ColorSumEnabled ) {
7255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC;
7265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;
7275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      p |= RADEON_SPECULAR_ENABLE;
7285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
7295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;
7305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Fog.Enabled) {
7335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_SPECULAR;
7345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC;
7355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Bizzare: have to leave lighting enabled to get fog.
7375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
7385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE;
7395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
74143b57728340e70827a114c384192ed319abdb5c6Keith Whitwell   if (NEED_SECONDARY_COLOR(ctx)) {
7425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      assert( (p & RADEON_SPECULAR_ENABLE) != 0 );
7435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
7445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      assert( (p & RADEON_SPECULAR_ENABLE) == 0 );
7455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.ctx.cmd[CTX_PP_CNTL] != p ) {
7485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
7495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_PP_CNTL] = p;
7505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Update vertex/render formats
7535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
7545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (rmesa->TclFallback) {
7555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonChooseRenderState( ctx );
7565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonChooseVertexState( ctx );
7575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
7625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Materials
7635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
7645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Update on colormaterial, material emmissive/ambient,
7675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * lightmodel.globalambient
7685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
7695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_global_ambient( GLcontext *ctx )
7705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
7725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   float *fcmd = (float *)RADEON_DB_STATE( glt );
7735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Need to do more if both emmissive & ambient are PREMULT:
775f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger    * Hope this is not needed for MULT
7765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
7775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ((rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &
7785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       ((3 << RADEON_EMISSIVE_SOURCE_SHIFT) |
7795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	(3 << RADEON_AMBIENT_SOURCE_SHIFT))) == 0)
7805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
7815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      COPY_3V( &fcmd[GLT_RED],
7825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_EMISSION]);
7835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      ACC_SCALE_3V( &fcmd[GLT_RED],
7845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		   ctx->Light.Model.Ambient,
7855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		   ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT]);
7865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else
7885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
7895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      COPY_3V( &fcmd[GLT_RED], ctx->Light.Model.Ambient );
7905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_DB_STATECHANGE(rmesa, &rmesa->hw.glt);
7935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Update on change to
7965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *    - light[p].colors
7975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *    - light[p].enabled
7985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
7995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_light_colors( GLcontext *ctx, GLuint p )
8005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct gl_light *l = &ctx->Light.Light[p];
8025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*     fprintf(stderr, "%s\n", __FUNCTION__); */
8045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (l->Enabled) {
8065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
8075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      float *fcmd = (float *)RADEON_DB_STATE( lit[p] );
8085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      COPY_4V( &fcmd[LIT_AMBIENT_RED], l->Ambient );
8105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      COPY_4V( &fcmd[LIT_DIFFUSE_RED], l->Diffuse );
8115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      COPY_4V( &fcmd[LIT_SPECULAR_RED], l->Specular );
8125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] );
8145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Also fallback for asym colormaterial mode in twoside lighting...
8185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
8195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void check_twoside_fallback( GLcontext *ctx )
8205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean fallback = GL_FALSE;
8225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLint i;
8235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Light.Enabled && ctx->Light.Model.TwoSide) {
8255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Light.ColorMaterialEnabled &&
8265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  (ctx->Light.ColorMaterialBitmask & BACK_MATERIAL_BITS) !=
8275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  ((ctx->Light.ColorMaterialBitmask & FRONT_MATERIAL_BITS)<<1))
8285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fallback = GL_TRUE;
8295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else {
8305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 for (i = MAT_ATTRIB_FRONT_AMBIENT; i < MAT_ATTRIB_FRONT_INDEXES; i+=2)
8315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (memcmp( ctx->Light.Material.Attrib[i],
8325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			ctx->Light.Material.Attrib[i+1],
8335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			sizeof(GLfloat)*4) != 0) {
8345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fallback = GL_TRUE;
8355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       break;
8365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
8375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
8385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_LIGHT_TWOSIDE, fallback );
8415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonColorMaterial( GLcontext *ctx, GLenum face, GLenum mode )
8455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
8475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint light_model_ctl1 = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL];
8485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
84927889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling      light_model_ctl1 &= ~((3 << RADEON_EMISSIVE_SOURCE_SHIFT) |
85027889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling			   (3 << RADEON_AMBIENT_SOURCE_SHIFT) |
85127889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling			   (3 << RADEON_DIFFUSE_SOURCE_SHIFT) |
85227889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling			   (3 << RADEON_SPECULAR_SOURCE_SHIFT));
8535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
854f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   if (ctx->Light.ColorMaterialEnabled) {
855f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      GLuint mask = ctx->Light.ColorMaterialBitmask;
856f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger
8575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (mask & MAT_BIT_FRONT_EMISSION) {
85827889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling	 light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE <<
8595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     RADEON_EMISSIVE_SOURCE_SHIFT);
8605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
861f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      else {
862f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger	 light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT <<
863f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger			     RADEON_EMISSIVE_SOURCE_SHIFT);
864f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      }
8655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (mask & MAT_BIT_FRONT_AMBIENT) {
86727889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling	 light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE <<
8685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     RADEON_AMBIENT_SOURCE_SHIFT);
8695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
870f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      else {
871f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger	 light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT <<
872f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger			     RADEON_AMBIENT_SOURCE_SHIFT);
873f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      }
8745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (mask & MAT_BIT_FRONT_DIFFUSE) {
87627889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling	 light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE <<
8775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     RADEON_DIFFUSE_SOURCE_SHIFT);
8785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
879f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      else {
880f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger	 light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT <<
881f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger			     RADEON_DIFFUSE_SOURCE_SHIFT);
882f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      }
8835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (mask & MAT_BIT_FRONT_SPECULAR) {
88527889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling	 light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE <<
8865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     RADEON_SPECULAR_SOURCE_SHIFT);
8875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
888f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      else {
889f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger	 light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT <<
890f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger			     RADEON_SPECULAR_SOURCE_SHIFT);
891f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      }
892f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   }
893f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   else {
894f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   /* Default to MULT:
895f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger    */
896f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << RADEON_EMISSIVE_SOURCE_SHIFT) |
897f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger		   (RADEON_LM_SOURCE_STATE_MULT << RADEON_AMBIENT_SOURCE_SHIFT) |
898f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger		   (RADEON_LM_SOURCE_STATE_MULT << RADEON_DIFFUSE_SOURCE_SHIFT) |
899f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger		   (RADEON_LM_SOURCE_STATE_MULT << RADEON_SPECULAR_SOURCE_SHIFT);
900f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   }
9015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (light_model_ctl1 != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]) {
9035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tcl );
9045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] = light_model_ctl1;
9055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
9075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonUpdateMaterial( GLcontext *ctx )
9095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
9105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
9115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat (*mat)[4] = ctx->Light.Material.Attrib;
9125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( mtl );
9135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint mask = ~0;
9145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Light.ColorMaterialEnabled)
9165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      mask &= ~ctx->Light.ColorMaterialBitmask;
9175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_DEBUG & DEBUG_STATE)
9195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s\n", __FUNCTION__);
9205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_EMISSION) {
9235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_EMMISSIVE_RED]   = mat[MAT_ATTRIB_FRONT_EMISSION][0];
9245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_EMMISSIVE_GREEN] = mat[MAT_ATTRIB_FRONT_EMISSION][1];
9255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_EMMISSIVE_BLUE]  = mat[MAT_ATTRIB_FRONT_EMISSION][2];
9265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_EMMISSIVE_ALPHA] = mat[MAT_ATTRIB_FRONT_EMISSION][3];
9275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_AMBIENT) {
9295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_AMBIENT_RED]     = mat[MAT_ATTRIB_FRONT_AMBIENT][0];
9305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_AMBIENT_GREEN]   = mat[MAT_ATTRIB_FRONT_AMBIENT][1];
9315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_AMBIENT_BLUE]    = mat[MAT_ATTRIB_FRONT_AMBIENT][2];
9325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_AMBIENT_ALPHA]   = mat[MAT_ATTRIB_FRONT_AMBIENT][3];
9335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_DIFFUSE) {
9355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_DIFFUSE_RED]     = mat[MAT_ATTRIB_FRONT_DIFFUSE][0];
9365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_DIFFUSE_GREEN]   = mat[MAT_ATTRIB_FRONT_DIFFUSE][1];
9375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_DIFFUSE_BLUE]    = mat[MAT_ATTRIB_FRONT_DIFFUSE][2];
9385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_DIFFUSE_ALPHA]   = mat[MAT_ATTRIB_FRONT_DIFFUSE][3];
9395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_SPECULAR) {
9415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SPECULAR_RED]    = mat[MAT_ATTRIB_FRONT_SPECULAR][0];
9425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SPECULAR_GREEN]  = mat[MAT_ATTRIB_FRONT_SPECULAR][1];
9435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SPECULAR_BLUE]   = mat[MAT_ATTRIB_FRONT_SPECULAR][2];
9445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SPECULAR_ALPHA]  = mat[MAT_ATTRIB_FRONT_SPECULAR][3];
9455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_SHININESS) {
9475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SHININESS]       = mat[MAT_ATTRIB_FRONT_SHININESS][0];
9485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
950a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer   RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mtl );
9515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
952a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer   check_twoside_fallback( ctx );
953f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger/*   update_global_ambient( ctx );*/
9545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
9555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* _NEW_LIGHT
9575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _NEW_MODELVIEW
9585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _MESA_NEW_NEED_EYE_COORDS
9595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
9605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Uses derived state from mesa:
9615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _VP_inf_norm
9625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _h_inf_norm
9635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _Position
9645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _NormDirection
9655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _ModelViewInvScale
9665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _NeedEyeCoords
9675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _EyeZDir
9685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
9695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * which are calculated in light.c and are correct for the current
9705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * lighting space (model or eye), hence dependencies on _NEW_MODELVIEW
9715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * and _MESA_NEW_NEED_EYE_COORDS.
9725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
9735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_light( GLcontext *ctx )
9745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
9755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
9765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Have to check these, or have an automatic shortcircuit mechanism
9785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * to remove noop statechanges. (Or just do a better job on the
9795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * front end).
9805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
9815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
9825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint tmp = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL];
9835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->_NeedEyeCoords)
9855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tmp &= ~RADEON_LIGHT_IN_MODELSPACE;
9865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
9875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tmp |= RADEON_LIGHT_IN_MODELSPACE;
9885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Leave this test disabled: (unexplained q3 lockup) (even with
9915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         new packets)
9925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      */
9935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (tmp != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL])
9945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      {
9955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tcl );
9965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] = tmp;
9975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
9985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
10015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( eye );
10025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[EYE_X] = ctx->_EyeZDir[0];
10035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[EYE_Y] = ctx->_EyeZDir[1];
10045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[EYE_Z] = - ctx->_EyeZDir[2];
10055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[EYE_RESCALE_FACTOR] = ctx->_ModelViewInvScale;
10065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.eye );
10075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Light.Enabled) {
10125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLint p;
10135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      for (p = 0 ; p < MAX_LIGHTS; p++) {
10145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (ctx->Light.Light[p].Enabled) {
10155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    struct gl_light *l = &ctx->Light.Light[p];
10165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( lit[p] );
10175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (l->EyePosition[3] == 0.0) {
10195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       COPY_3FV( &fcmd[LIT_POSITION_X], l->_VP_inf_norm );
10205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       COPY_3FV( &fcmd[LIT_DIRECTION_X], l->_h_inf_norm );
10215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_POSITION_W] = 0;
10225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_DIRECTION_W] = 0;
10235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    } else {
10245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       COPY_4V( &fcmd[LIT_POSITION_X], l->_Position );
10255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_DIRECTION_X] = -l->_NormDirection[0];
10265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_DIRECTION_Y] = -l->_NormDirection[1];
10275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_DIRECTION_Z] = -l->_NormDirection[2];
10285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_DIRECTION_W] = 0;
10295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
10305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] );
10325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
10335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
10345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
10365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLightfv( GLcontext *ctx, GLenum light,
10385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			   GLenum pname, const GLfloat *params )
10395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
10405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
10415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLint p = light - GL_LIGHT0;
10425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct gl_light *l = &ctx->Light.Light[p];
10435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat *fcmd = (GLfloat *)rmesa->hw.lit[p].cmd;
10445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (pname) {
10475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_AMBIENT:
10485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DIFFUSE:
10495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SPECULAR:
10505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      update_light_colors( ctx, p );
10515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SPOT_DIRECTION:
10545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* picked up in update_light */
10555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POSITION: {
10585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* positions picked up in update_light, but can do flag here */
10595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint flag;
10605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;
10615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* FIXME: Set RANGE_ATTEN only when needed */
10635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (p&1)
10645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 flag = RADEON_LIGHT_1_IS_LOCAL;
10655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
10665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 flag = RADEON_LIGHT_0_IS_LOCAL;
10675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
10695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (l->EyePosition[3] != 0.0F)
10705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[idx] |= flag;
10715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
10725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[idx] &= ~flag;
10735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SPOT_EXPONENT:
10775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
10785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_SPOT_EXPONENT] = params[0];
10795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SPOT_CUTOFF: {
10825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint flag = (p&1) ? RADEON_LIGHT_1_IS_SPOT : RADEON_LIGHT_0_IS_SPOT;
10835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;
10845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
10865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_SPOT_CUTOFF] = l->_CosCutoff;
10875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
10895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (l->SpotCutoff != 180.0F)
10905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[idx] |= flag;
10915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
10925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[idx] &= ~flag;
10935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_ATTENUATION:
10985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
10995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_ATTEN_CONST] = params[0];
11005d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      if ( params[0] == 0.0 )
11015d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 fcmd[LIT_ATTEN_CONST_INV] = FLT_MAX;
11025d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      else
11035d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 fcmd[LIT_ATTEN_CONST_INV] = 1.0 / params[0];
11045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINEAR_ATTENUATION:
11065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
11075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_ATTEN_LINEAR] = params[0];
11085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_QUADRATIC_ATTENUATION:
11105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
11115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_ATTEN_QUADRATIC] = params[0];
11125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
11145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
11155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
11165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Set RANGE_ATTEN only when needed */
11185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (pname) {
11195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POSITION:
11205d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer   case GL_CONSTANT_ATTENUATION:
11215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINEAR_ATTENUATION:
11225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_QUADRATIC_ATTENUATION:
11235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
11245d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      GLuint *icmd = (GLuint *)RADEON_DB_STATE( tcl );
11255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;
11265d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      GLuint atten_flag = ( p&1 ) ? RADEON_LIGHT_1_ENABLE_RANGE_ATTEN
11275d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer				  : RADEON_LIGHT_0_ENABLE_RANGE_ATTEN;
11285d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      GLuint atten_const_flag = ( p&1 ) ? RADEON_LIGHT_1_CONSTANT_RANGE_ATTEN
11295d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer				  : RADEON_LIGHT_0_CONSTANT_RANGE_ATTEN;
11305d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer
11315d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      if ( l->EyePosition[3] == 0.0F ||
11325d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	   ( ( fcmd[LIT_ATTEN_CONST] == 0.0 || fcmd[LIT_ATTEN_CONST] == 1.0 ) &&
11335d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	     fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) ) {
11345d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 /* Disable attenuation */
11355d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 icmd[idx] &= ~atten_flag;
11365d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      } else {
11375d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 if ( fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) {
11385d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    /* Enable only constant portion of attenuation calculation */
11395d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    icmd[idx] |= ( atten_flag | atten_const_flag );
11405d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 } else {
11415d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    /* Enable full attenuation calculation */
11425d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    icmd[idx] &= ~atten_const_flag;
11435d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    icmd[idx] |= atten_flag;
11445d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 }
11455d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      }
11465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11475d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.tcl );
11485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
11505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
11515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
11535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
11545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLightModelfv( GLcontext *ctx, GLenum pname,
11595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				const GLfloat *param )
11605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
11615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
11625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (pname) {
11645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LIGHT_MODEL_AMBIENT:
11655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 update_global_ambient( ctx );
11665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
11675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LIGHT_MODEL_LOCAL_VIEWER:
11695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tcl );
11705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (ctx->Light.Model.LocalViewer)
11715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LOCAL_VIEWER;
11725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 else
11735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_LOCAL_VIEWER;
11745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         break;
11755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LIGHT_MODEL_TWO_SIDE:
11775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tcl );
11785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (ctx->Light.Model.TwoSide)
11795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_LIGHT_TWOSIDE;
11805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 else
11815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_LIGHT_TWOSIDE;
11825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 check_twoside_fallback( ctx );
11845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (rmesa->TclFallback) {
11865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    radeonChooseRenderState( ctx );
11875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    radeonChooseVertexState( ctx );
11885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
11895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         break;
11905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LIGHT_MODEL_COLOR_CONTROL:
11925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonUpdateSpecular(ctx);
11935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         break;
11945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      default:
11965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         break;
11975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
11985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
11995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonShadeModel( GLcontext *ctx, GLenum mode )
12015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
12025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
12035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL];
12045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   s &= ~(RADEON_DIFFUSE_SHADE_MASK |
12065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  RADEON_ALPHA_SHADE_MASK |
12075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  RADEON_SPECULAR_SHADE_MASK |
12085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  RADEON_FOG_SHADE_MASK);
12095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( mode ) {
12115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FLAT:
12125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      s |= (RADEON_DIFFUSE_SHADE_FLAT |
12135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_ALPHA_SHADE_FLAT |
12145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_SPECULAR_SHADE_FLAT |
12155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_FOG_SHADE_FLAT);
12165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SMOOTH:
12185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      s |= (RADEON_DIFFUSE_SHADE_GOURAUD |
12195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_ALPHA_SHADE_GOURAUD |
12205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_SPECULAR_SHADE_GOURAUD |
12215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_FOG_SHADE_GOURAUD);
12225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
12245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
12255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
12265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) {
12285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, set );
12295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] = s;
12305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
12315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
12325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
12355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * User clip planes
12365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
12375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClipPlane( GLcontext *ctx, GLenum plane, const GLfloat *eq )
12395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
12405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLint p = (GLint) plane - (GLint) GL_CLIP_PLANE0;
12415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
12425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p];
12435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ucp[p] );
12455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ucp[p].cmd[UCP_X] = ip[0];
12465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1];
12475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2];
12485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ucp[p].cmd[UCP_W] = ip[3];
12495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
12505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonUpdateClipPlanes( GLcontext *ctx )
12525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
12535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
12545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint p;
12555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for (p = 0; p < ctx->Const.MaxClipPlanes; p++) {
12575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Transform.ClipPlanesEnabled & (1 << p)) {
12585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p];
12595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, ucp[p] );
12615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ucp[p].cmd[UCP_X] = ip[0];
12625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1];
12635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2];
12645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ucp[p].cmd[UCP_W] = ip[3];
12655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
12665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
12675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
12685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
12715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Stencil
12725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
12735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1274878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void
1275878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian PaulradeonStencilFuncSeparate( GLcontext *ctx, GLenum face, GLenum func,
1276878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian 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
1319878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void
1320878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian PaulradeonStencilMaskSeparate( GLcontext *ctx, GLenum face, GLuint mask )
13215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
13225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
13235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, msk );
13255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~RADEON_STENCIL_WRITE_MASK;
13265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |=
13275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      (ctx->Stencil.WriteMask[0] << RADEON_STENCIL_WRITEMASK_SHIFT);
13285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
13295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1330878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void radeonStencilOpSeparate( GLcontext *ctx, GLenum face, GLenum fail,
1331878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul                                     GLenum zfail, GLenum zpass )
13325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
13335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
13345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1335de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   /* radeon 7200 have stencil bug, DEC and INC_WRAP will actually both do DEC_WRAP,
1336de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      and DEC_WRAP (and INVERT) will do INVERT. No way to get correct INC_WRAP and DEC,
1337de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      but DEC_WRAP can be fixed by using DEC and INC_WRAP at least use INC. */
1338de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger
1339de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   GLuint tempRADEON_STENCIL_FAIL_DEC_WRAP;
1340de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   GLuint tempRADEON_STENCIL_FAIL_INC_WRAP;
1341de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   GLuint tempRADEON_STENCIL_ZFAIL_DEC_WRAP;
1342de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   GLuint tempRADEON_STENCIL_ZFAIL_INC_WRAP;
1343de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   GLuint tempRADEON_STENCIL_ZPASS_DEC_WRAP;
1344de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   GLuint tempRADEON_STENCIL_ZPASS_INC_WRAP;
1345de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger
1346de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   if (rmesa->radeonScreen->chipset & RADEON_CHIPSET_BROKEN_STENCIL) {
1347de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_FAIL_DEC_WRAP = RADEON_STENCIL_FAIL_DEC;
1348de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_FAIL_INC_WRAP = RADEON_STENCIL_FAIL_INC;
1349de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZFAIL_DEC_WRAP = RADEON_STENCIL_ZFAIL_DEC;
1350de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZFAIL_INC_WRAP = RADEON_STENCIL_ZFAIL_INC;
1351de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZPASS_DEC_WRAP = RADEON_STENCIL_ZPASS_DEC;
1352de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZPASS_INC_WRAP = RADEON_STENCIL_ZPASS_INC;
1353de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   }
1354de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   else {
1355de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_FAIL_DEC_WRAP = RADEON_STENCIL_FAIL_DEC_WRAP;
1356de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_FAIL_INC_WRAP = RADEON_STENCIL_FAIL_INC_WRAP;
1357de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZFAIL_DEC_WRAP = RADEON_STENCIL_ZFAIL_DEC_WRAP;
1358de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZFAIL_INC_WRAP = RADEON_STENCIL_ZFAIL_INC_WRAP;
1359de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZPASS_DEC_WRAP = RADEON_STENCIL_ZPASS_DEC_WRAP;
1360de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZPASS_INC_WRAP = RADEON_STENCIL_ZPASS_INC_WRAP;
1361de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   }
1362de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger
13635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
13645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~(RADEON_STENCIL_FAIL_MASK |
13655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul					       RADEON_STENCIL_ZFAIL_MASK |
13665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul					       RADEON_STENCIL_ZPASS_MASK);
13675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Stencil.FailFunc[0] ) {
13695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_KEEP:
13705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_KEEP;
13715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
13735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_ZERO;
13745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_REPLACE:
13765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_REPLACE;
13775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INCR:
13795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_INC;
13805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DECR:
13825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_DEC;
13835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1384de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   case GL_INCR_WRAP:
1385de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_FAIL_INC_WRAP;
1386de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      break;
1387de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   case GL_DECR_WRAP:
1388de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_FAIL_DEC_WRAP;
1389de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      break;
13905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INVERT:
13915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_INVERT;
13925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
13945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Stencil.ZFailFunc[0] ) {
13965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_KEEP:
13975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_KEEP;
13985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
14005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_ZERO;
14015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
14025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_REPLACE:
14035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_REPLACE;
14045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
14055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INCR:
14065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_INC;
14075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
14085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DECR:
14095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_DEC;
14105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1411de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   case GL_INCR_WRAP:
1412de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZFAIL_INC_WRAP;
1413de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      break;
1414de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   case GL_DECR_WRAP:
1415de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZFAIL_DEC_WRAP;
1416de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      break;
14175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INVERT:
14185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_INVERT;
14195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
14205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
14215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Stencil.ZPassFunc[0] ) {
14235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_KEEP:
14245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_KEEP;
14255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
14265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
14275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_ZERO;
14285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
14295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_REPLACE:
14305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_REPLACE;
14315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
14325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INCR:
14335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_INC;
14345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
14355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DECR:
14365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_DEC;
14375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1438de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   case GL_INCR_WRAP:
1439de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZPASS_INC_WRAP;
1440de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      break;
1441de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   case GL_DECR_WRAP:
1442de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZPASS_DEC_WRAP;
1443de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      break;
14445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INVERT:
14455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_INVERT;
14465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
14475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
14485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
14495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClearStencil( GLcontext *ctx, GLint s )
14515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
14525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
14535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->state.stencil.clear =
14555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      ((GLuint) ctx->Stencil.Clear |
14565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       (0xff << RADEON_STENCIL_MASK_SHIFT) |
14575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       (ctx->Stencil.WriteMask[0] << RADEON_STENCIL_WRITEMASK_SHIFT));
14585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
14595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
14625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Window position and viewport transformation
14635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
14645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
14665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * To correctly position primitives:
14675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
14685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define SUBPIXEL_X 0.125
14695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define SUBPIXEL_Y 0.125
14705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
147116e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul
147216e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul/**
147316e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul * Called when window size or position changes or viewport or depth range
147416e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul * state is changed.  We update the hardware viewport state here.
147516e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul */
14765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonUpdateWindow( GLcontext *ctx )
14775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
14785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
14795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;
14805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat xoffset = (GLfloat)dPriv->x;
14815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat yoffset = (GLfloat)dPriv->y + dPriv->h;
14825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const GLfloat *v = ctx->Viewport._WindowMap.m;
14835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat sx = v[MAT_SX];
14855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat tx = v[MAT_TX] + xoffset + SUBPIXEL_X;
14865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat sy = - v[MAT_SY];
14875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat ty = (- v[MAT_TY]) + yoffset + SUBPIXEL_Y;
14885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat sz = v[MAT_SZ] * rmesa->state.depth.scale;
14895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat tz = v[MAT_TZ] * rmesa->state.depth.scale;
14905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_FIREVERTICES( rmesa );
14915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, vpt );
14925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE]  = *(GLuint *)&sx;
14945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = *(GLuint *)&tx;
14955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE]  = *(GLuint *)&sy;
14965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = *(GLuint *)&ty;
14975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE]  = *(GLuint *)&sz;
14985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = *(GLuint *)&tz;
14995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
15005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonViewport( GLcontext *ctx, GLint x, GLint y,
15035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			    GLsizei width, GLsizei height )
15045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
15055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Don't pipeline viewport changes, conflict with window offset
15065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * setting below.  Could apply deltas to rescue pipelined viewport
15075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * values, or keep the originals hanging around.
15085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
15095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_FIREVERTICES( RADEON_CONTEXT(ctx) );
15105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonUpdateWindow( ctx );
15115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
15125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDepthRange( GLcontext *ctx, GLclampd nearval,
15145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			      GLclampd farval )
15155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
15165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonUpdateWindow( ctx );
15175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
15185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonUpdateViewportOffset( GLcontext *ctx )
15205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
15215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
15225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;
15235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat xoffset = (GLfloat)dPriv->x;
15245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat yoffset = (GLfloat)dPriv->y + dPriv->h;
15255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const GLfloat *v = ctx->Viewport._WindowMap.m;
15265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15274754fc653f43903265dc878f27826ebcf26dfdcbKeith Whitwell   GLfloat tx = v[MAT_TX] + xoffset + SUBPIXEL_X;
15284754fc653f43903265dc878f27826ebcf26dfdcbKeith Whitwell   GLfloat ty = (- v[MAT_TY]) + yoffset + SUBPIXEL_Y;
15295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] != *(GLuint *)&tx ||
15315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] != *(GLuint *)&ty )
15325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
15335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Note: this should also modify whatever data the context reset
15345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       * code uses...
15355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
15365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = *(GLuint *)&tx;
15375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = *(GLuint *)&ty;
15385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* update polygon stipple x/y screen offset */
15405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      {
15415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         GLuint stx, sty;
15425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         GLuint m = rmesa->hw.msc.cmd[MSC_RE_MISC];
15435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         m &= ~(RADEON_STIPPLE_X_OFFSET_MASK |
15455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                RADEON_STIPPLE_Y_OFFSET_MASK);
15465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         /* add magic offsets, then invert */
15485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         stx = 31 - ((rmesa->dri.drawable->x - 1) & RADEON_STIPPLE_COORD_MASK);
15495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         sty = 31 - ((rmesa->dri.drawable->y + rmesa->dri.drawable->h - 1)
15505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                     & RADEON_STIPPLE_COORD_MASK);
15515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         m |= ((stx << RADEON_STIPPLE_X_OFFSET_SHIFT) |
15535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul               (sty << RADEON_STIPPLE_Y_OFFSET_SHIFT));
15545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         if ( rmesa->hw.msc.cmd[MSC_RE_MISC] != m ) {
15565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            RADEON_STATECHANGE( rmesa, msc );
15575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.msc.cmd[MSC_RE_MISC] = m;
15585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         }
15595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
15605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
15615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonUpdateScissor( ctx );
15635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
15645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
15685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Miscellaneous
15695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
15705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClearColor( GLcontext *ctx, const GLfloat color[4] )
15725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
15735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
15745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLubyte c[4];
15755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]);
15765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]);
15775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]);
15785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]);
15795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->state.color.clear = radeonPackColor( rmesa->radeonScreen->cpp,
15805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul					       c[0], c[1], c[2], c[3] );
15815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
15825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderMode( GLcontext *ctx, GLenum mode )
15855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
15865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
15875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   FALLBACK( rmesa, RADEON_FALLBACK_RENDER_MODE, (mode != GL_RENDER) );
15885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
15895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic GLuint radeon_rop_tab[] = {
15925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_CLEAR,
15935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_AND,
15945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_AND_REVERSE,
15955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_COPY,
15965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_AND_INVERTED,
15975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_NOOP,
15985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_XOR,
15995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_OR,
16005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_NOR,
16015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_EQUIV,
16025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_INVERT,
16035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_OR_REVERSE,
16045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_COPY_INVERTED,
16055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_OR_INVERTED,
16065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_NAND,
16075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_SET,
16085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
16095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLogicOpCode( GLcontext *ctx, GLenum opcode )
16115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
16125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
16135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint rop = (GLuint)opcode - GL_CLEAR;
16145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ASSERT( rop < 16 );
16165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, msk );
16185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.msk.cmd[MSK_RB3D_ROPCNTL] = radeon_rop_tab[rop];
16195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
16205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
162216e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul/**
162316e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul * Set up the cliprects for either front or back-buffer drawing.
162416e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul */
162516e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paulvoid radeonSetCliprects( radeonContextPtr rmesa )
16265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
16275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;
16285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
162916e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul   if (rmesa->glCtx->DrawBuffer->_ColorDrawBufferMask[0]
163016e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul       == BUFFER_BIT_BACK_LEFT) {
16315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Can't ignore 2d windows if we are page flipping.
16325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
16335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( dPriv->numBackClipRects == 0 || rmesa->doPageFlip ) {
16345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->numClipRects = dPriv->numClipRects;
1635ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl	 rmesa->pClipRects = dPriv->pClipRects;
16365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
16375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else {
16385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->numClipRects = dPriv->numBackClipRects;
1639ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl	 rmesa->pClipRects = dPriv->pBackClipRects;
16405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
164116e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul   }
164216e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul   else {
164316e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul      /* front buffer (or none, or multiple buffers */
164416e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul      rmesa->numClipRects = dPriv->numClipRects;
164516e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul      rmesa->pClipRects = dPriv->pClipRects;
16465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
16475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (rmesa->state.scissor.enabled)
16495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonRecalcScissorRects( rmesa );
16505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
16515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1653982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul/**
1654982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul * Called via glDrawBuffer.
1655982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul */
16565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDrawBuffer( GLcontext *ctx, GLenum mode )
16575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
16585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
16595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_DEBUG & DEBUG_DRI)
16615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s %s\n", __FUNCTION__,
16625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      _mesa_lookup_enum_by_nr( mode ));
16635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_FIREVERTICES(rmesa);	/* don't pipeline cliprect changes */
16655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /*
1667982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul    * _ColorDrawBufferMask is easier to cope with than <mode>.
1668982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul    * Check for software fallback, update cliprects.
16695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
1670e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   switch ( ctx->DrawBuffer->_ColorDrawBufferMask[0] ) {
1671e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   case BUFFER_BIT_FRONT_LEFT:
1672e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   case BUFFER_BIT_BACK_LEFT:
16735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      FALLBACK( rmesa, RADEON_FALLBACK_DRAW_BUFFER, GL_FALSE );
16745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
167616e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul      /* 0 (GL_NONE) buffers or multiple color drawing buffers */
16775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      FALLBACK( rmesa, RADEON_FALLBACK_DRAW_BUFFER, GL_TRUE );
16785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
16795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
16805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
168116e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul   radeonSetCliprects( rmesa );
168216e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul
1683982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   /* We'll set the drawing engine's offset/pitch parameters later
1684982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul    * when we update other state.
16855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
16865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
16875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonReadBuffer( GLcontext *ctx, GLenum mode )
16895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
16905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* nothing, until we implement h/w glRead/CopyPixels or CopyTexImage */
16915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
16925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
16955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * State enable/disable
16965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
16975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonEnable( GLcontext *ctx, GLenum cap, GLboolean state )
16995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
17005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
17015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint p, flag;
17025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( RADEON_DEBUG & DEBUG_STATE )
17045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf( stderr, "%s( %s = %s )\n", __FUNCTION__,
17055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       _mesa_lookup_enum_by_nr( cap ),
17065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       state ? "GL_TRUE" : "GL_FALSE" );
17075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( cap ) {
17095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Fast track this one...
17105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
17115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_1D:
17125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_2D:
17135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_3D:
17145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALPHA_TEST:
17175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
17185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state) {
17195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_ALPHA_TEST_ENABLE;
17205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
17215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ALPHA_TEST_ENABLE;
17225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_BLEND:
17265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
17275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state) {
17285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_ALPHA_BLEND_ENABLE;
17295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
17305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ALPHA_BLEND_ENABLE;
17315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
173278bb0803cf722ad5273fc495791eb573bf8b4d21Michel Dänzer      if ( ctx->Color._LogicOpEnabled ) {
17335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_ROP_ENABLE;
17345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
17355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE;
17365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Catch a possible fallback:
17395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
17405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state) {
1741c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick	 ctx->Driver.BlendEquationSeparate( ctx,
1742c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick					    ctx->Color.BlendEquationRGB,
1743c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick					    ctx->Color.BlendEquationA );
174420a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick	 ctx->Driver.BlendFuncSeparate( ctx, ctx->Color.BlendSrcRGB,
174520a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick					ctx->Color.BlendDstRGB,
1746253428f06a45d59cc50c9ccc4c8d17cd8c02c25dIan Romanick					ctx->Color.BlendSrcA,
1747253428f06a45d59cc50c9ccc4c8d17cd8c02c25dIan Romanick					ctx->Color.BlendDstA );
17485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else {
17505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 FALLBACK( rmesa, RADEON_FALLBACK_BLEND_FUNC, GL_FALSE );
17515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 FALLBACK( rmesa, RADEON_FALLBACK_BLEND_EQ, GL_FALSE );
17525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE0:
17565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE1:
17575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE2:
17585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE3:
17595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE4:
17605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE5:
17615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      p = cap-GL_CLIP_PLANE0;
17625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, tcl );
17635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state) {
17645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= (RADEON_UCP_ENABLE_0<<p);
17655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonClipPlane( ctx, cap, NULL );
17665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else {
17685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~(RADEON_UCP_ENABLE_0<<p);
17695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_COLOR_MATERIAL:
17735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonColorMaterial( ctx, 0, 0 );
1774a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer      radeonUpdateMaterial( ctx );
17755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CULL_FACE:
17785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonCullFace( ctx, 0 );
17795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DEPTH_TEST:
17825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, ctx );
17835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
17845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_Z_ENABLE;
17855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
17865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_Z_ENABLE;
17875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DITHER:
17915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, ctx );
17925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
17935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_DITHER_ENABLE;
179499ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~rmesa->state.color.roundEnable;
17955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
17965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_DITHER_ENABLE;
179799ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  rmesa->state.color.roundEnable;
17985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG:
18025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, ctx );
18035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
18045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_FOG_ENABLE;
18052c28dd892cfb43445d7e54df8b6a8331192f4e99Brian Paul	 radeonFogfv( ctx, GL_FOG_MODE, NULL );
18065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
18075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_FOG_ENABLE;
18085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE(rmesa, tcl);
18095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_TCL_FOG_MASK;
18105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
18115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateSpecular( ctx ); /* for PK_SPEC */
18125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (rmesa->TclFallback)
18135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonChooseVertexState( ctx );
18145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      _mesa_allow_light_in_model( ctx, !state );
18155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT0:
18185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT1:
18195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT2:
18205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT3:
18215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT4:
18225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT5:
18235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT6:
18245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT7:
18255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
18265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      p = cap - GL_LIGHT0;
18275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (p&1)
18285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 flag = (RADEON_LIGHT_1_ENABLE |
18295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 RADEON_LIGHT_1_ENABLE_AMBIENT |
18305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 RADEON_LIGHT_1_ENABLE_SPECULAR);
18315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
18325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 flag = (RADEON_LIGHT_0_ENABLE |
18335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 RADEON_LIGHT_0_ENABLE_AMBIENT |
18345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 RADEON_LIGHT_0_ENABLE_SPECULAR);
18355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state)
18375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] |= flag;
18385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
18395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] &= ~flag;
18405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /*
18425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
18435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      update_light_colors( ctx, p );
18445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHTING:
18475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
18485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateSpecular(ctx);
18495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      check_twoside_fallback( ctx );
18505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINE_SMOOTH:
18535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
18545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
18555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_ANTI_ALIAS_LINE;
18565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
18575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ANTI_ALIAS_LINE;
18585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
18595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINE_STIPPLE:
18625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
18635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
18645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_PATTERN_ENABLE;
18655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
18665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_PATTERN_ENABLE;
18675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
18685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_COLOR_LOGIC_OP:
18715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
187278bb0803cf722ad5273fc495791eb573bf8b4d21Michel Dänzer      if ( ctx->Color._LogicOpEnabled ) {
18735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_ROP_ENABLE;
18745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
18755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE;
18765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
18775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NORMALIZE:
18805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, tcl );
18815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
18825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |=  RADEON_NORMALIZE_NORMALS;
18835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
18845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_NORMALIZE_NORMALS;
18855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
18865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_OFFSET_POINT:
188930f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      RADEON_STATECHANGE( rmesa, set );
189030f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      if ( state ) {
189130f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_ZBIAS_ENABLE_POINT;
189230f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      } else {
189330f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_POINT;
18945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
18955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_OFFSET_LINE:
189830f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      RADEON_STATECHANGE( rmesa, set );
189930f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      if ( state ) {
190030f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_ZBIAS_ENABLE_LINE;
190130f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      } else {
190230f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_LINE;
19035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
19045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
19055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_OFFSET_FILL:
190730f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      RADEON_STATECHANGE( rmesa, set );
190830f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      if ( state ) {
190930f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_ZBIAS_ENABLE_TRI;
191030f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      } else {
191130f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_TRI;
19125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
19135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
19145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_SMOOTH:
19165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
19175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
19185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_ANTI_ALIAS_POLY;
19195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
19205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ANTI_ALIAS_POLY;
19215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
19225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
19235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_STIPPLE:
19255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, ctx );
19265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
19275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_STIPPLE_ENABLE;
19285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
19295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_STIPPLE_ENABLE;
19305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
19315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
19325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RESCALE_NORMAL_EXT: {
19345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLboolean tmp = ctx->_NeedEyeCoords ? state : !state;
19355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, tcl );
19365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( tmp ) {
19375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |=  RADEON_RESCALE_NORMALS;
19385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
19395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_RESCALE_NORMALS;
19405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
19415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
19425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
19435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SCISSOR_TEST:
19455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_FIREVERTICES( rmesa );
19465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.scissor.enabled = state;
19475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateScissor( ctx );
19485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
19495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_STENCIL_TEST:
19515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( rmesa->state.stencil.hwBuffer ) {
19525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, ctx );
19535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if ( state ) {
19545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_STENCIL_ENABLE;
19555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 } else {
19565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_STENCIL_ENABLE;
19575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
19585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
19595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 FALLBACK( rmesa, RADEON_FALLBACK_STENCIL, state );
19605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
19615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
19625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_GEN_Q:
19645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_GEN_R:
19655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_GEN_S:
19665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_GEN_T:
19675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Picked up in radeonUpdateTextureState.
19685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
19695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->recheck_texgen[ctx->Texture.CurrentUnit] = GL_TRUE;
19705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
19715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_COLOR_SUM_EXT:
19735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateSpecular ( ctx );
19745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
19755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
19775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
19785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
19795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
19805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLightingSpaceChange( GLcontext *ctx )
19835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
19845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
19855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean tmp;
19865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, tcl );
19875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_DEBUG & DEBUG_STATE)
19895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s %d BEFORE %x\n", __FUNCTION__, ctx->_NeedEyeCoords,
19905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]);
19915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->_NeedEyeCoords)
19935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tmp = ctx->Transform.RescaleNormals;
19945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else
19955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tmp = !ctx->Transform.RescaleNormals;
19965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( tmp ) {
19985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |=  RADEON_RESCALE_NORMALS;
19995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
20005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_RESCALE_NORMALS;
20015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
20025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_DEBUG & DEBUG_STATE)
20045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s %d AFTER %x\n", __FUNCTION__, ctx->_NeedEyeCoords,
20055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]);
20065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
20075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
20095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Deferred state management - matrices, textures, other?
20105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
20115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2012a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheideggerstatic void texmat_set_texrect( radeonContextPtr rmesa,
2013a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger				struct gl_texture_object *tObj, GLuint unit )
2014a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger{
2015a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   const struct gl_texture_image *baseImage = tObj->Image[0][tObj->BaseLevel];
2016a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   _math_matrix_set_identity( &rmesa->tmpmat[unit] );
2017a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   rmesa->tmpmat[unit].m[0] = 1.0 / baseImage->Width;
2018a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   rmesa->tmpmat[unit].m[5] = 1.0 / baseImage->Height;
2019a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger
2020a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger}
2021a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger
2022a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheideggerstatic void texmat_fixup_texrect( radeonContextPtr rmesa,
2023a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger				  struct gl_texture_object *tObj, GLuint unit )
2024a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger{
2025a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   const struct gl_texture_image *baseImage = tObj->Image[0][tObj->BaseLevel];
2026a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   GLuint i;
2027a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   for (i = 0; i < 4; i++) {
2028a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      rmesa->tmpmat[unit].m[i] = rmesa->tmpmat[unit].m[i] / baseImage->Width;
2029a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      rmesa->tmpmat[unit].m[i+4] = rmesa->tmpmat[unit].m[i+4] / baseImage->Height;
2030a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   }}
2031a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger
2032a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger
203311f763f5057490477a2771febe8923682f6a5adaRoland Scheideggervoid radeonUploadTexMatrix( radeonContextPtr rmesa,
2034a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger			    int unit, GLboolean swapcols )
2035a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger{
2036a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger/* Here's how this works: on r100, only 3 tex coords can be submitted, so the
2037a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   vector looks like this probably: (s t r|q 0) (not sure if the last coord
2038a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   is hardwired to 0, could be 1 too). Interestingly, it actually looks like
2039a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   texgen generates all 4 coords, at least tests with projtex indicated that.
2040a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   So: if we need the q coord in the end (solely determined by the texture
2041a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   target, i.e. 2d / 1d / texrect targets) we swap the third and 4th row.
2042a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   Additionally, if we don't have texgen but 4 tex coords submitted, we swap
2043a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   column 3 and 4 (for the 2d / 1d / texrect targets) since the the q coord
2044a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   will get submitted in the "wrong", i.e. 3rd, slot.
2045a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   If an app submits 3 coords for 2d targets, we assume it is saving on vertex
2046a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   size and using the texture matrix to swap the r and q coords around (ut2k3
2047a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   does exactly that), so we don't need the 3rd / 4th column swap - still need
2048a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   the 3rd / 4th row swap of course. This will potentially break for apps which
2049a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   use TexCoord3x just for fun. Additionally, it will never work if an app uses
2050a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   an "advanced" texture matrix and relies on all 4 texcoord inputs to generate
2051a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   the maximum needed 3. This seems impossible to do with hw tcl on r100, and
2052a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   incredibly hard to detect so we can't just fallback in such a case. Assume
2053a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   it never happens... - rs
2054a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger*/
2055a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger
2056a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   int idx = TEXMAT_0 + unit;
2057a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   float *dest = ((float *)RADEON_DB_STATE( mat[idx] )) + MAT_ELT_0;
2058a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   int i;
2059a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   struct gl_texture_unit tUnit = rmesa->glCtx->Texture.Unit[unit];
206011f763f5057490477a2771febe8923682f6a5adaRoland Scheidegger   GLfloat *src = rmesa->tmpmat[unit].m;
2061a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger
2062a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   rmesa->TexMatColSwap &= ~(1 << unit);
2063a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   if ((tUnit._ReallyEnabled & (TEXTURE_3D_BIT | TEXTURE_CUBE_BIT)) == 0) {
2064a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      if (swapcols) {
2065a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 rmesa->TexMatColSwap |= 1 << unit;
2066a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 /* attention some elems are swapped 2 times! */
2067a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[0];
2068a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[4];
2069a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[12];
2070a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[8];
2071a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[1];
2072a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[5];
2073a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[13];
2074a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[9];
2075a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[2];
2076a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[6];
2077a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[15];
2078a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[11];
2079a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 /* those last 4 are probably never used */
2080a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[3];
2081a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[7];
2082a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[14];
2083a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[10];
2084a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      }
2085a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      else {
2086a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 for (i = 0; i < 2; i++) {
2087a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i];
2088a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i+4];
2089a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i+8];
2090a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i+12];
2091a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 }
2092a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 for (i = 3; i >= 2; i--) {
2093a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i];
2094a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i+4];
2095a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i+8];
2096a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i+12];
2097a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 }
2098a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      }
2099a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   }
2100a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   else {
2101a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      /* never used currently - no swapping needed at all presumably */
2102a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      for (i = 0 ; i < 4 ; i++) {
2103a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[i];
2104a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[i+4];
2105a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[i+8];
2106a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[i+12];
2107a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      }
2108a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   }
21095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2110a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );
2111a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger}
21125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void upload_matrix( radeonContextPtr rmesa, GLfloat *src, int idx )
21155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
21165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   float *dest = ((float *)RADEON_DB_STATE( mat[idx] ))+MAT_ELT_0;
21175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i;
21185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for (i = 0 ; i < 4 ; i++) {
21215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      *dest++ = src[i];
21225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      *dest++ = src[i+4];
21235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      *dest++ = src[i+8];
21245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      *dest++ = src[i+12];
21255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
21265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );
21285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
21295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void upload_matrix_t( radeonContextPtr rmesa, GLfloat *src, int idx )
21315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
21325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   float *dest = ((float *)RADEON_DB_STATE( mat[idx] ))+MAT_ELT_0;
21335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   memcpy(dest, src, 16*sizeof(float));
21345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );
21355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
21365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_texturematrix( GLcontext *ctx )
21395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
21405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT( ctx );
21415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint tpc = rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL];
21425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint vs = rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL];
21435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int unit;
2144a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   GLuint texMatEnabled = 0;
2145a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   rmesa->NeedTexMatrix = 0;
2146a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   rmesa->TexMatColSwap = 0;
21475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
214830daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger   for (unit = 0 ; unit < ctx->Const.MaxTextureUnits; unit++) {
2149a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      if (ctx->Texture.Unit[unit]._ReallyEnabled) {
2150a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 GLboolean needMatrix = GL_FALSE;
2151a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 if (ctx->TextureMatrixStack[unit].Top->type != MATRIX_IDENTITY) {
2152a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    needMatrix = GL_TRUE;
2153a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    texMatEnabled |= (RADEON_TEXGEN_TEXMAT_0_ENABLE |
2154a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger			      RADEON_TEXMAT_0_ENABLE) << unit;
2155a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger
2156a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    if (rmesa->TexGenEnabled & (RADEON_TEXMAT_0_ENABLE << unit)) {
2157a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	       /* Need to preconcatenate any active texgen
2158a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	        * obj/eyeplane matrices:
2159a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	        */
2160a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	       _math_matrix_mul_matrix( &rmesa->tmpmat[unit],
216184c9e671edcc1358307879491bddef9f7d96f14bRoland Scheidegger				     ctx->TextureMatrixStack[unit].Top,
216284c9e671edcc1358307879491bddef9f7d96f14bRoland Scheidegger				     &rmesa->TexGenMatrix[unit] );
2163a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    }
2164a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    else {
2165a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	       _math_matrix_copy( &rmesa->tmpmat[unit],
2166a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger		  ctx->TextureMatrixStack[unit].Top );
2167a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    }
216884c9e671edcc1358307879491bddef9f7d96f14bRoland Scheidegger	 }
2169a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 else if (rmesa->TexGenEnabled & (RADEON_TEXMAT_0_ENABLE << unit)) {
2170a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    _math_matrix_copy( &rmesa->tmpmat[unit], &rmesa->TexGenMatrix[unit] );
2171a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    needMatrix = GL_TRUE;
2172a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 }
2173a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 if (ctx->Texture.Unit[unit]._ReallyEnabled == TEXTURE_RECT_BIT) {
2174a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    texMatEnabled |= (RADEON_TEXGEN_TEXMAT_0_ENABLE |
2175a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger			      RADEON_TEXMAT_0_ENABLE) << unit;
2176a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    if (needMatrix)
2177a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	       texmat_fixup_texrect( rmesa, ctx->Texture.Unit[unit]._Current, unit );
2178a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    else
2179a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	       texmat_set_texrect( rmesa, ctx->Texture.Unit[unit]._Current, unit );
2180a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    needMatrix = GL_TRUE;
2181a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 }
2182a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 if (needMatrix) {
2183a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    rmesa->NeedTexMatrix |= 1 << unit;
218411f763f5057490477a2771febe8923682f6a5adaRoland Scheidegger	    radeonUploadTexMatrix( rmesa, unit,
2185a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger			!ctx->Texture.Unit[unit].TexGenEnabled );
21865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
21875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
21885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
21895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2190a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   tpc = (texMatEnabled | rmesa->TexGenEnabled);
21915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
219230daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger   /* TCL_TEX_COMPUTED_x is TCL_TEX_INPUT_x | 0x8 */
219330daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger   vs &= ~((RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_0_OUTPUT_SHIFT) |
219430daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger	   (RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_1_OUTPUT_SHIFT) |
219530daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger	   (RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_2_OUTPUT_SHIFT));
219630daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger
219730daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger   vs |= (((tpc & RADEON_TEXGEN_TEXMAT_0_ENABLE) <<
219830daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger	 (RADEON_TCL_TEX_0_OUTPUT_SHIFT + 3)) |
219930daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger      ((tpc & RADEON_TEXGEN_TEXMAT_1_ENABLE) <<
220030daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger	 (RADEON_TCL_TEX_1_OUTPUT_SHIFT + 2)) |
220130daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger      ((tpc & RADEON_TEXGEN_TEXMAT_2_ENABLE) <<
220230daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger	 (RADEON_TCL_TEX_2_OUTPUT_SHIFT + 1)));
22035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
22045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (tpc != rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL] ||
22055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       vs != rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL]) {
2206a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger
22075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
22085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL] = tpc;
22095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] = vs;
22105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
22115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
22125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
22135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2214982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul/**
2215982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul * Tell the card where to render (offset, pitch).
2216982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul * Effected by glDrawBuffer, etc
2217982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul */
2218982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paulvoid
2219982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian PaulradeonUpdateDrawBuffer(GLcontext *ctx)
2220982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul{
2221982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
2222982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   struct gl_framebuffer *fb = ctx->DrawBuffer;
2223982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   driRenderbuffer *drb;
2224982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul
2225982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   if (fb->_ColorDrawBufferMask[0] == BUFFER_BIT_FRONT_LEFT) {
2226982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul      /* draw to front */
2227982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul      drb = (driRenderbuffer *) fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer;
2228982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   }
2229982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   else if (fb->_ColorDrawBufferMask[0] == BUFFER_BIT_BACK_LEFT) {
2230982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul      /* draw to back */
2231982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul      drb = (driRenderbuffer *) fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer;
2232982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   }
2233982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   else {
2234982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul      /* drawing to multiple buffers, or none */
2235982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul      return;
2236982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   }
2237982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul
2238982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   assert(drb);
2239982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   assert(drb->flippedPitch);
2240982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul
2241982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
2242982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul
2243982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   /* Note: we used the (possibly) page-flipped values */
2244982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET]
2245982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul     = ((drb->flippedOffset + rmesa->radeonScreen->fbLocation)
2246982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul	& RADEON_COLOROFFSET_MASK);
2247982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] = drb->flippedPitch;
2248982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   if (rmesa->sarea->tiling_enabled) {
2249982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] |= RADEON_COLOR_TILE_ENABLE;
2250982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   }
2251982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul}
2252982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul
22535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
22545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonValidateState( GLcontext *ctx )
22555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
22565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
22575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint new_state = rmesa->NewGLState;
22585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2259982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   if (new_state & (_NEW_BUFFERS | _NEW_COLOR | _NEW_PIXEL)) {
2260982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul     radeonUpdateDrawBuffer(ctx);
2261982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   }
2262982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul
22635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & _NEW_TEXTURE) {
22645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateTextureState( ctx );
22655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      new_state |= rmesa->NewGLState; /* may add TEXTURE_MATRIX */
22665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
22675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
22685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Need an event driven matrix update?
22695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
22705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & (_NEW_MODELVIEW|_NEW_PROJECTION))
22715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      upload_matrix( rmesa, ctx->_ModelProjectMatrix.m, MODEL_PROJ );
22725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
22735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Need these for lighting (shouldn't upload otherwise)
22745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
22755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & (_NEW_MODELVIEW)) {
22765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      upload_matrix( rmesa, ctx->ModelviewMatrixStack.Top->m, MODEL );
22775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      upload_matrix_t( rmesa, ctx->ModelviewMatrixStack.Top->inv, MODEL_IT );
22785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
22795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
22805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Does this need to be triggered on eg. modelview for
22815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * texgen-derived objplane/eyeplane matrices?
22825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
22835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & _NEW_TEXTURE_MATRIX) {
22845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      update_texturematrix( ctx );
2285a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   }
22865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
22875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & (_NEW_LIGHT|_NEW_MODELVIEW|_MESA_NEW_NEED_EYE_COORDS)) {
22885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      update_light( ctx );
22895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
22905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
22915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* emit all active clip planes if projection matrix changes.
22925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
22935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & (_NEW_PROJECTION)) {
22945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Transform.ClipPlanesEnabled)
22955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonUpdateClipPlanes( ctx );
22965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
22975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
22985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
22995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->NewGLState = 0;
23005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
23015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
23025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
23035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonInvalidateState( GLcontext *ctx, GLuint new_state )
23045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
23055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _swrast_InvalidateState( ctx, new_state );
23065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _swsetup_InvalidateState( ctx, new_state );
23075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _ac_InvalidateState( ctx, new_state );
23085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _tnl_InvalidateState( ctx, new_state );
23095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _ae_invalidate_state( ctx, new_state );
23105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CONTEXT(ctx)->NewGLState |= new_state;
23115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonVtxfmtInvalidate( ctx );
23125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
23135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
231457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
231557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell/* A hack.  Need a faster way to find this out.
231657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell */
231757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwellstatic GLboolean check_material( GLcontext *ctx )
231857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell{
231957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   TNLcontext *tnl = TNL_CONTEXT(ctx);
232057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   GLint i;
232157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
232257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   for (i = _TNL_ATTRIB_MAT_FRONT_AMBIENT;
232357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	i < _TNL_ATTRIB_MAT_BACK_INDEXES;
232457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	i++)
232557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (tnl->vb.AttribPtr[i] &&
232657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	  tnl->vb.AttribPtr[i]->stride)
232757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 return GL_TRUE;
232857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
232957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   return GL_FALSE;
233057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell}
233157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
233257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
23335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonWrapRunPipeline( GLcontext *ctx )
23345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
23355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
233657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   GLboolean has_material;
23375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
23385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (0)
23395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s, newstate: %x\n", __FUNCTION__, rmesa->NewGLState);
23405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
23415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Validate state:
23425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
23435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (rmesa->NewGLState)
23445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonValidateState( ctx );
23455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
234657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   has_material = (ctx->Light.Enabled && check_material( ctx ));
234757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
234857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   if (has_material) {
23495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_MATERIAL, GL_TRUE );
23505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
23515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
23525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Run the pipeline.
23535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
23545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _tnl_run_pipeline( ctx );
23555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
235657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   if (has_material) {
23575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_MATERIAL, GL_FALSE );
23585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
23595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
23605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
23615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
23625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Initialize the driver's state functions.
2363275a563bea0c0eef7bcd52ddc493803acf94c37eBrian Paul * Many of the ctx->Driver functions might have been initialized to
2364275a563bea0c0eef7bcd52ddc493803acf94c37eBrian Paul * software defaults in the earlier _mesa_init_driver_functions() call.
23655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
23665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonInitStateFuncs( GLcontext *ctx )
23675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
23685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.UpdateState		= radeonInvalidateState;
23695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LightingSpaceChange      = radeonLightingSpaceChange;
23705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
23715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.DrawBuffer		= radeonDrawBuffer;
23725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ReadBuffer		= radeonReadBuffer;
23735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
23745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.AlphaFunc		= radeonAlphaFunc;
2375c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   ctx->Driver.BlendEquationSeparate	= radeonBlendEquationSeparate;
23765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.BlendFuncSeparate	= radeonBlendFuncSeparate;
23775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ClearColor		= radeonClearColor;
23785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ClearDepth		= radeonClearDepth;
23795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ClearIndex		= NULL;
23805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ClearStencil		= radeonClearStencil;
23815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ClipPlane		= radeonClipPlane;
23825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ColorMask		= radeonColorMask;
23835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.CullFace			= radeonCullFace;
23845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.DepthFunc		= radeonDepthFunc;
23855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.DepthMask		= radeonDepthMask;
23865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.DepthRange		= radeonDepthRange;
23875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Enable			= radeonEnable;
23885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Fogfv			= radeonFogfv;
23895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.FrontFace		= radeonFrontFace;
23905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Hint			= NULL;
23915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.IndexMask		= NULL;
23925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LightModelfv		= radeonLightModelfv;
23935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Lightfv			= radeonLightfv;
23945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LineStipple              = radeonLineStipple;
23955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LineWidth                = radeonLineWidth;
23965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LogicOpcode		= radeonLogicOpCode;
23975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.PolygonMode		= radeonPolygonMode;
239830f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger   ctx->Driver.PolygonOffset		= radeonPolygonOffset;
23995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.PolygonStipple		= radeonPolygonStipple;
24005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.RenderMode		= radeonRenderMode;
24015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Scissor			= radeonScissor;
24025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ShadeModel		= radeonShadeModel;
2403878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul   ctx->Driver.StencilFuncSeparate	= radeonStencilFuncSeparate;
2404878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul   ctx->Driver.StencilMaskSeparate	= radeonStencilMaskSeparate;
2405878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul   ctx->Driver.StencilOpSeparate	= radeonStencilOpSeparate;
24065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Viewport			= radeonViewport;
24075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
24085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange = radeonUpdateMaterial;
24095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNL_CONTEXT(ctx)->Driver.RunPipeline = radeonWrapRunPipeline;
24105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2411