15df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**************************************************************************
25df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
35df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulCopyright 2000, 2001 VA Linux Systems Inc., Fremont, California.
45df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
55df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulAll Rights Reserved.
65df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
75df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulPermission is hereby granted, free of charge, to any person obtaining
85df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paula copy of this software and associated documentation files (the
95df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul"Software"), to deal in the Software without restriction, including
105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulwithout limitation the rights to use, copy, modify, merge, publish,
115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Pauldistribute, sublicense, and/or sell copies of the Software, and to
125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulpermit persons to whom the Software is furnished to do so, subject to
135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulthe following conditions:
145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulThe above copyright notice and this permission notice (including the
165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulnext paragraph) shall be included in all copies or substantial
175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulportions of the Software.
185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul**************************************************************************/
285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Authors:
315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *   Gareth Hughes <gareth@valinux.com>
325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *   Keith Whitwell <keith@tungstengraphics.com>
335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
35ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h"
36ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/imports.h"
37ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/api_arrayelt.h"
38ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/enums.h"
39ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/light.h"
40ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/context.h"
41ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/framebuffer.h"
4247941bfaea6e8a60e2c31f7a2c8c233f2a10ecb1Brian Paul#include "main/fbobject.h"
43bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen#include "main/simple_list.h"
44decc6e2a32ef49e673c081f30e19b8970155d887Brian Paul#include "main/state.h"
455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4680c88304fc9d09531b2530b74973821e47b46753Keith Whitwell#include "vbo/vbo.h"
475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/tnl.h"
485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_pipeline.h"
495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "swrast_setup/swrast_setup.h"
50e167403e5809c447870644bd9ea09fad369706cfAlex Deucher#include "drivers/common/meta.h"
515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_context.h"
5305304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie#include "radeon_mipmap_tree.h"
545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_ioctl.h"
555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_state.h"
565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tcl.h"
575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tex.h"
585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_swtcl.h"
595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
60f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonUpdateSpecular( struct gl_context *ctx );
612d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger
625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Alpha blending
645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
66f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonAlphaFunc( struct gl_context *ctx, GLenum func, GLfloat ref )
675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
684637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int pp_misc = rmesa->hw.ctx.cmd[CTX_PP_MISC];
705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLubyte refByte;
715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   CLAMPED_FLOAT_TO_UBYTE(refByte, ref);
735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   pp_misc &= ~(RADEON_ALPHA_TEST_OP_MASK | RADEON_REF_ALPHA_MASK);
775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   pp_misc |= (refByte & RADEON_REF_ALPHA_MASK);
785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( func ) {
805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NEVER:
815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_FAIL;
825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LESS:
845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_LESS;
855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_EQUAL:
875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_EQUAL;
885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LEQUAL:
905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_LEQUAL;
915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GREATER:
935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_GREATER;
945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NOTEQUAL:
965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_NEQUAL;
975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GEQUAL:
995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_GEQUAL;
1005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALWAYS:
1025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_PASS;
1035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ctx.cmd[CTX_PP_MISC] = pp_misc;
1075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
109f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonBlendEquationSeparate( struct gl_context *ctx,
110c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick					 GLenum modeRGB, GLenum modeA )
1115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
1124637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
1135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint b = rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] & ~RADEON_COMB_FCN_MASK;
1145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean fallback = GL_FALSE;
1155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
116c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   assert( modeRGB == modeA );
117c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick
118c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   switch ( modeRGB ) {
1195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FUNC_ADD:
1205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LOGIC_OP:
1215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_COMB_FCN_ADD_CLAMP;
1225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FUNC_SUBTRACT:
1255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_COMB_FCN_SUB_CLAMP;
1265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
1295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Color.BlendEnabled)
1305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fallback = GL_TRUE;
1315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
1325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b |= RADEON_COMB_FCN_ADD_CLAMP;
1335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   FALLBACK( rmesa, RADEON_FALLBACK_BLEND_EQ, fallback );
1375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( !fallback ) {
1385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
1395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = b;
140888b1a9166abfb1b2873cf7c1eb2daf45a26c84fRoland Scheidegger      if ( (ctx->Color.ColorLogicOpEnabled || (ctx->Color.BlendEnabled
14174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul	    && ctx->Color.Blend[0].EquationRGB == GL_LOGIC_OP)) ) {
1425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_ROP_ENABLE;
1435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
1445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE;
1455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
149f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonBlendFuncSeparate( struct gl_context *ctx,
15020a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick				     GLenum sfactorRGB, GLenum dfactorRGB,
15120a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick				     GLenum sfactorA, GLenum dfactorA )
1525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
1534637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
1547dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   GLuint b = rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] &
1555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      ~(RADEON_SRC_BLEND_MASK | RADEON_DST_BLEND_MASK);
1565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean fallback = GL_FALSE;
1575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   switch ( ctx->Color.Blend[0].SrcRGB ) {
1595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
1605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ZERO;
1615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE:
1635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE;
1645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DST_COLOR:
1665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_DST_COLOR;
1675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_DST_COLOR:
1695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE_MINUS_DST_COLOR;
1705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_COLOR:
1725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_SRC_COLOR;
1735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_SRC_COLOR:
1755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE_MINUS_SRC_COLOR;
1765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_ALPHA:
1785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_SRC_ALPHA;
1795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_SRC_ALPHA:
1815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE_MINUS_SRC_ALPHA;
1825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DST_ALPHA:
1845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_DST_ALPHA;
1855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_DST_ALPHA:
1875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE_MINUS_DST_ALPHA;
1885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_ALPHA_SATURATE:
1905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_SRC_ALPHA_SATURATE;
1915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_COLOR:
1935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_CONSTANT_COLOR:
1945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_ALPHA:
1955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_CONSTANT_ALPHA:
1965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Color.BlendEnabled)
1975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fallback = GL_TRUE;
1985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
1995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b |= RADEON_SRC_BLEND_GL_ONE;
2005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
2025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   switch ( ctx->Color.Blend[0].DstRGB ) {
2065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
2075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ZERO;
2085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE:
2105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE;
2115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_COLOR:
2135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_SRC_COLOR;
2145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_SRC_COLOR:
2165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE_MINUS_SRC_COLOR;
2175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_ALPHA:
2195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_SRC_ALPHA;
2205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_SRC_ALPHA:
2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE_MINUS_SRC_ALPHA;
2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DST_COLOR:
2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_DST_COLOR;
2265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_DST_COLOR:
2285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE_MINUS_DST_COLOR;
2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DST_ALPHA:
2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_DST_ALPHA;
2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_DST_ALPHA:
2345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE_MINUS_DST_ALPHA;
2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_COLOR:
2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_CONSTANT_COLOR:
2385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_ALPHA:
2395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_CONSTANT_ALPHA:
2405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Color.BlendEnabled)
2415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fallback = GL_TRUE;
2425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b |= RADEON_DST_BLEND_GL_ZERO;
2445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
2465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   FALLBACK( rmesa, RADEON_FALLBACK_BLEND_FUNC, fallback );
2505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( !fallback ) {
2515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
2525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = b;
2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
2585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Depth testing
2595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
2605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
261f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonDepthFunc( struct gl_context *ctx, GLenum func )
2625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2634637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
2645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
2665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_Z_TEST_MASK;
2675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Depth.Func ) {
2695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NEVER:
2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_NEVER;
2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LESS:
2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_LESS;
2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_EQUAL:
2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_EQUAL;
2775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LEQUAL:
2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_LEQUAL;
2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GREATER:
2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_GREATER;
2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NOTEQUAL:
2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_NEQUAL;
2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GEQUAL:
2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_GEQUAL;
2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALWAYS:
2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_ALWAYS;
2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
297f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonDepthMask( struct gl_context *ctx, GLboolean flag )
2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2994637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
3005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
3015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( ctx->Depth.Mask ) {
3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |=  RADEON_Z_WRITE_ENABLE;
3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
3055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_Z_WRITE_ENABLE;
3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Fog
3125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
3135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
315f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonFogfv( struct gl_context *ctx, GLenum pname, const GLfloat *param )
3165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3174637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   union { int i; float f; } c, d;
319499f0685e8236eca410fce516de0e9bab7e25be8Brian Paul   GLubyte col[4];
3205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (pname) {
3225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG_MODE:
3235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (!ctx->Fog.Enabled)
3245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return;
3255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
3265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_TCL_FOG_MASK;
3275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch (ctx->Fog.Mode) {
3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR:
3295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_LINEAR;
3305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_EXP:
3325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_EXP;
3335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_EXP2:
3355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_EXP2;
3365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      default:
3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return;
3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3402d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger   /* fallthrough */
3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG_DENSITY:
3422d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger   case GL_FOG_START:
3432d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger   case GL_FOG_END:
3442d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      if (!ctx->Fog.Enabled)
3452d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 return;
3462d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      c.i = rmesa->hw.fog.cmd[FOG_C];
3472d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      d.i = rmesa->hw.fog.cmd[FOG_D];
3485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch (ctx->Fog.Mode) {
3495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_EXP:
3505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 c.f = 0.0;
351512c994b92126a7575bb3cc327da40710b43f52cEric Anholt	 /* While this is the opposite sign from the DDK, it makes the fog test
352512c994b92126a7575bb3cc327da40710b43f52cEric Anholt	  * pass, and matches r200.
353512c994b92126a7575bb3cc327da40710b43f52cEric Anholt	  */
354512c994b92126a7575bb3cc327da40710b43f52cEric Anholt	 d.f = -ctx->Fog.Density;
3555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_EXP2:
3575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 c.f = 0.0;
3585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 d.f = -(ctx->Fog.Density * ctx->Fog.Density);
3595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3602d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      case GL_LINEAR:
3615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (ctx->Fog.Start == ctx->Fog.End) {
3625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    c.f = 1.0F;
3635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    d.f = 1.0F;
3645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 } else {
3655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start);
366512c994b92126a7575bb3cc327da40710b43f52cEric Anholt	    /* While this is the opposite sign from the DDK, it makes the fog
367512c994b92126a7575bb3cc327da40710b43f52cEric Anholt	     * test pass, and matches r200.
368512c994b92126a7575bb3cc327da40710b43f52cEric Anholt	     */
369512c994b92126a7575bb3cc327da40710b43f52cEric Anholt	    d.f = -1.0/(ctx->Fog.End-ctx->Fog.Start);
3705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
3712d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 break;
3722d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      default:
3732d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 break;
3742d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      }
3752d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      if (c.i != rmesa->hw.fog.cmd[FOG_C] || d.i != rmesa->hw.fog.cmd[FOG_D]) {
3762d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 RADEON_STATECHANGE( rmesa, fog );
3772d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 rmesa->hw.fog.cmd[FOG_C] = c.i;
3782d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 rmesa->hw.fog.cmd[FOG_D] = d.i;
3795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3817dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   case GL_FOG_COLOR:
3825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
383499f0685e8236eca410fce516de0e9bab7e25be8Brian Paul      _mesa_unclamped_float_rgba_to_ubyte(col, ctx->Fog.Color );
3842d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] &= ~RADEON_FOG_COLOR_MASK;
3852d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] |=
3865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonPackColor( 4, col[0], col[1], col[2], 0 );
3875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3882d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger   case GL_FOG_COORD_SRC:
3892d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      radeonUpdateSpecular( ctx );
3905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
3925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
3975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Culling
3985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
400f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonCullFace( struct gl_context *ctx, GLenum unused )
4015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4024637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
4035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL];
4045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint t = rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL];
4055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   s |= RADEON_FFACE_SOLID | RADEON_BFACE_SOLID;
4075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t &= ~(RADEON_CULL_FRONT | RADEON_CULL_BACK);
4085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( ctx->Polygon.CullFlag ) {
4105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch ( ctx->Polygon.CullFaceMode ) {
4115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_FRONT:
4125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 s &= ~RADEON_FFACE_SOLID;
4135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t |= RADEON_CULL_FRONT;
4145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
4155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_BACK:
4165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 s &= ~RADEON_BFACE_SOLID;
4175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t |= RADEON_CULL_BACK;
4185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
4195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_FRONT_AND_BACK:
4205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 s &= ~(RADEON_FFACE_SOLID | RADEON_BFACE_SOLID);
4215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t |= (RADEON_CULL_FRONT | RADEON_CULL_BACK);
4225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
4235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
4245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) {
4275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, set );
4285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] = s;
4295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] != t ) {
4325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl );
4335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] = t;
4345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
437f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonFrontFace( struct gl_context *ctx, GLenum mode )
4385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4394637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
440320b5abda5026f23f327c6f60c1b6287cc507e78smoki   int cull_face = (mode == GL_CW) ? RADEON_FFACE_CULL_CW : RADEON_FFACE_CULL_CCW;
4415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, set );
4435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_FFACE_CULL_DIR_MASK;
4445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, tcl );
4465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_CULL_FRONT_IS_CCW;
4475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
44860e60bb3026a269fefe1cfd3312fdf3a7e4c595fMichel Dänzer   /* Winding is inverted when rendering to FBO */
44947941bfaea6e8a60e2c31f7a2c8c233f2a10ecb1Brian Paul   if (ctx->DrawBuffer && _mesa_is_user_fbo(ctx->DrawBuffer))
450320b5abda5026f23f327c6f60c1b6287cc507e78smoki      cull_face = (mode == GL_CCW) ? RADEON_FFACE_CULL_CW : RADEON_FFACE_CULL_CCW;
451320b5abda5026f23f327c6f60c1b6287cc507e78smoki   rmesa->hw.set.cmd[SET_SE_CNTL] |= cull_face;
45260e60bb3026a269fefe1cfd3312fdf3a7e4c595fMichel Dänzer
453320b5abda5026f23f327c6f60c1b6287cc507e78smoki   if ( mode == GL_CCW )
4545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_CULL_FRONT_IS_CCW;
4555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
4595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Line state
4605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
461f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonLineWidth( struct gl_context *ctx, GLfloat widthf )
4625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4634637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, lin );
4665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, set );
4675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Line width is stored in U6.4 format.
4695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
4705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] = (GLuint)(widthf * 16.0);
4715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( widthf > 1.0 ) {
4725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_WIDELINE_ENABLE;
4735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
4745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_WIDELINE_ENABLE;
4755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
478f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonLineStipple( struct gl_context *ctx, GLint factor, GLushort pattern )
4795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4804637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
4815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, lin );
4837dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   rmesa->hw.lin.cmd[LIN_RE_LINE_PATTERN] =
4845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      ((((GLuint)factor & 0xff) << 16) | ((GLuint)pattern));
4855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
4895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Masks
4905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
491f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonColorMask( struct gl_context *ctx,
4925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     GLboolean r, GLboolean g,
4935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     GLboolean b, GLboolean a )
4945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4954637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
496504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie   struct radeon_renderbuffer *rrb;
497504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie   GLuint mask;
498504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie
499504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie   rrb = radeon_get_colorbuffer(&rmesa->radeon);
500504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie   if (!rrb)
501504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie     return;
502504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie
503504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie   mask = radeonPackColor( rrb->cpp,
504fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul			   ctx->Color.ColorMask[0][RCOMP],
505fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul			   ctx->Color.ColorMask[0][GCOMP],
506fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul			   ctx->Color.ColorMask[0][BCOMP],
507fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul			   ctx->Color.ColorMask[0][ACOMP] );
5085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] != mask ) {
5105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, msk );
5115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] = mask;
5125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
5175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Polygon state
5185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
5195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
520f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonPolygonOffset( struct gl_context *ctx,
5215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				 GLfloat factor, GLfloat units )
5225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5234637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
5248c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie   const GLfloat depthScale = 1.0F / ctx->DrawBuffer->_DepthMaxF;
5258c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie   float_ui32_type constant =  { units * depthScale };
52608e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   float_ui32_type factoru = { factor };
5275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, zbs );
52908e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_FACTOR]   = factoru.ui32;
53008e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_CONSTANT] = constant.ui32;
5315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
533f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonPolygonMode( struct gl_context *ctx, GLenum face, GLenum mode )
5345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5354637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
5365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean flag = (ctx->_TriangleCaps & DD_TRI_UNFILLED) != 0;
5375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Can't generally do unfilled via tcl, but some good special
5397dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle    * cases work.
5405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
5415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_UNFILLED, flag);
5424637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (rmesa->radeon.TclFallback) {
5435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonChooseRenderState( ctx );
5445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonChooseVertexState( ctx );
5455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
5505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Rendering attributes
5515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
5525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * We really don't want to recalculate all this every time we bind a
5535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * texture.  These things shouldn't change all that often, so it makes
5545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * sense to break them out of the core texture state update routines.
5555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
5565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Examine lighting and texture state to determine if separate specular
5585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * should be enabled.
5595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
560f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonUpdateSpecular( struct gl_context *ctx )
5615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5624637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
5635a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell   uint32_t p = rmesa->hw.ctx.cmd[CTX_PP_CNTL];
5642d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger   GLuint flag = 0;
5655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, tcl );
5675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_SPECULAR;
5695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_DIFFUSE;
5705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] &= ~RADEON_TCL_VTX_PK_SPEC;
5715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] &= ~RADEON_TCL_VTX_PK_DIFFUSE;
5725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_LIGHTING_ENABLE;
5735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   p &= ~RADEON_SPECULAR_ENABLE;
5755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_DIFFUSE_SPECULAR_COMBINE;
5775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Light.Enabled &&
5805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) {
5815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_SPECULAR;
5825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_DIFFUSE;
5835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC;
5845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;
5855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE;
5865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      p |=  RADEON_SPECULAR_ENABLE;
5877dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &=
5885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 ~RADEON_DIFFUSE_SPECULAR_COMBINE;
5895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else if (ctx->Light.Enabled) {
5915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_DIFFUSE;
5925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;
5935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE;
5945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else if (ctx->Fog.ColorSumEnabled ) {
5955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC;
5965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;
5975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      p |= RADEON_SPECULAR_ENABLE;
5985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
5995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;
6005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Fog.Enabled) {
6035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC;
6042d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      if (ctx->Fog.FogCoordinateSource == GL_FRAGMENT_DEPTH) {
6052d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_SPECULAR;
6062d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      /* Bizzare: have to leave lighting enabled to get fog. */
6072d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE;
6082d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      }
6092d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      else {
6102d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      /* cannot do tcl fog factor calculation with fog coord source
6112d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger       * (send precomputed factors). Cannot use precomputed fog
6122d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger       * factors together with tcl spec light (need tcl fallback) */
6132d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 flag = (rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &
6142d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	    RADEON_TCL_COMPUTE_SPECULAR) != 0;
6152d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      }
6165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6177dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
6182d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger   TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_FOGCOORDSPEC, flag);
6195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
620decc6e2a32ef49e673c081f30e19b8970155d887Brian Paul   if (_mesa_need_secondary_color(ctx)) {
6215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      assert( (p & RADEON_SPECULAR_ENABLE) != 0 );
6225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
6235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      assert( (p & RADEON_SPECULAR_ENABLE) == 0 );
6245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.ctx.cmd[CTX_PP_CNTL] != p ) {
6275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
6285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_PP_CNTL] = p;
6295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Update vertex/render formats
6325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
6337dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   if (rmesa->radeon.TclFallback) {
6345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonChooseRenderState( ctx );
6355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonChooseVertexState( ctx );
6365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
6415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Materials
6425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
6435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6457dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle/* Update on colormaterial, material emmissive/ambient,
6465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * lightmodel.globalambient
6475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
648f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void update_global_ambient( struct gl_context *ctx )
6495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6504637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
6515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   float *fcmd = (float *)RADEON_DB_STATE( glt );
6525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Need to do more if both emmissive & ambient are PREMULT:
654f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger    * Hope this is not needed for MULT
6555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
6565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ((rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &
6575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       ((3 << RADEON_EMISSIVE_SOURCE_SHIFT) |
6587dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	(3 << RADEON_AMBIENT_SOURCE_SHIFT))) == 0)
6595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
6607dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      COPY_3V( &fcmd[GLT_RED],
6615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_EMISSION]);
6625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      ACC_SCALE_3V( &fcmd[GLT_RED],
6635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		   ctx->Light.Model.Ambient,
6645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		   ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT]);
6657dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   }
6665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else
6675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
6685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      COPY_3V( &fcmd[GLT_RED], ctx->Light.Model.Ambient );
6695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6707dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
6715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_DB_STATECHANGE(rmesa, &rmesa->hw.glt);
6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6747dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle/* Update on change to
6755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *    - light[p].colors
6765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *    - light[p].enabled
6775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
678f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void update_light_colors( struct gl_context *ctx, GLuint p )
6795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct gl_light *l = &ctx->Light.Light[p];
6815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*     fprintf(stderr, "%s\n", __FUNCTION__); */
6835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (l->Enabled) {
6854637235183b80963536f2364e4d50fcb894886ddDave Airlie      r100ContextPtr rmesa = R100_CONTEXT(ctx);
6865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      float *fcmd = (float *)RADEON_DB_STATE( lit[p] );
6875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6887dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      COPY_4V( &fcmd[LIT_AMBIENT_RED], l->Ambient );
6895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      COPY_4V( &fcmd[LIT_DIFFUSE_RED], l->Diffuse );
6905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      COPY_4V( &fcmd[LIT_SPECULAR_RED], l->Specular );
6917dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] );
6935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Also fallback for asym colormaterial mode in twoside lighting...
6975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
698f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void check_twoside_fallback( struct gl_context *ctx )
6995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean fallback = GL_FALSE;
7015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLint i;
7025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Light.Enabled && ctx->Light.Model.TwoSide) {
7045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Light.ColorMaterialEnabled &&
7054cb3579e52fed48d623698610e31d05ac8c8946fBrian Paul	  (ctx->Light._ColorMaterialBitmask & BACK_MATERIAL_BITS) !=
7064cb3579e52fed48d623698610e31d05ac8c8946fBrian Paul	  ((ctx->Light._ColorMaterialBitmask & FRONT_MATERIAL_BITS)<<1))
7075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fallback = GL_TRUE;
7085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else {
7095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 for (i = MAT_ATTRIB_FRONT_AMBIENT; i < MAT_ATTRIB_FRONT_INDEXES; i+=2)
7105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (memcmp( ctx->Light.Material.Attrib[i],
7115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			ctx->Light.Material.Attrib[i+1],
7125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			sizeof(GLfloat)*4) != 0) {
7137dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	       fallback = GL_TRUE;
7145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       break;
7155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
7165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
7175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_LIGHT_TWOSIDE, fallback );
7205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
723f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonColorMaterial( struct gl_context *ctx, GLenum face, GLenum mode )
7245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7254637235183b80963536f2364e4d50fcb894886ddDave Airlie      r100ContextPtr rmesa = R100_CONTEXT(ctx);
7265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint light_model_ctl1 = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL];
7275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
72827889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling      light_model_ctl1 &= ~((3 << RADEON_EMISSIVE_SOURCE_SHIFT) |
72927889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling			   (3 << RADEON_AMBIENT_SOURCE_SHIFT) |
73027889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling			   (3 << RADEON_DIFFUSE_SOURCE_SHIFT) |
7317dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle			   (3 << RADEON_SPECULAR_SOURCE_SHIFT));
7327dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
733f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   if (ctx->Light.ColorMaterialEnabled) {
7344cb3579e52fed48d623698610e31d05ac8c8946fBrian Paul      GLuint mask = ctx->Light._ColorMaterialBitmask;
735f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger
7365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (mask & MAT_BIT_FRONT_EMISSION) {
73727889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling	 light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE <<
7385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     RADEON_EMISSIVE_SOURCE_SHIFT);
7395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
740f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      else {
741f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger	 light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT <<
742f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger			     RADEON_EMISSIVE_SOURCE_SHIFT);
743f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      }
7445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (mask & MAT_BIT_FRONT_AMBIENT) {
74627889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling	 light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE <<
7475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     RADEON_AMBIENT_SOURCE_SHIFT);
7485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
749f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      else {
750f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger	 light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT <<
751f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger			     RADEON_AMBIENT_SOURCE_SHIFT);
752f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      }
7537dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
7545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (mask & MAT_BIT_FRONT_DIFFUSE) {
75527889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling	 light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE <<
7565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     RADEON_DIFFUSE_SOURCE_SHIFT);
7575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
758f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      else {
759f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger	 light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT <<
760f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger			     RADEON_DIFFUSE_SOURCE_SHIFT);
761f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      }
7627dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
7635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (mask & MAT_BIT_FRONT_SPECULAR) {
76427889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling	 light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE <<
7655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     RADEON_SPECULAR_SOURCE_SHIFT);
7665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
767f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      else {
768f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger	 light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT <<
769f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger			     RADEON_SPECULAR_SOURCE_SHIFT);
770f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      }
771f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   }
772f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   else {
773f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   /* Default to MULT:
774f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger    */
775f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << RADEON_EMISSIVE_SOURCE_SHIFT) |
776f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger		   (RADEON_LM_SOURCE_STATE_MULT << RADEON_AMBIENT_SOURCE_SHIFT) |
777f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger		   (RADEON_LM_SOURCE_STATE_MULT << RADEON_DIFFUSE_SOURCE_SHIFT) |
778f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger		   (RADEON_LM_SOURCE_STATE_MULT << RADEON_SPECULAR_SOURCE_SHIFT);
779f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   }
7807dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
7815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (light_model_ctl1 != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]) {
7825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tcl );
7837dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] = light_model_ctl1;
7845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
787f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid radeonUpdateMaterial( struct gl_context *ctx )
7885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7894637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
7905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat (*mat)[4] = ctx->Light.Material.Attrib;
7915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( mtl );
7925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint mask = ~0;
7937dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
7945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Light.ColorMaterialEnabled)
7954cb3579e52fed48d623698610e31d05ac8c8946fBrian Paul      mask &= ~ctx->Light._ColorMaterialBitmask;
7965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7974e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen   if (RADEON_DEBUG & RADEON_STATE)
7985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s\n", __FUNCTION__);
7995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8007dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
8015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_EMISSION) {
8025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_EMMISSIVE_RED]   = mat[MAT_ATTRIB_FRONT_EMISSION][0];
8035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_EMMISSIVE_GREEN] = mat[MAT_ATTRIB_FRONT_EMISSION][1];
8045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_EMMISSIVE_BLUE]  = mat[MAT_ATTRIB_FRONT_EMISSION][2];
8055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_EMMISSIVE_ALPHA] = mat[MAT_ATTRIB_FRONT_EMISSION][3];
8065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_AMBIENT) {
8085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_AMBIENT_RED]     = mat[MAT_ATTRIB_FRONT_AMBIENT][0];
8095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_AMBIENT_GREEN]   = mat[MAT_ATTRIB_FRONT_AMBIENT][1];
8105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_AMBIENT_BLUE]    = mat[MAT_ATTRIB_FRONT_AMBIENT][2];
8115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_AMBIENT_ALPHA]   = mat[MAT_ATTRIB_FRONT_AMBIENT][3];
8125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_DIFFUSE) {
8145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_DIFFUSE_RED]     = mat[MAT_ATTRIB_FRONT_DIFFUSE][0];
8155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_DIFFUSE_GREEN]   = mat[MAT_ATTRIB_FRONT_DIFFUSE][1];
8165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_DIFFUSE_BLUE]    = mat[MAT_ATTRIB_FRONT_DIFFUSE][2];
8175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_DIFFUSE_ALPHA]   = mat[MAT_ATTRIB_FRONT_DIFFUSE][3];
8185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_SPECULAR) {
8205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SPECULAR_RED]    = mat[MAT_ATTRIB_FRONT_SPECULAR][0];
8215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SPECULAR_GREEN]  = mat[MAT_ATTRIB_FRONT_SPECULAR][1];
8225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SPECULAR_BLUE]   = mat[MAT_ATTRIB_FRONT_SPECULAR][2];
8235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SPECULAR_ALPHA]  = mat[MAT_ATTRIB_FRONT_SPECULAR][3];
8245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_SHININESS) {
8265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SHININESS]       = mat[MAT_ATTRIB_FRONT_SHININESS][0];
8275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
829a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer   RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mtl );
8305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
831a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer   check_twoside_fallback( ctx );
832f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger/*   update_global_ambient( ctx );*/
8335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* _NEW_LIGHT
8365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _NEW_MODELVIEW
8375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _MESA_NEW_NEED_EYE_COORDS
8385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
8395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Uses derived state from mesa:
8405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _VP_inf_norm
8415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _h_inf_norm
8425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _Position
8437391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul *       _NormSpotDirection
8445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _ModelViewInvScale
8455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _NeedEyeCoords
8465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _EyeZDir
8475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
8485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * which are calculated in light.c and are correct for the current
8495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * lighting space (model or eye), hence dependencies on _NEW_MODELVIEW
8507dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle * and _MESA_NEW_NEED_EYE_COORDS.
8515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
852f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void update_light( struct gl_context *ctx )
8535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8544637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
8555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Have to check these, or have an automatic shortcircuit mechanism
8575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * to remove noop statechanges. (Or just do a better job on the
8585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * front end).
8595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
8605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
8615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint tmp = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL];
8625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->_NeedEyeCoords)
8645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tmp &= ~RADEON_LIGHT_IN_MODELSPACE;
8655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
8665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tmp |= RADEON_LIGHT_IN_MODELSPACE;
8677dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
8685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Leave this test disabled: (unexplained q3 lockup) (even with
8705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         new packets)
8715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      */
8727dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      if (tmp != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL])
8735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      {
8745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tcl );
8755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] = tmp;
8765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
8775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
8805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( eye );
8815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[EYE_X] = ctx->_EyeZDir[0];
8825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[EYE_Y] = ctx->_EyeZDir[1];
8835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[EYE_Z] = - ctx->_EyeZDir[2];
8845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[EYE_RESCALE_FACTOR] = ctx->_ModelViewInvScale;
8855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.eye );
8865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Light.Enabled) {
8915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLint p;
8925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      for (p = 0 ; p < MAX_LIGHTS; p++) {
8935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (ctx->Light.Light[p].Enabled) {
8945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    struct gl_light *l = &ctx->Light.Light[p];
8955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( lit[p] );
8967dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
8975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (l->EyePosition[3] == 0.0) {
8987dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	       COPY_3FV( &fcmd[LIT_POSITION_X], l->_VP_inf_norm );
8997dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	       COPY_3FV( &fcmd[LIT_DIRECTION_X], l->_h_inf_norm );
9005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_POSITION_W] = 0;
9015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_DIRECTION_W] = 0;
9025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    } else {
9035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       COPY_4V( &fcmd[LIT_POSITION_X], l->_Position );
9047391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul	       fcmd[LIT_DIRECTION_X] = -l->_NormSpotDirection[0];
9057391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul	       fcmd[LIT_DIRECTION_Y] = -l->_NormSpotDirection[1];
9067391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul	       fcmd[LIT_DIRECTION_Z] = -l->_NormSpotDirection[2];
9075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_DIRECTION_W] = 0;
9085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
9095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] );
9115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
9125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
9135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
9155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
916f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonLightfv( struct gl_context *ctx, GLenum light,
9175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			   GLenum pname, const GLfloat *params )
9185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
9194637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
9205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLint p = light - GL_LIGHT0;
9215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct gl_light *l = &ctx->Light.Light[p];
9225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat *fcmd = (GLfloat *)rmesa->hw.lit[p].cmd;
9237dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
9245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (pname) {
9267dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   case GL_AMBIENT:
9275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DIFFUSE:
9285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SPECULAR:
9295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      update_light_colors( ctx, p );
9305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9327dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   case GL_SPOT_DIRECTION:
9337dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      /* picked up in update_light */
9345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POSITION: {
9377dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      /* positions picked up in update_light, but can do flag here */
9385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint flag;
9395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;
9405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* FIXME: Set RANGE_ATTEN only when needed */
9427dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      if (p&1)
9435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 flag = RADEON_LIGHT_1_IS_LOCAL;
9445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
9455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 flag = RADEON_LIGHT_0_IS_LOCAL;
9465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
9485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (l->EyePosition[3] != 0.0F)
9495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[idx] |= flag;
9505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
9515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[idx] &= ~flag;
9525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SPOT_EXPONENT:
9565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
9575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_SPOT_EXPONENT] = params[0];
9585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SPOT_CUTOFF: {
9615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint flag = (p&1) ? RADEON_LIGHT_1_IS_SPOT : RADEON_LIGHT_0_IS_SPOT;
9625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;
9635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
9655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_SPOT_CUTOFF] = l->_CosCutoff;
9665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
9685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (l->SpotCutoff != 180.0F)
9695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[idx] |= flag;
9705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
9715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[idx] &= ~flag;
9725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_ATTENUATION:
9775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
9785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_ATTEN_CONST] = params[0];
9795d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      if ( params[0] == 0.0 )
9805d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 fcmd[LIT_ATTEN_CONST_INV] = FLT_MAX;
9815d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      else
9825d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 fcmd[LIT_ATTEN_CONST_INV] = 1.0 / params[0];
9835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINEAR_ATTENUATION:
9855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
9865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_ATTEN_LINEAR] = params[0];
9875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_QUADRATIC_ATTENUATION:
9895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
9905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_ATTEN_QUADRATIC] = params[0];
9915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
9935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
9945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Set RANGE_ATTEN only when needed */
9975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (pname) {
9985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POSITION:
9995d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer   case GL_CONSTANT_ATTENUATION:
10005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINEAR_ATTENUATION:
10015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_QUADRATIC_ATTENUATION:
10025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
10035d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      GLuint *icmd = (GLuint *)RADEON_DB_STATE( tcl );
10045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;
10055d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      GLuint atten_flag = ( p&1 ) ? RADEON_LIGHT_1_ENABLE_RANGE_ATTEN
10065d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer				  : RADEON_LIGHT_0_ENABLE_RANGE_ATTEN;
10075d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      GLuint atten_const_flag = ( p&1 ) ? RADEON_LIGHT_1_CONSTANT_RANGE_ATTEN
10085d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer				  : RADEON_LIGHT_0_CONSTANT_RANGE_ATTEN;
10095d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer
10105d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      if ( l->EyePosition[3] == 0.0F ||
10115d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	   ( ( fcmd[LIT_ATTEN_CONST] == 0.0 || fcmd[LIT_ATTEN_CONST] == 1.0 ) &&
10125d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	     fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) ) {
10135d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 /* Disable attenuation */
10145d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 icmd[idx] &= ~atten_flag;
10155d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      } else {
10165d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 if ( fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) {
10175d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    /* Enable only constant portion of attenuation calculation */
10185d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    icmd[idx] |= ( atten_flag | atten_const_flag );
10195d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 } else {
10205d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    /* Enable full attenuation calculation */
10215d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    icmd[idx] &= ~atten_const_flag;
10225d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    icmd[idx] |= atten_flag;
10235d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 }
10245d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      }
10255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10265d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.tcl );
10275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
10305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
10335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10347dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
10355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1037f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonLightModelfv( struct gl_context *ctx, GLenum pname,
10385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				const GLfloat *param )
10395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
10404637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
10415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (pname) {
10437dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      case GL_LIGHT_MODEL_AMBIENT:
10445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 update_global_ambient( ctx );
10455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
10465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LIGHT_MODEL_LOCAL_VIEWER:
10485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tcl );
10495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (ctx->Light.Model.LocalViewer)
10505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LOCAL_VIEWER;
10515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 else
10525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_LOCAL_VIEWER;
10535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         break;
10545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LIGHT_MODEL_TWO_SIDE:
10565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tcl );
10575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (ctx->Light.Model.TwoSide)
10585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_LIGHT_TWOSIDE;
10595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 else
10605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_LIGHT_TWOSIDE;
10615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 check_twoside_fallback( ctx );
10635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10644637235183b80963536f2364e4d50fcb894886ddDave Airlie	 if (rmesa->radeon.TclFallback) {
10655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    radeonChooseRenderState( ctx );
10665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    radeonChooseVertexState( ctx );
10675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
10685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         break;
10695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LIGHT_MODEL_COLOR_CONTROL:
10715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonUpdateSpecular(ctx);
10725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         break;
10735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      default:
10755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         break;
10765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
10785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1079f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonShadeModel( struct gl_context *ctx, GLenum mode )
10805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
10814637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
10825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL];
10835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   s &= ~(RADEON_DIFFUSE_SHADE_MASK |
10855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  RADEON_ALPHA_SHADE_MASK |
10865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  RADEON_SPECULAR_SHADE_MASK |
10875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  RADEON_FOG_SHADE_MASK);
10885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( mode ) {
10905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FLAT:
10915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      s |= (RADEON_DIFFUSE_SHADE_FLAT |
10925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_ALPHA_SHADE_FLAT |
10935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_SPECULAR_SHADE_FLAT |
10945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_FOG_SHADE_FLAT);
10955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SMOOTH:
10975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      s |= (RADEON_DIFFUSE_SHADE_GOURAUD |
10985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_ALPHA_SHADE_GOURAUD |
10995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_SPECULAR_SHADE_GOURAUD |
11005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_FOG_SHADE_GOURAUD);
11015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
11035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
11045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
11055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) {
11075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, set );
11085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] = s;
11095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
11105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
11115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
11145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * User clip planes
11155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
11165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1117f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonClipPlane( struct gl_context *ctx, GLenum plane, const GLfloat *eq )
11185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
11195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLint p = (GLint) plane - (GLint) GL_CLIP_PLANE0;
11204637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
11215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p];
11225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ucp[p] );
11245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ucp[p].cmd[UCP_X] = ip[0];
11255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1];
11265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2];
11275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ucp[p].cmd[UCP_W] = ip[3];
11285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
11295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1130f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonUpdateClipPlanes( struct gl_context *ctx )
11315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
11324637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
11335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint p;
11345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for (p = 0; p < ctx->Const.MaxClipPlanes; p++) {
11365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Transform.ClipPlanesEnabled & (1 << p)) {
11375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p];
11385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, ucp[p] );
11405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ucp[p].cmd[UCP_X] = ip[0];
11415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1];
11425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2];
11435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ucp[p].cmd[UCP_W] = ip[3];
11445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
11455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
11465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
11475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
11505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Stencil
11515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
11525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1153878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void
1154f9995b30756140724f41daf963fa06167912be7fKristian HøgsbergradeonStencilFuncSeparate( struct gl_context *ctx, GLenum face, GLenum func,
1155878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul                           GLint ref, GLuint mask )
11565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
11574637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
115871b2504e0390fa19f133647c8686d830f8f40eb6Keith Whitwell   GLuint refmask = (((ctx->Stencil.Ref[0] & 0xff) << RADEON_STENCIL_REF_SHIFT) |
115971b2504e0390fa19f133647c8686d830f8f40eb6Keith Whitwell		     ((ctx->Stencil.ValueMask[0] & 0xff) << RADEON_STENCIL_MASK_SHIFT));
11605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
11625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, msk );
11635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_STENCIL_TEST_MASK;
11655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~(RADEON_STENCIL_REF_MASK|
11665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul						   RADEON_STENCIL_VALUE_MASK);
11675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Stencil.Function[0] ) {
11695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NEVER:
11705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_NEVER;
11715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LESS:
11735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_LESS;
11745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_EQUAL:
11765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_EQUAL;
11775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LEQUAL:
11795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_LEQUAL;
11805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GREATER:
11825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_GREATER;
11835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NOTEQUAL:
11855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_NEQUAL;
11865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GEQUAL:
11885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_GEQUAL;
11895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALWAYS:
11915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_ALWAYS;
11925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
11945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |= refmask;
11965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
11975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1198878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void
1199f9995b30756140724f41daf963fa06167912be7fKristian HøgsbergradeonStencilMaskSeparate( struct gl_context *ctx, GLenum face, GLuint mask )
12005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
12014637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
12025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, msk );
12045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~RADEON_STENCIL_WRITE_MASK;
12055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |=
120671b2504e0390fa19f133647c8686d830f8f40eb6Keith Whitwell      ((ctx->Stencil.WriteMask[0] & 0xff) << RADEON_STENCIL_WRITEMASK_SHIFT);
12075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
12085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1209f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonStencilOpSeparate( struct gl_context *ctx, GLenum face, GLenum fail,
1210878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul                                     GLenum zfail, GLenum zpass )
12115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
12124637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
12135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1214de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   /* radeon 7200 have stencil bug, DEC and INC_WRAP will actually both do DEC_WRAP,
1215de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      and DEC_WRAP (and INVERT) will do INVERT. No way to get correct INC_WRAP and DEC,
1216de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      but DEC_WRAP can be fixed by using DEC and INC_WRAP at least use INC. */
12177dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
1218de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   GLuint tempRADEON_STENCIL_FAIL_DEC_WRAP;
1219de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   GLuint tempRADEON_STENCIL_FAIL_INC_WRAP;
1220de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   GLuint tempRADEON_STENCIL_ZFAIL_DEC_WRAP;
1221de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   GLuint tempRADEON_STENCIL_ZFAIL_INC_WRAP;
1222de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   GLuint tempRADEON_STENCIL_ZPASS_DEC_WRAP;
1223de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   GLuint tempRADEON_STENCIL_ZPASS_INC_WRAP;
12247dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
12254637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (rmesa->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_BROKEN_STENCIL) {
1226de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_FAIL_DEC_WRAP = RADEON_STENCIL_FAIL_DEC;
1227de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_FAIL_INC_WRAP = RADEON_STENCIL_FAIL_INC;
1228de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZFAIL_DEC_WRAP = RADEON_STENCIL_ZFAIL_DEC;
1229de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZFAIL_INC_WRAP = RADEON_STENCIL_ZFAIL_INC;
1230de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZPASS_DEC_WRAP = RADEON_STENCIL_ZPASS_DEC;
1231de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZPASS_INC_WRAP = RADEON_STENCIL_ZPASS_INC;
1232de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   }
1233de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   else {
1234de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_FAIL_DEC_WRAP = RADEON_STENCIL_FAIL_DEC_WRAP;
1235de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_FAIL_INC_WRAP = RADEON_STENCIL_FAIL_INC_WRAP;
1236de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZFAIL_DEC_WRAP = RADEON_STENCIL_ZFAIL_DEC_WRAP;
1237de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZFAIL_INC_WRAP = RADEON_STENCIL_ZFAIL_INC_WRAP;
1238de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZPASS_DEC_WRAP = RADEON_STENCIL_ZPASS_DEC_WRAP;
1239de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZPASS_INC_WRAP = RADEON_STENCIL_ZPASS_INC_WRAP;
1240de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   }
12417dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
12425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
12435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~(RADEON_STENCIL_FAIL_MASK |
12445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul					       RADEON_STENCIL_ZFAIL_MASK |
12455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul					       RADEON_STENCIL_ZPASS_MASK);
12465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Stencil.FailFunc[0] ) {
12485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_KEEP:
12495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_KEEP;
12505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
12525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_ZERO;
12535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_REPLACE:
12555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_REPLACE;
12565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INCR:
12585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_INC;
12595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DECR:
12615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_DEC;
12625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1263de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   case GL_INCR_WRAP:
1264de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_FAIL_INC_WRAP;
1265de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      break;
1266de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   case GL_DECR_WRAP:
1267de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_FAIL_DEC_WRAP;
1268de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      break;
12695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INVERT:
12705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_INVERT;
12715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
12735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Stencil.ZFailFunc[0] ) {
12755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_KEEP:
12765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_KEEP;
12775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
12795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_ZERO;
12805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_REPLACE:
12825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_REPLACE;
12835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INCR:
12855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_INC;
12865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DECR:
12885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_DEC;
12895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1290de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   case GL_INCR_WRAP:
1291de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZFAIL_INC_WRAP;
1292de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      break;
1293de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   case GL_DECR_WRAP:
1294de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZFAIL_DEC_WRAP;
1295de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      break;
12965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INVERT:
12975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_INVERT;
12985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
13005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Stencil.ZPassFunc[0] ) {
13025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_KEEP:
13035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_KEEP;
13045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
13065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_ZERO;
13075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_REPLACE:
13095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_REPLACE;
13105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INCR:
13125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_INC;
13135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DECR:
13155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_DEC;
13165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1317de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   case GL_INCR_WRAP:
1318de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZPASS_INC_WRAP;
1319de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      break;
1320de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   case GL_DECR_WRAP:
1321de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZPASS_DEC_WRAP;
1322de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      break;
13235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INVERT:
13245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_INVERT;
13255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
13275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
13285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
13325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Window position and viewport transformation
13335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
13345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
13365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * To correctly position primitives:
13375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
13385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define SUBPIXEL_X 0.125
13395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define SUBPIXEL_Y 0.125
13405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
134116e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul
134216e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul/**
134316e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul * Called when window size or position changes or viewport or depth range
134416e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul * state is changed.  We update the hardware viewport state here.
134516e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul */
1346f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid radeonUpdateWindow( struct gl_context *ctx )
13475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
13484637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
1349d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIdrawable *dPriv = radeon_get_drawable(&rmesa->radeon);
1350d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg   GLfloat xoffset = 0.0;
1351d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg   GLfloat yoffset = dPriv ? (GLfloat) dPriv->h : 0;
13525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const GLfloat *v = ctx->Viewport._WindowMap.m;
135347941bfaea6e8a60e2c31f7a2c8c233f2a10ecb1Brian Paul   const GLboolean render_to_fbo = (ctx->DrawBuffer ? _mesa_is_user_fbo(ctx->DrawBuffer) : 0);
13548c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie   const GLfloat depthScale = 1.0F / ctx->DrawBuffer->_DepthMaxF;
13556c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie   GLfloat y_scale, y_bias;
13566c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie
13576c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie   if (render_to_fbo) {
13586c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie      y_scale = 1.0;
13596c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie      y_bias = 0;
13606c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie   } else {
13616c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie      y_scale = -1.0;
13626c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie      y_bias = yoffset;
13636c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie   }
13645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
136508e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   float_ui32_type sx = { v[MAT_SX] };
136608e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   float_ui32_type tx = { v[MAT_TX] + xoffset + SUBPIXEL_X };
13676c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie   float_ui32_type sy = { v[MAT_SY] * y_scale };
13686c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie   float_ui32_type ty = { (v[MAT_TY] * y_scale) + y_bias + SUBPIXEL_Y };
13698c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie   float_ui32_type sz = { v[MAT_SZ] * depthScale };
13708c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie   float_ui32_type tz = { v[MAT_TZ] * depthScale };
137108e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger
13725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, vpt );
13735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
137408e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE]  = sx.ui32;
137508e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = tx.ui32;
137608e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE]  = sy.ui32;
137708e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = ty.ui32;
137808e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE]  = sz.ui32;
137908e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = tz.ui32;
13805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
13815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1383f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonViewport( struct gl_context *ctx, GLint x, GLint y,
13845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			    GLsizei width, GLsizei height )
13855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
13865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Don't pipeline viewport changes, conflict with window offset
13875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * setting below.  Could apply deltas to rescue pipelined viewport
13885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * values, or keep the originals hanging around.
13895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
13905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonUpdateWindow( ctx );
13912b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie
13922b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie   radeon_viewport(ctx, x, y, width, height);
13935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
13945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1395f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonDepthRange( struct gl_context *ctx, GLclampd nearval,
13965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			      GLclampd farval )
13975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
13985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonUpdateWindow( ctx );
13995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
14005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1401f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid radeonUpdateViewportOffset( struct gl_context *ctx )
14025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
14034637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
1404d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIdrawable *dPriv = radeon_get_drawable(&rmesa->radeon);
1405d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg   GLfloat xoffset = 0.0;
1406d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg   GLfloat yoffset = (GLfloat)dPriv->h;
14075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const GLfloat *v = ctx->Viewport._WindowMap.m;
14085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
140908e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   float_ui32_type tx;
141008e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   float_ui32_type ty;
141108e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger
141208e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   tx.f = v[MAT_TX] + xoffset + SUBPIXEL_X;
141308e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   ty.f = (- v[MAT_TY]) + yoffset + SUBPIXEL_Y;
14145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
141508e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   if ( rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] != tx.ui32 ||
141608e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger	rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] != ty.ui32 )
14175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
14185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Note: this should also modify whatever data the context reset
14195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       * code uses...
14205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
142108e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger      RADEON_STATECHANGE( rmesa, vpt );
142208e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger      rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = tx.ui32;
142308e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger      rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = ty.ui32;
142408e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger
14255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* update polygon stipple x/y screen offset */
14265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      {
14275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         GLuint stx, sty;
14285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         GLuint m = rmesa->hw.msc.cmd[MSC_RE_MISC];
14295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         m &= ~(RADEON_STIPPLE_X_OFFSET_MASK |
14315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                RADEON_STIPPLE_Y_OFFSET_MASK);
14325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         /* add magic offsets, then invert */
1434d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg         stx = 31 - ((-1) & RADEON_STIPPLE_COORD_MASK);
1435d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg         sty = 31 - ((dPriv->h - 1)
14365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                     & RADEON_STIPPLE_COORD_MASK);
14375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         m |= ((stx << RADEON_STIPPLE_X_OFFSET_SHIFT) |
14395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul               (sty << RADEON_STIPPLE_Y_OFFSET_SHIFT));
14405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         if ( rmesa->hw.msc.cmd[MSC_RE_MISC] != m ) {
14425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            RADEON_STATECHANGE( rmesa, msc );
14435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.msc.cmd[MSC_RE_MISC] = m;
14445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         }
14455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
14465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
14475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonUpdateScissor( ctx );
14495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
14505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
14545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Miscellaneous
14555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
14565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1457f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonRenderMode( struct gl_context *ctx, GLenum mode )
14585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
14594637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
14605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   FALLBACK( rmesa, RADEON_FALLBACK_RENDER_MODE, (mode != GL_RENDER) );
14615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
14625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic GLuint radeon_rop_tab[] = {
14655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_CLEAR,
14665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_AND,
14675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_AND_REVERSE,
14685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_COPY,
14695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_AND_INVERTED,
14705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_NOOP,
14715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_XOR,
14725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_OR,
14735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_NOR,
14745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_EQUIV,
14755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_INVERT,
14765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_OR_REVERSE,
14775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_COPY_INVERTED,
14785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_OR_INVERTED,
14795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_NAND,
14805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_SET,
14815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
14825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1483f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonLogicOpCode( struct gl_context *ctx, GLenum opcode )
14845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
14854637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
14865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint rop = (GLuint)opcode - GL_CLEAR;
14875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ASSERT( rop < 16 );
14895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, msk );
14915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.msk.cmd[MSK_RB3D_ROPCNTL] = radeon_rop_tab[rop];
14925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
14935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
14955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * State enable/disable
14965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
14975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1498f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonEnable( struct gl_context *ctx, GLenum cap, GLboolean state )
14995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
15004637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
15015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint p, flag;
15025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15034e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen   if ( RADEON_DEBUG & RADEON_STATE )
15045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf( stderr, "%s( %s = %s )\n", __FUNCTION__,
15055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       _mesa_lookup_enum_by_nr( cap ),
15065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       state ? "GL_TRUE" : "GL_FALSE" );
15075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( cap ) {
15095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Fast track this one...
15105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
15115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_1D:
15125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_2D:
15135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_3D:
15145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
15155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALPHA_TEST:
15175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
15185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state) {
15195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_ALPHA_TEST_ENABLE;
15205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
15215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ALPHA_TEST_ENABLE;
15225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
15235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
15245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_BLEND:
15265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
15275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state) {
15285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_ALPHA_BLEND_ENABLE;
15295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
15305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ALPHA_BLEND_ENABLE;
15315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1532888b1a9166abfb1b2873cf7c1eb2daf45a26c84fRoland Scheidegger      if ( (ctx->Color.ColorLogicOpEnabled || (ctx->Color.BlendEnabled
153374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul	    && ctx->Color.Blend[0].EquationRGB == GL_LOGIC_OP)) ) {
15345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_ROP_ENABLE;
15355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
15365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE;
15375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
15385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Catch a possible fallback:
15405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
15415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state) {
1542c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick	 ctx->Driver.BlendEquationSeparate( ctx,
154374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul					    ctx->Color.Blend[0].EquationRGB,
154474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul					    ctx->Color.Blend[0].EquationA );
154574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul	 ctx->Driver.BlendFuncSeparate( ctx, ctx->Color.Blend[0].SrcRGB,
154674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul					ctx->Color.Blend[0].DstRGB,
154774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul					ctx->Color.Blend[0].SrcA,
154874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul					ctx->Color.Blend[0].DstA );
15495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
15505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else {
15515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 FALLBACK( rmesa, RADEON_FALLBACK_BLEND_FUNC, GL_FALSE );
15525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 FALLBACK( rmesa, RADEON_FALLBACK_BLEND_EQ, GL_FALSE );
15535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
15545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
15555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE0:
15575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE1:
15585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE2:
15595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE3:
15605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE4:
15617dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   case GL_CLIP_PLANE5:
15625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      p = cap-GL_CLIP_PLANE0;
15635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, tcl );
15645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state) {
15655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= (RADEON_UCP_ENABLE_0<<p);
15665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonClipPlane( ctx, cap, NULL );
15675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
15685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else {
15695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~(RADEON_UCP_ENABLE_0<<p);
15705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
15715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
15725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_COLOR_MATERIAL:
15745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonColorMaterial( ctx, 0, 0 );
1575a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer      radeonUpdateMaterial( ctx );
15765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
15775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CULL_FACE:
15795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonCullFace( ctx, 0 );
15805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
15815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DEPTH_TEST:
15835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, ctx );
15845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
15855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_Z_ENABLE;
15865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
15875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_Z_ENABLE;
15885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
15895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
15905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DITHER:
15925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, ctx );
15935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
15945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_DITHER_ENABLE;
1595d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~rmesa->radeon.state.color.roundEnable;
15965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
15975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_DITHER_ENABLE;
1598d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  rmesa->radeon.state.color.roundEnable;
15995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
16005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG:
16035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, ctx );
16045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
16055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_FOG_ENABLE;
16062c28dd892cfb43445d7e54df8b6a8331192f4e99Brian Paul	 radeonFogfv( ctx, GL_FOG_MODE, NULL );
16075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
16085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_FOG_ENABLE;
16095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE(rmesa, tcl);
16105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_TCL_FOG_MASK;
16115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
16125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateSpecular( ctx ); /* for PK_SPEC */
16135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      _mesa_allow_light_in_model( ctx, !state );
16145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT0:
16175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT1:
16185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT2:
16195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT3:
16205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT4:
16215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT5:
16225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT6:
16235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT7:
16245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
16255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      p = cap - GL_LIGHT0;
16267dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      if (p&1)
16275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 flag = (RADEON_LIGHT_1_ENABLE |
16287dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle		 RADEON_LIGHT_1_ENABLE_AMBIENT |
16295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 RADEON_LIGHT_1_ENABLE_SPECULAR);
16305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
16315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 flag = (RADEON_LIGHT_0_ENABLE |
16327dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle		 RADEON_LIGHT_0_ENABLE_AMBIENT |
16335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 RADEON_LIGHT_0_ENABLE_SPECULAR);
16345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state)
16365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] |= flag;
16375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
16385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] &= ~flag;
16395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16407dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      /*
16415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
16425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      update_light_colors( ctx, p );
16435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHTING:
16465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
16475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateSpecular(ctx);
16485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      check_twoside_fallback( ctx );
16495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINE_SMOOTH:
16525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
16535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
16545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_ANTI_ALIAS_LINE;
16555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
16565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ANTI_ALIAS_LINE;
16575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
16585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINE_STIPPLE:
16615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
16625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
16635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_PATTERN_ENABLE;
16645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
16655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_PATTERN_ENABLE;
16665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
16675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_COLOR_LOGIC_OP:
16705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
1671888b1a9166abfb1b2873cf7c1eb2daf45a26c84fRoland Scheidegger      if ( (ctx->Color.ColorLogicOpEnabled || (ctx->Color.BlendEnabled
167274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul	    && ctx->Color.Blend[0].EquationRGB == GL_LOGIC_OP)) ) {
16735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_ROP_ENABLE;
16745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
16755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE;
16765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
16775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16787dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
16795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NORMALIZE:
16805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, tcl );
16815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
16825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |=  RADEON_NORMALIZE_NORMALS;
16835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
16845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_NORMALIZE_NORMALS;
16855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
16865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_OFFSET_POINT:
168930f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      RADEON_STATECHANGE( rmesa, set );
169030f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      if ( state ) {
169130f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_ZBIAS_ENABLE_POINT;
169230f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      } else {
169330f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_POINT;
16945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
16955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_OFFSET_LINE:
169830f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      RADEON_STATECHANGE( rmesa, set );
169930f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      if ( state ) {
170030f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_ZBIAS_ENABLE_LINE;
170130f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      } else {
170230f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_LINE;
17035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_OFFSET_FILL:
170730f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      RADEON_STATECHANGE( rmesa, set );
170830f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      if ( state ) {
170930f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_ZBIAS_ENABLE_TRI;
171030f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      } else {
171130f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_TRI;
17125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_SMOOTH:
17165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
17175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
17185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_ANTI_ALIAS_POLY;
17195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
17205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ANTI_ALIAS_POLY;
17215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_STIPPLE:
17255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, ctx );
17265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
17275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_STIPPLE_ENABLE;
17285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
17295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_STIPPLE_ENABLE;
17305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RESCALE_NORMAL_EXT: {
17345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLboolean tmp = ctx->_NeedEyeCoords ? state : !state;
17355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, tcl );
17365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( tmp ) {
17375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |=  RADEON_RESCALE_NORMALS;
17385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
17395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_RESCALE_NORMALS;
17405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
17435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SCISSOR_TEST:
17451090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie      radeon_firevertices(&rmesa->radeon);
1746d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie      rmesa->radeon.state.scissor.enabled = state;
17475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateScissor( ctx );
17485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_STENCIL_TEST:
17518c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie      {
17528c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	 GLboolean hw_stencil = GL_FALSE;
17538c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	 if (ctx->DrawBuffer) {
17548c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    struct radeon_renderbuffer *rrbStencil
17558c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	       = radeon_get_renderbuffer(ctx->DrawBuffer, BUFFER_STENCIL);
17568c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    hw_stencil = (rrbStencil && rrbStencil->bo);
17578c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	 }
17588c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
17598c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	 if (hw_stencil) {
17608c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    RADEON_STATECHANGE( rmesa, ctx );
17618c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    if ( state ) {
17628c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	       rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_STENCIL_ENABLE;
17638c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    } else {
17648c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	       rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_STENCIL_ENABLE;
17658c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    }
17665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 } else {
17678c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    FALLBACK( rmesa, RADEON_FALLBACK_STENCIL, state );
17685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
17695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_GEN_Q:
17735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_GEN_R:
17745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_GEN_S:
17755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_GEN_T:
17765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Picked up in radeonUpdateTextureState.
17775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
17787dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      rmesa->recheck_texgen[ctx->Texture.CurrentUnit] = GL_TRUE;
17795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_COLOR_SUM_EXT:
17825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateSpecular ( ctx );
17835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
17865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
17875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
17885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
17895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1791f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonLightingSpaceChange( struct gl_context *ctx )
17925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
17934637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
17945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean tmp;
17955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, tcl );
17965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17974e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen   if (RADEON_DEBUG & RADEON_STATE)
17985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s %d BEFORE %x\n", __FUNCTION__, ctx->_NeedEyeCoords,
17995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]);
18005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->_NeedEyeCoords)
18025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tmp = ctx->Transform.RescaleNormals;
18035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else
18045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tmp = !ctx->Transform.RescaleNormals;
18055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( tmp ) {
18075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |=  RADEON_RESCALE_NORMALS;
18085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
18095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_RESCALE_NORMALS;
18105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
18115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18124e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen   if (RADEON_DEBUG & RADEON_STATE)
18135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s %d AFTER %x\n", __FUNCTION__, ctx->_NeedEyeCoords,
18145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]);
18155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
18165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
18185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Deferred state management - matrices, textures, other?
18195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
18205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1821a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger
18224637235183b80963536f2364e4d50fcb894886ddDave Airlievoid radeonUploadTexMatrix( r100ContextPtr rmesa,
1823a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger			    int unit, GLboolean swapcols )
1824a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger{
1825a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger/* Here's how this works: on r100, only 3 tex coords can be submitted, so the
1826a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   vector looks like this probably: (s t r|q 0) (not sure if the last coord
1827a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   is hardwired to 0, could be 1 too). Interestingly, it actually looks like
1828a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   texgen generates all 4 coords, at least tests with projtex indicated that.
1829a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   So: if we need the q coord in the end (solely determined by the texture
1830a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   target, i.e. 2d / 1d / texrect targets) we swap the third and 4th row.
1831a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   Additionally, if we don't have texgen but 4 tex coords submitted, we swap
1832fab1f07d6ad01463897ae792f4b33738afb07369Jeff Smith   column 3 and 4 (for the 2d / 1d / texrect targets) since the q coord
1833a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   will get submitted in the "wrong", i.e. 3rd, slot.
1834a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   If an app submits 3 coords for 2d targets, we assume it is saving on vertex
1835a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   size and using the texture matrix to swap the r and q coords around (ut2k3
1836a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   does exactly that), so we don't need the 3rd / 4th column swap - still need
1837a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   the 3rd / 4th row swap of course. This will potentially break for apps which
1838a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   use TexCoord3x just for fun. Additionally, it will never work if an app uses
1839a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   an "advanced" texture matrix and relies on all 4 texcoord inputs to generate
1840a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   the maximum needed 3. This seems impossible to do with hw tcl on r100, and
1841a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   incredibly hard to detect so we can't just fallback in such a case. Assume
1842a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   it never happens... - rs
1843a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger*/
1844a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger
1845a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   int idx = TEXMAT_0 + unit;
1846a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   float *dest = ((float *)RADEON_DB_STATE( mat[idx] )) + MAT_ELT_0;
1847a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   int i;
18484637235183b80963536f2364e4d50fcb894886ddDave Airlie   struct gl_texture_unit tUnit = rmesa->radeon.glCtx->Texture.Unit[unit];
184911f763f5057490477a2771febe8923682f6a5adaRoland Scheidegger   GLfloat *src = rmesa->tmpmat[unit].m;
1850a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger
1851a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   rmesa->TexMatColSwap &= ~(1 << unit);
1852a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   if ((tUnit._ReallyEnabled & (TEXTURE_3D_BIT | TEXTURE_CUBE_BIT)) == 0) {
1853a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      if (swapcols) {
1854a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 rmesa->TexMatColSwap |= 1 << unit;
1855a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 /* attention some elems are swapped 2 times! */
1856a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[0];
1857a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[4];
1858a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[12];
1859a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[8];
1860a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[1];
1861a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[5];
1862a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[13];
1863a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[9];
1864a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[2];
1865a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[6];
1866a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[15];
1867a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[11];
1868a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 /* those last 4 are probably never used */
1869a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[3];
1870a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[7];
1871a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[14];
1872a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[10];
1873a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      }
1874a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      else {
1875a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 for (i = 0; i < 2; i++) {
1876a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i];
1877a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i+4];
1878a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i+8];
1879a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i+12];
1880a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 }
1881a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 for (i = 3; i >= 2; i--) {
1882a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i];
1883a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i+4];
1884a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i+8];
1885a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i+12];
1886a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 }
1887a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      }
1888a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   }
1889a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   else {
1890a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      for (i = 0 ; i < 4 ; i++) {
1891a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[i];
1892a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[i+4];
1893a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[i+8];
1894a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[i+12];
1895a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      }
1896a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   }
18975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1898a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );
1899a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger}
19005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19024637235183b80963536f2364e4d50fcb894886ddDave Airliestatic void upload_matrix( r100ContextPtr rmesa, GLfloat *src, int idx )
19035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
19045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   float *dest = ((float *)RADEON_DB_STATE( mat[idx] ))+MAT_ELT_0;
19055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i;
19065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for (i = 0 ; i < 4 ; i++) {
19095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      *dest++ = src[i];
19105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      *dest++ = src[i+4];
19115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      *dest++ = src[i+8];
19125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      *dest++ = src[i+12];
19135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
19145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );
19165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
19175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19184637235183b80963536f2364e4d50fcb894886ddDave Airliestatic void upload_matrix_t( r100ContextPtr rmesa, GLfloat *src, int idx )
19195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
19205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   float *dest = ((float *)RADEON_DB_STATE( mat[idx] ))+MAT_ELT_0;
19215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   memcpy(dest, src, 16*sizeof(float));
19225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );
19235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
19245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1926f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void update_texturematrix( struct gl_context *ctx )
19275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
19284637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT( ctx );
19295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint tpc = rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL];
19305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint vs = rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL];
19315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int unit;
1932a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   GLuint texMatEnabled = 0;
1933a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   rmesa->NeedTexMatrix = 0;
1934a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   rmesa->TexMatColSwap = 0;
19355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
193630daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger   for (unit = 0 ; unit < ctx->Const.MaxTextureUnits; unit++) {
1937a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      if (ctx->Texture.Unit[unit]._ReallyEnabled) {
1938a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 GLboolean needMatrix = GL_FALSE;
1939a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 if (ctx->TextureMatrixStack[unit].Top->type != MATRIX_IDENTITY) {
1940a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    needMatrix = GL_TRUE;
1941a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    texMatEnabled |= (RADEON_TEXGEN_TEXMAT_0_ENABLE |
1942a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger			      RADEON_TEXMAT_0_ENABLE) << unit;
1943a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger
1944a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    if (rmesa->TexGenEnabled & (RADEON_TEXMAT_0_ENABLE << unit)) {
1945a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	       /* Need to preconcatenate any active texgen
1946a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	        * obj/eyeplane matrices:
1947a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	        */
1948a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	       _math_matrix_mul_matrix( &rmesa->tmpmat[unit],
194984c9e671edcc1358307879491bddef9f7d96f14bRoland Scheidegger				     ctx->TextureMatrixStack[unit].Top,
195084c9e671edcc1358307879491bddef9f7d96f14bRoland Scheidegger				     &rmesa->TexGenMatrix[unit] );
1951a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    }
1952a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    else {
1953a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	       _math_matrix_copy( &rmesa->tmpmat[unit],
1954a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger		  ctx->TextureMatrixStack[unit].Top );
1955a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    }
195684c9e671edcc1358307879491bddef9f7d96f14bRoland Scheidegger	 }
1957a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 else if (rmesa->TexGenEnabled & (RADEON_TEXMAT_0_ENABLE << unit)) {
1958a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    _math_matrix_copy( &rmesa->tmpmat[unit], &rmesa->TexGenMatrix[unit] );
1959a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    needMatrix = GL_TRUE;
1960a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 }
1961a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 if (needMatrix) {
1962a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    rmesa->NeedTexMatrix |= 1 << unit;
196311f763f5057490477a2771febe8923682f6a5adaRoland Scheidegger	    radeonUploadTexMatrix( rmesa, unit,
1964a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger			!ctx->Texture.Unit[unit].TexGenEnabled );
19655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
19665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
19675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
19685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1969a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   tpc = (texMatEnabled | rmesa->TexGenEnabled);
19705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
197130daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger   /* TCL_TEX_COMPUTED_x is TCL_TEX_INPUT_x | 0x8 */
197230daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger   vs &= ~((RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_0_OUTPUT_SHIFT) |
197330daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger	   (RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_1_OUTPUT_SHIFT) |
197430daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger	   (RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_2_OUTPUT_SHIFT));
197530daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger
197630daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger   vs |= (((tpc & RADEON_TEXGEN_TEXMAT_0_ENABLE) <<
197730daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger	 (RADEON_TCL_TEX_0_OUTPUT_SHIFT + 3)) |
197830daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger      ((tpc & RADEON_TEXGEN_TEXMAT_1_ENABLE) <<
197930daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger	 (RADEON_TCL_TEX_1_OUTPUT_SHIFT + 2)) |
198030daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger      ((tpc & RADEON_TEXGEN_TEXMAT_2_ENABLE) <<
198130daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger	 (RADEON_TCL_TEX_2_OUTPUT_SHIFT + 1)));
19825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (tpc != rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL] ||
19845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       vs != rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL]) {
1985a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger
19865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
19875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL] = tpc;
19885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] = vs;
19895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
19905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
19915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1992f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic GLboolean r100ValidateBuffers(struct gl_context *ctx)
199305304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie{
199405304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
199505304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie   struct radeon_renderbuffer *rrb;
1996c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie   int i, ret;
199705304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie
1998c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie   radeon_cs_space_reset_bos(rmesa->radeon.cmdbuf.cs);
19997dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
200005304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie   rrb = radeon_get_colorbuffer(&rmesa->radeon);
200105304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie   /* color buffer */
200205304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie   if (rrb && rrb->bo) {
2003c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie     radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, rrb->bo,
2004c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie				       0, RADEON_GEM_DOMAIN_VRAM);
200505304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie   }
200605304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie
200705304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie   /* depth buffer */
200805304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie   rrb = radeon_get_depthbuffer(&rmesa->radeon);
200905304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie   /* color buffer */
201005304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie   if (rrb && rrb->bo) {
2011c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie     radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, rrb->bo,
2012c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie				       0, RADEON_GEM_DOMAIN_VRAM);
201305304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie   }
20145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
201505304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie   for (i = 0; i < ctx->Const.MaxTextureImageUnits; ++i) {
201605304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie      radeonTexObj *t;
20177dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
201805304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie      if (!ctx->Texture.Unit[i]._ReallyEnabled)
201905304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie	 continue;
202005304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie
202185957cb512e74c8ddeb5ba2e06df091943ab8400Dave Airlie      t = rmesa->state.texture.unit[i].texobj;
2022a5da4acb9583db5289fcad410513d0fedcf9bab2Dave Airlie
2023a5da4acb9583db5289fcad410513d0fedcf9bab2Dave Airlie      if (!t)
2024a5da4acb9583db5289fcad410513d0fedcf9bab2Dave Airlie	 continue;
202505304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie      if (t->image_override && t->bo)
2026c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie	radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, t->bo,
202705304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie			   RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
202805304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie      else if (t->mt->bo)
2029c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie	radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, t->mt->bo,
203005304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie			   RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
203105304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie   }
203205304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie
2033bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen   ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs, first_elem(&rmesa->radeon.dma.reserved)->bo, RADEON_GEM_DOMAIN_GTT, 0);
2034c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie   if (ret)
2035c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie       return GL_FALSE;
2036c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie   return GL_TRUE;
203705304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie}
203805304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie
2039f9995b30756140724f41daf963fa06167912be7fKristian HøgsbergGLboolean radeonValidateState( struct gl_context *ctx )
20405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
20414637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
20424637235183b80963536f2364e4d50fcb894886ddDave Airlie   GLuint new_state = rmesa->radeon.NewGLState;
20435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2044c514c1f99493147bbba7a1dbe157c0492f4cf2ebJerome Glisse   if (new_state & _NEW_BUFFERS) {
20452b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie     _mesa_update_framebuffer(ctx);
20462b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie     /* this updates the DrawBuffer's Width/Height if it's a FBO */
20472b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie     _mesa_update_draw_buffer_bounds(ctx);
20482b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie     RADEON_STATECHANGE(rmesa, ctx);
2049982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   }
2050982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul
20515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & _NEW_TEXTURE) {
20525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateTextureState( ctx );
20534637235183b80963536f2364e4d50fcb894886ddDave Airlie      new_state |= rmesa->radeon.NewGLState; /* may add TEXTURE_MATRIX */
20545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
20555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
205605304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie   /* we need to do a space check here */
205705304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie   if (!r100ValidateBuffers(ctx))
205805304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie     return GL_FALSE;
205905304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie
20605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Need an event driven matrix update?
20615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
20627dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   if (new_state & (_NEW_MODELVIEW|_NEW_PROJECTION))
20635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      upload_matrix( rmesa, ctx->_ModelProjectMatrix.m, MODEL_PROJ );
20645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Need these for lighting (shouldn't upload otherwise)
20665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
20675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & (_NEW_MODELVIEW)) {
20685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      upload_matrix( rmesa, ctx->ModelviewMatrixStack.Top->m, MODEL );
20695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      upload_matrix_t( rmesa, ctx->ModelviewMatrixStack.Top->inv, MODEL_IT );
20705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
20715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Does this need to be triggered on eg. modelview for
20735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * texgen-derived objplane/eyeplane matrices?
20745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
20755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & _NEW_TEXTURE_MATRIX) {
20765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      update_texturematrix( ctx );
2077a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   }
20785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & (_NEW_LIGHT|_NEW_MODELVIEW|_MESA_NEW_NEED_EYE_COORDS)) {
20805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      update_light( ctx );
20815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
20825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* emit all active clip planes if projection matrix changes.
20845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
20855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & (_NEW_PROJECTION)) {
20867dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle      if (ctx->Transform.ClipPlanesEnabled)
20875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonUpdateClipPlanes( ctx );
20885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
20895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20914637235183b80963536f2364e4d50fcb894886ddDave Airlie   rmesa->radeon.NewGLState = 0;
209290ffce497395d8c02fee2ea4ee4c025eede3d876Alex Deucher
209390ffce497395d8c02fee2ea4ee4c025eede3d876Alex Deucher   return GL_TRUE;
20945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
20955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2097f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonInvalidateState( struct gl_context *ctx, GLuint new_state )
20985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
20995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _swrast_InvalidateState( ctx, new_state );
21005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _swsetup_InvalidateState( ctx, new_state );
210180c88304fc9d09531b2530b74973821e47b46753Keith Whitwell   _vbo_InvalidateState( ctx, new_state );
21025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _tnl_InvalidateState( ctx, new_state );
21035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _ae_invalidate_state( ctx, new_state );
21044637235183b80963536f2364e4d50fcb894886ddDave Airlie   R100_CONTEXT(ctx)->radeon.NewGLState |= new_state;
21055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
21065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
210757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
210857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell/* A hack.  Need a faster way to find this out.
210957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell */
2110f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic GLboolean check_material( struct gl_context *ctx )
211157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell{
211257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   TNLcontext *tnl = TNL_CONTEXT(ctx);
211357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   GLint i;
211457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
21157dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle   for (i = _TNL_ATTRIB_MAT_FRONT_AMBIENT;
21167dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	i < _TNL_ATTRIB_MAT_BACK_INDEXES;
211757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	i++)
211857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (tnl->vb.AttribPtr[i] &&
211957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	  tnl->vb.AttribPtr[i]->stride)
212057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 return GL_TRUE;
212157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
212257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   return GL_FALSE;
212357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell}
21247dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
212557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
2126f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonWrapRunPipeline( struct gl_context *ctx )
21275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
21284637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
212957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   GLboolean has_material;
21305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (0)
21324637235183b80963536f2364e4d50fcb894886ddDave Airlie      fprintf(stderr, "%s, newstate: %x\n", __FUNCTION__, rmesa->radeon.NewGLState);
21335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Validate state:
21355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
21364637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (rmesa->radeon.NewGLState)
213705304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie      if (!radeonValidateState( ctx ))
213805304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie	 FALLBACK(rmesa, RADEON_FALLBACK_TEXTURE, GL_TRUE);
21395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
214057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   has_material = (ctx->Light.Enabled && check_material( ctx ));
214157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
214257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   if (has_material) {
21435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_MATERIAL, GL_TRUE );
21445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
21455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Run the pipeline.
21477dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle    */
21485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _tnl_run_pipeline( ctx );
21495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
215057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   if (has_material) {
21515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_MATERIAL, GL_FALSE );
21525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
21535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
21545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2155f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonPolygonStipple( struct gl_context *ctx, const GLubyte *mask )
21567d361537661b93a501c9533271458a41b965ea79Dave Airlie{
21577d361537661b93a501c9533271458a41b965ea79Dave Airlie   r100ContextPtr r100 = R100_CONTEXT(ctx);
21587d361537661b93a501c9533271458a41b965ea79Dave Airlie   GLint i;
21597d361537661b93a501c9533271458a41b965ea79Dave Airlie
21607d361537661b93a501c9533271458a41b965ea79Dave Airlie   radeon_firevertices(&r100->radeon);
21617d361537661b93a501c9533271458a41b965ea79Dave Airlie
21627d361537661b93a501c9533271458a41b965ea79Dave Airlie   RADEON_STATECHANGE(r100, stp);
21637d361537661b93a501c9533271458a41b965ea79Dave Airlie
21647d361537661b93a501c9533271458a41b965ea79Dave Airlie   /* Must flip pattern upside down.
21657d361537661b93a501c9533271458a41b965ea79Dave Airlie    */
21667d361537661b93a501c9533271458a41b965ea79Dave Airlie   for ( i = 31 ; i >= 0; i--) {
21677d361537661b93a501c9533271458a41b965ea79Dave Airlie     r100->hw.stp.cmd[3 + i] = ((GLuint *) mask)[i];
21687d361537661b93a501c9533271458a41b965ea79Dave Airlie   }
21697d361537661b93a501c9533271458a41b965ea79Dave Airlie}
21707d361537661b93a501c9533271458a41b965ea79Dave Airlie
21715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Initialize the driver's state functions.
2173275a563bea0c0eef7bcd52ddc493803acf94c37eBrian Paul * Many of the ctx->Driver functions might have been initialized to
2174275a563bea0c0eef7bcd52ddc493803acf94c37eBrian Paul * software defaults in the earlier _mesa_init_driver_functions() call.
21755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
21760973a1ec78fdedc5401cb1c0f6d027425c492509Eric Anholtvoid radeonInitStateFuncs( struct gl_context *ctx )
21775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
21785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.UpdateState		= radeonInvalidateState;
21795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LightingSpaceChange      = radeonLightingSpaceChange;
21805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.DrawBuffer		= radeonDrawBuffer;
21825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ReadBuffer		= radeonReadBuffer;
2183d9a19d8649e49acfac98c240bff88931be7743d7Alex Deucher   ctx->Driver.CopyPixels               = _mesa_meta_CopyPixels;
2184d9a19d8649e49acfac98c240bff88931be7743d7Alex Deucher   ctx->Driver.DrawPixels               = _mesa_meta_DrawPixels;
21850973a1ec78fdedc5401cb1c0f6d027425c492509Eric Anholt   ctx->Driver.ReadPixels               = radeonReadPixels;
21865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.AlphaFunc		= radeonAlphaFunc;
2188c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   ctx->Driver.BlendEquationSeparate	= radeonBlendEquationSeparate;
21895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.BlendFuncSeparate	= radeonBlendFuncSeparate;
21905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ClipPlane		= radeonClipPlane;
21915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ColorMask		= radeonColorMask;
21925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.CullFace			= radeonCullFace;
21935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.DepthFunc		= radeonDepthFunc;
21945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.DepthMask		= radeonDepthMask;
21955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.DepthRange		= radeonDepthRange;
21965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Enable			= radeonEnable;
21975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Fogfv			= radeonFogfv;
21985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.FrontFace		= radeonFrontFace;
21995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Hint			= NULL;
22005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LightModelfv		= radeonLightModelfv;
22015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Lightfv			= radeonLightfv;
22025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LineStipple              = radeonLineStipple;
22035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LineWidth                = radeonLineWidth;
22045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LogicOpcode		= radeonLogicOpCode;
22055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.PolygonMode		= radeonPolygonMode;
220630f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger   ctx->Driver.PolygonOffset		= radeonPolygonOffset;
22070973a1ec78fdedc5401cb1c0f6d027425c492509Eric Anholt   ctx->Driver.PolygonStipple		= radeonPolygonStipple;
22085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.RenderMode		= radeonRenderMode;
22095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Scissor			= radeonScissor;
22105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ShadeModel		= radeonShadeModel;
2211878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul   ctx->Driver.StencilFuncSeparate	= radeonStencilFuncSeparate;
2212878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul   ctx->Driver.StencilMaskSeparate	= radeonStencilMaskSeparate;
2213878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul   ctx->Driver.StencilOpSeparate	= radeonStencilOpSeparate;
22145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Viewport			= radeonViewport;
22155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
22165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange = radeonUpdateMaterial;
22175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNL_CONTEXT(ctx)->Driver.RunPipeline = radeonWrapRunPipeline;
22185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2219