1adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/************************************************************************** 2adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 3adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellCopyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. 4adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 5adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellThe Weather Channel (TM) funded Tungsten Graphics to develop the 6adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellinitial release of the Radeon 8500 driver under the XFree86 license. 7adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellThis notice must be preserved. 8adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 9adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellPermission is hereby granted, free of charge, to any person obtaining 10adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwella copy of this software and associated documentation files (the 11adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell"Software"), to deal in the Software without restriction, including 12adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellwithout limitation the rights to use, copy, modify, merge, publish, 13adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwelldistribute, sublicense, and/or sell copies of the Software, and to 14adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellpermit persons to whom the Software is furnished to do so, subject to 15adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellthe following conditions: 16adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 17adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellThe above copyright notice and this permission notice (including the 18adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellnext paragraph) shall be included in all copies or substantial 19adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellportions of the Software. 20adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 21adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 22adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 23adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 24adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 25adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 26adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 27adbec39bbf671ad80f6c557801e274cac0d305faKeith WhitwellWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 29adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell**************************************************************************/ 30adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 31adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* 32adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Authors: 33adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Keith Whitwell <keith@tungstengraphics.com> 34adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 35adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 36ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h" 37ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/imports.h" 38ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/api_arrayelt.h" 39ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/enums.h" 40ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/colormac.h" 41ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/light.h" 42ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/framebuffer.h" 4347941bfaea6e8a60e2c31f7a2c8c233f2a10ecb1Brian Paul#include "main/fbobject.h" 44adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 45adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "swrast/swrast.h" 4680c88304fc9d09531b2530b74973821e47b46753Keith Whitwell#include "vbo/vbo.h" 47adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "tnl/tnl.h" 48adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "tnl/t_pipeline.h" 49adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "swrast_setup/swrast_setup.h" 50e167403e5809c447870644bd9ea09fad369706cfAlex Deucher#include "drivers/common/meta.h" 51adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 52dc8a707c672918b88dd4135930bef60ed148d8ceDave Airlie#include "radeon_common.h" 53e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie#include "radeon_mipmap_tree.h" 54adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "r200_context.h" 55adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "r200_ioctl.h" 56adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "r200_state.h" 57adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "r200_tcl.h" 58adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "r200_tex.h" 59adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#include "r200_swtcl.h" 6098c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger#include "r200_vertprog.h" 61adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 62adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 63adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* ============================================================= 64adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Alpha blending 65adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 66adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 67f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200AlphaFunc( struct gl_context *ctx, GLenum func, GLfloat ref ) 68adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 69adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 70adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell int pp_misc = rmesa->hw.ctx.cmd[CTX_PP_MISC]; 71adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLubyte refByte; 72adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 73adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell CLAMPED_FLOAT_TO_UBYTE(refByte, ref); 74adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 75adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, ctx ); 76adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 77adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell pp_misc &= ~(R200_ALPHA_TEST_OP_MASK | R200_REF_ALPHA_MASK); 78adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell pp_misc |= (refByte & R200_REF_ALPHA_MASK); 79adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 80adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell switch ( func ) { 81adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_NEVER: 827dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle pp_misc |= R200_ALPHA_TEST_FAIL; 83adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 84adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LESS: 85adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell pp_misc |= R200_ALPHA_TEST_LESS; 86adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 87adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_EQUAL: 88adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell pp_misc |= R200_ALPHA_TEST_EQUAL; 89adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 90adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LEQUAL: 91adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell pp_misc |= R200_ALPHA_TEST_LEQUAL; 92adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 93adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_GREATER: 94adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell pp_misc |= R200_ALPHA_TEST_GREATER; 95adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 96adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_NOTEQUAL: 97adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell pp_misc |= R200_ALPHA_TEST_NEQUAL; 98adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 99adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_GEQUAL: 100adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell pp_misc |= R200_ALPHA_TEST_GEQUAL; 101adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 102adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_ALWAYS: 103adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell pp_misc |= R200_ALPHA_TEST_PASS; 104adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 105adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 106adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 107adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_PP_MISC] = pp_misc; 108adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 109adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 110f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200BlendColor( struct gl_context *ctx, const GLfloat cf[4] ) 111033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger{ 112033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger GLubyte color[4]; 113033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger r200ContextPtr rmesa = R200_CONTEXT(ctx); 114033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger R200_STATECHANGE( rmesa, ctx ); 115033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger CLAMPED_FLOAT_TO_UBYTE(color[0], cf[0]); 116033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger CLAMPED_FLOAT_TO_UBYTE(color[1], cf[1]); 117033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger CLAMPED_FLOAT_TO_UBYTE(color[2], cf[2]); 118033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger CLAMPED_FLOAT_TO_UBYTE(color[3], cf[3]); 11956d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCOLOR] = radeonPackColor( 4, color[0], color[1], color[2], color[3] ); 120033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger} 121033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger 122b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger/** 123b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * Calculate the hardware blend factor setting. This same function is used 124b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * for source and destination of both alpha and RGB. 125b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * 126b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * \returns 127b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * The hardware register value for the specified blend factor. This value 128b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * will need to be shifted into the correct position for either source or 129b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * destination factor. 130b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * 131b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * \todo 132b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * Since the two cases where source and destination are handled differently 133b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * are essentially error cases, they should never happen. Determine if these 134b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * cases can be removed. 135b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger */ 136b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheideggerstatic int blend_factor( GLenum factor, GLboolean is_src ) 137adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 138b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger int func; 139adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 140b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger switch ( factor ) { 141adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_ZERO: 142b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger func = R200_BLEND_GL_ZERO; 143adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 144adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_ONE: 145b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger func = R200_BLEND_GL_ONE; 146adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 147adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_DST_COLOR: 148b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger func = R200_BLEND_GL_DST_COLOR; 149adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 150adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_ONE_MINUS_DST_COLOR: 151b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger func = R200_BLEND_GL_ONE_MINUS_DST_COLOR; 152adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 153adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_SRC_COLOR: 154b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger func = R200_BLEND_GL_SRC_COLOR; 155adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 156adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_ONE_MINUS_SRC_COLOR: 157b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger func = R200_BLEND_GL_ONE_MINUS_SRC_COLOR; 158adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 159adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_SRC_ALPHA: 160b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger func = R200_BLEND_GL_SRC_ALPHA; 161adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 162adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_ONE_MINUS_SRC_ALPHA: 163b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger func = R200_BLEND_GL_ONE_MINUS_SRC_ALPHA; 164adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 165adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_DST_ALPHA: 166b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger func = R200_BLEND_GL_DST_ALPHA; 167adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 168adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_ONE_MINUS_DST_ALPHA: 169b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger func = R200_BLEND_GL_ONE_MINUS_DST_ALPHA; 170adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 171adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_SRC_ALPHA_SATURATE: 172b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger func = (is_src) ? R200_BLEND_GL_SRC_ALPHA_SATURATE : R200_BLEND_GL_ZERO; 173adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 174adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_CONSTANT_COLOR: 175b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger func = R200_BLEND_GL_CONST_COLOR; 176adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 177adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_ONE_MINUS_CONSTANT_COLOR: 178b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger func = R200_BLEND_GL_ONE_MINUS_CONST_COLOR; 179adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 180adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_CONSTANT_ALPHA: 181b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger func = R200_BLEND_GL_CONST_ALPHA; 182adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 183adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_ONE_MINUS_CONSTANT_ALPHA: 184b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger func = R200_BLEND_GL_ONE_MINUS_CONST_ALPHA; 185adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 186adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell default: 187b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger func = (is_src) ? R200_BLEND_GL_ONE : R200_BLEND_GL_ZERO; 188adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 189b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger return func; 190b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger} 191adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 192b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger/** 193b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * Sets both the blend equation and the blend function. 194b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * This is done in a single 195b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * function because some blend equations (i.e., \c GL_MIN and \c GL_MAX) 196b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * change the interpretation of the blend function. 197b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * Also, make sure that blend function and blend equation are set to their default 198b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * value if color blending is not enabled, since at least blend equations GL_MIN 199b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * and GL_FUNC_REVERSE_SUBTRACT will cause wrong results otherwise for 200b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger * unknown reasons. 201b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger */ 202f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200_set_blend_state( struct gl_context * ctx ) 203b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger{ 204b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger r200ContextPtr rmesa = R200_CONTEXT(ctx); 205b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger GLuint cntl = rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] & 206033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger ~(R200_ROP_ENABLE | R200_ALPHA_BLEND_ENABLE | R200_SEPARATE_ALPHA_ENABLE); 207b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger 208b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger int func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) | 209b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT); 210b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger int eqn = R200_COMB_FCN_ADD_CLAMP; 211033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger int funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) | 212033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT); 213033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger int eqnA = R200_COMB_FCN_ADD_CLAMP; 214b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger 215b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger R200_STATECHANGE( rmesa, ctx ); 216b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger 21756d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie if (ctx->Color.ColorLogicOpEnabled) { 21856d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = cntl | R200_ROP_ENABLE; 21956d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie rmesa->hw.ctx.cmd[CTX_RB3D_ABLENDCNTL] = eqn | func; 22056d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie rmesa->hw.ctx.cmd[CTX_RB3D_CBLENDCNTL] = eqn | func; 22156d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie return; 22256d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie } else if (ctx->Color.BlendEnabled) { 22356d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = cntl | R200_ALPHA_BLEND_ENABLE | R200_SEPARATE_ALPHA_ENABLE; 224b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger } 225b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger else { 22656d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = cntl; 22756d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie rmesa->hw.ctx.cmd[CTX_RB3D_ABLENDCNTL] = eqn | func; 22856d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie rmesa->hw.ctx.cmd[CTX_RB3D_CBLENDCNTL] = eqn | func; 22956d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie return; 230b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger } 231b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger 23274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul func = (blend_factor( ctx->Color.Blend[0].SrcRGB, GL_TRUE ) << R200_SRC_BLEND_SHIFT) | 23374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul (blend_factor( ctx->Color.Blend[0].DstRGB, GL_FALSE ) << R200_DST_BLEND_SHIFT); 234b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger 23574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul switch(ctx->Color.Blend[0].EquationRGB) { 236b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger case GL_FUNC_ADD: 237b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger eqn = R200_COMB_FCN_ADD_CLAMP; 238adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 239b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger 240b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger case GL_FUNC_SUBTRACT: 241b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger eqn = R200_COMB_FCN_SUB_CLAMP; 242adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 243b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger 244b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger case GL_FUNC_REVERSE_SUBTRACT: 245b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger eqn = R200_COMB_FCN_RSUB_CLAMP; 246adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 247b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger 248b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger case GL_MIN: 249b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger eqn = R200_COMB_FCN_MIN; 250b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) | 251b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT); 252adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 253b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger 254b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger case GL_MAX: 255b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger eqn = R200_COMB_FCN_MAX; 256b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) | 257b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT); 258adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 259b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger 260adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell default: 261b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger fprintf( stderr, "[%s:%u] Invalid RGB blend equation (0x%04x).\n", 26274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul __FUNCTION__, __LINE__, ctx->Color.Blend[0].EquationRGB ); 263b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger return; 264adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 265adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 26674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul funcA = (blend_factor( ctx->Color.Blend[0].SrcA, GL_TRUE ) << R200_SRC_BLEND_SHIFT) | 26774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul (blend_factor( ctx->Color.Blend[0].DstA, GL_FALSE ) << R200_DST_BLEND_SHIFT); 268033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger 26974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul switch(ctx->Color.Blend[0].EquationA) { 270033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger case GL_FUNC_ADD: 271033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger eqnA = R200_COMB_FCN_ADD_CLAMP; 272033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger break; 273033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger 274033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger case GL_FUNC_SUBTRACT: 275033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger eqnA = R200_COMB_FCN_SUB_CLAMP; 276033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger break; 277033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger 278033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger case GL_FUNC_REVERSE_SUBTRACT: 279033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger eqnA = R200_COMB_FCN_RSUB_CLAMP; 280033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger break; 281033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger 282033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger case GL_MIN: 283033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger eqnA = R200_COMB_FCN_MIN; 284033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) | 285033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT); 286033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger break; 287033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger 288033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger case GL_MAX: 289033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger eqnA = R200_COMB_FCN_MAX; 290033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) | 291033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT); 292033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger break; 293033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger 294033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger default: 295033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger fprintf( stderr, "[%s:%u] Invalid A blend equation (0x%04x).\n", 29674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul __FUNCTION__, __LINE__, ctx->Color.Blend[0].EquationA ); 297033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger return; 298033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger } 299033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger 300033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger rmesa->hw.ctx.cmd[CTX_RB3D_ABLENDCNTL] = eqnA | funcA; 301033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger rmesa->hw.ctx.cmd[CTX_RB3D_CBLENDCNTL] = eqn | func; 302033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger 303b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger} 304b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger 305f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200BlendEquationSeparate( struct gl_context *ctx, 306b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger GLenum modeRGB, GLenum modeA ) 307b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger{ 308b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger r200_set_blend_state( ctx ); 309b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger} 310b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger 311f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200BlendFuncSeparate( struct gl_context *ctx, 312b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger GLenum sfactorRGB, GLenum dfactorRGB, 313b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger GLenum sfactorA, GLenum dfactorA ) 314b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger{ 315b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger r200_set_blend_state( ctx ); 316adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 317adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 318adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 319adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* ============================================================= 320adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Depth testing 321adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 322adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 323f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200DepthFunc( struct gl_context *ctx, GLenum func ) 324adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 325adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 326adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 327adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, ctx ); 328adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~R200_Z_TEST_MASK; 329adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 330adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell switch ( ctx->Depth.Func ) { 331adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_NEVER: 332adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_NEVER; 333adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 334adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LESS: 335adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_LESS; 336adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 337adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_EQUAL: 338adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_EQUAL; 339adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 340adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LEQUAL: 341adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_LEQUAL; 342adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 343adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_GREATER: 344adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_GREATER; 345adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 346adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_NOTEQUAL: 347adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_NEQUAL; 348adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 349adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_GEQUAL: 350adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_GEQUAL; 351adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 352adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_ALWAYS: 353adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_ALWAYS; 354adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 355adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 356adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 357adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 358f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200DepthMask( struct gl_context *ctx, GLboolean flag ) 359adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 360adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 361adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, ctx ); 362adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 363adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( ctx->Depth.Mask ) { 364adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_WRITE_ENABLE; 365adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 366adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~R200_Z_WRITE_ENABLE; 367adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 368adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 369adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 370adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 371adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* ============================================================= 372adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Fog 373adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 374adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 375adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 376f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200Fogfv( struct gl_context *ctx, GLenum pname, const GLfloat *param ) 377adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 378adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 379adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell union { int i; float f; } c, d; 3808530d72c4e6ca8b8c741554ac446dd2ba8150e2eBrian Paul GLubyte col[4]; 381adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint i; 382adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 383adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell c.i = rmesa->hw.fog.cmd[FOG_C]; 384adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell d.i = rmesa->hw.fog.cmd[FOG_D]; 385adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 386adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell switch (pname) { 387adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_FOG_MODE: 388adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (!ctx->Fog.Enabled) 389adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell return; 390adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE(rmesa, tcl); 391adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~R200_TCL_FOG_MASK; 392adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell switch (ctx->Fog.Mode) { 393adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LINEAR: 394adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_TCL_FOG_LINEAR; 395adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (ctx->Fog.Start == ctx->Fog.End) { 396adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell c.f = 1.0F; 397adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell d.f = 1.0F; 398adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 399adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell else { 400adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start); 401adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell d.f = -1.0/(ctx->Fog.End-ctx->Fog.Start); 402adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 403adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 404adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_EXP: 405adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_TCL_FOG_EXP; 406adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell c.f = 0.0; 407adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell d.f = -ctx->Fog.Density; 408adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 409adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_EXP2: 410adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_TCL_FOG_EXP2; 411adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell c.f = 0.0; 412adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell d.f = -(ctx->Fog.Density * ctx->Fog.Density); 413adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 414adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell default: 415adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell return; 416adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 417adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 418adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_FOG_DENSITY: 419adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell switch (ctx->Fog.Mode) { 420adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_EXP: 421adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell c.f = 0.0; 422adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell d.f = -ctx->Fog.Density; 423adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 424adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_EXP2: 425adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell c.f = 0.0; 426adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell d.f = -(ctx->Fog.Density * ctx->Fog.Density); 427adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 428adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell default: 429adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 430adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 431adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 432adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_FOG_START: 433adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_FOG_END: 434adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (ctx->Fog.Mode == GL_LINEAR) { 435adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (ctx->Fog.Start == ctx->Fog.End) { 436adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell c.f = 1.0F; 437adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell d.f = 1.0F; 438adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 439adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start); 440adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell d.f = -1.0/(ctx->Fog.End-ctx->Fog.Start); 441adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 442adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 443adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 4447dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle case GL_FOG_COLOR: 445adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, ctx ); 4468530d72c4e6ca8b8c741554ac446dd2ba8150e2eBrian Paul _mesa_unclamped_float_rgba_to_ubyte(col, ctx->Fog.Color ); 447692ca82116485a9c6191e5265c5b369d5b4f82f3Dave Airlie i = radeonPackColor( 4, col[0], col[1], col[2], 0 ); 448adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] &= ~R200_FOG_COLOR_MASK; 449adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] |= i; 450adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 451d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger case GL_FOG_COORD_SRC: { 452d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger GLuint out_0 = rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0]; 453d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger GLuint fog = rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR]; 454d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger 455d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger fog &= ~R200_FOG_USE_MASK; 456fc606f7db9072d4f40081aea8f92f1d4489a5115Roland Scheidegger if ( ctx->Fog.FogCoordinateSource == GL_FOG_COORD || ctx->VertexProgram.Enabled) { 457d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger fog |= R200_FOG_USE_VTX_FOG; 458d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger out_0 |= R200_VTX_DISCRETE_FOG; 459d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger } 460d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger else { 461d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger fog |= R200_FOG_USE_SPEC_ALPHA; 462d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger out_0 &= ~R200_VTX_DISCRETE_FOG; 463d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger } 464d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger 465d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger if ( fog != rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] ) { 466d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger R200_STATECHANGE( rmesa, ctx ); 467d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] = fog; 468d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger } 469d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger 4701c0f11046a6dff2568bf42f213983df583b765b9Roland Scheidegger if (out_0 != rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0]) { 471d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger R200_STATECHANGE( rmesa, vtx ); 4727dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] = out_0; 473d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger } 474d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger 475adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 476d294f79190a5b25ef0fbbbf3ac94b15c9402d009Roland Scheidegger } 477adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell default: 478adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell return; 479adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 480adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 481adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (c.i != rmesa->hw.fog.cmd[FOG_C] || d.i != rmesa->hw.fog.cmd[FOG_D]) { 482adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, fog ); 483adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.fog.cmd[FOG_C] = c.i; 484adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.fog.cmd[FOG_D] = d.i; 485adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 486adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 487adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 488adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* ============================================================= 489adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Culling 490adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 491adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 492f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200CullFace( struct gl_context *ctx, GLenum unused ) 493adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 494adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 495adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL]; 496adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint t = rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL]; 497adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 498adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell s |= R200_FFACE_SOLID | R200_BFACE_SOLID; 499adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell t &= ~(R200_CULL_FRONT | R200_CULL_BACK); 500adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 501adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( ctx->Polygon.CullFlag ) { 502adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell switch ( ctx->Polygon.CullFaceMode ) { 503adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_FRONT: 504adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell s &= ~R200_FFACE_SOLID; 505adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell t |= R200_CULL_FRONT; 506adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 507adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_BACK: 508adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell s &= ~R200_BFACE_SOLID; 509adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell t |= R200_CULL_BACK; 510adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 511adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_FRONT_AND_BACK: 512adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell s &= ~(R200_FFACE_SOLID | R200_BFACE_SOLID); 513adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell t |= (R200_CULL_FRONT | R200_CULL_BACK); 514adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 515adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 516adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 517adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 518adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) { 519adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE(rmesa, set ); 520adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.set.cmd[SET_SE_CNTL] = s; 521adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 522adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 523adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] != t ) { 524adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE(rmesa, tcl ); 525adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] = t; 526adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 527adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 528adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 529f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200FrontFace( struct gl_context *ctx, GLenum mode ) 530adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 531adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 532320b5abda5026f23f327c6f60c1b6287cc507e78smoki int cull_face = (mode == GL_CW) ? R200_FFACE_CULL_CW : R200_FFACE_CULL_CCW; 533adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 534adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, set ); 535adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_FFACE_CULL_DIR_MASK; 536adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 537adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, tcl ); 538adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~R200_CULL_FRONT_IS_CCW; 539adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 54060e60bb3026a269fefe1cfd3312fdf3a7e4c595fMichel Dänzer /* Winding is inverted when rendering to FBO */ 54147941bfaea6e8a60e2c31f7a2c8c233f2a10ecb1Brian Paul if (ctx->DrawBuffer && _mesa_is_user_fbo(ctx->DrawBuffer)) 542320b5abda5026f23f327c6f60c1b6287cc507e78smoki cull_face = (mode == GL_CCW) ? R200_FFACE_CULL_CW : R200_FFACE_CULL_CCW; 543320b5abda5026f23f327c6f60c1b6287cc507e78smoki rmesa->hw.set.cmd[SET_SE_CNTL] |= cull_face; 54460e60bb3026a269fefe1cfd3312fdf3a7e4c595fMichel Dänzer 545320b5abda5026f23f327c6f60c1b6287cc507e78smoki if ( mode == GL_CCW ) 546adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_CULL_FRONT_IS_CCW; 547adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 548adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 549adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* ============================================================= 550adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Point state 551adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 552f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200PointSize( struct gl_context *ctx, GLfloat size ) 553adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 55444dace86eaf9eded8e6465adfadf6345658686ddRoland Scheidegger r200ContextPtr rmesa = R200_CONTEXT(ctx); 555cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger GLfloat *fcmd = (GLfloat *)rmesa->hw.ptp.cmd; 55644dace86eaf9eded8e6465adfadf6345658686ddRoland Scheidegger 55705b04084892cc54e52010837de8fd85cd64d3b7aPauli Nieminen radeon_print(RADEON_STATE, RADEON_TRACE, 55805b04084892cc54e52010837de8fd85cd64d3b7aPauli Nieminen "%s(%p) size: %f, fixed point result: %d.%d (%d/16)\n", 55905b04084892cc54e52010837de8fd85cd64d3b7aPauli Nieminen __func__, ctx, size, 56005b04084892cc54e52010837de8fd85cd64d3b7aPauli Nieminen ((GLuint)(ctx->Point.Size * 16.0))/16, 56105b04084892cc54e52010837de8fd85cd64d3b7aPauli Nieminen (((GLuint)(ctx->Point.Size * 16.0))&15)*100/16, 56205b04084892cc54e52010837de8fd85cd64d3b7aPauli Nieminen ((GLuint)(ctx->Point.Size * 16.0))&15); 56305b04084892cc54e52010837de8fd85cd64d3b7aPauli Nieminen 56444dace86eaf9eded8e6465adfadf6345658686ddRoland Scheidegger R200_STATECHANGE( rmesa, cst ); 565cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger R200_STATECHANGE( rmesa, ptp ); 56644dace86eaf9eded8e6465adfadf6345658686ddRoland Scheidegger rmesa->hw.cst.cmd[CST_RE_POINTSIZE] &= ~0xffff; 56744dace86eaf9eded8e6465adfadf6345658686ddRoland Scheidegger rmesa->hw.cst.cmd[CST_RE_POINTSIZE] |= ((GLuint)(ctx->Point.Size * 16.0)); 568cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger/* this is the size param of the point size calculation (point size reg value 569cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger is not used when calculation is active). */ 570cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger fcmd[PTP_VPORT_SCALE_PTSIZE] = ctx->Point.Size; 571cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger} 572cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger 573f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200PointParameter( struct gl_context *ctx, GLenum pname, const GLfloat *params) 574cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger{ 575cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger r200ContextPtr rmesa = R200_CONTEXT(ctx); 576cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger GLfloat *fcmd = (GLfloat *)rmesa->hw.ptp.cmd; 577cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger 578cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger switch (pname) { 579cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger case GL_POINT_SIZE_MIN: 580cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger /* Can clamp both in tcl and setup - just set both (as does fglrx) */ 581cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger R200_STATECHANGE( rmesa, lin ); 582cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger R200_STATECHANGE( rmesa, ptp ); 583cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] &= 0xffff; 584cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] |= (GLuint)(ctx->Point.MinSize * 16.0) << 16; 585cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger fcmd[PTP_CLAMP_MIN] = ctx->Point.MinSize; 586cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger break; 587cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger case GL_POINT_SIZE_MAX: 588cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger R200_STATECHANGE( rmesa, cst ); 589cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger R200_STATECHANGE( rmesa, ptp ); 590cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger rmesa->hw.cst.cmd[CST_RE_POINTSIZE] &= 0xffff; 591cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger rmesa->hw.cst.cmd[CST_RE_POINTSIZE] |= (GLuint)(ctx->Point.MaxSize * 16.0) << 16; 592cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger fcmd[PTP_CLAMP_MAX] = ctx->Point.MaxSize; 593cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger break; 594cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger case GL_POINT_DISTANCE_ATTENUATION: 595cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger R200_STATECHANGE( rmesa, vtx ); 596cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger R200_STATECHANGE( rmesa, spr ); 597cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger R200_STATECHANGE( rmesa, ptp ); 598cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger GLfloat *fcmd = (GLfloat *)rmesa->hw.ptp.cmd; 599cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] &= 600cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger ~(R200_PS_MULT_MASK | R200_PS_LIN_ATT_ZERO | R200_PS_SE_SEL_STATE); 601cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger /* can't rely on ctx->Point._Attenuated here and test for NEW_POINT in 602cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger r200ValidateState looks like overkill */ 603cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger if (ctx->Point.Params[0] != 1.0 || 604cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger ctx->Point.Params[1] != 0.0 || 605cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger ctx->Point.Params[2] != 0.0 || 606cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger (ctx->VertexProgram.Enabled && ctx->VertexProgram.PointSizeEnabled)) { 607cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger /* all we care for vp would be the ps_se_sel_state setting */ 608cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger fcmd[PTP_ATT_CONST_QUAD] = ctx->Point.Params[2]; 609cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger fcmd[PTP_ATT_CONST_LIN] = ctx->Point.Params[1]; 610cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger fcmd[PTP_ATT_CONST_CON] = ctx->Point.Params[0]; 611cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] |= R200_PS_MULT_ATTENCONST; 612cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger if (ctx->Point.Params[1] == 0.0) 613cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] |= R200_PS_LIN_ATT_ZERO; 614cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger/* FIXME: setting this here doesn't look quite ok - we only want to do 615cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger that if we're actually drawing points probably */ 616cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_PT_SIZE; 617cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= R200_VTX_POINT_SIZE; 618cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger } 619cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger else { 620cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] |= 621cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger R200_PS_SE_SEL_STATE | R200_PS_MULT_CONST; 622cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] &= ~R200_OUTPUT_PT_SIZE; 623cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] &= ~R200_VTX_POINT_SIZE; 624cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger } 625cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger break; 626cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger case GL_POINT_FADE_THRESHOLD_SIZE: 627cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger /* don't support multisampling, so doesn't matter. */ 628cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger break; 629cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger /* can't do these but don't need them. 630cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger case GL_POINT_SPRITE_R_MODE_NV: 631cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger case GL_POINT_SPRITE_COORD_ORIGIN: */ 632cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger default: 633cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger fprintf(stderr, "bad pname parameter in r200PointParameter\n"); 634cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger return; 635cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger } 636adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 637adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 638adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* ============================================================= 639adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Line state 640adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 641f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200LineWidth( struct gl_context *ctx, GLfloat widthf ) 642adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 643adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 644adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 645adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, lin ); 646adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, set ); 647adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 648adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell /* Line width is stored in U6.4 format. 649af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian * Same min/max limits for AA, non-AA lines. 650adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 651adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] &= ~0xffff; 652af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] |= (GLuint) 653af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian (CLAMP(widthf, ctx->Const.MinLineWidth, ctx->Const.MaxLineWidth) * 16.0); 654adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 655adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( widthf > 1.0 ) { 656adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.set.cmd[SET_SE_CNTL] |= R200_WIDELINE_ENABLE; 657adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 658adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_WIDELINE_ENABLE; 659adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 660adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 661adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 662f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200LineStipple( struct gl_context *ctx, GLint factor, GLushort pattern ) 663adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 664adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 665adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 666adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, lin ); 6677dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle rmesa->hw.lin.cmd[LIN_RE_LINE_PATTERN] = 668adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell ((((GLuint)factor & 0xff) << 16) | ((GLuint)pattern)); 669adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 670adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 671adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 672adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* ============================================================= 673adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Masks 674adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 675f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200ColorMask( struct gl_context *ctx, 676adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLboolean r, GLboolean g, 677adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLboolean b, GLboolean a ) 678adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 679adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 680504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie GLuint mask; 681504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie struct radeon_renderbuffer *rrb; 682adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint flag = rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] & ~R200_PLANE_MASK_ENABLE; 683adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 684504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie rrb = radeon_get_colorbuffer(&rmesa->radeon); 685504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie if (!rrb) 686504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie return; 687504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie mask = radeonPackColor( rrb->cpp, 688fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul ctx->Color.ColorMask[0][RCOMP], 689fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul ctx->Color.ColorMask[0][GCOMP], 690fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul ctx->Color.ColorMask[0][BCOMP], 691fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul ctx->Color.ColorMask[0][ACOMP] ); 692504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie 693504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie 694adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (!(r && g && b && a)) 695adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell flag |= R200_PLANE_MASK_ENABLE; 696adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 6977dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle if ( rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] != flag ) { 6987dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle R200_STATECHANGE( rmesa, ctx ); 6997dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = flag; 7007dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle } 701adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 702adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] != mask ) { 703adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, msk ); 704adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] = mask; 705adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 706adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 707adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 708adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 709adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* ============================================================= 710adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Polygon state 711adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 712adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 713f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200PolygonOffset( struct gl_context *ctx, 714adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLfloat factor, GLfloat units ) 715adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 716adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 7178c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie const GLfloat depthScale = 1.0F / ctx->DrawBuffer->_DepthMaxF; 7188c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie float_ui32_type constant = { units * depthScale }; 71908e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger float_ui32_type factoru = { factor }; 720adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 721adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* factor *= 2; */ 722adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* constant *= 2; */ 72308e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger 724adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* fprintf(stderr, "%s f:%f u:%f\n", __FUNCTION__, factor, constant); */ 725adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 726adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, zbs ); 72708e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_FACTOR] = factoru.ui32; 72808e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_CONSTANT] = constant.ui32; 729adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 730adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 731f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200PolygonMode( struct gl_context *ctx, GLenum face, GLenum mode ) 732adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 733adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 734adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLboolean flag = (ctx->_TriangleCaps & DD_TRI_UNFILLED) != 0; 735adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 736adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell /* Can't generally do unfilled via tcl, but some good special 7377dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle * cases work. 738adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 739adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell TCL_FALLBACK( ctx, R200_TCL_FALLBACK_UNFILLED, flag); 7404637235183b80963536f2364e4d50fcb894886ddDave Airlie if (rmesa->radeon.TclFallback) { 741adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ChooseRenderState( ctx ); 742adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ChooseVertexState( ctx ); 743adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 744adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 745adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 746adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 747adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* ============================================================= 748adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Rendering attributes 749adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * 750adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * We really don't want to recalculate all this every time we bind a 751adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * texture. These things shouldn't change all that often, so it makes 752adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * sense to break them out of the core texture state update routines. 753adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 754adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 755adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* Examine lighting and texture state to determine if separate specular 756adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * should be enabled. 757adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 758f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200UpdateSpecular( struct gl_context *ctx ) 759adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 760adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 7615a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell uint32_t p = rmesa->hw.ctx.cmd[CTX_PP_CNTL]; 762adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 763adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, tcl ); 764adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, vtx ); 765adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 766adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] &= ~(3<<R200_VTX_COLOR_0_SHIFT); 767adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] &= ~(3<<R200_VTX_COLOR_1_SHIFT); 768adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] &= ~R200_OUTPUT_COLOR_0; 769adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] &= ~R200_OUTPUT_COLOR_1; 770adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_LIGHTING_ENABLE; 771adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 772adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell p &= ~R200_SPECULAR_ENABLE; 773adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 774adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_DIFFUSE_SPECULAR_COMBINE; 775adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 776adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 777adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (ctx->Light.Enabled && 778adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) { 7797dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= 780adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT) | 7817dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle (R200_VTX_FP_RGBA << R200_VTX_COLOR_1_SHIFT)); 782adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_0; 783adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_1; 784adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LIGHTING_ENABLE; 785adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell p |= R200_SPECULAR_ENABLE; 7867dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= 787adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell ~R200_DIFFUSE_SPECULAR_COMBINE; 788adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 789adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell else if (ctx->Light.Enabled) { 7907dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= 7917dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT)); 792adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_0; 793adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LIGHTING_ENABLE; 794adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else if (ctx->Fog.ColorSumEnabled ) { 7957dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= 796adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT) | 7977dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle (R200_VTX_FP_RGBA << R200_VTX_COLOR_1_SHIFT)); 798adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell p |= R200_SPECULAR_ENABLE; 799adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 8007dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= 8017dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT)); 802adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 803adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 804adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (ctx->Fog.Enabled) { 8057dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= 8067dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle ((R200_VTX_FP_RGBA << R200_VTX_COLOR_1_SHIFT)); 807adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_1; 808adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 809adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 810adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( rmesa->hw.ctx.cmd[CTX_PP_CNTL] != p ) { 811adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, ctx ); 812adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_PP_CNTL] = p; 813adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 814adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 815adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell /* Update vertex/render formats 816adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 8177dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle if (rmesa->radeon.TclFallback) { 818adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ChooseRenderState( ctx ); 819adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ChooseVertexState( ctx ); 820adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 821adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 822adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 823adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 824adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* ============================================================= 825adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Materials 826adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 827adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 828adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 8297dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle/* Update on colormaterial, material emmissive/ambient, 830adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * lightmodel.globalambient 831adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 832f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void update_global_ambient( struct gl_context *ctx ) 833adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 834adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 835adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell float *fcmd = (float *)R200_DB_STATE( glt ); 836adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 837adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell /* Need to do more if both emmissive & ambient are PREMULT: 838a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger * I believe this is not nessary when using source_material. This condition thus 839a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger * will never happen currently, and the function has no dependencies on materials now 840adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 841adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ((rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1] & 842adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell ((3 << R200_FRONT_EMISSIVE_SOURCE_SHIFT) | 8437dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle (3 << R200_FRONT_AMBIENT_SOURCE_SHIFT))) == 0) 844adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell { 8457dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle COPY_3V( &fcmd[GLT_RED], 846adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_EMISSION]); 847adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell ACC_SCALE_3V( &fcmd[GLT_RED], 848adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell ctx->Light.Model.Ambient, 849adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT]); 8507dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle } 851adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell else 852adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell { 853adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell COPY_3V( &fcmd[GLT_RED], ctx->Light.Model.Ambient ); 854adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 8557dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 856adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_DB_STATECHANGE(rmesa, &rmesa->hw.glt); 857adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 858adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 8597dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle/* Update on change to 860adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * - light[p].colors 861adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * - light[p].enabled 862adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 863f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void update_light_colors( struct gl_context *ctx, GLuint p ) 864adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 865adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell struct gl_light *l = &ctx->Light.Light[p]; 866adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 867adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* fprintf(stderr, "%s\n", __FUNCTION__); */ 868adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 869adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (l->Enabled) { 870adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 871adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell float *fcmd = (float *)R200_DB_STATE( lit[p] ); 872adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 8737dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle COPY_4V( &fcmd[LIT_AMBIENT_RED], l->Ambient ); 874adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell COPY_4V( &fcmd[LIT_DIFFUSE_RED], l->Diffuse ); 875adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell COPY_4V( &fcmd[LIT_SPECULAR_RED], l->Specular ); 8767dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 877adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] ); 878adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 879adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 880adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 881f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200ColorMaterial( struct gl_context *ctx, GLenum face, GLenum mode ) 882adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 883adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 884adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint light_model_ctl1 = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1]; 885adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell light_model_ctl1 &= ~((0xf << R200_FRONT_EMISSIVE_SOURCE_SHIFT) | 886adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell (0xf << R200_FRONT_AMBIENT_SOURCE_SHIFT) | 887adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell (0xf << R200_FRONT_DIFFUSE_SOURCE_SHIFT) | 888a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger (0xf << R200_FRONT_SPECULAR_SOURCE_SHIFT) | 889a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger (0xf << R200_BACK_EMISSIVE_SOURCE_SHIFT) | 890a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger (0xf << R200_BACK_AMBIENT_SOURCE_SHIFT) | 891a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger (0xf << R200_BACK_DIFFUSE_SOURCE_SHIFT) | 892a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger (0xf << R200_BACK_SPECULAR_SOURCE_SHIFT)); 893a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger 894a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger if (ctx->Light.ColorMaterialEnabled) { 8954cb3579e52fed48d623698610e31d05ac8c8946fBrian Paul GLuint mask = ctx->Light._ColorMaterialBitmask; 8967dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 897adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (mask & MAT_BIT_FRONT_EMISSION) { 898adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << 899adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_FRONT_EMISSIVE_SOURCE_SHIFT); 900adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 901a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger else 902a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 << 903a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger R200_FRONT_EMISSIVE_SOURCE_SHIFT); 904adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 905adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (mask & MAT_BIT_FRONT_AMBIENT) { 906adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << 907adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_FRONT_AMBIENT_SOURCE_SHIFT); 908adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 909a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger else 910a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 << 911a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger R200_FRONT_AMBIENT_SOURCE_SHIFT); 9127dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 913adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (mask & MAT_BIT_FRONT_DIFFUSE) { 914adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << 915adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_FRONT_DIFFUSE_SOURCE_SHIFT); 916adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 917a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger else 918a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 << 919a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger R200_FRONT_DIFFUSE_SOURCE_SHIFT); 9207dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 921adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (mask & MAT_BIT_FRONT_SPECULAR) { 922adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << 923adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_FRONT_SPECULAR_SOURCE_SHIFT); 924adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 925a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger else { 926a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 << 927a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger R200_FRONT_SPECULAR_SOURCE_SHIFT); 928a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger } 9297dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 930a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger if (mask & MAT_BIT_BACK_EMISSION) { 931a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << 932a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger R200_BACK_EMISSIVE_SOURCE_SHIFT); 933a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger } 934adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 935a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger else light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 << 936a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger R200_BACK_EMISSIVE_SOURCE_SHIFT); 937adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 938a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger if (mask & MAT_BIT_BACK_AMBIENT) { 939a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << 940a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger R200_BACK_AMBIENT_SOURCE_SHIFT); 941a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger } 942a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger else light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 << 943a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger R200_BACK_AMBIENT_SOURCE_SHIFT); 944a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger 945a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger if (mask & MAT_BIT_BACK_DIFFUSE) { 946a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << 947a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger R200_BACK_DIFFUSE_SOURCE_SHIFT); 948a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger } 949a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger else light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 << 950a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger R200_BACK_DIFFUSE_SOURCE_SHIFT); 951a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger 952a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger if (mask & MAT_BIT_BACK_SPECULAR) { 953a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << 954a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger R200_BACK_SPECULAR_SOURCE_SHIFT); 955a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger } 956a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger else { 957a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 << 958a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger R200_BACK_SPECULAR_SOURCE_SHIFT); 959a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger } 960adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 961a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger else { 962a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger /* Default to SOURCE_MATERIAL: 963a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger */ 964a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger light_model_ctl1 |= 965a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_EMISSIVE_SOURCE_SHIFT) | 966a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_AMBIENT_SOURCE_SHIFT) | 967a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_DIFFUSE_SOURCE_SHIFT) | 968a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_SPECULAR_SOURCE_SHIFT) | 969a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_EMISSIVE_SOURCE_SHIFT) | 970a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_AMBIENT_SOURCE_SHIFT) | 971a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_DIFFUSE_SOURCE_SHIFT) | 972a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_SPECULAR_SOURCE_SHIFT); 973a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger } 974a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger 975a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger if (light_model_ctl1 != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1]) { 976a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger R200_STATECHANGE( rmesa, tcl ); 977a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1] = light_model_ctl1; 978adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 9797dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 9807dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 981adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 982adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 983f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid r200UpdateMaterial( struct gl_context *ctx ) 984adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 985adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 986adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLfloat (*mat)[4] = ctx->Light.Material.Attrib; 987adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLfloat *fcmd = (GLfloat *)R200_DB_STATE( mtl[0] ); 988a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger GLfloat *fcmd2 = (GLfloat *)R200_DB_STATE( mtl[1] ); 989adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint mask = ~0; 9907dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 991a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger /* Might be possible and faster to update everything unconditionally? */ 992adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (ctx->Light.ColorMaterialEnabled) 9934cb3579e52fed48d623698610e31d05ac8c8946fBrian Paul mask &= ~ctx->Light._ColorMaterialBitmask; 994adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 995239105c6c87da0b0c5c15ae54b19fe39492b0f29Pauli Nieminen if (R200_DEBUG & RADEON_STATE) 996adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fprintf(stderr, "%s\n", __FUNCTION__); 997adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 998adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (mask & MAT_BIT_FRONT_EMISSION) { 999adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[MTL_EMMISSIVE_RED] = mat[MAT_ATTRIB_FRONT_EMISSION][0]; 1000adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[MTL_EMMISSIVE_GREEN] = mat[MAT_ATTRIB_FRONT_EMISSION][1]; 1001adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[MTL_EMMISSIVE_BLUE] = mat[MAT_ATTRIB_FRONT_EMISSION][2]; 1002adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[MTL_EMMISSIVE_ALPHA] = mat[MAT_ATTRIB_FRONT_EMISSION][3]; 1003adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1004adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (mask & MAT_BIT_FRONT_AMBIENT) { 1005adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[MTL_AMBIENT_RED] = mat[MAT_ATTRIB_FRONT_AMBIENT][0]; 1006adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[MTL_AMBIENT_GREEN] = mat[MAT_ATTRIB_FRONT_AMBIENT][1]; 1007adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[MTL_AMBIENT_BLUE] = mat[MAT_ATTRIB_FRONT_AMBIENT][2]; 1008adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[MTL_AMBIENT_ALPHA] = mat[MAT_ATTRIB_FRONT_AMBIENT][3]; 1009adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1010adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (mask & MAT_BIT_FRONT_DIFFUSE) { 1011adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[MTL_DIFFUSE_RED] = mat[MAT_ATTRIB_FRONT_DIFFUSE][0]; 1012adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[MTL_DIFFUSE_GREEN] = mat[MAT_ATTRIB_FRONT_DIFFUSE][1]; 1013adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[MTL_DIFFUSE_BLUE] = mat[MAT_ATTRIB_FRONT_DIFFUSE][2]; 1014adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[MTL_DIFFUSE_ALPHA] = mat[MAT_ATTRIB_FRONT_DIFFUSE][3]; 1015adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1016adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (mask & MAT_BIT_FRONT_SPECULAR) { 1017adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[MTL_SPECULAR_RED] = mat[MAT_ATTRIB_FRONT_SPECULAR][0]; 1018adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[MTL_SPECULAR_GREEN] = mat[MAT_ATTRIB_FRONT_SPECULAR][1]; 1019adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[MTL_SPECULAR_BLUE] = mat[MAT_ATTRIB_FRONT_SPECULAR][2]; 1020adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[MTL_SPECULAR_ALPHA] = mat[MAT_ATTRIB_FRONT_SPECULAR][3]; 1021adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1022adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (mask & MAT_BIT_FRONT_SHININESS) { 1023adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[MTL_SHININESS] = mat[MAT_ATTRIB_FRONT_SHININESS][0]; 1024adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1025adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1026a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger if (mask & MAT_BIT_BACK_EMISSION) { 1027a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger fcmd2[MTL_EMMISSIVE_RED] = mat[MAT_ATTRIB_BACK_EMISSION][0]; 1028a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger fcmd2[MTL_EMMISSIVE_GREEN] = mat[MAT_ATTRIB_BACK_EMISSION][1]; 1029a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger fcmd2[MTL_EMMISSIVE_BLUE] = mat[MAT_ATTRIB_BACK_EMISSION][2]; 1030a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger fcmd2[MTL_EMMISSIVE_ALPHA] = mat[MAT_ATTRIB_BACK_EMISSION][3]; 1031a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger } 1032a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger if (mask & MAT_BIT_BACK_AMBIENT) { 1033a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger fcmd2[MTL_AMBIENT_RED] = mat[MAT_ATTRIB_BACK_AMBIENT][0]; 1034a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger fcmd2[MTL_AMBIENT_GREEN] = mat[MAT_ATTRIB_BACK_AMBIENT][1]; 1035a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger fcmd2[MTL_AMBIENT_BLUE] = mat[MAT_ATTRIB_BACK_AMBIENT][2]; 1036a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger fcmd2[MTL_AMBIENT_ALPHA] = mat[MAT_ATTRIB_BACK_AMBIENT][3]; 1037a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger } 1038a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger if (mask & MAT_BIT_BACK_DIFFUSE) { 1039a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger fcmd2[MTL_DIFFUSE_RED] = mat[MAT_ATTRIB_BACK_DIFFUSE][0]; 1040a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger fcmd2[MTL_DIFFUSE_GREEN] = mat[MAT_ATTRIB_BACK_DIFFUSE][1]; 1041a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger fcmd2[MTL_DIFFUSE_BLUE] = mat[MAT_ATTRIB_BACK_DIFFUSE][2]; 1042a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger fcmd2[MTL_DIFFUSE_ALPHA] = mat[MAT_ATTRIB_BACK_DIFFUSE][3]; 1043a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger } 1044a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger if (mask & MAT_BIT_BACK_SPECULAR) { 1045a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger fcmd2[MTL_SPECULAR_RED] = mat[MAT_ATTRIB_BACK_SPECULAR][0]; 1046a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger fcmd2[MTL_SPECULAR_GREEN] = mat[MAT_ATTRIB_BACK_SPECULAR][1]; 1047a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger fcmd2[MTL_SPECULAR_BLUE] = mat[MAT_ATTRIB_BACK_SPECULAR][2]; 1048a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger fcmd2[MTL_SPECULAR_ALPHA] = mat[MAT_ATTRIB_BACK_SPECULAR][3]; 1049a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger } 1050a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger if (mask & MAT_BIT_BACK_SHININESS) { 1051a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger fcmd2[MTL_SHININESS] = mat[MAT_ATTRIB_BACK_SHININESS][0]; 1052a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger } 1053adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1054a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger R200_DB_STATECHANGE( rmesa, &rmesa->hw.mtl[0] ); 1055a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger R200_DB_STATECHANGE( rmesa, &rmesa->hw.mtl[1] ); 1056a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer 1057a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger /* currently material changes cannot trigger a global ambient change, I believe this is correct 1058a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger update_global_ambient( ctx ); */ 1059adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 1060adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1061adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* _NEW_LIGHT 1062adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * _NEW_MODELVIEW 1063adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * _MESA_NEW_NEED_EYE_COORDS 1064adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * 1065adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Uses derived state from mesa: 1066adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * _VP_inf_norm 1067adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * _h_inf_norm 1068adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * _Position 10697391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul * _NormSpotDirection 1070adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * _ModelViewInvScale 1071adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * _NeedEyeCoords 1072adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * _EyeZDir 1073adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * 1074adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * which are calculated in light.c and are correct for the current 1075adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * lighting space (model or eye), hence dependencies on _NEW_MODELVIEW 10767dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle * and _MESA_NEW_NEED_EYE_COORDS. 1077adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 1078f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void update_light( struct gl_context *ctx ) 1079adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 1080adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 1081adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1082adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell /* Have to check these, or have an automatic shortcircuit mechanism 1083adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * to remove noop statechanges. (Or just do a better job on the 1084adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * front end). 1085adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 1086adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell { 1087adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint tmp = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0]; 1088adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1089adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (ctx->_NeedEyeCoords) 1090adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell tmp &= ~R200_LIGHT_IN_MODELSPACE; 1091adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell else 1092adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell tmp |= R200_LIGHT_IN_MODELSPACE; 10937dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 10947dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle if (tmp != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0]) 1095adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell { 1096adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, tcl ); 1097adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] = tmp; 1098adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1099adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1100adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1101adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell { 1102adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLfloat *fcmd = (GLfloat *)R200_DB_STATE( eye ); 1103adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[EYE_X] = ctx->_EyeZDir[0]; 1104adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[EYE_Y] = ctx->_EyeZDir[1]; 1105adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[EYE_Z] = - ctx->_EyeZDir[2]; 1106adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[EYE_RESCALE_FACTOR] = ctx->_ModelViewInvScale; 1107adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_DB_STATECHANGE( rmesa, &rmesa->hw.eye ); 1108adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1109adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1110adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1111adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1112adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (ctx->Light.Enabled) { 1113adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLint p; 1114adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell for (p = 0 ; p < MAX_LIGHTS; p++) { 1115adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (ctx->Light.Light[p].Enabled) { 1116adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell struct gl_light *l = &ctx->Light.Light[p]; 1117adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLfloat *fcmd = (GLfloat *)R200_DB_STATE( lit[p] ); 11187dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 1119adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (l->EyePosition[3] == 0.0) { 11207dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle COPY_3FV( &fcmd[LIT_POSITION_X], l->_VP_inf_norm ); 11217dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle COPY_3FV( &fcmd[LIT_DIRECTION_X], l->_h_inf_norm ); 1122adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[LIT_POSITION_W] = 0; 1123adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[LIT_DIRECTION_W] = 0; 1124adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 1125adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell COPY_4V( &fcmd[LIT_POSITION_X], l->_Position ); 11267391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul fcmd[LIT_DIRECTION_X] = -l->_NormSpotDirection[0]; 11277391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul fcmd[LIT_DIRECTION_Y] = -l->_NormSpotDirection[1]; 11287391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul fcmd[LIT_DIRECTION_Z] = -l->_NormSpotDirection[2]; 1129adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[LIT_DIRECTION_W] = 0; 1130adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1131adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1132adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] ); 1133adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1134adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1135adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1136adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 1137adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1138f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200Lightfv( struct gl_context *ctx, GLenum light, 1139adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLenum pname, const GLfloat *params ) 1140adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 1141adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 1142adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLint p = light - GL_LIGHT0; 1143adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell struct gl_light *l = &ctx->Light.Light[p]; 1144adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLfloat *fcmd = (GLfloat *)rmesa->hw.lit[p].cmd; 11457dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 1146adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1147adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell switch (pname) { 11487dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle case GL_AMBIENT: 1149adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_DIFFUSE: 1150adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_SPECULAR: 1151adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell update_light_colors( ctx, p ); 1152adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1153adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 11547dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle case GL_SPOT_DIRECTION: 11557dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle /* picked up in update_light */ 1156adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1157adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1158adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_POSITION: { 11597dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle /* positions picked up in update_light, but can do flag here */ 1160adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint flag = (p&1)? R200_LIGHT_1_IS_LOCAL : R200_LIGHT_0_IS_LOCAL; 1161adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2; 1162adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1163adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE(rmesa, tcl); 1164adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (l->EyePosition[3] != 0.0F) 1165adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[idx] |= flag; 1166adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell else 1167adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[idx] &= ~flag; 1168adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1169adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1170adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1171adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_SPOT_EXPONENT: 1172adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE(rmesa, lit[p]); 1173adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[LIT_SPOT_EXPONENT] = params[0]; 1174adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1175adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1176adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_SPOT_CUTOFF: { 1177adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint flag = (p&1) ? R200_LIGHT_1_IS_SPOT : R200_LIGHT_0_IS_SPOT; 1178adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2; 1179adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1180adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE(rmesa, lit[p]); 1181adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[LIT_SPOT_CUTOFF] = l->_CosCutoff; 1182adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1183adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE(rmesa, tcl); 1184adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (l->SpotCutoff != 180.0F) 1185adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[idx] |= flag; 1186adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell else 1187adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[idx] &= ~flag; 1188adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1189adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1190adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1191adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1192adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_CONSTANT_ATTENUATION: 1193adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE(rmesa, lit[p]); 1194adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[LIT_ATTEN_CONST] = params[0]; 11955d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer if ( params[0] == 0.0 ) 11965d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer fcmd[LIT_ATTEN_CONST_INV] = FLT_MAX; 11975d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer else 11985d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer fcmd[LIT_ATTEN_CONST_INV] = 1.0 / params[0]; 1199adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1200adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LINEAR_ATTENUATION: 1201adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE(rmesa, lit[p]); 1202adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[LIT_ATTEN_LINEAR] = params[0]; 1203adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1204adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_QUADRATIC_ATTENUATION: 1205adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE(rmesa, lit[p]); 1206adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fcmd[LIT_ATTEN_QUADRATIC] = params[0]; 1207adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1208adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell default: 1209adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell return; 1210adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1211adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 12125d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer /* Set RANGE_ATTEN only when needed */ 12135d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer switch (pname) { 12145d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer case GL_POSITION: 12155d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer case GL_CONSTANT_ATTENUATION: 12165d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer case GL_LINEAR_ATTENUATION: 12175d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer case GL_QUADRATIC_ATTENUATION: { 12185d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer GLuint *icmd = (GLuint *)R200_DB_STATE( tcl ); 12195d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2; 12205d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer GLuint atten_flag = ( p&1 ) ? R200_LIGHT_1_ENABLE_RANGE_ATTEN 12215d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer : R200_LIGHT_0_ENABLE_RANGE_ATTEN; 12225d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer GLuint atten_const_flag = ( p&1 ) ? R200_LIGHT_1_CONSTANT_RANGE_ATTEN 12235d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer : R200_LIGHT_0_CONSTANT_RANGE_ATTEN; 12245d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer 12255d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer if ( l->EyePosition[3] == 0.0F || 12265d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer ( ( fcmd[LIT_ATTEN_CONST] == 0.0 || fcmd[LIT_ATTEN_CONST] == 1.0 ) && 12275d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) ) { 12285d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer /* Disable attenuation */ 12295d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer icmd[idx] &= ~atten_flag; 12305d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer } else { 12315d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer if ( fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) { 12325d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer /* Enable only constant portion of attenuation calculation */ 12335d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer icmd[idx] |= ( atten_flag | atten_const_flag ); 12345d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer } else { 12355d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer /* Enable full attenuation calculation */ 12365d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer icmd[idx] &= ~atten_const_flag; 12375d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer icmd[idx] |= atten_flag; 12385d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer } 12395d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer } 12405d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer 12415d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer R200_DB_STATECHANGE( rmesa, &rmesa->hw.tcl ); 12425d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer break; 12435d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer } 12445d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer default: 12455d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer break; 12465d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer } 1247adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 1248adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1249f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200UpdateLocalViewer ( struct gl_context *ctx ) 12509dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger{ 12519dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger/* It looks like for the texgen modes GL_SPHERE_MAP, GL_NORMAL_MAP and 12529dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger GL_REFLECTION_MAP we need R200_LOCAL_VIEWER set (fglrx does exactly that 12539dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger for these and only these modes). This means specular highlights may turn out 12549dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger wrong in some cases when lighting is enabled but GL_LIGHT_MODEL_LOCAL_VIEWER 12559dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger is not set, though it seems to happen rarely and the effect seems quite 12569dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger subtle. May need TCL fallback to fix it completely, though I'm not sure 12579dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger how you'd identify the cases where the specular highlights indeed will 12589dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger be wrong. Don't know if fglrx does something special in that case. 12599dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger*/ 12609dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger r200ContextPtr rmesa = R200_CONTEXT(ctx); 12619dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger R200_STATECHANGE( rmesa, tcl ); 12629dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger if (ctx->Light.Model.LocalViewer || 12639dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger ctx->Texture._GenFlags & TEXGEN_NEED_NORMALS) 12649dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LOCAL_VIEWER; 12659dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger else 12669dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_LOCAL_VIEWER; 12679dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger} 1268adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1269f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200LightModelfv( struct gl_context *ctx, GLenum pname, 1270adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell const GLfloat *param ) 1271adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 1272adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 1273adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1274adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell switch (pname) { 12757dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle case GL_LIGHT_MODEL_AMBIENT: 1276adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell update_global_ambient( ctx ); 1277adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1278adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1279adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LIGHT_MODEL_LOCAL_VIEWER: 12809dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger r200UpdateLocalViewer( ctx ); 1281adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1282adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1283adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LIGHT_MODEL_TWO_SIDE: 1284adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, tcl ); 1285adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (ctx->Light.Model.TwoSide) 1286adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LIGHT_TWOSIDE; 1287adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell else 1288a1b9b1a4409729fa8b6714e5847544576fcee404Roland Scheidegger rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~(R200_LIGHT_TWOSIDE); 12894637235183b80963536f2364e4d50fcb894886ddDave Airlie if (rmesa->radeon.TclFallback) { 1290adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ChooseRenderState( ctx ); 1291adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ChooseVertexState( ctx ); 1292adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1293adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1294adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1295adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LIGHT_MODEL_COLOR_CONTROL: 1296adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200UpdateSpecular(ctx); 1297adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1298adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1299adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell default: 1300adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1301adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1302adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 1303adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1304f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200ShadeModel( struct gl_context *ctx, GLenum mode ) 1305adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 1306adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 1307adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL]; 1308adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1309adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell s &= ~(R200_DIFFUSE_SHADE_MASK | 1310adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ALPHA_SHADE_MASK | 1311adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_SPECULAR_SHADE_MASK | 1312cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger R200_FOG_SHADE_MASK | 1313cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger R200_DISC_FOG_SHADE_MASK); 1314adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1315adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell switch ( mode ) { 1316adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_FLAT: 1317adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell s |= (R200_DIFFUSE_SHADE_FLAT | 1318adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ALPHA_SHADE_FLAT | 1319adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_SPECULAR_SHADE_FLAT | 1320cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger R200_FOG_SHADE_FLAT | 1321cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger R200_DISC_FOG_SHADE_FLAT); 1322adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1323adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_SMOOTH: 1324adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell s |= (R200_DIFFUSE_SHADE_GOURAUD | 1325adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ALPHA_SHADE_GOURAUD | 1326adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_SPECULAR_SHADE_GOURAUD | 1327cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger R200_FOG_SHADE_GOURAUD | 1328cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger R200_DISC_FOG_SHADE_GOURAUD); 1329adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1330adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell default: 1331adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell return; 1332adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1333adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1334adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) { 1335adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, set ); 1336adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.set.cmd[SET_SE_CNTL] = s; 1337adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1338adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 1339adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1340adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1341adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* ============================================================= 1342adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * User clip planes 1343adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 1344adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1345f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200ClipPlane( struct gl_context *ctx, GLenum plane, const GLfloat *eq ) 1346adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 1347adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLint p = (GLint) plane - (GLint) GL_CLIP_PLANE0; 1348adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 1349adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p]; 1350adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1351adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, ucp[p] ); 1352adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ucp[p].cmd[UCP_X] = ip[0]; 1353adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1]; 1354adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2]; 1355adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ucp[p].cmd[UCP_W] = ip[3]; 1356adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 1357adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1358f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200UpdateClipPlanes( struct gl_context *ctx ) 1359adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 1360adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 1361adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint p; 1362adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1363adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell for (p = 0; p < ctx->Const.MaxClipPlanes; p++) { 1364adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (ctx->Transform.ClipPlanesEnabled & (1 << p)) { 1365adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p]; 1366adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1367adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, ucp[p] ); 1368adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ucp[p].cmd[UCP_X] = ip[0]; 1369adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1]; 1370adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2]; 1371adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ucp[p].cmd[UCP_W] = ip[3]; 1372adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1373adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1374adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 1375adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1376adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1377adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* ============================================================= 1378adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Stencil 1379adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 1380adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1381878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void 1382f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergr200StencilFuncSeparate( struct gl_context *ctx, GLenum face, GLenum func, 1383878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul GLint ref, GLuint mask ) 1384adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 1385adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 138671b2504e0390fa19f133647c8686d830f8f40eb6Keith Whitwell GLuint refmask = (((ctx->Stencil.Ref[0] & 0xff) << R200_STENCIL_REF_SHIFT) | 138771b2504e0390fa19f133647c8686d830f8f40eb6Keith Whitwell ((ctx->Stencil.ValueMask[0] & 0xff) << R200_STENCIL_MASK_SHIFT)); 1388adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1389adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, ctx ); 1390adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, msk ); 1391adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1392adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~R200_STENCIL_TEST_MASK; 1393adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~(R200_STENCIL_REF_MASK| 1394adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STENCIL_VALUE_MASK); 1395adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1396adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell switch ( ctx->Stencil.Function[0] ) { 1397adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_NEVER: 1398adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_NEVER; 1399adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1400adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LESS: 1401adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_LESS; 1402adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1403adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_EQUAL: 1404adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_EQUAL; 1405adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1406adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LEQUAL: 1407adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_LEQUAL; 1408adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1409adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_GREATER: 1410adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_GREATER; 1411adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1412adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_NOTEQUAL: 1413adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_NEQUAL; 1414adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1415adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_GEQUAL: 1416adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_GEQUAL; 1417adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1418adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_ALWAYS: 1419adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_ALWAYS; 1420adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1421adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1422adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1423adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |= refmask; 1424adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 1425adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1426878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void 1427f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergr200StencilMaskSeparate( struct gl_context *ctx, GLenum face, GLuint mask ) 1428adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 1429adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 1430adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1431adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, msk ); 1432adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~R200_STENCIL_WRITE_MASK; 1433adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |= 143471b2504e0390fa19f133647c8686d830f8f40eb6Keith Whitwell ((ctx->Stencil.WriteMask[0] & 0xff) << R200_STENCIL_WRITEMASK_SHIFT); 1435adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 1436adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1437878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void 1438f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergr200StencilOpSeparate( struct gl_context *ctx, GLenum face, GLenum fail, 1439878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul GLenum zfail, GLenum zpass ) 1440adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 1441adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 1442adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1443adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, ctx ); 1444adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~(R200_STENCIL_FAIL_MASK | 1445adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STENCIL_ZFAIL_MASK | 1446adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STENCIL_ZPASS_MASK); 1447adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1448adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell switch ( ctx->Stencil.FailFunc[0] ) { 1449adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_KEEP: 1450adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_KEEP; 1451adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1452adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_ZERO: 1453adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_ZERO; 1454adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1455adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_REPLACE: 1456adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_REPLACE; 1457adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1458adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_INCR: 1459adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_INC; 1460adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1461adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_DECR: 1462adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_DEC; 1463adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1464adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_INCR_WRAP_EXT: 1465adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_INC_WRAP; 1466adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1467adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_DECR_WRAP_EXT: 1468adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_DEC_WRAP; 1469adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1470adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_INVERT: 1471adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_INVERT; 1472adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1473adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1474adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1475adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell switch ( ctx->Stencil.ZFailFunc[0] ) { 1476adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_KEEP: 1477adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_KEEP; 1478adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1479adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_ZERO: 1480adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_ZERO; 1481adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1482adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_REPLACE: 1483adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_REPLACE; 1484adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1485adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_INCR: 1486adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_INC; 1487adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1488adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_DECR: 1489adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_DEC; 1490adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1491adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_INCR_WRAP_EXT: 1492adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_INC_WRAP; 1493adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1494adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_DECR_WRAP_EXT: 1495adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_DEC_WRAP; 1496adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1497adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_INVERT: 1498adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_INVERT; 1499adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1500adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1501adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1502adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell switch ( ctx->Stencil.ZPassFunc[0] ) { 1503adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_KEEP: 1504adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_KEEP; 1505adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1506adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_ZERO: 1507adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_ZERO; 1508adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1509adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_REPLACE: 1510adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_REPLACE; 1511adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1512adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_INCR: 1513adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_INC; 1514adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1515adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_DECR: 1516adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_DEC; 1517adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1518adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_INCR_WRAP_EXT: 1519adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_INC_WRAP; 1520adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1521adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_DECR_WRAP_EXT: 1522adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_DEC_WRAP; 1523adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1524adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_INVERT: 1525adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_INVERT; 1526adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1527adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1528adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 1529adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1530adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1531adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* ============================================================= 1532adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Window position and viewport transformation 1533adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 1534adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1535d0a3400f66b8c4ace7ebef6d0a944376d5203756Alan Swanson/** 1536d0a3400f66b8c4ace7ebef6d0a944376d5203756Alan Swanson * Called when window size or position changes or viewport or depth range 1537d0a3400f66b8c4ace7ebef6d0a944376d5203756Alan Swanson * state is changed. We update the hardware viewport state here. 1538d0a3400f66b8c4ace7ebef6d0a944376d5203756Alan Swanson */ 1539f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid r200UpdateWindow( struct gl_context *ctx ) 1540adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 1541adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 1542d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIdrawable *dPriv = radeon_get_drawable(&rmesa->radeon); 1543d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg GLfloat xoffset = 0; 1544d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg GLfloat yoffset = dPriv ? (GLfloat) dPriv->h : 0; 1545adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell const GLfloat *v = ctx->Viewport._WindowMap.m; 154647941bfaea6e8a60e2c31f7a2c8c233f2a10ecb1Brian Paul const GLboolean render_to_fbo = (ctx->DrawBuffer ? _mesa_is_user_fbo(ctx->DrawBuffer) : 0); 15478c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie const GLfloat depthScale = 1.0F / ctx->DrawBuffer->_DepthMaxF; 15486c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie GLfloat y_scale, y_bias; 15496c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie 15506c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie if (render_to_fbo) { 15516c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie y_scale = 1.0; 15526c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie y_bias = 0; 15536c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie } else { 15546c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie y_scale = -1.0; 15556c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie y_bias = yoffset; 15566c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie } 1557adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 155808e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger float_ui32_type sx = { v[MAT_SX] }; 15593856c3cc46813ad96ae6f02dec19460193d986acFrederic Crozat float_ui32_type tx = { v[MAT_TX] + xoffset }; 15606c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie float_ui32_type sy = { v[MAT_SY] * y_scale }; 15613856c3cc46813ad96ae6f02dec19460193d986acFrederic Crozat float_ui32_type ty = { (v[MAT_TY] * y_scale) + y_bias }; 15628c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie float_ui32_type sz = { v[MAT_SZ] * depthScale }; 15638c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie float_ui32_type tz = { v[MAT_TZ] * depthScale }; 1564adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1565adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, vpt ); 1566adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 156708e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE] = sx.ui32; 156808e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = tx.ui32; 156908e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE] = sy.ui32; 157008e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = ty.ui32; 157108e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE] = sz.ui32; 157208e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = tz.ui32; 1573adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 1574adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1575f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid r200_vtbl_update_scissor( struct gl_context *ctx ) 1576dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen{ 1577dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen r200ContextPtr r200 = R200_CONTEXT(ctx); 1578dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen unsigned x1, y1, x2, y2; 1579dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen struct radeon_renderbuffer *rrb; 1580dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen 1581dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen R200_SET_STATE(r200, set, SET_RE_CNTL, R200_SCISSOR_ENABLE | r200->hw.set.cmd[SET_RE_CNTL]); 1582dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen 1583dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen if (r200->radeon.state.scissor.enabled) { 1584dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen x1 = r200->radeon.state.scissor.rect.x1; 1585dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen y1 = r200->radeon.state.scissor.rect.y1; 1586d0cb1036aa98d35ae5233d326fbb0ba592a26e26Dave Airlie x2 = r200->radeon.state.scissor.rect.x2; 1587d0cb1036aa98d35ae5233d326fbb0ba592a26e26Dave Airlie y2 = r200->radeon.state.scissor.rect.y2; 1588dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen } else { 1589dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen rrb = radeon_get_colorbuffer(&r200->radeon); 1590dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen x1 = 0; 1591dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen y1 = 0; 1592c080202db5363a18a759a9a7c82b40ac558c8abeBrian Paul x2 = rrb->base.Base.Width - 1; 1593c080202db5363a18a759a9a7c82b40ac558c8abeBrian Paul y2 = rrb->base.Base.Height - 1; 1594dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen } 1595dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen 1596dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen R200_SET_STATE(r200, sci, SCI_XY_1, x1 | (y1 << 16)); 1597dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen R200_SET_STATE(r200, sci, SCI_XY_2, x2 | (y2 << 16)); 1598dbf59de6d2f8be526e97af6c768622e6ca3cf6b1Pauli Nieminen} 1599adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1600adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1601f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200Viewport( struct gl_context *ctx, GLint x, GLint y, 1602adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLsizei width, GLsizei height ) 1603adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 1604adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell /* Don't pipeline viewport changes, conflict with window offset 1605adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * setting below. Could apply deltas to rescue pipelined viewport 1606adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * values, or keep the originals hanging around. 1607adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 1608adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200UpdateWindow( ctx ); 16092b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie 16102b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie radeon_viewport(ctx, x, y, width, height); 1611adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 1612adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1613f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200DepthRange( struct gl_context *ctx, GLclampd nearval, 1614adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLclampd farval ) 1615adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 1616adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200UpdateWindow( ctx ); 1617adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 1618adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1619f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid r200UpdateViewportOffset( struct gl_context *ctx ) 1620adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 1621adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 1622d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIdrawable *dPriv = radeon_get_drawable(&rmesa->radeon); 1623d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg GLfloat xoffset = (GLfloat)0; 1624d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg GLfloat yoffset = (GLfloat)dPriv->h; 1625adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell const GLfloat *v = ctx->Viewport._WindowMap.m; 1626adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 162708e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger float_ui32_type tx; 162808e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger float_ui32_type ty; 162908e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger 16303856c3cc46813ad96ae6f02dec19460193d986acFrederic Crozat tx.f = v[MAT_TX] + xoffset; 16313856c3cc46813ad96ae6f02dec19460193d986acFrederic Crozat ty.f = (- v[MAT_TY]) + yoffset; 1632adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 163308e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger if ( rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] != tx.ui32 || 163408e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] != ty.ui32 ) 1635adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell { 1636adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell /* Note: this should also modify whatever data the context reset 1637adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * code uses... 1638adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 163908e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger R200_STATECHANGE( rmesa, vpt ); 164008e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = tx.ui32; 164108e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = ty.ui32; 164208e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger 1643adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell /* update polygon stipple x/y screen offset */ 1644adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell { 1645adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint stx, sty; 1646adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint m = rmesa->hw.msc.cmd[MSC_RE_MISC]; 1647adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1648adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell m &= ~(R200_STIPPLE_X_OFFSET_MASK | 1649adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STIPPLE_Y_OFFSET_MASK); 1650adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1651adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell /* add magic offsets, then invert */ 1652d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg stx = 31 - ((-1) & R200_STIPPLE_COORD_MASK); 1653d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg sty = 31 - ((dPriv->h - 1) 1654adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell & R200_STIPPLE_COORD_MASK); 1655adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1656adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell m |= ((stx << R200_STIPPLE_X_OFFSET_SHIFT) | 1657adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell (sty << R200_STIPPLE_Y_OFFSET_SHIFT)); 1658adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1659adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( rmesa->hw.msc.cmd[MSC_RE_MISC] != m ) { 1660adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, msc ); 1661adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.msc.cmd[MSC_RE_MISC] = m; 1662adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1663adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1664adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1665adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 166661da612a4f8862e0aac4ff4fc87c133cb8a1c4a5Dave Airlie radeonUpdateScissor( ctx ); 1667adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 1668adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1669adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1670adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1671adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* ============================================================= 1672adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Miscellaneous 1673adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 1674adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1675f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200RenderMode( struct gl_context *ctx, GLenum mode ) 1676adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 1677adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 1678adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell FALLBACK( rmesa, R200_FALLBACK_RENDER_MODE, (mode != GL_RENDER) ); 1679adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 1680adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1681adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1682adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellstatic GLuint r200_rop_tab[] = { 1683adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ROP_CLEAR, 1684adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ROP_AND, 1685adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ROP_AND_REVERSE, 1686adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ROP_COPY, 1687adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ROP_AND_INVERTED, 1688adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ROP_NOOP, 1689adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ROP_XOR, 1690adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ROP_OR, 1691adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ROP_NOR, 1692adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ROP_EQUIV, 1693adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ROP_INVERT, 1694adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ROP_OR_REVERSE, 1695adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ROP_COPY_INVERTED, 1696adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ROP_OR_INVERTED, 1697adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ROP_NAND, 1698adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_ROP_SET, 1699adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}; 1700adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1701f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200LogicOpCode( struct gl_context *ctx, GLenum opcode ) 1702adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 1703adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 1704adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint rop = (GLuint)opcode - GL_CLEAR; 1705adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1706adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell ASSERT( rop < 16 ); 1707adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1708adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, msk ); 1709adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.msk.cmd[MSK_RB3D_ROPCNTL] = r200_rop_tab[rop]; 1710adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 1711adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1712adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* ============================================================= 1713adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * State enable/disable 1714adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 1715adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1716f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200Enable( struct gl_context *ctx, GLenum cap, GLboolean state ) 1717adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 1718adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 1719adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint p, flag; 1720adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1721239105c6c87da0b0c5c15ae54b19fe39492b0f29Pauli Nieminen if ( R200_DEBUG & RADEON_STATE ) 1722adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fprintf( stderr, "%s( %s = %s )\n", __FUNCTION__, 1723adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell _mesa_lookup_enum_by_nr( cap ), 1724adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell state ? "GL_TRUE" : "GL_FALSE" ); 1725adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1726adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell switch ( cap ) { 1727adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell /* Fast track this one... 1728adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 1729adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_TEXTURE_1D: 1730adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_TEXTURE_2D: 1731adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_TEXTURE_3D: 1732adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1733adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1734adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_ALPHA_TEST: 1735adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, ctx ); 1736adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (state) { 1737adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_ALPHA_TEST_ENABLE; 1738adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 1739adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_ALPHA_TEST_ENABLE; 1740adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1741adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1742adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1743adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_BLEND: 1744b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger case GL_COLOR_LOGIC_OP: 1745b9cbd5272452dcaae1d1b2462ed3001d64dc55e8Roland Scheidegger r200_set_blend_state( ctx ); 1746adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1747adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1748adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_CLIP_PLANE0: 1749adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_CLIP_PLANE1: 1750adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_CLIP_PLANE2: 1751adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_CLIP_PLANE3: 1752adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_CLIP_PLANE4: 17537dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle case GL_CLIP_PLANE5: 1754adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell p = cap-GL_CLIP_PLANE0; 1755adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, tcl ); 1756adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (state) { 1757adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= (R200_UCP_ENABLE_0<<p); 1758adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ClipPlane( ctx, cap, NULL ); 1759adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1760adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell else { 1761adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~(R200_UCP_ENABLE_0<<p); 1762adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1763adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1764adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1765adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_COLOR_MATERIAL: 1766adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ColorMaterial( ctx, 0, 0 ); 1767a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer r200UpdateMaterial( ctx ); 1768adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1769adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1770adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_CULL_FACE: 1771adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200CullFace( ctx, 0 ); 1772adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1773adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1774adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_DEPTH_TEST: 1775adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE(rmesa, ctx ); 1776adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( state ) { 1777adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_Z_ENABLE; 1778adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 1779adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_Z_ENABLE; 1780adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1781adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1782adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1783adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_DITHER: 1784adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE(rmesa, ctx ); 1785adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( state ) { 1786adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_DITHER_ENABLE; 1787d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~rmesa->radeon.state.color.roundEnable; 1788adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 1789adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_DITHER_ENABLE; 1790d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= rmesa->radeon.state.color.roundEnable; 1791adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1792adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1793adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1794adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_FOG: 1795adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE(rmesa, ctx ); 1796adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( state ) { 1797adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_FOG_ENABLE; 17980846e52d46b36c411f79908df010072e03bb6437Brian Paul r200Fogfv( ctx, GL_FOG_MODE, NULL ); 1799adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 1800adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_FOG_ENABLE; 1801adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE(rmesa, tcl); 1802adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~R200_TCL_FOG_MASK; 1803adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1804adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200UpdateSpecular( ctx ); /* for PK_SPEC */ 18057dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle if (rmesa->radeon.TclFallback) 18067a57932a025cf786527d31f4951c8a6d0f25aeecKeith Whitwell r200ChooseVertexState( ctx ); 18077a57932a025cf786527d31f4951c8a6d0f25aeecKeith Whitwell _mesa_allow_light_in_model( ctx, !state ); 1808adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1809adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1810adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LIGHT0: 1811adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LIGHT1: 1812adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LIGHT2: 1813adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LIGHT3: 1814adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LIGHT4: 1815adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LIGHT5: 1816adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LIGHT6: 1817adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LIGHT7: 1818adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE(rmesa, tcl); 1819adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell p = cap - GL_LIGHT0; 18207dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle if (p&1) 1821adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell flag = (R200_LIGHT_1_ENABLE | 18227dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle R200_LIGHT_1_ENABLE_AMBIENT | 1823adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_LIGHT_1_ENABLE_SPECULAR); 1824adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell else 1825adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell flag = (R200_LIGHT_0_ENABLE | 18267dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle R200_LIGHT_0_ENABLE_AMBIENT | 1827adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_LIGHT_0_ENABLE_SPECULAR); 1828adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1829adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (state) 1830adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] |= flag; 1831adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell else 1832adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] &= ~flag; 1833adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 18347dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle /* 1835adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 1836adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell update_light_colors( ctx, p ); 1837adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1838adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1839adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LIGHTING: 1840adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200UpdateSpecular(ctx); 1841cb08dcbbf29dfa82128c8302f7aa69e90478a5eaRoland Scheidegger /* for reflection map fixup - might set recheck_texgen for all units too */ 18424637235183b80963536f2364e4d50fcb894886ddDave Airlie rmesa->radeon.NewGLState |= _NEW_TEXTURE; 1843adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1844adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1845adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LINE_SMOOTH: 1846adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, ctx ); 1847adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( state ) { 1848adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_ANTI_ALIAS_LINE; 1849adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 1850adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_ANTI_ALIAS_LINE; 1851adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1852adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1853adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1854adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_LINE_STIPPLE: 1855adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, set ); 1856adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( state ) { 1857adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.set.cmd[SET_RE_CNTL] |= R200_PATTERN_ENABLE; 1858adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 1859adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.set.cmd[SET_RE_CNTL] &= ~R200_PATTERN_ENABLE; 1860adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1861adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1862adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1863adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_NORMALIZE: 1864adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, tcl ); 1865adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( state ) { 1866adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_NORMALIZE_NORMALS; 1867adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 1868adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_NORMALIZE_NORMALS; 1869adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1870adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1871adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 187244dace86eaf9eded8e6465adfadf6345658686ddRoland Scheidegger /* Pointsize registers on r200 only work for point sprites, and point smooth 187344dace86eaf9eded8e6465adfadf6345658686ddRoland Scheidegger * doesn't work for point sprites (and isn't needed for 1.0 sized aa points). 187444dace86eaf9eded8e6465adfadf6345658686ddRoland Scheidegger * In any case, setting pointmin == pointsizemax == 1.0 for aa points 187544dace86eaf9eded8e6465adfadf6345658686ddRoland Scheidegger * is enough to satisfy conform. 1876adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 1877adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_POINT_SMOOTH: 1878adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1879adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1880adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell /* These don't really do anything, as we don't use the 3vtx 1881adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * primitives yet. 1882adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 1883adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#if 0 1884adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_POLYGON_OFFSET_POINT: 1885adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, set ); 1886adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( state ) { 1887adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.set.cmd[SET_SE_CNTL] |= R200_ZBIAS_ENABLE_POINT; 1888adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 1889adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_ZBIAS_ENABLE_POINT; 1890adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1891adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1892adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1893adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_POLYGON_OFFSET_LINE: 1894adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, set ); 1895adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( state ) { 1896adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.set.cmd[SET_SE_CNTL] |= R200_ZBIAS_ENABLE_LINE; 1897adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 1898adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_ZBIAS_ENABLE_LINE; 1899adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1900adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1901adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell#endif 1902adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1903cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger case GL_POINT_SPRITE_ARB: 1904cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger R200_STATECHANGE( rmesa, spr ); 1905cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger if ( state ) { 1906cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger int i; 1907cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger for (i = 0; i < 6; i++) { 1908cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] |= 1909cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger ctx->Point.CoordReplace[i] << (R200_PS_GEN_TEX_0_SHIFT + i); 1910cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger } 1911cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger } else { 1912cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] &= ~R200_PS_GEN_TEX_MASK; 1913cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger } 1914cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger break; 1915cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger 1916adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_POLYGON_OFFSET_FILL: 1917adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, set ); 1918adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( state ) { 1919adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.set.cmd[SET_SE_CNTL] |= R200_ZBIAS_ENABLE_TRI; 1920adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 1921adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_ZBIAS_ENABLE_TRI; 1922adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1923adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1924adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1925adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_POLYGON_SMOOTH: 1926adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, ctx ); 1927adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( state ) { 1928adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_ANTI_ALIAS_POLY; 1929adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 1930adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_ANTI_ALIAS_POLY; 1931adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1932adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1933adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1934adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_POLYGON_STIPPLE: 1935adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE(rmesa, set ); 1936adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( state ) { 1937adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.set.cmd[SET_RE_CNTL] |= R200_STIPPLE_ENABLE; 1938adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 1939adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.set.cmd[SET_RE_CNTL] &= ~R200_STIPPLE_ENABLE; 1940adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1941adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1942adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1943adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_RESCALE_NORMAL_EXT: { 1944adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLboolean tmp = ctx->_NeedEyeCoords ? state : !state; 1945adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, tcl ); 1946adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( tmp ) { 1947adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_RESCALE_NORMALS; 1948adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 1949adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_RESCALE_NORMALS; 1950adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1951adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1952adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1953adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1954adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_SCISSOR_TEST: 19551090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie radeon_firevertices(&rmesa->radeon); 1956d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie rmesa->radeon.state.scissor.enabled = state; 195761da612a4f8862e0aac4ff4fc87c133cb8a1c4a5Dave Airlie radeonUpdateScissor( ctx ); 1958adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1959adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1960adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_STENCIL_TEST: 19618c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie { 19628c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie GLboolean hw_stencil = GL_FALSE; 19638c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie if (ctx->DrawBuffer) { 19648c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie struct radeon_renderbuffer *rrbStencil 19658c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie = radeon_get_renderbuffer(ctx->DrawBuffer, BUFFER_STENCIL); 19668c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie hw_stencil = (rrbStencil && rrbStencil->bo); 19678c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie } 19688c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie 19698c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie if (hw_stencil) { 19708c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie R200_STATECHANGE( rmesa, ctx ); 19718c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie if ( state ) { 19728c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_STENCIL_ENABLE; 19738c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie } else { 19748c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_STENCIL_ENABLE; 19758c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie } 1976adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 19778c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie FALLBACK( rmesa, R200_FALLBACK_STENCIL, state ); 1978adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1979adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 1980adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1981adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1982adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_TEXTURE_GEN_Q: 1983adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_TEXTURE_GEN_R: 1984adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_TEXTURE_GEN_S: 1985adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_TEXTURE_GEN_T: 1986adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell /* Picked up in r200UpdateTextureState. 1987adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 19887dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle rmesa->recheck_texgen[ctx->Texture.CurrentUnit] = GL_TRUE; 1989adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1990adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 1991adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell case GL_COLOR_SUM_EXT: 1992adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200UpdateSpecular ( ctx ); 1993adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell break; 1994adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 19950866b67fdb8503b38715da310ddf78dd15c92f8fDave Airlie case GL_VERTEX_PROGRAM_ARB: 199698c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger if (!state) { 199798c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger GLuint i; 199891650469aeb01f249bcd553d9d309b3016c2f93cRoland Scheidegger rmesa->curr_vp_hw = NULL; 199998c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger R200_STATECHANGE( rmesa, vap ); 200098c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL] &= ~R200_VAP_PROG_VTX_SHADER_ENABLE; 200198c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger /* mark all tcl atoms (tcl vector state got overwritten) dirty 200298c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger not sure about tcl scalar state - we need at least grd 200398c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger with vert progs too. 200498c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger ucp looks like it doesn't get overwritten (may even work 200598c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger with vp for pos-invariant progs if we're lucky) */ 200698c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger R200_STATECHANGE( rmesa, mtl[0] ); 200798c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger R200_STATECHANGE( rmesa, mtl[1] ); 200898c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger R200_STATECHANGE( rmesa, fog ); 200998c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger R200_STATECHANGE( rmesa, glt ); 201098c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger R200_STATECHANGE( rmesa, eye ); 201198c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger for (i = R200_MTX_MV; i <= R200_MTX_TEX5; i++) { 201298c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger R200_STATECHANGE( rmesa, mat[i] ); 201398c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger } 201498c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger for (i = 0 ; i < 8; i++) { 201598c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger R200_STATECHANGE( rmesa, lit[i] ); 201698c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger } 201798c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger R200_STATECHANGE( rmesa, tcl ); 201898c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger for (i = 0; i <= ctx->Const.MaxClipPlanes; i++) { 201998c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger if (ctx->Transform.ClipPlanesEnabled & (1 << i)) { 202098c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= (R200_UCP_ENABLE_0 << i); 202198c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger } 202298c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger/* else { 202398c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~(R200_UCP_ENABLE_0 << i); 202498c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger }*/ 202598c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger } 2026fc606f7db9072d4f40081aea8f92f1d4489a5115Roland Scheidegger /* ugly. Need to call everything which might change compsel. */ 202798c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger r200UpdateSpecular( ctx ); 2028fc606f7db9072d4f40081aea8f92f1d4489a5115Roland Scheidegger#if 0 202998c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger /* shouldn't be necessary, as it's picked up anyway in r200ValidateState (_NEW_PROGRAM), 203098c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger but without it doom3 locks up at always the same places. Why? */ 203191650469aeb01f249bcd553d9d309b3016c2f93cRoland Scheidegger /* FIXME: This can (and should) be replaced by a call to the TCL_STATE_FLUSH reg before 203291650469aeb01f249bcd553d9d309b3016c2f93cRoland Scheidegger accessing VAP_SE_VAP_CNTL. Requires drm changes (done). Remove after some time... */ 203398c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger r200UpdateTextureState( ctx ); 203498c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger /* if we call r200UpdateTextureState we need the code below because we are calling it with 203598c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger non-current derived enabled values which may revert the state atoms for frag progs even when 203698c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger they already got disabled... ugh 203798c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger Should really figure out why we need to call r200UpdateTextureState in the first place */ 203898c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger GLuint unit; 203998c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger for (unit = 0; unit < R200_MAX_TEXTURE_UNITS; unit++) { 204098c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger R200_STATECHANGE( rmesa, pix[unit] ); 204198c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger R200_STATECHANGE( rmesa, tex[unit] ); 204298c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT] &= 204398c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger ~(R200_TXFORMAT_ST_ROUTE_MASK | R200_TXFORMAT_LOOKUP_DISABLE); 204498c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT] |= unit << R200_TXFORMAT_ST_ROUTE_SHIFT; 204598c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger /* need to guard this with drmSupportsFragmentShader? Should never get here if 204698c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger we don't announce ATI_fs, right? */ 204798c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger rmesa->hw.tex[unit].cmd[TEX_PP_TXMULTI_CTL] = 0; 204898c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger } 204998c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger R200_STATECHANGE( rmesa, cst ); 205098c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger R200_STATECHANGE( rmesa, tf ); 205198c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger rmesa->hw.cst.cmd[CST_PP_CNTL_X] = 0; 205291650469aeb01f249bcd553d9d309b3016c2f93cRoland Scheidegger#endif 205398c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger } 205498c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger else { 205591650469aeb01f249bcd553d9d309b3016c2f93cRoland Scheidegger /* picked up later */ 205698c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger } 2057fc606f7db9072d4f40081aea8f92f1d4489a5115Roland Scheidegger /* call functions which change hw state based on ARB_vp enabled or not. */ 2058cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger r200PointParameter( ctx, GL_POINT_DISTANCE_ATTENUATION, NULL ); 2059fc606f7db9072d4f40081aea8f92f1d4489a5115Roland Scheidegger r200Fogfv( ctx, GL_FOG_COORD_SRC, NULL ); 2060cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger break; 2061cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger 2062cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger case GL_VERTEX_PROGRAM_POINT_SIZE_ARB: 2063cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger r200PointParameter( ctx, GL_POINT_DISTANCE_ATTENUATION, NULL ); 20640866b67fdb8503b38715da310ddf78dd15c92f8fDave Airlie break; 20650866b67fdb8503b38715da310ddf78dd15c92f8fDave Airlie 2066f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger case GL_FRAGMENT_SHADER_ATI: 2067f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger if ( !state ) { 2068f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger /* restore normal tex env colors and make sure tex env combine will get updated 2069f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger mark env atoms dirty (as their data was overwritten by afs even 2070f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger if they didn't change) and restore tex coord routing */ 2071f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger GLuint unit; 2072f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger for (unit = 0; unit < R200_MAX_TEXTURE_UNITS; unit++) { 20738a6182105772280e2727de4a00809c8fb7b13c87Roland Scheidegger R200_STATECHANGE( rmesa, pix[unit] ); 20748a6182105772280e2727de4a00809c8fb7b13c87Roland Scheidegger R200_STATECHANGE( rmesa, tex[unit] ); 2075f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT] &= 2076f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger ~(R200_TXFORMAT_ST_ROUTE_MASK | R200_TXFORMAT_LOOKUP_DISABLE); 2077f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT] |= unit << R200_TXFORMAT_ST_ROUTE_SHIFT; 2078f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger rmesa->hw.tex[unit].cmd[TEX_PP_TXMULTI_CTL] = 0; 2079f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger } 2080f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger R200_STATECHANGE( rmesa, cst ); 2081f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger R200_STATECHANGE( rmesa, tf ); 20828a6182105772280e2727de4a00809c8fb7b13c87Roland Scheidegger rmesa->hw.cst.cmd[CST_PP_CNTL_X] = 0; 2083f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger } 2084f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger else { 2085f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger /* need to mark this dirty as pix/tf atoms have overwritten the data 2086f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger even if the data in the atoms didn't change */ 2087f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger R200_STATECHANGE( rmesa, atf ); 2088f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger R200_STATECHANGE( rmesa, afs[1] ); 2089f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger /* everything else picked up in r200UpdateTextureState hopefully */ 2090f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger } 2091f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger break; 2092adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell default: 2093adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell return; 2094adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 2095adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 2096adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2097adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2098f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid r200LightingSpaceChange( struct gl_context *ctx ) 2099adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 2100adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 2101adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLboolean tmp; 2102adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2103239105c6c87da0b0c5c15ae54b19fe39492b0f29Pauli Nieminen if (R200_DEBUG & RADEON_STATE) 2104adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fprintf(stderr, "%s %d BEFORE %x\n", __FUNCTION__, ctx->_NeedEyeCoords, 2105adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0]); 2106adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2107adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (ctx->_NeedEyeCoords) 2108adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell tmp = ctx->Transform.RescaleNormals; 2109adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell else 2110adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell tmp = !ctx->Transform.RescaleNormals; 2111adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2112adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE( rmesa, tcl ); 2113adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if ( tmp ) { 2114adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_RESCALE_NORMALS; 2115adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } else { 2116adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_RESCALE_NORMALS; 2117adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 2118adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2119239105c6c87da0b0c5c15ae54b19fe39492b0f29Pauli Nieminen if (R200_DEBUG & RADEON_STATE) 2120adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fprintf(stderr, "%s %d AFTER %x\n", __FUNCTION__, ctx->_NeedEyeCoords, 2121adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0]); 2122adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 2123adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2124adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* ============================================================= 2125adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * Deferred state management - matrices, textures, other? 2126adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 2127adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2128adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2129adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2130adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2131adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellstatic void upload_matrix( r200ContextPtr rmesa, GLfloat *src, int idx ) 2132adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 2133adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell float *dest = ((float *)R200_DB_STATE( mat[idx] ))+MAT_ELT_0; 2134adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell int i; 2135adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2136adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2137adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell for (i = 0 ; i < 4 ; i++) { 2138adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell *dest++ = src[i]; 2139adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell *dest++ = src[i+4]; 2140adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell *dest++ = src[i+8]; 2141adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell *dest++ = src[i+12]; 2142adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 2143adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2144adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] ); 2145adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 2146adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2147adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellstatic void upload_matrix_t( r200ContextPtr rmesa, const GLfloat *src, int idx ) 2148adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 2149adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell float *dest = ((float *)R200_DB_STATE( mat[idx] ))+MAT_ELT_0; 2150adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell memcpy(dest, src, 16*sizeof(float)); 2151adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] ); 2152adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 2153adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2154adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2155f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void update_texturematrix( struct gl_context *ctx ) 2156adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 2157adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT( ctx ); 2158adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint tpc = rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_0]; 2159adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell GLuint compsel = rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL]; 2160adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell int unit; 2161adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2162239105c6c87da0b0c5c15ae54b19fe39492b0f29Pauli Nieminen if (R200_DEBUG & RADEON_STATE) 2163adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell fprintf(stderr, "%s before COMPSEL: %x\n", __FUNCTION__, 2164adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL]); 2165adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2166adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->TexMatEnabled = 0; 2167adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->TexMatCompSel = 0; 2168adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2169aaaf38d37215aa1536ff34ec370ecfc04111af22Roland Scheidegger for (unit = 0 ; unit < ctx->Const.MaxTextureUnits; unit++) { 21707dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle if (!ctx->Texture.Unit[unit]._ReallyEnabled) 2171adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell continue; 2172adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2173adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (ctx->TextureMatrixStack[unit].Top->type != MATRIX_IDENTITY) { 2174adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->TexMatEnabled |= (R200_TEXGEN_TEXMAT_0_ENABLE| 2175adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_TEXMAT_0_ENABLE) << unit; 2176adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2177adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->TexMatCompSel |= R200_OUTPUT_TEX_0 << unit; 2178adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2179adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (rmesa->TexGenEnabled & (R200_TEXMAT_0_ENABLE << unit)) { 21807dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle /* Need to preconcatenate any active texgen 2181adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * obj/eyeplane matrices: 2182adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 2183b1ebd306bf4fdc4076d3d3daa410b08f477cb4c4Eric Anholt _math_matrix_mul_matrix( &rmesa->tmpmat, 21847dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle ctx->TextureMatrixStack[unit].Top, 2185b1ebd306bf4fdc4076d3d3daa410b08f477cb4c4Eric Anholt &rmesa->TexGenMatrix[unit] ); 2186adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell upload_matrix( rmesa, rmesa->tmpmat.m, R200_MTX_TEX0+unit ); 21877dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle } 2188adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell else { 21897dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle upload_matrix( rmesa, ctx->TextureMatrixStack[unit].Top->m, 2190adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_MTX_TEX0+unit ); 2191adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 2192adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 2193adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell else if (rmesa->TexGenEnabled & (R200_TEXMAT_0_ENABLE << unit)) { 21947dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle upload_matrix( rmesa, rmesa->TexGenMatrix[unit].m, 2195adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_MTX_TEX0+unit ); 2196adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 2197adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 2198adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2199adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell tpc = (rmesa->TexMatEnabled | rmesa->TexGenEnabled); 2200b1ebd306bf4fdc4076d3d3daa410b08f477cb4c4Eric Anholt if (tpc != rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_0]) { 2201adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE(rmesa, tcg); 2202adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_0] = tpc; 2203adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 2204adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2205adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell compsel &= ~R200_OUTPUT_TEX_MASK; 2206adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell compsel |= rmesa->TexMatCompSel | rmesa->TexGenCompSel; 2207adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (compsel != rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL]) { 2208adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell R200_STATECHANGE(rmesa, vtx); 2209adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] = compsel; 2210adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 2211adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 2212adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2213f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic GLboolean r200ValidateBuffers(struct gl_context *ctx) 2214e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie{ 2215e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie r200ContextPtr rmesa = R200_CONTEXT(ctx); 2216e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie struct radeon_renderbuffer *rrb; 2217bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen struct radeon_dma_bo *dma_bo; 2218c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie int i, ret; 221905304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie 2220239105c6c87da0b0c5c15ae54b19fe39492b0f29Pauli Nieminen if (RADEON_DEBUG & RADEON_IOCTL) 2221bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen fprintf(stderr, "%s\n", __FUNCTION__); 2222c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie radeon_cs_space_reset_bos(rmesa->radeon.cmdbuf.cs); 22237dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 2224e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie rrb = radeon_get_colorbuffer(&rmesa->radeon); 2225e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie /* color buffer */ 2226e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie if (rrb && rrb->bo) { 2227c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, rrb->bo, 2228c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie 0, RADEON_GEM_DOMAIN_VRAM); 2229e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie } 2230e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie 2231e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie /* depth buffer */ 2232e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie rrb = radeon_get_depthbuffer(&rmesa->radeon); 2233e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie /* color buffer */ 2234e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie if (rrb && rrb->bo) { 2235c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, rrb->bo, 2236c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie 0, RADEON_GEM_DOMAIN_VRAM); 2237e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie } 2238e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie 2239e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie for (i = 0; i < ctx->Const.MaxTextureImageUnits; ++i) { 2240e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie radeonTexObj *t; 22417dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 2242e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie if (!ctx->Texture.Unit[i]._ReallyEnabled) 2243e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie continue; 224405304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie 2245e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie t = radeon_tex_obj(ctx->Texture.Unit[i]._Current); 224605304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie if (t->image_override && t->bo) 2247c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, t->bo, 224805304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); 224905304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie else if (t->mt->bo) 2250c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, t->mt->bo, 225105304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); 2252e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie } 225305304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie 2254bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen dma_bo = first_elem(&rmesa->radeon.dma.reserved); 2255bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen { 2256bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs, dma_bo->bo, RADEON_GEM_DOMAIN_GTT, 0); 2257bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen if (ret) 2258bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen return GL_FALSE; 2259bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen } 2260c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie return GL_TRUE; 2261e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie} 2262fcbfeb5d28aea87c60f2d02daa213d0c0c2516e8Brian Paul 2263f9995b30756140724f41daf963fa06167912be7fKristian HøgsbergGLboolean r200ValidateState( struct gl_context *ctx ) 2264adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 2265adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 22664637235183b80963536f2364e4d50fcb894886ddDave Airlie GLuint new_state = rmesa->radeon.NewGLState; 2267adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2268c514c1f99493147bbba7a1dbe157c0492f4cf2ebJerome Glisse if (new_state & _NEW_BUFFERS) { 22692b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie _mesa_update_framebuffer(ctx); 22702b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie /* this updates the DrawBuffer's Width/Height if it's a FBO */ 22712b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie _mesa_update_draw_buffer_bounds(ctx); 22727dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 22732b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie R200_STATECHANGE(rmesa, ctx); 2274fcbfeb5d28aea87c60f2d02daa213d0c0c2516e8Brian Paul } 2275fcbfeb5d28aea87c60f2d02daa213d0c0c2516e8Brian Paul 2276f48473e42511f8d37a239a07f791bc0a87209e5bBrian Paul if (new_state & (_NEW_TEXTURE | _NEW_PROGRAM | _NEW_PROGRAM_CONSTANTS)) { 2277adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200UpdateTextureState( ctx ); 22784637235183b80963536f2364e4d50fcb894886ddDave Airlie new_state |= rmesa->radeon.NewGLState; /* may add TEXTURE_MATRIX */ 22799dd973ec3b2b53f4b95d2ba0a746a0e52533becfRoland Scheidegger r200UpdateLocalViewer( ctx ); 2280adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 2281adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2282e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie /* we need to do a space check here */ 2283e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie if (!r200ValidateBuffers(ctx)) 2284e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie return GL_FALSE; 2285e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie 228698c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger/* FIXME: don't really need most of these when vertex progs are enabled */ 228798c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger 2288adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell /* Need an event driven matrix update? 2289adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 22907dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle if (new_state & (_NEW_MODELVIEW|_NEW_PROJECTION)) 2291adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell upload_matrix( rmesa, ctx->_ModelProjectMatrix.m, R200_MTX_MVP ); 2292adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2293adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell /* Need these for lighting (shouldn't upload otherwise) 2294adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 2295adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (new_state & (_NEW_MODELVIEW)) { 2296adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell upload_matrix( rmesa, ctx->ModelviewMatrixStack.Top->m, R200_MTX_MV ); 2297adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell upload_matrix_t( rmesa, ctx->ModelviewMatrixStack.Top->inv, R200_MTX_IMV ); 2298adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 2299adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2300adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell /* Does this need to be triggered on eg. modelview for 2301adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell * texgen-derived objplane/eyeplane matrices? 2302adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 2303adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (new_state & (_NEW_TEXTURE|_NEW_TEXTURE_MATRIX)) { 2304adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell update_texturematrix( ctx ); 2305f20917de5bd2b1fc152e74304d3649a1f6042422Roland Scheidegger } 2306adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2307adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (new_state & (_NEW_LIGHT|_NEW_MODELVIEW|_MESA_NEW_NEED_EYE_COORDS)) { 2308adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell update_light( ctx ); 2309adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 2310adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2311adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell /* emit all active clip planes if projection matrix changes. 2312adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 2313adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (new_state & (_NEW_PROJECTION)) { 23147dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle if (ctx->Transform.ClipPlanesEnabled) 2315adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200UpdateClipPlanes( ctx ); 2316adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 2317adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 231898c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger if (new_state & (_NEW_PROGRAM| 2319f48473e42511f8d37a239a07f791bc0a87209e5bBrian Paul _NEW_PROGRAM_CONSTANTS | 232098c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger /* need to test for pretty much anything due to possible parameter bindings */ 232198c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger _NEW_MODELVIEW|_NEW_PROJECTION|_NEW_TRANSFORM| 232298c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger _NEW_LIGHT|_NEW_TEXTURE|_NEW_TEXTURE_MATRIX| 232398c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger _NEW_FOG|_NEW_POINT|_NEW_TRACK_MATRIX)) { 232498c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger if (ctx->VertexProgram._Enabled) { 232598c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger r200SetupVertexProg( ctx ); 232698c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger } 232798c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger else TCL_FALLBACK(ctx, R200_TCL_FALLBACK_VERTEX_PROGRAM, 0); 232898c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger } 2329adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 23304637235183b80963536f2364e4d50fcb894886ddDave Airlie rmesa->radeon.NewGLState = 0; 2331e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie return GL_TRUE; 2332adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 2333adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2334adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2335f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200InvalidateState( struct gl_context *ctx, GLuint new_state ) 2336adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 2337adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell _swrast_InvalidateState( ctx, new_state ); 2338adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell _swsetup_InvalidateState( ctx, new_state ); 233980c88304fc9d09531b2530b74973821e47b46753Keith Whitwell _vbo_InvalidateState( ctx, new_state ); 2340adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell _tnl_InvalidateState( ctx, new_state ); 2341adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell _ae_invalidate_state( ctx, new_state ); 23424637235183b80963536f2364e4d50fcb894886ddDave Airlie R200_CONTEXT(ctx)->radeon.NewGLState |= new_state; 2343adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 2344adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 234557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell/* A hack. The r200 can actually cope just fine with materials 23462a441c488f4bcf11fe032ea7ba448bbfb7449c66Roland Scheidegger * between begin/ends, so fix this. 23472a441c488f4bcf11fe032ea7ba448bbfb7449c66Roland Scheidegger * Should map to inputs just like the generic vertex arrays for vertex progs. 23482a441c488f4bcf11fe032ea7ba448bbfb7449c66Roland Scheidegger * In theory there could still be too many and we'd still need a fallback. 234957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell */ 2350f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic GLboolean check_material( struct gl_context *ctx ) 235157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell{ 235257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell TNLcontext *tnl = TNL_CONTEXT(ctx); 235357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell GLint i; 235457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 23552a441c488f4bcf11fe032ea7ba448bbfb7449c66Roland Scheidegger for (i = _TNL_ATTRIB_MAT_FRONT_AMBIENT; 23562a441c488f4bcf11fe032ea7ba448bbfb7449c66Roland Scheidegger i < _TNL_ATTRIB_MAT_BACK_INDEXES; 235757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell i++) 235857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell if (tnl->vb.AttribPtr[i] && 235957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell tnl->vb.AttribPtr[i]->stride) 236057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell return GL_TRUE; 236157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 236257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell return GL_FALSE; 236357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell} 23642a441c488f4bcf11fe032ea7ba448bbfb7449c66Roland Scheidegger 2365f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200WrapRunPipeline( struct gl_context *ctx ) 2366adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 2367adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell r200ContextPtr rmesa = R200_CONTEXT(ctx); 236857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell GLboolean has_material; 2369adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2370adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell if (0) 23714637235183b80963536f2364e4d50fcb894886ddDave Airlie fprintf(stderr, "%s, newstate: %x\n", __FUNCTION__, rmesa->radeon.NewGLState); 2372adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2373adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell /* Validate state: 2374adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 23754637235183b80963536f2364e4d50fcb894886ddDave Airlie if (rmesa->radeon.NewGLState) 2376e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie if (!r200ValidateState( ctx )) 2377e45213d89bf26c68c9f4c9074eaec9ab3311de7dDave Airlie FALLBACK(rmesa, RADEON_FALLBACK_TEXTURE, GL_TRUE); 2378adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 23792a441c488f4bcf11fe032ea7ba448bbfb7449c66Roland Scheidegger has_material = !ctx->VertexProgram._Enabled && ctx->Light.Enabled && check_material( ctx ); 238057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 238157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell if (has_material) { 2382adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell TCL_FALLBACK( ctx, R200_TCL_FALLBACK_MATERIAL, GL_TRUE ); 2383adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 2384adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2385adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell /* Run the pipeline. 23867dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle */ 2387adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell _tnl_run_pipeline( ctx ); 2388adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 238957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell if (has_material) { 2390adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell TCL_FALLBACK( ctx, R200_TCL_FALLBACK_MATERIAL, GL_FALSE ); 2391adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell } 2392adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 2393adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2394adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2395f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r200PolygonStipple( struct gl_context *ctx, const GLubyte *mask ) 23967d361537661b93a501c9533271458a41b965ea79Dave Airlie{ 23977d361537661b93a501c9533271458a41b965ea79Dave Airlie r200ContextPtr r200 = R200_CONTEXT(ctx); 23987d361537661b93a501c9533271458a41b965ea79Dave Airlie GLint i; 23997d361537661b93a501c9533271458a41b965ea79Dave Airlie 24007d361537661b93a501c9533271458a41b965ea79Dave Airlie radeon_firevertices(&r200->radeon); 24017d361537661b93a501c9533271458a41b965ea79Dave Airlie 240277768cdd73acc512a6d3171731a9c1b20c996f3fPauli Nieminen radeon_print(RADEON_STATE, RADEON_TRACE, 240377768cdd73acc512a6d3171731a9c1b20c996f3fPauli Nieminen "%s(%p) first 32 bits are %x.\n", 240477768cdd73acc512a6d3171731a9c1b20c996f3fPauli Nieminen __func__, 240577768cdd73acc512a6d3171731a9c1b20c996f3fPauli Nieminen ctx, 240677768cdd73acc512a6d3171731a9c1b20c996f3fPauli Nieminen *(uint32_t*)mask); 240777768cdd73acc512a6d3171731a9c1b20c996f3fPauli Nieminen 24087d361537661b93a501c9533271458a41b965ea79Dave Airlie R200_STATECHANGE(r200, stp); 24097d361537661b93a501c9533271458a41b965ea79Dave Airlie 24107d361537661b93a501c9533271458a41b965ea79Dave Airlie /* Must flip pattern upside down. 24117d361537661b93a501c9533271458a41b965ea79Dave Airlie */ 24127d361537661b93a501c9533271458a41b965ea79Dave Airlie for ( i = 31 ; i >= 0; i--) { 24137d361537661b93a501c9533271458a41b965ea79Dave Airlie r200->hw.stp.cmd[3 + i] = ((GLuint *) mask)[i]; 24147d361537661b93a501c9533271458a41b965ea79Dave Airlie } 24157d361537661b93a501c9533271458a41b965ea79Dave Airlie} 2416adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell/* Initialize the driver's state functions. 2417adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell */ 2418d1ca1599f0319f5c99852ce24420aa592e806db0Alex Deuchervoid r200InitStateFuncs( radeonContextPtr radeon, struct dd_function_table *functions ) 2419adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell{ 2420d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->UpdateState = r200InvalidateState; 2421d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->LightingSpaceChange = r200LightingSpaceChange; 2422d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul 24232b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie functions->DrawBuffer = radeonDrawBuffer; 24242b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie functions->ReadBuffer = radeonReadBuffer; 2425d1ca1599f0319f5c99852ce24420aa592e806db0Alex Deucher 2426d9a19d8649e49acfac98c240bff88931be7743d7Alex Deucher functions->CopyPixels = _mesa_meta_CopyPixels; 2427d9a19d8649e49acfac98c240bff88931be7743d7Alex Deucher functions->DrawPixels = _mesa_meta_DrawPixels; 24284a2f00889ba481c117057da5fac7585327458cc3Eric Anholt functions->ReadPixels = radeonReadPixels; 2429d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul 2430d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->AlphaFunc = r200AlphaFunc; 2431033728555cb2f39d8c77f228e1eccc45329bb40aRoland Scheidegger functions->BlendColor = r200BlendColor; 2432c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick functions->BlendEquationSeparate = r200BlendEquationSeparate; 2433d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->BlendFuncSeparate = r200BlendFuncSeparate; 2434d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->ClipPlane = r200ClipPlane; 2435d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->ColorMask = r200ColorMask; 2436d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->CullFace = r200CullFace; 2437d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->DepthFunc = r200DepthFunc; 2438d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->DepthMask = r200DepthMask; 2439d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->DepthRange = r200DepthRange; 2440d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->Enable = r200Enable; 2441d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->Fogfv = r200Fogfv; 2442d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->FrontFace = r200FrontFace; 2443d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->Hint = NULL; 2444d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->LightModelfv = r200LightModelfv; 2445d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->Lightfv = r200Lightfv; 2446d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->LineStipple = r200LineStipple; 2447d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->LineWidth = r200LineWidth; 2448d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->LogicOpcode = r200LogicOpCode; 2449d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->PolygonMode = r200PolygonMode; 2450d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->PolygonOffset = r200PolygonOffset; 24512b5618fc5bdcbee3434f8b5aa3a31eb06fb479c0Alex Deucher functions->PolygonStipple = r200PolygonStipple; 2452cb977ae5f4c9fab5753c04bfdd8736978ad4feeeRoland Scheidegger functions->PointParameterfv = r200PointParameter; 2453d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->PointSize = r200PointSize; 2454d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->RenderMode = r200RenderMode; 24551090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie functions->Scissor = radeonScissor; 2456d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->ShadeModel = r200ShadeModel; 2457878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul functions->StencilFuncSeparate = r200StencilFuncSeparate; 2458878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul functions->StencilMaskSeparate = r200StencilMaskSeparate; 2459878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul functions->StencilOpSeparate = r200StencilOpSeparate; 2460d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->Viewport = r200Viewport; 2461d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul} 2462d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul 2463adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell 2464f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid r200InitTnlFuncs( struct gl_context *ctx ) 2465d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul{ 2466adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange = r200UpdateMaterial; 2467adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell TNL_CONTEXT(ctx)->Driver.RunPipeline = r200WrapRunPipeline; 2468adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell} 2469