radeon_state.c revision 8c7e30fb950c83f5e9e29e60735e999ac608145a
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/state.h"
41ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/context.h"
42ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/framebuffer.h"
435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4480c88304fc9d09531b2530b74973821e47b46753Keith Whitwell#include "vbo/vbo.h"
455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/tnl.h"
465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_pipeline.h"
475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "swrast_setup/swrast_setup.h"
485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_context.h"
505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_ioctl.h"
515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_state.h"
525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tcl.h"
535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tex.h"
545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_swtcl.h"
55982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul#include "drirenderbuffer.h"
565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
572d61d301171620efe624d83a5457f4094eb49cbaRoland Scheideggerstatic void radeonUpdateSpecular( GLcontext *ctx );
582d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger
595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Alpha blending
615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonAlphaFunc( GLcontext *ctx, GLenum func, GLfloat ref )
645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
654637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int pp_misc = rmesa->hw.ctx.cmd[CTX_PP_MISC];
675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLubyte refByte;
685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   CLAMPED_FLOAT_TO_UBYTE(refByte, ref);
705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   pp_misc &= ~(RADEON_ALPHA_TEST_OP_MASK | RADEON_REF_ALPHA_MASK);
745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   pp_misc |= (refByte & RADEON_REF_ALPHA_MASK);
755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( func ) {
775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NEVER:
785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_FAIL;
795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LESS:
815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_LESS;
825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_EQUAL:
845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_EQUAL;
855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LEQUAL:
875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_LEQUAL;
885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GREATER:
905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_GREATER;
915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NOTEQUAL:
935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_NEQUAL;
945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GEQUAL:
965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_GEQUAL;
975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALWAYS:
995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      pp_misc |= RADEON_ALPHA_TEST_PASS;
1005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ctx.cmd[CTX_PP_MISC] = pp_misc;
1045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
106c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanickstatic void radeonBlendEquationSeparate( GLcontext *ctx,
107c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick					 GLenum modeRGB, GLenum modeA )
1085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
1094637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
1105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint b = rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] & ~RADEON_COMB_FCN_MASK;
1115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean fallback = GL_FALSE;
1125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
113c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   assert( modeRGB == modeA );
114c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick
115c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   switch ( modeRGB ) {
1165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FUNC_ADD:
1175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LOGIC_OP:
1185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_COMB_FCN_ADD_CLAMP;
1195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FUNC_SUBTRACT:
1225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_COMB_FCN_SUB_CLAMP;
1235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
1265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Color.BlendEnabled)
1275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fallback = GL_TRUE;
1285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
1295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b |= RADEON_COMB_FCN_ADD_CLAMP;
1305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   FALLBACK( rmesa, RADEON_FALLBACK_BLEND_EQ, fallback );
1345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( !fallback ) {
1355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
1365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = b;
137888b1a9166abfb1b2873cf7c1eb2daf45a26c84fRoland Scheidegger      if ( (ctx->Color.ColorLogicOpEnabled || (ctx->Color.BlendEnabled
138888b1a9166abfb1b2873cf7c1eb2daf45a26c84fRoland Scheidegger	    && ctx->Color.BlendEquationRGB == GL_LOGIC_OP)) ) {
1395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_ROP_ENABLE;
1405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
1415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE;
1425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14620a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanickstatic void radeonBlendFuncSeparate( GLcontext *ctx,
14720a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick				     GLenum sfactorRGB, GLenum dfactorRGB,
14820a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick				     GLenum sfactorA, GLenum dfactorA )
1495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
1504637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
1515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint b = rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] &
1525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      ~(RADEON_SRC_BLEND_MASK | RADEON_DST_BLEND_MASK);
1535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean fallback = GL_FALSE;
1545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Color.BlendSrcRGB ) {
1565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
1575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ZERO;
1585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE:
1605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE;
1615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DST_COLOR:
1635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_DST_COLOR;
1645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_DST_COLOR:
1665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE_MINUS_DST_COLOR;
1675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_COLOR:
1695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_SRC_COLOR;
1705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_SRC_COLOR:
1725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE_MINUS_SRC_COLOR;
1735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_ALPHA:
1755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_SRC_ALPHA;
1765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_SRC_ALPHA:
1785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE_MINUS_SRC_ALPHA;
1795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DST_ALPHA:
1815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_DST_ALPHA;
1825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_DST_ALPHA:
1845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_ONE_MINUS_DST_ALPHA;
1855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_ALPHA_SATURATE:
1875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_SRC_BLEND_GL_SRC_ALPHA_SATURATE;
1885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_COLOR:
1905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_CONSTANT_COLOR:
1915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_ALPHA:
1925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_CONSTANT_ALPHA:
1935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Color.BlendEnabled)
1945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fallback = GL_TRUE;
1955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
1965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b |= RADEON_SRC_BLEND_GL_ONE;
1975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
1995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Color.BlendDstRGB ) {
2035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
2045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ZERO;
2055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE:
2075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE;
2085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_COLOR:
2105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_SRC_COLOR;
2115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_SRC_COLOR:
2135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE_MINUS_SRC_COLOR;
2145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SRC_ALPHA:
2165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_SRC_ALPHA;
2175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_SRC_ALPHA:
2195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE_MINUS_SRC_ALPHA;
2205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DST_COLOR:
2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_DST_COLOR;
2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_DST_COLOR:
2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE_MINUS_DST_COLOR;
2265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DST_ALPHA:
2285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_DST_ALPHA;
2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_DST_ALPHA:
2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      b |= RADEON_DST_BLEND_GL_ONE_MINUS_DST_ALPHA;
2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_COLOR:
2345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_CONSTANT_COLOR:
2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_ALPHA:
2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ONE_MINUS_CONSTANT_ALPHA:
2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Color.BlendEnabled)
2385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fallback = GL_TRUE;
2395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
2405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b |= RADEON_DST_BLEND_GL_ZERO;
2415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   FALLBACK( rmesa, RADEON_FALLBACK_BLEND_FUNC, fallback );
2475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( !fallback ) {
2485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
2495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = b;
2505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Depth testing
2565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
2575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDepthFunc( GLcontext *ctx, GLenum func )
2595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2604637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
2615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
2635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_Z_TEST_MASK;
2645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Depth.Func ) {
2665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NEVER:
2675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_NEVER;
2685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LESS:
2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_LESS;
2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_EQUAL:
2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_EQUAL;
2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LEQUAL:
2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_LEQUAL;
2775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GREATER:
2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_GREATER;
2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NOTEQUAL:
2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_NEQUAL;
2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GEQUAL:
2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_GEQUAL;
2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALWAYS:
2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_ALWAYS;
2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDepthMask( GLcontext *ctx, GLboolean flag )
2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2964637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
2975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( ctx->Depth.Mask ) {
3005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |=  RADEON_Z_WRITE_ENABLE;
3015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_Z_WRITE_ENABLE;
3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClearDepth( GLcontext *ctx, GLclampd d )
3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3084637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
3095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint format = (rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &
3105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		    RADEON_DEPTH_FORMAT_MASK);
3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( format ) {
3135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_DEPTH_FORMAT_16BIT_INT_Z:
314d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie      rmesa->radeon.state.depth.clear = d * 0x0000ffff;
3155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_DEPTH_FORMAT_24BIT_INT_Z:
317d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie      rmesa->radeon.state.depth.clear = d * 0x00ffffff;
3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
3245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Fog
3255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
3265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonFogfv( GLcontext *ctx, GLenum pname, const GLfloat *param )
3295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3304637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
3315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   union { int i; float f; } c, d;
3325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLchan col[4];
3335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (pname) {
3355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG_MODE:
3365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (!ctx->Fog.Enabled)
3375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return;
3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_TCL_FOG_MASK;
3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch (ctx->Fog.Mode) {
3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR:
3425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_LINEAR;
3435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_EXP:
3455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_EXP;
3465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_EXP2:
3485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_EXP2;
3495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      default:
3515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return;
3525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3532d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger   /* fallthrough */
3545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG_DENSITY:
3552d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger   case GL_FOG_START:
3562d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger   case GL_FOG_END:
3572d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      if (!ctx->Fog.Enabled)
3582d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 return;
3592d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      c.i = rmesa->hw.fog.cmd[FOG_C];
3602d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      d.i = rmesa->hw.fog.cmd[FOG_D];
3615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch (ctx->Fog.Mode) {
3625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_EXP:
3635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 c.f = 0.0;
364512c994b92126a7575bb3cc327da40710b43f52cEric Anholt	 /* While this is the opposite sign from the DDK, it makes the fog test
365512c994b92126a7575bb3cc327da40710b43f52cEric Anholt	  * pass, and matches r200.
366512c994b92126a7575bb3cc327da40710b43f52cEric Anholt	  */
367512c994b92126a7575bb3cc327da40710b43f52cEric Anholt	 d.f = -ctx->Fog.Density;
3685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_EXP2:
3705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 c.f = 0.0;
3715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 d.f = -(ctx->Fog.Density * ctx->Fog.Density);
3725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
3732d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      case GL_LINEAR:
3745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (ctx->Fog.Start == ctx->Fog.End) {
3755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    c.f = 1.0F;
3765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    d.f = 1.0F;
3775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 } else {
3785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start);
379512c994b92126a7575bb3cc327da40710b43f52cEric Anholt	    /* While this is the opposite sign from the DDK, it makes the fog
380512c994b92126a7575bb3cc327da40710b43f52cEric Anholt	     * test pass, and matches r200.
381512c994b92126a7575bb3cc327da40710b43f52cEric Anholt	     */
382512c994b92126a7575bb3cc327da40710b43f52cEric Anholt	    d.f = -1.0/(ctx->Fog.End-ctx->Fog.Start);
3835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
3842d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 break;
3852d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      default:
3862d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 break;
3872d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      }
3882d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      if (c.i != rmesa->hw.fog.cmd[FOG_C] || d.i != rmesa->hw.fog.cmd[FOG_D]) {
3892d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 RADEON_STATECHANGE( rmesa, fog );
3902d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 rmesa->hw.fog.cmd[FOG_C] = c.i;
3912d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 rmesa->hw.fog.cmd[FOG_D] = d.i;
3925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG_COLOR:
3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
3965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      UNCLAMPED_FLOAT_TO_RGB_CHAN( col, ctx->Fog.Color );
3972d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] &= ~RADEON_FOG_COLOR_MASK;
3982d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] |=
3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonPackColor( 4, col[0], col[1], col[2], 0 );
4005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
4012d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger   case GL_FOG_COORD_SRC:
4022d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      radeonUpdateSpecular( ctx );
4035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
4045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
4055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
4065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
4105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Culling
4115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
4125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonCullFace( GLcontext *ctx, GLenum unused )
4145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4154637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
4165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL];
4175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint t = rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL];
4185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   s |= RADEON_FFACE_SOLID | RADEON_BFACE_SOLID;
4205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t &= ~(RADEON_CULL_FRONT | RADEON_CULL_BACK);
4215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( ctx->Polygon.CullFlag ) {
4235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch ( ctx->Polygon.CullFaceMode ) {
4245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_FRONT:
4255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 s &= ~RADEON_FFACE_SOLID;
4265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t |= RADEON_CULL_FRONT;
4275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
4285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_BACK:
4295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 s &= ~RADEON_BFACE_SOLID;
4305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t |= RADEON_CULL_BACK;
4315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
4325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_FRONT_AND_BACK:
4335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 s &= ~(RADEON_FFACE_SOLID | RADEON_BFACE_SOLID);
4345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t |= (RADEON_CULL_FRONT | RADEON_CULL_BACK);
4355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
4365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
4375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) {
4405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, set );
4415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] = s;
4425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] != t ) {
4455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl );
4465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] = t;
4475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonFrontFace( GLcontext *ctx, GLenum mode )
4515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4524637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
4535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, set );
4555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_FFACE_CULL_DIR_MASK;
4565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, tcl );
4585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_CULL_FRONT_IS_CCW;
4595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( mode ) {
4615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CW:
4625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_FFACE_CULL_CW;
4635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CCW:
4655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_FFACE_CULL_CCW;
4665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_CULL_FRONT_IS_CCW;
4675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
4685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
4735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Line state
4745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
4755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLineWidth( GLcontext *ctx, GLfloat widthf )
4765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4774637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
4785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, lin );
4805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, set );
4815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Line width is stored in U6.4 format.
4835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
4845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] = (GLuint)(widthf * 16.0);
4855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( widthf > 1.0 ) {
4865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_WIDELINE_ENABLE;
4875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
4885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_WIDELINE_ENABLE;
4895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLineStipple( GLcontext *ctx, GLint factor, GLushort pattern )
4935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4944637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
4955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, lin );
4975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.lin.cmd[LIN_RE_LINE_PATTERN] =
4985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      ((((GLuint)factor & 0xff) << 16) | ((GLuint)pattern));
4995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
5035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Masks
5045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
5055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonColorMask( GLcontext *ctx,
5065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     GLboolean r, GLboolean g,
5075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     GLboolean b, GLboolean a )
5085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5094637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
5104637235183b80963536f2364e4d50fcb894886ddDave Airlie   GLuint mask = radeonPackColor( rmesa->radeon.radeonScreen->cpp,
5115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				  ctx->Color.ColorMask[RCOMP],
5125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				  ctx->Color.ColorMask[GCOMP],
5135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				  ctx->Color.ColorMask[BCOMP],
5145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				  ctx->Color.ColorMask[ACOMP] );
5155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] != mask ) {
5175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, msk );
5185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] = mask;
5195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
5245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Polygon state
5255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
5265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonPolygonOffset( GLcontext *ctx,
5285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				 GLfloat factor, GLfloat units )
5295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5304637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
5318c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie   const GLfloat depthScale = 1.0F / ctx->DrawBuffer->_DepthMaxF;
5328c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie   float_ui32_type constant =  { units * depthScale };
53308e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   float_ui32_type factoru = { factor };
5345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, zbs );
53608e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_FACTOR]   = factoru.ui32;
53708e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_CONSTANT] = constant.ui32;
5385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonPolygonStipple( GLcontext *ctx, const GLubyte *mask )
5415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5424637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
5435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint i;
544ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl   drm_radeon_stipple_t stipple;
5455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Must flip pattern upside down.
5475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
5485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for ( i = 0 ; i < 32 ; i++ ) {
5495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->state.stipple.mask[31 - i] = ((GLuint *) mask)[i];
5505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* TODO: push this into cmd mechanism
5535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
5541090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   radeon_firevertices(&rmesa->radeon);
555d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie   LOCK_HARDWARE( &rmesa->radeon );
5565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* FIXME: Use window x,y offsets into stipple RAM.
5585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
5595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   stipple.mask = rmesa->state.stipple.mask;
5604637235183b80963536f2364e4d50fcb894886ddDave Airlie   drmCommandWrite( rmesa->radeon.dri.fd, DRM_RADEON_STIPPLE,
561ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl                    &stipple, sizeof(drm_radeon_stipple_t) );
562d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie   UNLOCK_HARDWARE( &rmesa->radeon );
5635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonPolygonMode( GLcontext *ctx, GLenum face, GLenum mode )
5665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5674637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
5685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean flag = (ctx->_TriangleCaps & DD_TRI_UNFILLED) != 0;
5695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Can't generally do unfilled via tcl, but some good special
5715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * cases work.
5725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
5735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_UNFILLED, flag);
5744637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (rmesa->radeon.TclFallback) {
5755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonChooseRenderState( ctx );
5765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonChooseVertexState( ctx );
5775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
5825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Rendering attributes
5835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
5845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * We really don't want to recalculate all this every time we bind a
5855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * texture.  These things shouldn't change all that often, so it makes
5865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * sense to break them out of the core texture state update routines.
5875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
5885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Examine lighting and texture state to determine if separate specular
5905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * should be enabled.
5915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
5925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonUpdateSpecular( GLcontext *ctx )
5935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5944637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
5955a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell   uint32_t p = rmesa->hw.ctx.cmd[CTX_PP_CNTL];
5962d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger   GLuint flag = 0;
5975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, tcl );
5995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_SPECULAR;
6015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_DIFFUSE;
6025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] &= ~RADEON_TCL_VTX_PK_SPEC;
6035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] &= ~RADEON_TCL_VTX_PK_DIFFUSE;
6045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_LIGHTING_ENABLE;
6055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   p &= ~RADEON_SPECULAR_ENABLE;
6075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_DIFFUSE_SPECULAR_COMBINE;
6095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Light.Enabled &&
6125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) {
6135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_SPECULAR;
6145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_DIFFUSE;
6155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC;
6165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;
6175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE;
6185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      p |=  RADEON_SPECULAR_ENABLE;
6195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &=
6205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 ~RADEON_DIFFUSE_SPECULAR_COMBINE;
6215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else if (ctx->Light.Enabled) {
6235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_DIFFUSE;
6245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;
6255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE;
6265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else if (ctx->Fog.ColorSumEnabled ) {
6275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC;
6285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;
6295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      p |= RADEON_SPECULAR_ENABLE;
6305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
6315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;
6325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Fog.Enabled) {
6355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC;
6362d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      if (ctx->Fog.FogCoordinateSource == GL_FRAGMENT_DEPTH) {
6372d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_SPECULAR;
6382d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      /* Bizzare: have to leave lighting enabled to get fog. */
6392d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE;
6402d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      }
6412d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      else {
6422d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      /* cannot do tcl fog factor calculation with fog coord source
6432d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger       * (send precomputed factors). Cannot use precomputed fog
6442d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger       * factors together with tcl spec light (need tcl fallback) */
6452d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 flag = (rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &
6462d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	    RADEON_TCL_COMPUTE_SPECULAR) != 0;
6472d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger      }
6485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6492d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger
6502d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger   TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_FOGCOORDSPEC, flag);
6515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
65243b57728340e70827a114c384192ed319abdb5c6Keith Whitwell   if (NEED_SECONDARY_COLOR(ctx)) {
6535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      assert( (p & RADEON_SPECULAR_ENABLE) != 0 );
6545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
6555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      assert( (p & RADEON_SPECULAR_ENABLE) == 0 );
6565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.ctx.cmd[CTX_PP_CNTL] != p ) {
6595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
6605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_PP_CNTL] = p;
6615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Update vertex/render formats
6645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
6654637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (rmesa->radeon.TclFallback) {
6665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonChooseRenderState( ctx );
6675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonChooseVertexState( ctx );
6685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
6735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Materials
6745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
6755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Update on colormaterial, material emmissive/ambient,
6785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * lightmodel.globalambient
6795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
6805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_global_ambient( GLcontext *ctx )
6815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6824637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
6835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   float *fcmd = (float *)RADEON_DB_STATE( glt );
6845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Need to do more if both emmissive & ambient are PREMULT:
686f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger    * Hope this is not needed for MULT
6875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
6885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ((rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &
6895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       ((3 << RADEON_EMISSIVE_SOURCE_SHIFT) |
6905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	(3 << RADEON_AMBIENT_SOURCE_SHIFT))) == 0)
6915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      COPY_3V( &fcmd[GLT_RED],
6935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_EMISSION]);
6945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      ACC_SCALE_3V( &fcmd[GLT_RED],
6955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		   ctx->Light.Model.Ambient,
6965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		   ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT]);
6975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else
6995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      COPY_3V( &fcmd[GLT_RED], ctx->Light.Model.Ambient );
7015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_DB_STATECHANGE(rmesa, &rmesa->hw.glt);
7045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Update on change to
7075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *    - light[p].colors
7085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *    - light[p].enabled
7095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
7105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_light_colors( GLcontext *ctx, GLuint p )
7115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct gl_light *l = &ctx->Light.Light[p];
7135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*     fprintf(stderr, "%s\n", __FUNCTION__); */
7155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (l->Enabled) {
7174637235183b80963536f2364e4d50fcb894886ddDave Airlie      r100ContextPtr rmesa = R100_CONTEXT(ctx);
7185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      float *fcmd = (float *)RADEON_DB_STATE( lit[p] );
7195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      COPY_4V( &fcmd[LIT_AMBIENT_RED], l->Ambient );
7215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      COPY_4V( &fcmd[LIT_DIFFUSE_RED], l->Diffuse );
7225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      COPY_4V( &fcmd[LIT_SPECULAR_RED], l->Specular );
7235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] );
7255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Also fallback for asym colormaterial mode in twoside lighting...
7295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
7305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void check_twoside_fallback( GLcontext *ctx )
7315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean fallback = GL_FALSE;
7335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLint i;
7345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Light.Enabled && ctx->Light.Model.TwoSide) {
7365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Light.ColorMaterialEnabled &&
7375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  (ctx->Light.ColorMaterialBitmask & BACK_MATERIAL_BITS) !=
7385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  ((ctx->Light.ColorMaterialBitmask & FRONT_MATERIAL_BITS)<<1))
7395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fallback = GL_TRUE;
7405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else {
7415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 for (i = MAT_ATTRIB_FRONT_AMBIENT; i < MAT_ATTRIB_FRONT_INDEXES; i+=2)
7425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (memcmp( ctx->Light.Material.Attrib[i],
7435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			ctx->Light.Material.Attrib[i+1],
7445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			sizeof(GLfloat)*4) != 0) {
7455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fallback = GL_TRUE;
7465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       break;
7475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
7485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
7495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_LIGHT_TWOSIDE, fallback );
7525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonColorMaterial( GLcontext *ctx, GLenum face, GLenum mode )
7565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7574637235183b80963536f2364e4d50fcb894886ddDave Airlie      r100ContextPtr rmesa = R100_CONTEXT(ctx);
7585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint light_model_ctl1 = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL];
7595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
76027889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling      light_model_ctl1 &= ~((3 << RADEON_EMISSIVE_SOURCE_SHIFT) |
76127889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling			   (3 << RADEON_AMBIENT_SOURCE_SHIFT) |
76227889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling			   (3 << RADEON_DIFFUSE_SOURCE_SHIFT) |
76327889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling			   (3 << RADEON_SPECULAR_SOURCE_SHIFT));
7645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
765f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   if (ctx->Light.ColorMaterialEnabled) {
766f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      GLuint mask = ctx->Light.ColorMaterialBitmask;
767f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger
7685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (mask & MAT_BIT_FRONT_EMISSION) {
76927889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling	 light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE <<
7705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     RADEON_EMISSIVE_SOURCE_SHIFT);
7715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
772f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      else {
773f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger	 light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT <<
774f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger			     RADEON_EMISSIVE_SOURCE_SHIFT);
775f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      }
7765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (mask & MAT_BIT_FRONT_AMBIENT) {
77827889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling	 light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE <<
7795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     RADEON_AMBIENT_SOURCE_SHIFT);
7805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
781f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      else {
782f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger	 light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT <<
783f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger			     RADEON_AMBIENT_SOURCE_SHIFT);
784f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      }
7855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (mask & MAT_BIT_FRONT_DIFFUSE) {
78727889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling	 light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE <<
7885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     RADEON_DIFFUSE_SOURCE_SHIFT);
7895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
790f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      else {
791f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger	 light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT <<
792f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger			     RADEON_DIFFUSE_SOURCE_SHIFT);
793f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      }
7945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (mask & MAT_BIT_FRONT_SPECULAR) {
79627889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling	 light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE <<
7975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     RADEON_SPECULAR_SOURCE_SHIFT);
7985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
799f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      else {
800f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger	 light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT <<
801f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger			     RADEON_SPECULAR_SOURCE_SHIFT);
802f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      }
803f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   }
804f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   else {
805f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   /* Default to MULT:
806f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger    */
807f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger      light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << RADEON_EMISSIVE_SOURCE_SHIFT) |
808f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger		   (RADEON_LM_SOURCE_STATE_MULT << RADEON_AMBIENT_SOURCE_SHIFT) |
809f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger		   (RADEON_LM_SOURCE_STATE_MULT << RADEON_DIFFUSE_SOURCE_SHIFT) |
810f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger		   (RADEON_LM_SOURCE_STATE_MULT << RADEON_SPECULAR_SOURCE_SHIFT);
811f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger   }
8125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (light_model_ctl1 != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]) {
8145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tcl );
8155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] = light_model_ctl1;
8165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonUpdateMaterial( GLcontext *ctx )
8205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8214637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
8225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat (*mat)[4] = ctx->Light.Material.Attrib;
8235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( mtl );
8245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint mask = ~0;
8255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Light.ColorMaterialEnabled)
8275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      mask &= ~ctx->Light.ColorMaterialBitmask;
8285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_DEBUG & DEBUG_STATE)
8305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s\n", __FUNCTION__);
8315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_EMISSION) {
8345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_EMMISSIVE_RED]   = mat[MAT_ATTRIB_FRONT_EMISSION][0];
8355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_EMMISSIVE_GREEN] = mat[MAT_ATTRIB_FRONT_EMISSION][1];
8365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_EMMISSIVE_BLUE]  = mat[MAT_ATTRIB_FRONT_EMISSION][2];
8375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_EMMISSIVE_ALPHA] = mat[MAT_ATTRIB_FRONT_EMISSION][3];
8385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_AMBIENT) {
8405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_AMBIENT_RED]     = mat[MAT_ATTRIB_FRONT_AMBIENT][0];
8415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_AMBIENT_GREEN]   = mat[MAT_ATTRIB_FRONT_AMBIENT][1];
8425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_AMBIENT_BLUE]    = mat[MAT_ATTRIB_FRONT_AMBIENT][2];
8435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_AMBIENT_ALPHA]   = mat[MAT_ATTRIB_FRONT_AMBIENT][3];
8445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_DIFFUSE) {
8465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_DIFFUSE_RED]     = mat[MAT_ATTRIB_FRONT_DIFFUSE][0];
8475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_DIFFUSE_GREEN]   = mat[MAT_ATTRIB_FRONT_DIFFUSE][1];
8485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_DIFFUSE_BLUE]    = mat[MAT_ATTRIB_FRONT_DIFFUSE][2];
8495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_DIFFUSE_ALPHA]   = mat[MAT_ATTRIB_FRONT_DIFFUSE][3];
8505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_SPECULAR) {
8525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SPECULAR_RED]    = mat[MAT_ATTRIB_FRONT_SPECULAR][0];
8535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SPECULAR_GREEN]  = mat[MAT_ATTRIB_FRONT_SPECULAR][1];
8545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SPECULAR_BLUE]   = mat[MAT_ATTRIB_FRONT_SPECULAR][2];
8555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SPECULAR_ALPHA]  = mat[MAT_ATTRIB_FRONT_SPECULAR][3];
8565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mask & MAT_BIT_FRONT_SHININESS) {
8585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[MTL_SHININESS]       = mat[MAT_ATTRIB_FRONT_SHININESS][0];
8595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
861a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer   RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mtl );
8625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
863a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer   check_twoside_fallback( ctx );
864f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger/*   update_global_ambient( ctx );*/
8655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* _NEW_LIGHT
8685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _NEW_MODELVIEW
8695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _MESA_NEW_NEED_EYE_COORDS
8705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
8715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Uses derived state from mesa:
8725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _VP_inf_norm
8735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _h_inf_norm
8745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _Position
8755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _NormDirection
8765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _ModelViewInvScale
8775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _NeedEyeCoords
8785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *       _EyeZDir
8795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
8805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * which are calculated in light.c and are correct for the current
8815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * lighting space (model or eye), hence dependencies on _NEW_MODELVIEW
8825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * and _MESA_NEW_NEED_EYE_COORDS.
8835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
8845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_light( GLcontext *ctx )
8855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8864637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
8875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Have to check these, or have an automatic shortcircuit mechanism
8895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * to remove noop statechanges. (Or just do a better job on the
8905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * front end).
8915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
8925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
8935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint tmp = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL];
8945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->_NeedEyeCoords)
8965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tmp &= ~RADEON_LIGHT_IN_MODELSPACE;
8975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
8985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tmp |= RADEON_LIGHT_IN_MODELSPACE;
8995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Leave this test disabled: (unexplained q3 lockup) (even with
9025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         new packets)
9035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      */
9045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (tmp != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL])
9055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      {
9065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tcl );
9075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] = tmp;
9085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
9095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
9125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( eye );
9135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[EYE_X] = ctx->_EyeZDir[0];
9145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[EYE_Y] = ctx->_EyeZDir[1];
9155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[EYE_Z] = - ctx->_EyeZDir[2];
9165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[EYE_RESCALE_FACTOR] = ctx->_ModelViewInvScale;
9175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.eye );
9185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->Light.Enabled) {
9235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLint p;
9245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      for (p = 0 ; p < MAX_LIGHTS; p++) {
9255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (ctx->Light.Light[p].Enabled) {
9265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    struct gl_light *l = &ctx->Light.Light[p];
9275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( lit[p] );
9285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (l->EyePosition[3] == 0.0) {
9305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       COPY_3FV( &fcmd[LIT_POSITION_X], l->_VP_inf_norm );
9315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       COPY_3FV( &fcmd[LIT_DIRECTION_X], l->_h_inf_norm );
9325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_POSITION_W] = 0;
9335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_DIRECTION_W] = 0;
9345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    } else {
9355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       COPY_4V( &fcmd[LIT_POSITION_X], l->_Position );
9365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_DIRECTION_X] = -l->_NormDirection[0];
9375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_DIRECTION_Y] = -l->_NormDirection[1];
9385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_DIRECTION_Z] = -l->_NormDirection[2];
9395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       fcmd[LIT_DIRECTION_W] = 0;
9405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
9415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] );
9435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
9445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
9455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
9475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLightfv( GLcontext *ctx, GLenum light,
9495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			   GLenum pname, const GLfloat *params )
9505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
9514637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
9525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLint p = light - GL_LIGHT0;
9535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct gl_light *l = &ctx->Light.Light[p];
9545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat *fcmd = (GLfloat *)rmesa->hw.lit[p].cmd;
9555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (pname) {
9585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_AMBIENT:
9595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DIFFUSE:
9605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SPECULAR:
9615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      update_light_colors( ctx, p );
9625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SPOT_DIRECTION:
9655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* picked up in update_light */
9665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POSITION: {
9695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* positions picked up in update_light, but can do flag here */
9705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint flag;
9715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;
9725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* FIXME: Set RANGE_ATTEN only when needed */
9745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (p&1)
9755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 flag = RADEON_LIGHT_1_IS_LOCAL;
9765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
9775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 flag = RADEON_LIGHT_0_IS_LOCAL;
9785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
9805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (l->EyePosition[3] != 0.0F)
9815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[idx] |= flag;
9825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
9835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[idx] &= ~flag;
9845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SPOT_EXPONENT:
9885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
9895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_SPOT_EXPONENT] = params[0];
9905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SPOT_CUTOFF: {
9935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint flag = (p&1) ? RADEON_LIGHT_1_IS_SPOT : RADEON_LIGHT_0_IS_SPOT;
9945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;
9955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
9975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_SPOT_CUTOFF] = l->_CosCutoff;
9985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
10005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (l->SpotCutoff != 180.0F)
10015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[idx] |= flag;
10025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
10035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[idx] &= ~flag;
10045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CONSTANT_ATTENUATION:
10095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
10105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_ATTEN_CONST] = params[0];
10115d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      if ( params[0] == 0.0 )
10125d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 fcmd[LIT_ATTEN_CONST_INV] = FLT_MAX;
10135d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      else
10145d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 fcmd[LIT_ATTEN_CONST_INV] = 1.0 / params[0];
10155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINEAR_ATTENUATION:
10175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
10185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_ATTEN_LINEAR] = params[0];
10195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_QUADRATIC_ATTENUATION:
10215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, lit[p]);
10225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fcmd[LIT_ATTEN_QUADRATIC] = params[0];
10235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
10255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
10265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Set RANGE_ATTEN only when needed */
10295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (pname) {
10305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POSITION:
10315d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer   case GL_CONSTANT_ATTENUATION:
10325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINEAR_ATTENUATION:
10335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_QUADRATIC_ATTENUATION:
10345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
10355d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      GLuint *icmd = (GLuint *)RADEON_DB_STATE( tcl );
10365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;
10375d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      GLuint atten_flag = ( p&1 ) ? RADEON_LIGHT_1_ENABLE_RANGE_ATTEN
10385d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer				  : RADEON_LIGHT_0_ENABLE_RANGE_ATTEN;
10395d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      GLuint atten_const_flag = ( p&1 ) ? RADEON_LIGHT_1_CONSTANT_RANGE_ATTEN
10405d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer				  : RADEON_LIGHT_0_CONSTANT_RANGE_ATTEN;
10415d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer
10425d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      if ( l->EyePosition[3] == 0.0F ||
10435d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	   ( ( fcmd[LIT_ATTEN_CONST] == 0.0 || fcmd[LIT_ATTEN_CONST] == 1.0 ) &&
10445d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	     fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) ) {
10455d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 /* Disable attenuation */
10465d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 icmd[idx] &= ~atten_flag;
10475d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      } else {
10485d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 if ( fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) {
10495d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    /* Enable only constant portion of attenuation calculation */
10505d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    icmd[idx] |= ( atten_flag | atten_const_flag );
10515d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 } else {
10525d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    /* Enable full attenuation calculation */
10535d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    icmd[idx] &= ~atten_const_flag;
10545d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	    icmd[idx] |= atten_flag;
10555d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer	 }
10565d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      }
10575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10585d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer      RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.tcl );
10595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
10625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
10635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
10655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLightModelfv( GLcontext *ctx, GLenum pname,
10705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				const GLfloat *param )
10715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
10724637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
10735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (pname) {
10755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LIGHT_MODEL_AMBIENT:
10765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 update_global_ambient( ctx );
10775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
10785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LIGHT_MODEL_LOCAL_VIEWER:
10805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tcl );
10815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (ctx->Light.Model.LocalViewer)
10825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LOCAL_VIEWER;
10835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 else
10845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_LOCAL_VIEWER;
10855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         break;
10865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LIGHT_MODEL_TWO_SIDE:
10885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tcl );
10895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (ctx->Light.Model.TwoSide)
10905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_LIGHT_TWOSIDE;
10915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 else
10925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_LIGHT_TWOSIDE;
10935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 check_twoside_fallback( ctx );
10955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10964637235183b80963536f2364e4d50fcb894886ddDave Airlie	 if (rmesa->radeon.TclFallback) {
10975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    radeonChooseRenderState( ctx );
10985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    radeonChooseVertexState( ctx );
10995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
11005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         break;
11015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LIGHT_MODEL_COLOR_CONTROL:
11035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonUpdateSpecular(ctx);
11045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         break;
11055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      default:
11075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         break;
11085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
11095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
11105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonShadeModel( GLcontext *ctx, GLenum mode )
11125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
11134637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
11145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL];
11155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   s &= ~(RADEON_DIFFUSE_SHADE_MASK |
11175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  RADEON_ALPHA_SHADE_MASK |
11185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  RADEON_SPECULAR_SHADE_MASK |
11195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  RADEON_FOG_SHADE_MASK);
11205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( mode ) {
11225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FLAT:
11235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      s |= (RADEON_DIFFUSE_SHADE_FLAT |
11245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_ALPHA_SHADE_FLAT |
11255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_SPECULAR_SHADE_FLAT |
11265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_FOG_SHADE_FLAT);
11275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SMOOTH:
11295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      s |= (RADEON_DIFFUSE_SHADE_GOURAUD |
11305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_ALPHA_SHADE_GOURAUD |
11315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_SPECULAR_SHADE_GOURAUD |
11325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    RADEON_FOG_SHADE_GOURAUD);
11335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
11345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
11355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
11365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
11375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) {
11395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, set );
11405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.set.cmd[SET_SE_CNTL] = s;
11415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
11425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
11435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
11465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * User clip planes
11475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
11485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClipPlane( GLcontext *ctx, GLenum plane, const GLfloat *eq )
11505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
11515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLint p = (GLint) plane - (GLint) GL_CLIP_PLANE0;
11524637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
11535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p];
11545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ucp[p] );
11565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ucp[p].cmd[UCP_X] = ip[0];
11575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1];
11585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2];
11595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ucp[p].cmd[UCP_W] = ip[3];
11605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
11615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonUpdateClipPlanes( GLcontext *ctx )
11635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
11644637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
11655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint p;
11665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for (p = 0; p < ctx->Const.MaxClipPlanes; p++) {
11685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Transform.ClipPlanesEnabled & (1 << p)) {
11695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p];
11705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, ucp[p] );
11725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ucp[p].cmd[UCP_X] = ip[0];
11735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1];
11745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2];
11755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ucp[p].cmd[UCP_W] = ip[3];
11765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
11775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
11785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
11795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
11825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Stencil
11835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
11845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1185878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void
1186878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian PaulradeonStencilFuncSeparate( GLcontext *ctx, GLenum face, GLenum func,
1187878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul                           GLint ref, GLuint mask )
11885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
11894637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
119071b2504e0390fa19f133647c8686d830f8f40eb6Keith Whitwell   GLuint refmask = (((ctx->Stencil.Ref[0] & 0xff) << RADEON_STENCIL_REF_SHIFT) |
119171b2504e0390fa19f133647c8686d830f8f40eb6Keith Whitwell		     ((ctx->Stencil.ValueMask[0] & 0xff) << RADEON_STENCIL_MASK_SHIFT));
11925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
11945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, msk );
11955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
11965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_STENCIL_TEST_MASK;
11975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~(RADEON_STENCIL_REF_MASK|
11985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul						   RADEON_STENCIL_VALUE_MASK);
11995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Stencil.Function[0] ) {
12015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NEVER:
12025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_NEVER;
12035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LESS:
12055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_LESS;
12065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_EQUAL:
12085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_EQUAL;
12095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LEQUAL:
12115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_LEQUAL;
12125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GREATER:
12145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_GREATER;
12155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NOTEQUAL:
12175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_NEQUAL;
12185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_GEQUAL:
12205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_GEQUAL;
12215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALWAYS:
12235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_ALWAYS;
12245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
12265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |= refmask;
12285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
12295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1230878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void
1231878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian PaulradeonStencilMaskSeparate( GLcontext *ctx, GLenum face, GLuint mask )
12325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
12334637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
12345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, msk );
12365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~RADEON_STENCIL_WRITE_MASK;
12375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |=
123871b2504e0390fa19f133647c8686d830f8f40eb6Keith Whitwell      ((ctx->Stencil.WriteMask[0] & 0xff) << RADEON_STENCIL_WRITEMASK_SHIFT);
12395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
12405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1241878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void radeonStencilOpSeparate( GLcontext *ctx, GLenum face, GLenum fail,
1242878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul                                     GLenum zfail, GLenum zpass )
12435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
12444637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
12455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1246de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   /* radeon 7200 have stencil bug, DEC and INC_WRAP will actually both do DEC_WRAP,
1247de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      and DEC_WRAP (and INVERT) will do INVERT. No way to get correct INC_WRAP and DEC,
1248de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      but DEC_WRAP can be fixed by using DEC and INC_WRAP at least use INC. */
1249de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger
1250de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   GLuint tempRADEON_STENCIL_FAIL_DEC_WRAP;
1251de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   GLuint tempRADEON_STENCIL_FAIL_INC_WRAP;
1252de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   GLuint tempRADEON_STENCIL_ZFAIL_DEC_WRAP;
1253de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   GLuint tempRADEON_STENCIL_ZFAIL_INC_WRAP;
1254de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   GLuint tempRADEON_STENCIL_ZPASS_DEC_WRAP;
1255de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   GLuint tempRADEON_STENCIL_ZPASS_INC_WRAP;
1256de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger
12574637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (rmesa->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_BROKEN_STENCIL) {
1258de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_FAIL_DEC_WRAP = RADEON_STENCIL_FAIL_DEC;
1259de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_FAIL_INC_WRAP = RADEON_STENCIL_FAIL_INC;
1260de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZFAIL_DEC_WRAP = RADEON_STENCIL_ZFAIL_DEC;
1261de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZFAIL_INC_WRAP = RADEON_STENCIL_ZFAIL_INC;
1262de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZPASS_DEC_WRAP = RADEON_STENCIL_ZPASS_DEC;
1263de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZPASS_INC_WRAP = RADEON_STENCIL_ZPASS_INC;
1264de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   }
1265de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   else {
1266de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_FAIL_DEC_WRAP = RADEON_STENCIL_FAIL_DEC_WRAP;
1267de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_FAIL_INC_WRAP = RADEON_STENCIL_FAIL_INC_WRAP;
1268de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZFAIL_DEC_WRAP = RADEON_STENCIL_ZFAIL_DEC_WRAP;
1269de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZFAIL_INC_WRAP = RADEON_STENCIL_ZFAIL_INC_WRAP;
1270de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZPASS_DEC_WRAP = RADEON_STENCIL_ZPASS_DEC_WRAP;
1271de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      tempRADEON_STENCIL_ZPASS_INC_WRAP = RADEON_STENCIL_ZPASS_INC_WRAP;
1272de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   }
1273de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger
12745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, ctx );
12755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~(RADEON_STENCIL_FAIL_MASK |
12765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul					       RADEON_STENCIL_ZFAIL_MASK |
12775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul					       RADEON_STENCIL_ZPASS_MASK);
12785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
12795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Stencil.FailFunc[0] ) {
12805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_KEEP:
12815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_KEEP;
12825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
12845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_ZERO;
12855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_REPLACE:
12875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_REPLACE;
12885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INCR:
12905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_INC;
12915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
12925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DECR:
12935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_DEC;
12945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1295de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   case GL_INCR_WRAP:
1296de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_FAIL_INC_WRAP;
1297de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      break;
1298de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   case GL_DECR_WRAP:
1299de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_FAIL_DEC_WRAP;
1300de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      break;
13015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INVERT:
13025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_INVERT;
13035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
13055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Stencil.ZFailFunc[0] ) {
13075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_KEEP:
13085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_KEEP;
13095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
13115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_ZERO;
13125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_REPLACE:
13145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_REPLACE;
13155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INCR:
13175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_INC;
13185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DECR:
13205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_DEC;
13215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1322de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   case GL_INCR_WRAP:
1323de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZFAIL_INC_WRAP;
1324de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      break;
1325de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   case GL_DECR_WRAP:
1326de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZFAIL_DEC_WRAP;
1327de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      break;
13285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INVERT:
13295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_INVERT;
13305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
13325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( ctx->Stencil.ZPassFunc[0] ) {
13345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_KEEP:
13355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_KEEP;
13365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ZERO:
13385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_ZERO;
13395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_REPLACE:
13415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_REPLACE;
13425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INCR:
13445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_INC;
13455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DECR:
13475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_DEC;
13485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1349de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   case GL_INCR_WRAP:
1350de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZPASS_INC_WRAP;
1351de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      break;
1352de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger   case GL_DECR_WRAP:
1353de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZPASS_DEC_WRAP;
1354de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      break;
13555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INVERT:
13565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_INVERT;
13575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
13585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
13595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
13605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClearStencil( GLcontext *ctx, GLint s )
13625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
13634637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
13645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1365d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie   rmesa->radeon.state.stencil.clear =
136671b2504e0390fa19f133647c8686d830f8f40eb6Keith Whitwell      ((GLuint) (ctx->Stencil.Clear & 0xff) |
13675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       (0xff << RADEON_STENCIL_MASK_SHIFT) |
136871b2504e0390fa19f133647c8686d830f8f40eb6Keith Whitwell       ((ctx->Stencil.WriteMask[0] & 0xff) << RADEON_STENCIL_WRITEMASK_SHIFT));
13695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
13705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
13735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Window position and viewport transformation
13745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
13755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
13765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
13775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * To correctly position primitives:
13785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
13795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define SUBPIXEL_X 0.125
13805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define SUBPIXEL_Y 0.125
13815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
138216e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul
138316e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul/**
138416e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul * Called when window size or position changes or viewport or depth range
138516e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul * state is changed.  We update the hardware viewport state here.
138616e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul */
13875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonUpdateWindow( GLcontext *ctx )
13885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
13894637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
13904637235183b80963536f2364e4d50fcb894886ddDave Airlie   __DRIdrawablePrivate *dPriv = rmesa->radeon.dri.drawable;
1391ed3a1cce73fcd0d6f4b6e9b5f69a98ad179ddc4bDave Airlie   GLfloat xoffset = dPriv ? (GLfloat) dPriv->x : 0;
1392ed3a1cce73fcd0d6f4b6e9b5f69a98ad179ddc4bDave Airlie   GLfloat yoffset = dPriv ? (GLfloat) dPriv->y + dPriv->h : 0;
13935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const GLfloat *v = ctx->Viewport._WindowMap.m;
13946c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie   const GLboolean render_to_fbo = (ctx->DrawBuffer ? (ctx->DrawBuffer->Name != 0) : 0);
13958c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie   const GLfloat depthScale = 1.0F / ctx->DrawBuffer->_DepthMaxF;
13966c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie   GLfloat y_scale, y_bias;
13976c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie
13986c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie   if (render_to_fbo) {
13996c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie      y_scale = 1.0;
14006c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie      y_bias = 0;
14016c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie   } else {
14026c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie      y_scale = -1.0;
14036c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie      y_bias = yoffset;
14046c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie   }
14055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
140608e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   float_ui32_type sx = { v[MAT_SX] };
140708e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   float_ui32_type tx = { v[MAT_TX] + xoffset + SUBPIXEL_X };
14086c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie   float_ui32_type sy = { v[MAT_SY] * y_scale };
14096c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie   float_ui32_type ty = { (v[MAT_TY] * y_scale) + y_bias + SUBPIXEL_Y };
14108c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie   float_ui32_type sz = { v[MAT_SZ] * depthScale };
14118c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie   float_ui32_type tz = { v[MAT_TZ] * depthScale };
141208e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger
14135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, vpt );
14145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
141508e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE]  = sx.ui32;
141608e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = tx.ui32;
141708e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE]  = sy.ui32;
141808e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = ty.ui32;
141908e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE]  = sz.ui32;
142008e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = tz.ui32;
14215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
14225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonViewport( GLcontext *ctx, GLint x, GLint y,
14255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			    GLsizei width, GLsizei height )
14265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
14275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Don't pipeline viewport changes, conflict with window offset
14285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * setting below.  Could apply deltas to rescue pipelined viewport
14295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * values, or keep the originals hanging around.
14305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
14315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonUpdateWindow( ctx );
14322b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie
14332b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie   radeon_viewport(ctx, x, y, width, height);
14345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
14355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDepthRange( GLcontext *ctx, GLclampd nearval,
14375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			      GLclampd farval )
14385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
14395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonUpdateWindow( ctx );
14405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
14415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonUpdateViewportOffset( GLcontext *ctx )
14435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
14444637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
14454637235183b80963536f2364e4d50fcb894886ddDave Airlie   __DRIdrawablePrivate *dPriv = rmesa->radeon.dri.drawable;
14465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat xoffset = (GLfloat)dPriv->x;
14475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat yoffset = (GLfloat)dPriv->y + dPriv->h;
14485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const GLfloat *v = ctx->Viewport._WindowMap.m;
14495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
145008e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   float_ui32_type tx;
145108e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   float_ui32_type ty;
145208e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger
145308e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   tx.f = v[MAT_TX] + xoffset + SUBPIXEL_X;
145408e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   ty.f = (- v[MAT_TY]) + yoffset + SUBPIXEL_Y;
14555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
145608e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   if ( rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] != tx.ui32 ||
145708e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger	rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] != ty.ui32 )
14585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
14595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Note: this should also modify whatever data the context reset
14605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       * code uses...
14615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
146208e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger      RADEON_STATECHANGE( rmesa, vpt );
146308e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger      rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = tx.ui32;
146408e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger      rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = ty.ui32;
146508e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger
14665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* update polygon stipple x/y screen offset */
14675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      {
14685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         GLuint stx, sty;
14695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         GLuint m = rmesa->hw.msc.cmd[MSC_RE_MISC];
14705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         m &= ~(RADEON_STIPPLE_X_OFFSET_MASK |
14725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                RADEON_STIPPLE_Y_OFFSET_MASK);
14735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         /* add magic offsets, then invert */
14754637235183b80963536f2364e4d50fcb894886ddDave Airlie         stx = 31 - ((rmesa->radeon.dri.drawable->x - 1) & RADEON_STIPPLE_COORD_MASK);
14764637235183b80963536f2364e4d50fcb894886ddDave Airlie         sty = 31 - ((rmesa->radeon.dri.drawable->y + rmesa->radeon.dri.drawable->h - 1)
14775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                     & RADEON_STIPPLE_COORD_MASK);
14785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         m |= ((stx << RADEON_STIPPLE_X_OFFSET_SHIFT) |
14805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul               (sty << RADEON_STIPPLE_Y_OFFSET_SHIFT));
14815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         if ( rmesa->hw.msc.cmd[MSC_RE_MISC] != m ) {
14835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            RADEON_STATECHANGE( rmesa, msc );
14845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    rmesa->hw.msc.cmd[MSC_RE_MISC] = m;
14855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         }
14865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
14875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
14885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonUpdateScissor( ctx );
14905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
14915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
14955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Miscellaneous
14965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
14975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
14985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClearColor( GLcontext *ctx, const GLfloat color[4] )
14995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
15004637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
15015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLubyte c[4];
15025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]);
15035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]);
15045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]);
15055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]);
1506d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie   rmesa->radeon.state.color.clear = radeonPackColor( rmesa->radeon.radeonScreen->cpp,
15075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul					       c[0], c[1], c[2], c[3] );
15085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
15095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderMode( GLcontext *ctx, GLenum mode )
15125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
15134637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
15145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   FALLBACK( rmesa, RADEON_FALLBACK_RENDER_MODE, (mode != GL_RENDER) );
15155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
15165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic GLuint radeon_rop_tab[] = {
15195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_CLEAR,
15205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_AND,
15215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_AND_REVERSE,
15225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_COPY,
15235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_AND_INVERTED,
15245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_NOOP,
15255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_XOR,
15265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_OR,
15275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_NOR,
15285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_EQUIV,
15295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_INVERT,
15305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_OR_REVERSE,
15315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_COPY_INVERTED,
15325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_OR_INVERTED,
15335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_NAND,
15345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_ROP_SET,
15355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
15365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLogicOpCode( GLcontext *ctx, GLenum opcode )
15385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
15394637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
15405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint rop = (GLuint)opcode - GL_CLEAR;
15415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ASSERT( rop < 16 );
15435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, msk );
15455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->hw.msk.cmd[MSK_RB3D_ROPCNTL] = radeon_rop_tab[rop];
15465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
15475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
15495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * State enable/disable
15505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
15515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonEnable( GLcontext *ctx, GLenum cap, GLboolean state )
15535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
15544637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
15555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint p, flag;
15565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( RADEON_DEBUG & DEBUG_STATE )
15585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf( stderr, "%s( %s = %s )\n", __FUNCTION__,
15595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       _mesa_lookup_enum_by_nr( cap ),
15605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       state ? "GL_TRUE" : "GL_FALSE" );
15615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( cap ) {
15635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Fast track this one...
15645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
15655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_1D:
15665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_2D:
15675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_3D:
15685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
15695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALPHA_TEST:
15715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
15725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state) {
15735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_ALPHA_TEST_ENABLE;
15745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
15755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ALPHA_TEST_ENABLE;
15765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
15775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
15785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_BLEND:
15805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
15815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state) {
15825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_ALPHA_BLEND_ENABLE;
15835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
15845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ALPHA_BLEND_ENABLE;
15855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1586888b1a9166abfb1b2873cf7c1eb2daf45a26c84fRoland Scheidegger      if ( (ctx->Color.ColorLogicOpEnabled || (ctx->Color.BlendEnabled
1587888b1a9166abfb1b2873cf7c1eb2daf45a26c84fRoland Scheidegger	    && ctx->Color.BlendEquationRGB == GL_LOGIC_OP)) ) {
15885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_ROP_ENABLE;
15895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
15905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE;
15915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
15925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Catch a possible fallback:
15945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
15955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state) {
1596c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick	 ctx->Driver.BlendEquationSeparate( ctx,
1597c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick					    ctx->Color.BlendEquationRGB,
1598c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick					    ctx->Color.BlendEquationA );
159920a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick	 ctx->Driver.BlendFuncSeparate( ctx, ctx->Color.BlendSrcRGB,
160020a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick					ctx->Color.BlendDstRGB,
1601253428f06a45d59cc50c9ccc4c8d17cd8c02c25dIan Romanick					ctx->Color.BlendSrcA,
1602253428f06a45d59cc50c9ccc4c8d17cd8c02c25dIan Romanick					ctx->Color.BlendDstA );
16035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
16045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else {
16055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 FALLBACK( rmesa, RADEON_FALLBACK_BLEND_FUNC, GL_FALSE );
16065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 FALLBACK( rmesa, RADEON_FALLBACK_BLEND_EQ, GL_FALSE );
16075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
16085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE0:
16115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE1:
16125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE2:
16135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE3:
16145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE4:
16155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLIP_PLANE5:
16165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      p = cap-GL_CLIP_PLANE0;
16175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, tcl );
16185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state) {
16195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= (RADEON_UCP_ENABLE_0<<p);
16205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonClipPlane( ctx, cap, NULL );
16215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
16225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else {
16235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~(RADEON_UCP_ENABLE_0<<p);
16245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
16255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_COLOR_MATERIAL:
16285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonColorMaterial( ctx, 0, 0 );
1629a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer      radeonUpdateMaterial( ctx );
16305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CULL_FACE:
16335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonCullFace( ctx, 0 );
16345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DEPTH_TEST:
16375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, ctx );
16385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
16395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_Z_ENABLE;
16405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
16415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_Z_ENABLE;
16425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
16435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_DITHER:
16465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, ctx );
16475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
16485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_DITHER_ENABLE;
1649d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~rmesa->radeon.state.color.roundEnable;
16505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
16515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_DITHER_ENABLE;
1652d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  rmesa->radeon.state.color.roundEnable;
16535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
16545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_FOG:
16575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, ctx );
16585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
16595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_FOG_ENABLE;
16602c28dd892cfb43445d7e54df8b6a8331192f4e99Brian Paul	 radeonFogfv( ctx, GL_FOG_MODE, NULL );
16615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
16625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_FOG_ENABLE;
16635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE(rmesa, tcl);
16645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_TCL_FOG_MASK;
16655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
16665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateSpecular( ctx ); /* for PK_SPEC */
16675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      _mesa_allow_light_in_model( ctx, !state );
16685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT0:
16715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT1:
16725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT2:
16735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT3:
16745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT4:
16755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT5:
16765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT6:
16775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHT7:
16785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
16795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      p = cap - GL_LIGHT0;
16805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (p&1)
16815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 flag = (RADEON_LIGHT_1_ENABLE |
16825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 RADEON_LIGHT_1_ENABLE_AMBIENT |
16835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 RADEON_LIGHT_1_ENABLE_SPECULAR);
16845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
16855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 flag = (RADEON_LIGHT_0_ENABLE |
16865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 RADEON_LIGHT_0_ENABLE_AMBIENT |
16875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 RADEON_LIGHT_0_ENABLE_SPECULAR);
16885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (state)
16905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] |= flag;
16915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
16925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] &= ~flag;
16935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /*
16955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
16965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      update_light_colors( ctx, p );
16975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
16985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LIGHTING:
17005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
17015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateSpecular(ctx);
17025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      check_twoside_fallback( ctx );
17035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINE_SMOOTH:
17065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
17075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
17085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_ANTI_ALIAS_LINE;
17095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
17105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ANTI_ALIAS_LINE;
17115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINE_STIPPLE:
17155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
17165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
17175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_PATTERN_ENABLE;
17185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
17195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_PATTERN_ENABLE;
17205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_COLOR_LOGIC_OP:
17245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
1725888b1a9166abfb1b2873cf7c1eb2daf45a26c84fRoland Scheidegger      if ( (ctx->Color.ColorLogicOpEnabled || (ctx->Color.BlendEnabled
1726888b1a9166abfb1b2873cf7c1eb2daf45a26c84fRoland Scheidegger	    && ctx->Color.BlendEquationRGB == GL_LOGIC_OP)) ) {
17275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_ROP_ENABLE;
17285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
17295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE;
17305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NORMALIZE:
17345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, tcl );
17355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
17365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |=  RADEON_NORMALIZE_NORMALS;
17375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
17385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_NORMALIZE_NORMALS;
17395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_OFFSET_POINT:
174330f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      RADEON_STATECHANGE( rmesa, set );
174430f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      if ( state ) {
174530f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_ZBIAS_ENABLE_POINT;
174630f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      } else {
174730f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_POINT;
17485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_OFFSET_LINE:
175230f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      RADEON_STATECHANGE( rmesa, set );
175330f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      if ( state ) {
175430f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_ZBIAS_ENABLE_LINE;
175530f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      } else {
175630f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_LINE;
17575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_OFFSET_FILL:
176130f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      RADEON_STATECHANGE( rmesa, set );
176230f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      if ( state ) {
176330f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_ZBIAS_ENABLE_TRI;
176430f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger      } else {
176530f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_TRI;
17665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_SMOOTH:
17705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, ctx );
17715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
17725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_ANTI_ALIAS_POLY;
17735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
17745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ANTI_ALIAS_POLY;
17755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_POLYGON_STIPPLE:
17795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, ctx );
17805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( state ) {
17815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_STIPPLE_ENABLE;
17825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
17835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_STIPPLE_ENABLE;
17845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RESCALE_NORMAL_EXT: {
17885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLboolean tmp = ctx->_NeedEyeCoords ? state : !state;
17895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE( rmesa, tcl );
17905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( tmp ) {
17915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |=  RADEON_RESCALE_NORMALS;
17925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
17935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_RESCALE_NORMALS;
17945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
17955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
17965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
17975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_SCISSOR_TEST:
17991090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie      radeon_firevertices(&rmesa->radeon);
1800d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie      rmesa->radeon.state.scissor.enabled = state;
18015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateScissor( ctx );
18025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_STENCIL_TEST:
18058c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie      {
18068c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	 GLboolean hw_stencil = GL_FALSE;
18078c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	 if (ctx->DrawBuffer) {
18088c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    struct radeon_renderbuffer *rrbStencil
18098c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	       = radeon_get_renderbuffer(ctx->DrawBuffer, BUFFER_STENCIL);
18108c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    hw_stencil = (rrbStencil && rrbStencil->bo);
18118c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	 }
18128c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
18138c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	 if (hw_stencil) {
18148c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    RADEON_STATECHANGE( rmesa, ctx );
18158c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    if ( state ) {
18168c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	       rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_STENCIL_ENABLE;
18178c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    } else {
18188c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	       rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_STENCIL_ENABLE;
18198c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    }
18205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 } else {
18218c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie	    FALLBACK( rmesa, RADEON_FALLBACK_STENCIL, state );
18225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
18235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
18245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_GEN_Q:
18275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_GEN_R:
18285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_GEN_S:
18295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_GEN_T:
18305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Picked up in radeonUpdateTextureState.
18315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
18325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->recheck_texgen[ctx->Texture.CurrentUnit] = GL_TRUE;
18335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_COLOR_SUM_EXT:
18365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateSpecular ( ctx );
18375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
18385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
18405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
18415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
18425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
18435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLightingSpaceChange( GLcontext *ctx )
18465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
18474637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
18485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean tmp;
18495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, tcl );
18505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_DEBUG & DEBUG_STATE)
18525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s %d BEFORE %x\n", __FUNCTION__, ctx->_NeedEyeCoords,
18535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]);
18545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (ctx->_NeedEyeCoords)
18565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tmp = ctx->Transform.RescaleNormals;
18575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else
18585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tmp = !ctx->Transform.RescaleNormals;
18595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( tmp ) {
18615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |=  RADEON_RESCALE_NORMALS;
18625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
18635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_RESCALE_NORMALS;
18645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
18655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_DEBUG & DEBUG_STATE)
18675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s %d AFTER %x\n", __FUNCTION__, ctx->_NeedEyeCoords,
18685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]);
18695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
18705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
18725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Deferred state management - matrices, textures, other?
18735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
18745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1875a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger
18764637235183b80963536f2364e4d50fcb894886ddDave Airlievoid radeonUploadTexMatrix( r100ContextPtr rmesa,
1877a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger			    int unit, GLboolean swapcols )
1878a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger{
1879a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger/* Here's how this works: on r100, only 3 tex coords can be submitted, so the
1880a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   vector looks like this probably: (s t r|q 0) (not sure if the last coord
1881a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   is hardwired to 0, could be 1 too). Interestingly, it actually looks like
1882a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   texgen generates all 4 coords, at least tests with projtex indicated that.
1883a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   So: if we need the q coord in the end (solely determined by the texture
1884a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   target, i.e. 2d / 1d / texrect targets) we swap the third and 4th row.
1885a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   Additionally, if we don't have texgen but 4 tex coords submitted, we swap
1886a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   column 3 and 4 (for the 2d / 1d / texrect targets) since the the q coord
1887a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   will get submitted in the "wrong", i.e. 3rd, slot.
1888a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   If an app submits 3 coords for 2d targets, we assume it is saving on vertex
1889a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   size and using the texture matrix to swap the r and q coords around (ut2k3
1890a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   does exactly that), so we don't need the 3rd / 4th column swap - still need
1891a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   the 3rd / 4th row swap of course. This will potentially break for apps which
1892a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   use TexCoord3x just for fun. Additionally, it will never work if an app uses
1893a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   an "advanced" texture matrix and relies on all 4 texcoord inputs to generate
1894a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   the maximum needed 3. This seems impossible to do with hw tcl on r100, and
1895a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   incredibly hard to detect so we can't just fallback in such a case. Assume
1896a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   it never happens... - rs
1897a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger*/
1898a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger
1899a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   int idx = TEXMAT_0 + unit;
1900a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   float *dest = ((float *)RADEON_DB_STATE( mat[idx] )) + MAT_ELT_0;
1901a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   int i;
19024637235183b80963536f2364e4d50fcb894886ddDave Airlie   struct gl_texture_unit tUnit = rmesa->radeon.glCtx->Texture.Unit[unit];
190311f763f5057490477a2771febe8923682f6a5adaRoland Scheidegger   GLfloat *src = rmesa->tmpmat[unit].m;
1904a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger
1905a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   rmesa->TexMatColSwap &= ~(1 << unit);
1906a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   if ((tUnit._ReallyEnabled & (TEXTURE_3D_BIT | TEXTURE_CUBE_BIT)) == 0) {
1907a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      if (swapcols) {
1908a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 rmesa->TexMatColSwap |= 1 << unit;
1909a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 /* attention some elems are swapped 2 times! */
1910a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[0];
1911a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[4];
1912a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[12];
1913a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[8];
1914a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[1];
1915a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[5];
1916a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[13];
1917a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[9];
1918a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[2];
1919a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[6];
1920a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[15];
1921a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[11];
1922a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 /* those last 4 are probably never used */
1923a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[3];
1924a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[7];
1925a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[14];
1926a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[10];
1927a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      }
1928a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      else {
1929a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 for (i = 0; i < 2; i++) {
1930a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i];
1931a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i+4];
1932a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i+8];
1933a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i+12];
1934a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 }
1935a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 for (i = 3; i >= 2; i--) {
1936a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i];
1937a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i+4];
1938a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i+8];
1939a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    *dest++ = src[i+12];
1940a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 }
1941a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      }
1942a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   }
1943a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   else {
1944a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      for (i = 0 ; i < 4 ; i++) {
1945a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[i];
1946a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[i+4];
1947a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[i+8];
1948a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 *dest++ = src[i+12];
1949a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      }
1950a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   }
19515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1952a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );
1953a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger}
19545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19564637235183b80963536f2364e4d50fcb894886ddDave Airliestatic void upload_matrix( r100ContextPtr rmesa, GLfloat *src, int idx )
19575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
19585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   float *dest = ((float *)RADEON_DB_STATE( mat[idx] ))+MAT_ELT_0;
19595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i;
19605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for (i = 0 ; i < 4 ; i++) {
19635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      *dest++ = src[i];
19645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      *dest++ = src[i+4];
19655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      *dest++ = src[i+8];
19665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      *dest++ = src[i+12];
19675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
19685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );
19705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
19715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19724637235183b80963536f2364e4d50fcb894886ddDave Airliestatic void upload_matrix_t( r100ContextPtr rmesa, GLfloat *src, int idx )
19735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
19745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   float *dest = ((float *)RADEON_DB_STATE( mat[idx] ))+MAT_ELT_0;
19755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   memcpy(dest, src, 16*sizeof(float));
19765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );
19775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
19785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
19805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_texturematrix( GLcontext *ctx )
19815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
19824637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT( ctx );
19835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint tpc = rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL];
19845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint vs = rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL];
19855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int unit;
1986a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   GLuint texMatEnabled = 0;
1987a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   rmesa->NeedTexMatrix = 0;
1988a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   rmesa->TexMatColSwap = 0;
19895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
199030daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger   for (unit = 0 ; unit < ctx->Const.MaxTextureUnits; unit++) {
1991a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger      if (ctx->Texture.Unit[unit]._ReallyEnabled) {
1992a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 GLboolean needMatrix = GL_FALSE;
1993a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 if (ctx->TextureMatrixStack[unit].Top->type != MATRIX_IDENTITY) {
1994a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    needMatrix = GL_TRUE;
1995a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    texMatEnabled |= (RADEON_TEXGEN_TEXMAT_0_ENABLE |
1996a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger			      RADEON_TEXMAT_0_ENABLE) << unit;
1997a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger
1998a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    if (rmesa->TexGenEnabled & (RADEON_TEXMAT_0_ENABLE << unit)) {
1999a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	       /* Need to preconcatenate any active texgen
2000a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	        * obj/eyeplane matrices:
2001a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	        */
2002a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	       _math_matrix_mul_matrix( &rmesa->tmpmat[unit],
200384c9e671edcc1358307879491bddef9f7d96f14bRoland Scheidegger				     ctx->TextureMatrixStack[unit].Top,
200484c9e671edcc1358307879491bddef9f7d96f14bRoland Scheidegger				     &rmesa->TexGenMatrix[unit] );
2005a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    }
2006a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    else {
2007a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	       _math_matrix_copy( &rmesa->tmpmat[unit],
2008a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger		  ctx->TextureMatrixStack[unit].Top );
2009a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    }
201084c9e671edcc1358307879491bddef9f7d96f14bRoland Scheidegger	 }
2011a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 else if (rmesa->TexGenEnabled & (RADEON_TEXMAT_0_ENABLE << unit)) {
2012a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    _math_matrix_copy( &rmesa->tmpmat[unit], &rmesa->TexGenMatrix[unit] );
2013a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    needMatrix = GL_TRUE;
2014a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 }
2015a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 if (needMatrix) {
2016a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    rmesa->NeedTexMatrix |= 1 << unit;
201711f763f5057490477a2771febe8923682f6a5adaRoland Scheidegger	    radeonUploadTexMatrix( rmesa, unit,
2018a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger			!ctx->Texture.Unit[unit].TexGenEnabled );
20195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
20205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
20215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
20225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2023a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   tpc = (texMatEnabled | rmesa->TexGenEnabled);
20245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
202530daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger   /* TCL_TEX_COMPUTED_x is TCL_TEX_INPUT_x | 0x8 */
202630daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger   vs &= ~((RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_0_OUTPUT_SHIFT) |
202730daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger	   (RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_1_OUTPUT_SHIFT) |
202830daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger	   (RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_2_OUTPUT_SHIFT));
202930daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger
203030daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger   vs |= (((tpc & RADEON_TEXGEN_TEXMAT_0_ENABLE) <<
203130daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger	 (RADEON_TCL_TEX_0_OUTPUT_SHIFT + 3)) |
203230daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger      ((tpc & RADEON_TEXGEN_TEXMAT_1_ENABLE) <<
203330daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger	 (RADEON_TCL_TEX_1_OUTPUT_SHIFT + 2)) |
203430daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger      ((tpc & RADEON_TEXGEN_TEXMAT_2_ENABLE) <<
203530daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger	 (RADEON_TCL_TEX_2_OUTPUT_SHIFT + 1)));
20365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (tpc != rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL] ||
20385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       vs != rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL]) {
2039a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger
20405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_STATECHANGE(rmesa, tcl);
20415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL] = tpc;
20425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] = vs;
20435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
20445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
20455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonValidateState( GLcontext *ctx )
20485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
20494637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
20504637235183b80963536f2364e4d50fcb894886ddDave Airlie   GLuint new_state = rmesa->radeon.NewGLState;
20515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2052982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   if (new_state & (_NEW_BUFFERS | _NEW_COLOR | _NEW_PIXEL)) {
20532b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie     _mesa_update_framebuffer(ctx);
20542b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie     /* this updates the DrawBuffer's Width/Height if it's a FBO */
20552b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie     _mesa_update_draw_buffer_bounds(ctx);
20562b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie     RADEON_STATECHANGE(rmesa, ctx);
2057982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul   }
2058982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul
20595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & _NEW_TEXTURE) {
20605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonUpdateTextureState( ctx );
20614637235183b80963536f2364e4d50fcb894886ddDave Airlie      new_state |= rmesa->radeon.NewGLState; /* may add TEXTURE_MATRIX */
20625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
20635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Need an event driven matrix update?
20655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
20665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & (_NEW_MODELVIEW|_NEW_PROJECTION))
20675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      upload_matrix( rmesa, ctx->_ModelProjectMatrix.m, MODEL_PROJ );
20685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Need these for lighting (shouldn't upload otherwise)
20705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
20715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & (_NEW_MODELVIEW)) {
20725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      upload_matrix( rmesa, ctx->ModelviewMatrixStack.Top->m, MODEL );
20735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      upload_matrix_t( rmesa, ctx->ModelviewMatrixStack.Top->inv, MODEL_IT );
20745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
20755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Does this need to be triggered on eg. modelview for
20775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * texgen-derived objplane/eyeplane matrices?
20785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
20795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & _NEW_TEXTURE_MATRIX) {
20805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      update_texturematrix( ctx );
2081a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   }
20825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & (_NEW_LIGHT|_NEW_MODELVIEW|_MESA_NEW_NEED_EYE_COORDS)) {
20845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      update_light( ctx );
20855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
20865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* emit all active clip planes if projection matrix changes.
20885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
20895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (new_state & (_NEW_PROJECTION)) {
20905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ctx->Transform.ClipPlanesEnabled)
20915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonUpdateClipPlanes( ctx );
20925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
20935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20954637235183b80963536f2364e4d50fcb894886ddDave Airlie   rmesa->radeon.NewGLState = 0;
20965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
20975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
20995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonInvalidateState( GLcontext *ctx, GLuint new_state )
21005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
21015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _swrast_InvalidateState( ctx, new_state );
21025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _swsetup_InvalidateState( ctx, new_state );
210380c88304fc9d09531b2530b74973821e47b46753Keith Whitwell   _vbo_InvalidateState( ctx, new_state );
21045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _tnl_InvalidateState( ctx, new_state );
21055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _ae_invalidate_state( ctx, new_state );
21064637235183b80963536f2364e4d50fcb894886ddDave Airlie   R100_CONTEXT(ctx)->radeon.NewGLState |= new_state;
21075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
21085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
210957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
211057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell/* A hack.  Need a faster way to find this out.
211157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell */
211257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwellstatic GLboolean check_material( GLcontext *ctx )
211357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell{
211457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   TNLcontext *tnl = TNL_CONTEXT(ctx);
211557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   GLint i;
211657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
211757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   for (i = _TNL_ATTRIB_MAT_FRONT_AMBIENT;
211857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	i < _TNL_ATTRIB_MAT_BACK_INDEXES;
211957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	i++)
212057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (tnl->vb.AttribPtr[i] &&
212157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	  tnl->vb.AttribPtr[i]->stride)
212257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 return GL_TRUE;
212357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
212457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   return GL_FALSE;
212557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell}
212657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
212757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
21285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonWrapRunPipeline( GLcontext *ctx )
21295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
21304637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
213157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   GLboolean has_material;
21325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (0)
21344637235183b80963536f2364e4d50fcb894886ddDave Airlie      fprintf(stderr, "%s, newstate: %x\n", __FUNCTION__, rmesa->radeon.NewGLState);
21355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Validate state:
21375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
21384637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (rmesa->radeon.NewGLState)
21395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonValidateState( ctx );
21405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
214157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   has_material = (ctx->Light.Enabled && check_material( ctx ));
214257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
214357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   if (has_material) {
21445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_MATERIAL, GL_TRUE );
21455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
21465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Run the pipeline.
21485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
21495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _tnl_run_pipeline( ctx );
21505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
215157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   if (has_material) {
21525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_MATERIAL, GL_FALSE );
21535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
21545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
21555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Initialize the driver's state functions.
2158275a563bea0c0eef7bcd52ddc493803acf94c37eBrian Paul * Many of the ctx->Driver functions might have been initialized to
2159275a563bea0c0eef7bcd52ddc493803acf94c37eBrian Paul * software defaults in the earlier _mesa_init_driver_functions() call.
21605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
21615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonInitStateFuncs( GLcontext *ctx )
21625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
21635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.UpdateState		= radeonInvalidateState;
21645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LightingSpaceChange      = radeonLightingSpaceChange;
21655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.DrawBuffer		= radeonDrawBuffer;
21675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ReadBuffer		= radeonReadBuffer;
21685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.AlphaFunc		= radeonAlphaFunc;
2170c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   ctx->Driver.BlendEquationSeparate	= radeonBlendEquationSeparate;
21715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.BlendFuncSeparate	= radeonBlendFuncSeparate;
21725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ClearColor		= radeonClearColor;
21735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ClearDepth		= radeonClearDepth;
21745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ClearIndex		= NULL;
21755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ClearStencil		= radeonClearStencil;
21765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ClipPlane		= radeonClipPlane;
21775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ColorMask		= radeonColorMask;
21785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.CullFace			= radeonCullFace;
21795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.DepthFunc		= radeonDepthFunc;
21805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.DepthMask		= radeonDepthMask;
21815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.DepthRange		= radeonDepthRange;
21825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Enable			= radeonEnable;
21835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Fogfv			= radeonFogfv;
21845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.FrontFace		= radeonFrontFace;
21855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Hint			= NULL;
21865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.IndexMask		= NULL;
21875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LightModelfv		= radeonLightModelfv;
21885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Lightfv			= radeonLightfv;
21895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LineStipple              = radeonLineStipple;
21905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LineWidth                = radeonLineWidth;
21915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.LogicOpcode		= radeonLogicOpCode;
21925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.PolygonMode		= radeonPolygonMode;
219330f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger   ctx->Driver.PolygonOffset		= radeonPolygonOffset;
21945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.PolygonStipple		= radeonPolygonStipple;
21955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.RenderMode		= radeonRenderMode;
21965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Scissor			= radeonScissor;
21975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.ShadeModel		= radeonShadeModel;
2198878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul   ctx->Driver.StencilFuncSeparate	= radeonStencilFuncSeparate;
2199878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul   ctx->Driver.StencilMaskSeparate	= radeonStencilMaskSeparate;
2200878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul   ctx->Driver.StencilOpSeparate	= radeonStencilOpSeparate;
22015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Driver.Viewport			= radeonViewport;
22025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
22035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange = radeonUpdateMaterial;
22045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNL_CONTEXT(ctx)->Driver.RunPipeline = radeonWrapRunPipeline;
22055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2206