1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCopyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThe Weather Channel (TM) funded Tungsten Graphics to develop the 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orginitial release of the Radeon 8500 driver under the XFree86 license. 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThis notice must be preserved. 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPermission is hereby granted, free of charge, to any person obtaining 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orga copy of this software and associated documentation files (the 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org"Software"), to deal in the Software without restriction, including 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwithout limitation the rights to use, copy, modify, merge, publish, 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdistribute, sublicense, and/or sell copies of the Software, and to 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpermit persons to whom the Software is furnished to do so, subject to 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgthe following conditions: 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThe above copyright notice and this permission notice (including the 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnext paragraph) shall be included in all copies or substantial 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgportions of the Software. 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org**************************************************************************/ 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors: 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Keith Whitwell <keith@tungstengraphics.com> 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/api_arrayelt.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/enums.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/colormac.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/light.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/framebuffer.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/fbobject.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/swrast.h" 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vbo/vbo.h" 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/tnl.h" 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/t_pipeline.h" 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast_setup/swrast_setup.h" 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "drivers/common/meta.h" 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeon_common.h" 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeon_mipmap_tree.h" 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_context.h" 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_ioctl.h" 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_state.h" 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_tcl.h" 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_tex.h" 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_swtcl.h" 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_vertprog.h" 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ============================================================= 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Alpha blending 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200AlphaFunc( struct gl_context *ctx, GLenum func, GLfloat ref ) 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int pp_misc = rmesa->hw.ctx.cmd[CTX_PP_MISC]; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte refByte; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_UBYTE(refByte, ref); 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ctx ); 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_misc &= ~(R200_ALPHA_TEST_OP_MASK | R200_REF_ALPHA_MASK); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_misc |= (refByte & R200_REF_ALPHA_MASK); 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch ( func ) { 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_NEVER: 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_misc |= R200_ALPHA_TEST_FAIL; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LESS: 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_misc |= R200_ALPHA_TEST_LESS; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_EQUAL: 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_misc |= R200_ALPHA_TEST_EQUAL; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LEQUAL: 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_misc |= R200_ALPHA_TEST_LEQUAL; 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREATER: 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_misc |= R200_ALPHA_TEST_GREATER; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_NOTEQUAL: 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_misc |= R200_ALPHA_TEST_NEQUAL; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GEQUAL: 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_misc |= R200_ALPHA_TEST_GEQUAL; 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALWAYS: 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_misc |= R200_ALPHA_TEST_PASS; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_PP_MISC] = pp_misc; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200BlendColor( struct gl_context *ctx, const GLfloat cf[4] ) 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte color[4]; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ctx ); 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_UBYTE(color[0], cf[0]); 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_UBYTE(color[1], cf[1]); 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_UBYTE(color[2], cf[2]); 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_UBYTE(color[3], cf[3]); 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCOLOR] = radeonPackColor( 4, color[0], color[1], color[2], color[3] ); 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Calculate the hardware blend factor setting. This same function is used 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for source and destination of both alpha and RGB. 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \returns 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The hardware register value for the specified blend factor. This value 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * will need to be shifted into the correct position for either source or 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * destination factor. 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \todo 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Since the two cases where source and destination are handled differently 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * are essentially error cases, they should never happen. Determine if these 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * cases can be removed. 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int blend_factor( GLenum factor, GLboolean is_src ) 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int func; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch ( factor ) { 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ZERO: 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = R200_BLEND_GL_ZERO; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ONE: 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = R200_BLEND_GL_ONE; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DST_COLOR: 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = R200_BLEND_GL_DST_COLOR; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ONE_MINUS_DST_COLOR: 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = R200_BLEND_GL_ONE_MINUS_DST_COLOR; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SRC_COLOR: 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = R200_BLEND_GL_SRC_COLOR; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ONE_MINUS_SRC_COLOR: 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = R200_BLEND_GL_ONE_MINUS_SRC_COLOR; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SRC_ALPHA: 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = R200_BLEND_GL_SRC_ALPHA; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ONE_MINUS_SRC_ALPHA: 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = R200_BLEND_GL_ONE_MINUS_SRC_ALPHA; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DST_ALPHA: 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = R200_BLEND_GL_DST_ALPHA; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ONE_MINUS_DST_ALPHA: 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = R200_BLEND_GL_ONE_MINUS_DST_ALPHA; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SRC_ALPHA_SATURATE: 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = (is_src) ? R200_BLEND_GL_SRC_ALPHA_SATURATE : R200_BLEND_GL_ZERO; 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_CONSTANT_COLOR: 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = R200_BLEND_GL_CONST_COLOR; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ONE_MINUS_CONSTANT_COLOR: 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = R200_BLEND_GL_ONE_MINUS_CONST_COLOR; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_CONSTANT_ALPHA: 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = R200_BLEND_GL_CONST_ALPHA; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ONE_MINUS_CONSTANT_ALPHA: 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = R200_BLEND_GL_ONE_MINUS_CONST_ALPHA; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = (is_src) ? R200_BLEND_GL_ONE : R200_BLEND_GL_ZERO; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return func; 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Sets both the blend equation and the blend function. 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is done in a single 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * function because some blend equations (i.e., \c GL_MIN and \c GL_MAX) 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * change the interpretation of the blend function. 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Also, make sure that blend function and blend equation are set to their default 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * value if color blending is not enabled, since at least blend equations GL_MIN 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and GL_FUNC_REVERSE_SUBTRACT will cause wrong results otherwise for 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * unknown reasons. 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200_set_blend_state( struct gl_context * ctx ) 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint cntl = rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] & 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ~(R200_ROP_ENABLE | R200_ALPHA_BLEND_ENABLE | R200_SEPARATE_ALPHA_ENABLE); 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) | 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT); 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int eqn = R200_COMB_FCN_ADD_CLAMP; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) | 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT); 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int eqnA = R200_COMB_FCN_ADD_CLAMP; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ctx ); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Color.ColorLogicOpEnabled) { 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = cntl | R200_ROP_ENABLE; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ABLENDCNTL] = eqn | func; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_CBLENDCNTL] = eqn | func; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (ctx->Color.BlendEnabled) { 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = cntl | R200_ALPHA_BLEND_ENABLE | R200_SEPARATE_ALPHA_ENABLE; 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = cntl; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ABLENDCNTL] = eqn | func; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_CBLENDCNTL] = eqn | func; 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = (blend_factor( ctx->Color.Blend[0].SrcRGB, GL_TRUE ) << R200_SRC_BLEND_SHIFT) | 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (blend_factor( ctx->Color.Blend[0].DstRGB, GL_FALSE ) << R200_DST_BLEND_SHIFT); 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(ctx->Color.Blend[0].EquationRGB) { 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FUNC_ADD: 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eqn = R200_COMB_FCN_ADD_CLAMP; 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FUNC_SUBTRACT: 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eqn = R200_COMB_FCN_SUB_CLAMP; 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FUNC_REVERSE_SUBTRACT: 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eqn = R200_COMB_FCN_RSUB_CLAMP; 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MIN: 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eqn = R200_COMB_FCN_MIN; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) | 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT); 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MAX: 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eqn = R200_COMB_FCN_MAX; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) | 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf( stderr, "[%s:%u] Invalid RGB blend equation (0x%04x).\n", 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __FUNCTION__, __LINE__, ctx->Color.Blend[0].EquationRGB ); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org funcA = (blend_factor( ctx->Color.Blend[0].SrcA, GL_TRUE ) << R200_SRC_BLEND_SHIFT) | 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (blend_factor( ctx->Color.Blend[0].DstA, GL_FALSE ) << R200_DST_BLEND_SHIFT); 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(ctx->Color.Blend[0].EquationA) { 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FUNC_ADD: 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eqnA = R200_COMB_FCN_ADD_CLAMP; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FUNC_SUBTRACT: 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eqnA = R200_COMB_FCN_SUB_CLAMP; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FUNC_REVERSE_SUBTRACT: 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eqnA = R200_COMB_FCN_RSUB_CLAMP; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MIN: 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eqnA = R200_COMB_FCN_MIN; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) | 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT); 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MAX: 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eqnA = R200_COMB_FCN_MAX; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) | 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT); 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf( stderr, "[%s:%u] Invalid A blend equation (0x%04x).\n", 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __FUNCTION__, __LINE__, ctx->Color.Blend[0].EquationA ); 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ABLENDCNTL] = eqnA | funcA; 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_CBLENDCNTL] = eqn | func; 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200BlendEquationSeparate( struct gl_context *ctx, 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum modeRGB, GLenum modeA ) 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200_set_blend_state( ctx ); 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200BlendFuncSeparate( struct gl_context *ctx, 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum sfactorRGB, GLenum dfactorRGB, 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum sfactorA, GLenum dfactorA ) 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200_set_blend_state( ctx ); 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ============================================================= 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Depth testing 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200DepthFunc( struct gl_context *ctx, GLenum func ) 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ctx ); 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~R200_Z_TEST_MASK; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch ( ctx->Depth.Func ) { 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_NEVER: 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_NEVER; 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LESS: 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_LESS; 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_EQUAL: 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_EQUAL; 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LEQUAL: 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_LEQUAL; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREATER: 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_GREATER; 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_NOTEQUAL: 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_NEQUAL; 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GEQUAL: 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_GEQUAL; 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALWAYS: 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_ALWAYS; 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200DepthMask( struct gl_context *ctx, GLboolean flag ) 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ctx ); 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( ctx->Depth.Mask ) { 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_WRITE_ENABLE; 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~R200_Z_WRITE_ENABLE; 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ============================================================= 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fog 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200Fogfv( struct gl_context *ctx, GLenum pname, const GLfloat *param ) 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org union { int i; float f; } c, d; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte col[4]; 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c.i = rmesa->hw.fog.cmd[FOG_C]; 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d.i = rmesa->hw.fog.cmd[FOG_D]; 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FOG_MODE: 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Fog.Enabled) 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, tcl); 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~R200_TCL_FOG_MASK; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ctx->Fog.Mode) { 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LINEAR: 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_TCL_FOG_LINEAR; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Fog.Start == ctx->Fog.End) { 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c.f = 1.0F; 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d.f = 1.0F; 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start); 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d.f = -1.0/(ctx->Fog.End-ctx->Fog.Start); 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_EXP: 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_TCL_FOG_EXP; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c.f = 0.0; 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d.f = -ctx->Fog.Density; 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_EXP2: 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_TCL_FOG_EXP2; 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c.f = 0.0; 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d.f = -(ctx->Fog.Density * ctx->Fog.Density); 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FOG_DENSITY: 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ctx->Fog.Mode) { 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_EXP: 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c.f = 0.0; 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d.f = -ctx->Fog.Density; 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_EXP2: 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c.f = 0.0; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d.f = -(ctx->Fog.Density * ctx->Fog.Density); 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FOG_START: 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FOG_END: 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Fog.Mode == GL_LINEAR) { 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Fog.Start == ctx->Fog.End) { 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c.f = 1.0F; 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d.f = 1.0F; 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start); 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d.f = -1.0/(ctx->Fog.End-ctx->Fog.Start); 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FOG_COLOR: 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ctx ); 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unclamped_float_rgba_to_ubyte(col, ctx->Fog.Color ); 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i = radeonPackColor( 4, col[0], col[1], col[2], 0 ); 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] &= ~R200_FOG_COLOR_MASK; 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] |= i; 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FOG_COORD_SRC: { 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint out_0 = rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0]; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint fog = rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR]; 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fog &= ~R200_FOG_USE_MASK; 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( ctx->Fog.FogCoordinateSource == GL_FOG_COORD || ctx->VertexProgram.Enabled) { 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fog |= R200_FOG_USE_VTX_FOG; 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out_0 |= R200_VTX_DISCRETE_FOG; 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fog |= R200_FOG_USE_SPEC_ALPHA; 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out_0 &= ~R200_VTX_DISCRETE_FOG; 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( fog != rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] ) { 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ctx ); 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] = fog; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (out_0 != rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0]) { 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, vtx ); 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] = out_0; 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c.i != rmesa->hw.fog.cmd[FOG_C] || d.i != rmesa->hw.fog.cmd[FOG_D]) { 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, fog ); 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.fog.cmd[FOG_C] = c.i; 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.fog.cmd[FOG_D] = d.i; 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ============================================================= 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Culling 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200CullFace( struct gl_context *ctx, GLenum unused ) 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL]; 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint t = rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL]; 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s |= R200_FFACE_SOLID | R200_BFACE_SOLID; 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t &= ~(R200_CULL_FRONT | R200_CULL_BACK); 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( ctx->Polygon.CullFlag ) { 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch ( ctx->Polygon.CullFaceMode ) { 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FRONT: 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s &= ~R200_FFACE_SOLID; 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t |= R200_CULL_FRONT; 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BACK: 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s &= ~R200_BFACE_SOLID; 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t |= R200_CULL_BACK; 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FRONT_AND_BACK: 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s &= ~(R200_FFACE_SOLID | R200_BFACE_SOLID); 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t |= (R200_CULL_FRONT | R200_CULL_BACK); 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) { 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, set ); 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.set.cmd[SET_SE_CNTL] = s; 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] != t ) { 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, tcl ); 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] = t; 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200FrontFace( struct gl_context *ctx, GLenum mode ) 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int cull_face = (mode == GL_CW) ? R200_FFACE_CULL_CW : R200_FFACE_CULL_CCW; 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, set ); 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_FFACE_CULL_DIR_MASK; 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, tcl ); 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~R200_CULL_FRONT_IS_CCW; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Winding is inverted when rendering to FBO */ 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->DrawBuffer && _mesa_is_user_fbo(ctx->DrawBuffer)) 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cull_face = (mode == GL_CCW) ? R200_FFACE_CULL_CW : R200_FFACE_CULL_CCW; 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.set.cmd[SET_SE_CNTL] |= cull_face; 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( mode == GL_CCW ) 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_CULL_FRONT_IS_CCW; 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ============================================================= 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Point state 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200PointSize( struct gl_context *ctx, GLfloat size ) 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *fcmd = (GLfloat *)rmesa->hw.ptp.cmd; 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_print(RADEON_STATE, RADEON_TRACE, 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "%s(%p) size: %f, fixed point result: %d.%d (%d/16)\n", 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __func__, ctx, size, 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((GLuint)(ctx->Point.Size * 16.0))/16, 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (((GLuint)(ctx->Point.Size * 16.0))&15)*100/16, 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((GLuint)(ctx->Point.Size * 16.0))&15); 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, cst ); 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ptp ); 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.cst.cmd[CST_RE_POINTSIZE] &= ~0xffff; 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.cst.cmd[CST_RE_POINTSIZE] |= ((GLuint)(ctx->Point.Size * 16.0)); 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* this is the size param of the point size calculation (point size reg value 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org is not used when calculation is active). */ 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[PTP_VPORT_SCALE_PTSIZE] = ctx->Point.Size; 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200PointParameter( struct gl_context *ctx, GLenum pname, const GLfloat *params) 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *fcmd = (GLfloat *)rmesa->hw.ptp.cmd; 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_POINT_SIZE_MIN: 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Can clamp both in tcl and setup - just set both (as does fglrx) */ 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, lin ); 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ptp ); 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] &= 0xffff; 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] |= (GLuint)(ctx->Point.MinSize * 16.0) << 16; 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[PTP_CLAMP_MIN] = ctx->Point.MinSize; 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_POINT_SIZE_MAX: 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, cst ); 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ptp ); 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.cst.cmd[CST_RE_POINTSIZE] &= 0xffff; 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.cst.cmd[CST_RE_POINTSIZE] |= (GLuint)(ctx->Point.MaxSize * 16.0) << 16; 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[PTP_CLAMP_MAX] = ctx->Point.MaxSize; 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_POINT_DISTANCE_ATTENUATION: 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, vtx ); 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, spr ); 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ptp ); 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *fcmd = (GLfloat *)rmesa->hw.ptp.cmd; 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] &= 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ~(R200_PS_MULT_MASK | R200_PS_LIN_ATT_ZERO | R200_PS_SE_SEL_STATE); 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* can't rely on ctx->Point._Attenuated here and test for NEW_POINT in 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ValidateState looks like overkill */ 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Point.Params[0] != 1.0 || 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Point.Params[1] != 0.0 || 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Point.Params[2] != 0.0 || 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (ctx->VertexProgram.Enabled && ctx->VertexProgram.PointSizeEnabled)) { 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* all we care for vp would be the ps_se_sel_state setting */ 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[PTP_ATT_CONST_QUAD] = ctx->Point.Params[2]; 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[PTP_ATT_CONST_LIN] = ctx->Point.Params[1]; 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[PTP_ATT_CONST_CON] = ctx->Point.Params[0]; 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] |= R200_PS_MULT_ATTENCONST; 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Point.Params[1] == 0.0) 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] |= R200_PS_LIN_ATT_ZERO; 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* FIXME: setting this here doesn't look quite ok - we only want to do 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org that if we're actually drawing points probably */ 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_PT_SIZE; 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= R200_VTX_POINT_SIZE; 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] |= 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_PS_SE_SEL_STATE | R200_PS_MULT_CONST; 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] &= ~R200_OUTPUT_PT_SIZE; 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] &= ~R200_VTX_POINT_SIZE; 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_POINT_FADE_THRESHOLD_SIZE: 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* don't support multisampling, so doesn't matter. */ 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* can't do these but don't need them. 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_POINT_SPRITE_R_MODE_NV: 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_POINT_SPRITE_COORD_ORIGIN: */ 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "bad pname parameter in r200PointParameter\n"); 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ============================================================= 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Line state 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200LineWidth( struct gl_context *ctx, GLfloat widthf ) 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, lin ); 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, set ); 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Line width is stored in U6.4 format. 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Same min/max limits for AA, non-AA lines. 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] &= ~0xffff; 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] |= (GLuint) 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (CLAMP(widthf, ctx->Const.MinLineWidth, ctx->Const.MaxLineWidth) * 16.0); 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( widthf > 1.0 ) { 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.set.cmd[SET_SE_CNTL] |= R200_WIDELINE_ENABLE; 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_WIDELINE_ENABLE; 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200LineStipple( struct gl_context *ctx, GLint factor, GLushort pattern ) 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, lin ); 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.lin.cmd[LIN_RE_LINE_PATTERN] = 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((((GLuint)factor & 0xff) << 16) | ((GLuint)pattern)); 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ============================================================= 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Masks 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200ColorMask( struct gl_context *ctx, 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean r, GLboolean g, 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean b, GLboolean a ) 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint mask; 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct radeon_renderbuffer *rrb; 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flag = rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] & ~R200_PLANE_MASK_ENABLE; 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rrb = radeon_get_colorbuffer(&rmesa->radeon); 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!rrb) 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = radeonPackColor( rrb->cpp, 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Color.ColorMask[0][RCOMP], 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Color.ColorMask[0][GCOMP], 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Color.ColorMask[0][BCOMP], 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Color.ColorMask[0][ACOMP] ); 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(r && g && b && a)) 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flag |= R200_PLANE_MASK_ENABLE; 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] != flag ) { 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ctx ); 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = flag; 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] != mask ) { 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, msk ); 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] = mask; 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ============================================================= 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Polygon state 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200PolygonOffset( struct gl_context *ctx, 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat factor, GLfloat units ) 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat depthScale = 1.0F / ctx->DrawBuffer->_DepthMaxF; 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float_ui32_type constant = { units * depthScale }; 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float_ui32_type factoru = { factor }; 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* factor *= 2; */ 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* constant *= 2; */ 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* fprintf(stderr, "%s f:%f u:%f\n", __FUNCTION__, factor, constant); */ 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, zbs ); 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_FACTOR] = factoru.ui32; 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_CONSTANT] = constant.ui32; 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200PolygonMode( struct gl_context *ctx, GLenum face, GLenum mode ) 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean flag = (ctx->_TriangleCaps & DD_TRI_UNFILLED) != 0; 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Can't generally do unfilled via tcl, but some good special 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * cases work. 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TCL_FALLBACK( ctx, R200_TCL_FALLBACK_UNFILLED, flag); 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rmesa->radeon.TclFallback) { 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ChooseRenderState( ctx ); 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ChooseVertexState( ctx ); 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ============================================================= 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Rendering attributes 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We really don't want to recalculate all this every time we bind a 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture. These things shouldn't change all that often, so it makes 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * sense to break them out of the core texture state update routines. 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Examine lighting and texture state to determine if separate specular 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * should be enabled. 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200UpdateSpecular( struct gl_context *ctx ) 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t p = rmesa->hw.ctx.cmd[CTX_PP_CNTL]; 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, tcl ); 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, vtx ); 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] &= ~(3<<R200_VTX_COLOR_0_SHIFT); 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] &= ~(3<<R200_VTX_COLOR_1_SHIFT); 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] &= ~R200_OUTPUT_COLOR_0; 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] &= ~R200_OUTPUT_COLOR_1; 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_LIGHTING_ENABLE; 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p &= ~R200_SPECULAR_ENABLE; 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_DIFFUSE_SPECULAR_COMBINE; 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Light.Enabled && 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) { 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT) | 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (R200_VTX_FP_RGBA << R200_VTX_COLOR_1_SHIFT)); 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_0; 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_1; 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LIGHTING_ENABLE; 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p |= R200_SPECULAR_ENABLE; 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ~R200_DIFFUSE_SPECULAR_COMBINE; 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->Light.Enabled) { 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT)); 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_0; 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LIGHTING_ENABLE; 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (ctx->Fog.ColorSumEnabled ) { 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT) | 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (R200_VTX_FP_RGBA << R200_VTX_COLOR_1_SHIFT)); 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p |= R200_SPECULAR_ENABLE; 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT)); 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Fog.Enabled) { 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((R200_VTX_FP_RGBA << R200_VTX_COLOR_1_SHIFT)); 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_1; 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( rmesa->hw.ctx.cmd[CTX_PP_CNTL] != p ) { 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ctx ); 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_PP_CNTL] = p; 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Update vertex/render formats 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rmesa->radeon.TclFallback) { 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ChooseRenderState( ctx ); 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ChooseVertexState( ctx ); 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ============================================================= 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Materials 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Update on colormaterial, material emmissive/ambient, 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * lightmodel.globalambient 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void update_global_ambient( struct gl_context *ctx ) 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float *fcmd = (float *)R200_DB_STATE( glt ); 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Need to do more if both emmissive & ambient are PREMULT: 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * I believe this is not nessary when using source_material. This condition thus 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * will never happen currently, and the function has no dependencies on materials now 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1] & 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((3 << R200_FRONT_EMISSIVE_SOURCE_SHIFT) | 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (3 << R200_FRONT_AMBIENT_SOURCE_SHIFT))) == 0) 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_3V( &fcmd[GLT_RED], 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_EMISSION]); 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ACC_SCALE_3V( &fcmd[GLT_RED], 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Light.Model.Ambient, 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT]); 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_3V( &fcmd[GLT_RED], ctx->Light.Model.Ambient ); 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_DB_STATECHANGE(rmesa, &rmesa->hw.glt); 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Update on change to 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - light[p].colors 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - light[p].enabled 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void update_light_colors( struct gl_context *ctx, GLuint p ) 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_light *l = &ctx->Light.Light[p]; 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* fprintf(stderr, "%s\n", __FUNCTION__); */ 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (l->Enabled) { 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float *fcmd = (float *)R200_DB_STATE( lit[p] ); 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V( &fcmd[LIT_AMBIENT_RED], l->Ambient ); 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V( &fcmd[LIT_DIFFUSE_RED], l->Diffuse ); 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V( &fcmd[LIT_SPECULAR_RED], l->Specular ); 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] ); 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200ColorMaterial( struct gl_context *ctx, GLenum face, GLenum mode ) 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint light_model_ctl1 = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1]; 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org light_model_ctl1 &= ~((0xf << R200_FRONT_EMISSIVE_SOURCE_SHIFT) | 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (0xf << R200_FRONT_AMBIENT_SOURCE_SHIFT) | 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (0xf << R200_FRONT_DIFFUSE_SOURCE_SHIFT) | 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (0xf << R200_FRONT_SPECULAR_SOURCE_SHIFT) | 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (0xf << R200_BACK_EMISSIVE_SOURCE_SHIFT) | 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (0xf << R200_BACK_AMBIENT_SOURCE_SHIFT) | 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (0xf << R200_BACK_DIFFUSE_SOURCE_SHIFT) | 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (0xf << R200_BACK_SPECULAR_SOURCE_SHIFT)); 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Light.ColorMaterialEnabled) { 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint mask = ctx->Light._ColorMaterialBitmask; 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & MAT_BIT_FRONT_EMISSION) { 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_FRONT_EMISSIVE_SOURCE_SHIFT); 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 << 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_FRONT_EMISSIVE_SOURCE_SHIFT); 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & MAT_BIT_FRONT_AMBIENT) { 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_FRONT_AMBIENT_SOURCE_SHIFT); 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 << 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_FRONT_AMBIENT_SOURCE_SHIFT); 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & MAT_BIT_FRONT_DIFFUSE) { 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_FRONT_DIFFUSE_SOURCE_SHIFT); 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 << 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_FRONT_DIFFUSE_SOURCE_SHIFT); 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & MAT_BIT_FRONT_SPECULAR) { 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_FRONT_SPECULAR_SOURCE_SHIFT); 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 << 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_FRONT_SPECULAR_SOURCE_SHIFT); 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & MAT_BIT_BACK_EMISSION) { 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_BACK_EMISSIVE_SOURCE_SHIFT); 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 << 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_BACK_EMISSIVE_SOURCE_SHIFT); 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & MAT_BIT_BACK_AMBIENT) { 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_BACK_AMBIENT_SOURCE_SHIFT); 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 << 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_BACK_AMBIENT_SOURCE_SHIFT); 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & MAT_BIT_BACK_DIFFUSE) { 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_BACK_DIFFUSE_SOURCE_SHIFT); 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 << 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_BACK_DIFFUSE_SOURCE_SHIFT); 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & MAT_BIT_BACK_SPECULAR) { 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_BACK_SPECULAR_SOURCE_SHIFT); 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 << 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_BACK_SPECULAR_SOURCE_SHIFT); 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Default to SOURCE_MATERIAL: 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org light_model_ctl1 |= 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_EMISSIVE_SOURCE_SHIFT) | 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_AMBIENT_SOURCE_SHIFT) | 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_DIFFUSE_SOURCE_SHIFT) | 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_SPECULAR_SOURCE_SHIFT) | 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_EMISSIVE_SOURCE_SHIFT) | 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_AMBIENT_SOURCE_SHIFT) | 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_DIFFUSE_SOURCE_SHIFT) | 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_SPECULAR_SOURCE_SHIFT); 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (light_model_ctl1 != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1]) { 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, tcl ); 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1] = light_model_ctl1; 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200UpdateMaterial( struct gl_context *ctx ) 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat (*mat)[4] = ctx->Light.Material.Attrib; 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *fcmd = (GLfloat *)R200_DB_STATE( mtl[0] ); 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *fcmd2 = (GLfloat *)R200_DB_STATE( mtl[1] ); 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint mask = ~0; 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Might be possible and faster to update everything unconditionally? */ 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Light.ColorMaterialEnabled) 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask &= ~ctx->Light._ColorMaterialBitmask; 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (R200_DEBUG & RADEON_STATE) 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s\n", __FUNCTION__); 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & MAT_BIT_FRONT_EMISSION) { 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[MTL_EMMISSIVE_RED] = mat[MAT_ATTRIB_FRONT_EMISSION][0]; 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[MTL_EMMISSIVE_GREEN] = mat[MAT_ATTRIB_FRONT_EMISSION][1]; 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[MTL_EMMISSIVE_BLUE] = mat[MAT_ATTRIB_FRONT_EMISSION][2]; 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[MTL_EMMISSIVE_ALPHA] = mat[MAT_ATTRIB_FRONT_EMISSION][3]; 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & MAT_BIT_FRONT_AMBIENT) { 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[MTL_AMBIENT_RED] = mat[MAT_ATTRIB_FRONT_AMBIENT][0]; 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[MTL_AMBIENT_GREEN] = mat[MAT_ATTRIB_FRONT_AMBIENT][1]; 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[MTL_AMBIENT_BLUE] = mat[MAT_ATTRIB_FRONT_AMBIENT][2]; 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[MTL_AMBIENT_ALPHA] = mat[MAT_ATTRIB_FRONT_AMBIENT][3]; 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & MAT_BIT_FRONT_DIFFUSE) { 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[MTL_DIFFUSE_RED] = mat[MAT_ATTRIB_FRONT_DIFFUSE][0]; 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[MTL_DIFFUSE_GREEN] = mat[MAT_ATTRIB_FRONT_DIFFUSE][1]; 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[MTL_DIFFUSE_BLUE] = mat[MAT_ATTRIB_FRONT_DIFFUSE][2]; 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[MTL_DIFFUSE_ALPHA] = mat[MAT_ATTRIB_FRONT_DIFFUSE][3]; 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & MAT_BIT_FRONT_SPECULAR) { 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[MTL_SPECULAR_RED] = mat[MAT_ATTRIB_FRONT_SPECULAR][0]; 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[MTL_SPECULAR_GREEN] = mat[MAT_ATTRIB_FRONT_SPECULAR][1]; 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[MTL_SPECULAR_BLUE] = mat[MAT_ATTRIB_FRONT_SPECULAR][2]; 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[MTL_SPECULAR_ALPHA] = mat[MAT_ATTRIB_FRONT_SPECULAR][3]; 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & MAT_BIT_FRONT_SHININESS) { 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[MTL_SHININESS] = mat[MAT_ATTRIB_FRONT_SHININESS][0]; 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & MAT_BIT_BACK_EMISSION) { 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd2[MTL_EMMISSIVE_RED] = mat[MAT_ATTRIB_BACK_EMISSION][0]; 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd2[MTL_EMMISSIVE_GREEN] = mat[MAT_ATTRIB_BACK_EMISSION][1]; 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd2[MTL_EMMISSIVE_BLUE] = mat[MAT_ATTRIB_BACK_EMISSION][2]; 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd2[MTL_EMMISSIVE_ALPHA] = mat[MAT_ATTRIB_BACK_EMISSION][3]; 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & MAT_BIT_BACK_AMBIENT) { 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd2[MTL_AMBIENT_RED] = mat[MAT_ATTRIB_BACK_AMBIENT][0]; 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd2[MTL_AMBIENT_GREEN] = mat[MAT_ATTRIB_BACK_AMBIENT][1]; 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd2[MTL_AMBIENT_BLUE] = mat[MAT_ATTRIB_BACK_AMBIENT][2]; 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd2[MTL_AMBIENT_ALPHA] = mat[MAT_ATTRIB_BACK_AMBIENT][3]; 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & MAT_BIT_BACK_DIFFUSE) { 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd2[MTL_DIFFUSE_RED] = mat[MAT_ATTRIB_BACK_DIFFUSE][0]; 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd2[MTL_DIFFUSE_GREEN] = mat[MAT_ATTRIB_BACK_DIFFUSE][1]; 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd2[MTL_DIFFUSE_BLUE] = mat[MAT_ATTRIB_BACK_DIFFUSE][2]; 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd2[MTL_DIFFUSE_ALPHA] = mat[MAT_ATTRIB_BACK_DIFFUSE][3]; 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & MAT_BIT_BACK_SPECULAR) { 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd2[MTL_SPECULAR_RED] = mat[MAT_ATTRIB_BACK_SPECULAR][0]; 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd2[MTL_SPECULAR_GREEN] = mat[MAT_ATTRIB_BACK_SPECULAR][1]; 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd2[MTL_SPECULAR_BLUE] = mat[MAT_ATTRIB_BACK_SPECULAR][2]; 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd2[MTL_SPECULAR_ALPHA] = mat[MAT_ATTRIB_BACK_SPECULAR][3]; 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & MAT_BIT_BACK_SHININESS) { 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd2[MTL_SHININESS] = mat[MAT_ATTRIB_BACK_SHININESS][0]; 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_DB_STATECHANGE( rmesa, &rmesa->hw.mtl[0] ); 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_DB_STATECHANGE( rmesa, &rmesa->hw.mtl[1] ); 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* currently material changes cannot trigger a global ambient change, I believe this is correct 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_global_ambient( ctx ); */ 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* _NEW_LIGHT 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _NEW_MODELVIEW 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _MESA_NEW_NEED_EYE_COORDS 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Uses derived state from mesa: 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _VP_inf_norm 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _h_inf_norm 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _Position 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _NormSpotDirection 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _ModelViewInvScale 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _NeedEyeCoords 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _EyeZDir 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * which are calculated in light.c and are correct for the current 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * lighting space (model or eye), hence dependencies on _NEW_MODELVIEW 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and _MESA_NEW_NEED_EYE_COORDS. 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void update_light( struct gl_context *ctx ) 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Have to check these, or have an automatic shortcircuit mechanism 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to remove noop statechanges. (Or just do a better job on the 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * front end). 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint tmp = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0]; 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->_NeedEyeCoords) 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp &= ~R200_LIGHT_IN_MODELSPACE; 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp |= R200_LIGHT_IN_MODELSPACE; 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tmp != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0]) 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, tcl ); 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] = tmp; 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *fcmd = (GLfloat *)R200_DB_STATE( eye ); 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[EYE_X] = ctx->_EyeZDir[0]; 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[EYE_Y] = ctx->_EyeZDir[1]; 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[EYE_Z] = - ctx->_EyeZDir[2]; 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[EYE_RESCALE_FACTOR] = ctx->_ModelViewInvScale; 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_DB_STATECHANGE( rmesa, &rmesa->hw.eye ); 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Light.Enabled) { 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint p; 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (p = 0 ; p < MAX_LIGHTS; p++) { 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Light.Light[p].Enabled) { 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_light *l = &ctx->Light.Light[p]; 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *fcmd = (GLfloat *)R200_DB_STATE( lit[p] ); 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (l->EyePosition[3] == 0.0) { 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_3FV( &fcmd[LIT_POSITION_X], l->_VP_inf_norm ); 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_3FV( &fcmd[LIT_DIRECTION_X], l->_h_inf_norm ); 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[LIT_POSITION_W] = 0; 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[LIT_DIRECTION_W] = 0; 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V( &fcmd[LIT_POSITION_X], l->_Position ); 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[LIT_DIRECTION_X] = -l->_NormSpotDirection[0]; 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[LIT_DIRECTION_Y] = -l->_NormSpotDirection[1]; 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[LIT_DIRECTION_Z] = -l->_NormSpotDirection[2]; 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[LIT_DIRECTION_W] = 0; 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] ); 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200Lightfv( struct gl_context *ctx, GLenum light, 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum pname, const GLfloat *params ) 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint p = light - GL_LIGHT0; 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_light *l = &ctx->Light.Light[p]; 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *fcmd = (GLfloat *)rmesa->hw.lit[p].cmd; 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_AMBIENT: 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DIFFUSE: 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SPECULAR: 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_light_colors( ctx, p ); 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SPOT_DIRECTION: 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* picked up in update_light */ 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_POSITION: { 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* positions picked up in update_light, but can do flag here */ 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flag = (p&1)? R200_LIGHT_1_IS_LOCAL : R200_LIGHT_0_IS_LOCAL; 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2; 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, tcl); 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (l->EyePosition[3] != 0.0F) 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[idx] |= flag; 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[idx] &= ~flag; 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SPOT_EXPONENT: 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, lit[p]); 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[LIT_SPOT_EXPONENT] = params[0]; 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SPOT_CUTOFF: { 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flag = (p&1) ? R200_LIGHT_1_IS_SPOT : R200_LIGHT_0_IS_SPOT; 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2; 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, lit[p]); 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[LIT_SPOT_CUTOFF] = l->_CosCutoff; 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, tcl); 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (l->SpotCutoff != 180.0F) 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[idx] |= flag; 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[idx] &= ~flag; 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_CONSTANT_ATTENUATION: 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, lit[p]); 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[LIT_ATTEN_CONST] = params[0]; 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( params[0] == 0.0 ) 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[LIT_ATTEN_CONST_INV] = FLT_MAX; 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[LIT_ATTEN_CONST_INV] = 1.0 / params[0]; 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LINEAR_ATTENUATION: 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, lit[p]); 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[LIT_ATTEN_LINEAR] = params[0]; 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_QUADRATIC_ATTENUATION: 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, lit[p]); 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[LIT_ATTEN_QUADRATIC] = params[0]; 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set RANGE_ATTEN only when needed */ 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_POSITION: 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_CONSTANT_ATTENUATION: 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LINEAR_ATTENUATION: 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_QUADRATIC_ATTENUATION: { 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *icmd = (GLuint *)R200_DB_STATE( tcl ); 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2; 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint atten_flag = ( p&1 ) ? R200_LIGHT_1_ENABLE_RANGE_ATTEN 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : R200_LIGHT_0_ENABLE_RANGE_ATTEN; 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint atten_const_flag = ( p&1 ) ? R200_LIGHT_1_CONSTANT_RANGE_ATTEN 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : R200_LIGHT_0_CONSTANT_RANGE_ATTEN; 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( l->EyePosition[3] == 0.0F || 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( ( fcmd[LIT_ATTEN_CONST] == 0.0 || fcmd[LIT_ATTEN_CONST] == 1.0 ) && 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) ) { 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Disable attenuation */ 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icmd[idx] &= ~atten_flag; 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) { 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Enable only constant portion of attenuation calculation */ 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icmd[idx] |= ( atten_flag | atten_const_flag ); 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Enable full attenuation calculation */ 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icmd[idx] &= ~atten_const_flag; 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icmd[idx] |= atten_flag; 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_DB_STATECHANGE( rmesa, &rmesa->hw.tcl ); 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200UpdateLocalViewer ( struct gl_context *ctx ) 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* It looks like for the texgen modes GL_SPHERE_MAP, GL_NORMAL_MAP and 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_REFLECTION_MAP we need R200_LOCAL_VIEWER set (fglrx does exactly that 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for these and only these modes). This means specular highlights may turn out 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wrong in some cases when lighting is enabled but GL_LIGHT_MODEL_LOCAL_VIEWER 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org is not set, though it seems to happen rarely and the effect seems quite 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org subtle. May need TCL fallback to fix it completely, though I'm not sure 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org how you'd identify the cases where the specular highlights indeed will 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org be wrong. Don't know if fglrx does something special in that case. 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/ 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, tcl ); 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Light.Model.LocalViewer || 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Texture._GenFlags & TEXGEN_NEED_NORMALS) 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LOCAL_VIEWER; 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_LOCAL_VIEWER; 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200LightModelfv( struct gl_context *ctx, GLenum pname, 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *param ) 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LIGHT_MODEL_AMBIENT: 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_global_ambient( ctx ); 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LIGHT_MODEL_LOCAL_VIEWER: 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200UpdateLocalViewer( ctx ); 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LIGHT_MODEL_TWO_SIDE: 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, tcl ); 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Light.Model.TwoSide) 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LIGHT_TWOSIDE; 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~(R200_LIGHT_TWOSIDE); 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rmesa->radeon.TclFallback) { 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ChooseRenderState( ctx ); 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ChooseVertexState( ctx ); 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LIGHT_MODEL_COLOR_CONTROL: 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200UpdateSpecular(ctx); 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200ShadeModel( struct gl_context *ctx, GLenum mode ) 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL]; 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s &= ~(R200_DIFFUSE_SHADE_MASK | 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ALPHA_SHADE_MASK | 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_SPECULAR_SHADE_MASK | 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_FOG_SHADE_MASK | 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_DISC_FOG_SHADE_MASK); 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch ( mode ) { 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FLAT: 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s |= (R200_DIFFUSE_SHADE_FLAT | 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ALPHA_SHADE_FLAT | 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_SPECULAR_SHADE_FLAT | 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_FOG_SHADE_FLAT | 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_DISC_FOG_SHADE_FLAT); 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SMOOTH: 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s |= (R200_DIFFUSE_SHADE_GOURAUD | 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ALPHA_SHADE_GOURAUD | 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_SPECULAR_SHADE_GOURAUD | 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_FOG_SHADE_GOURAUD | 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_DISC_FOG_SHADE_GOURAUD); 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) { 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, set ); 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.set.cmd[SET_SE_CNTL] = s; 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ============================================================= 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * User clip planes 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200ClipPlane( struct gl_context *ctx, GLenum plane, const GLfloat *eq ) 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint p = (GLint) plane - (GLint) GL_CLIP_PLANE0; 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p]; 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ucp[p] ); 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ucp[p].cmd[UCP_X] = ip[0]; 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1]; 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2]; 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ucp[p].cmd[UCP_W] = ip[3]; 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200UpdateClipPlanes( struct gl_context *ctx ) 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p; 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (p = 0; p < ctx->Const.MaxClipPlanes; p++) { 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Transform.ClipPlanesEnabled & (1 << p)) { 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p]; 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ucp[p] ); 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ucp[p].cmd[UCP_X] = ip[0]; 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1]; 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2]; 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ucp[p].cmd[UCP_W] = ip[3]; 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ============================================================= 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Stencil 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgr200StencilFuncSeparate( struct gl_context *ctx, GLenum face, GLenum func, 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint ref, GLuint mask ) 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint refmask = (((ctx->Stencil.Ref[0] & 0xff) << R200_STENCIL_REF_SHIFT) | 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((ctx->Stencil.ValueMask[0] & 0xff) << R200_STENCIL_MASK_SHIFT)); 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ctx ); 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, msk ); 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~R200_STENCIL_TEST_MASK; 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~(R200_STENCIL_REF_MASK| 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STENCIL_VALUE_MASK); 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch ( ctx->Stencil.Function[0] ) { 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_NEVER: 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_NEVER; 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LESS: 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_LESS; 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_EQUAL: 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_EQUAL; 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LEQUAL: 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_LEQUAL; 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREATER: 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_GREATER; 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_NOTEQUAL: 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_NEQUAL; 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GEQUAL: 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_GEQUAL; 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALWAYS: 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_ALWAYS; 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |= refmask; 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgr200StencilMaskSeparate( struct gl_context *ctx, GLenum face, GLuint mask ) 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, msk ); 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~R200_STENCIL_WRITE_MASK; 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |= 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((ctx->Stencil.WriteMask[0] & 0xff) << R200_STENCIL_WRITEMASK_SHIFT); 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgr200StencilOpSeparate( struct gl_context *ctx, GLenum face, GLenum fail, 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum zfail, GLenum zpass ) 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ctx ); 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~(R200_STENCIL_FAIL_MASK | 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STENCIL_ZFAIL_MASK | 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STENCIL_ZPASS_MASK); 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch ( ctx->Stencil.FailFunc[0] ) { 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_KEEP: 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_KEEP; 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ZERO: 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_ZERO; 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_REPLACE: 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_REPLACE; 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INCR: 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_INC; 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DECR: 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_DEC; 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INCR_WRAP_EXT: 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_INC_WRAP; 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DECR_WRAP_EXT: 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_DEC_WRAP; 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INVERT: 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_INVERT; 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch ( ctx->Stencil.ZFailFunc[0] ) { 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_KEEP: 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_KEEP; 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ZERO: 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_ZERO; 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_REPLACE: 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_REPLACE; 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INCR: 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_INC; 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DECR: 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_DEC; 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INCR_WRAP_EXT: 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_INC_WRAP; 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DECR_WRAP_EXT: 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_DEC_WRAP; 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INVERT: 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_INVERT; 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch ( ctx->Stencil.ZPassFunc[0] ) { 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_KEEP: 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_KEEP; 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ZERO: 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_ZERO; 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_REPLACE: 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_REPLACE; 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INCR: 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_INC; 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DECR: 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_DEC; 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INCR_WRAP_EXT: 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_INC_WRAP; 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DECR_WRAP_EXT: 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_DEC_WRAP; 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INVERT: 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_INVERT; 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ============================================================= 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Window position and viewport transformation 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called when window size or position changes or viewport or depth range 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * state is changed. We update the hardware viewport state here. 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200UpdateWindow( struct gl_context *ctx ) 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIdrawable *dPriv = radeon_get_drawable(&rmesa->radeon); 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat xoffset = 0; 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat yoffset = dPriv ? (GLfloat) dPriv->h : 0; 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *v = ctx->Viewport._WindowMap.m; 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean render_to_fbo = (ctx->DrawBuffer ? _mesa_is_user_fbo(ctx->DrawBuffer) : 0); 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat depthScale = 1.0F / ctx->DrawBuffer->_DepthMaxF; 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat y_scale, y_bias; 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (render_to_fbo) { 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y_scale = 1.0; 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y_bias = 0; 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y_scale = -1.0; 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y_bias = yoffset; 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float_ui32_type sx = { v[MAT_SX] }; 1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float_ui32_type tx = { v[MAT_TX] + xoffset }; 1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float_ui32_type sy = { v[MAT_SY] * y_scale }; 1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float_ui32_type ty = { (v[MAT_TY] * y_scale) + y_bias }; 1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float_ui32_type sz = { v[MAT_SZ] * depthScale }; 1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float_ui32_type tz = { v[MAT_TZ] * depthScale }; 1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, vpt ); 1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE] = sx.ui32; 1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = tx.ui32; 1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE] = sy.ui32; 1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = ty.ui32; 1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE] = sz.ui32; 1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = tz.ui32; 1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200_vtbl_update_scissor( struct gl_context *ctx ) 1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr r200 = R200_CONTEXT(ctx); 1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x1, y1, x2, y2; 1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct radeon_renderbuffer *rrb; 1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_SET_STATE(r200, set, SET_RE_CNTL, R200_SCISSOR_ENABLE | r200->hw.set.cmd[SET_RE_CNTL]); 1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r200->radeon.state.scissor.enabled) { 1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x1 = r200->radeon.state.scissor.rect.x1; 1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y1 = r200->radeon.state.scissor.rect.y1; 1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x2 = r200->radeon.state.scissor.rect.x2; 1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y2 = r200->radeon.state.scissor.rect.y2; 1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rrb = radeon_get_colorbuffer(&r200->radeon); 1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x1 = 0; 1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y1 = 0; 1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x2 = rrb->base.Base.Width - 1; 1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y2 = rrb->base.Base.Height - 1; 1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_SET_STATE(r200, sci, SCI_XY_1, x1 | (y1 << 16)); 1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_SET_STATE(r200, sci, SCI_XY_2, x2 | (y2 << 16)); 1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200Viewport( struct gl_context *ctx, GLint x, GLint y, 1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLsizei height ) 1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Don't pipeline viewport changes, conflict with window offset 1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * setting below. Could apply deltas to rescue pipelined viewport 1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * values, or keep the originals hanging around. 1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200UpdateWindow( ctx ); 1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_viewport(ctx, x, y, width, height); 1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200DepthRange( struct gl_context *ctx, GLclampd nearval, 1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLclampd farval ) 1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200UpdateWindow( ctx ); 1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200UpdateViewportOffset( struct gl_context *ctx ) 1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIdrawable *dPriv = radeon_get_drawable(&rmesa->radeon); 1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat xoffset = (GLfloat)0; 1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat yoffset = (GLfloat)dPriv->h; 1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *v = ctx->Viewport._WindowMap.m; 1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float_ui32_type tx; 1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float_ui32_type ty; 1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx.f = v[MAT_TX] + xoffset; 1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ty.f = (- v[MAT_TY]) + yoffset; 1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] != tx.ui32 || 1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] != ty.ui32 ) 1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note: this should also modify whatever data the context reset 1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * code uses... 1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, vpt ); 1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = tx.ui32; 1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = ty.ui32; 1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* update polygon stipple x/y screen offset */ 1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint stx, sty; 1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint m = rmesa->hw.msc.cmd[MSC_RE_MISC]; 1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m &= ~(R200_STIPPLE_X_OFFSET_MASK | 1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STIPPLE_Y_OFFSET_MASK); 1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* add magic offsets, then invert */ 1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stx = 31 - ((-1) & R200_STIPPLE_COORD_MASK); 1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sty = 31 - ((dPriv->h - 1) 1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org & R200_STIPPLE_COORD_MASK); 1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m |= ((stx << R200_STIPPLE_X_OFFSET_SHIFT) | 1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (sty << R200_STIPPLE_Y_OFFSET_SHIFT)); 1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( rmesa->hw.msc.cmd[MSC_RE_MISC] != m ) { 1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, msc ); 1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.msc.cmd[MSC_RE_MISC] = m; 1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeonUpdateScissor( ctx ); 1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ============================================================= 1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Miscellaneous 1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200RenderMode( struct gl_context *ctx, GLenum mode ) 1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FALLBACK( rmesa, R200_FALLBACK_RENDER_MODE, (mode != GL_RENDER) ); 1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint r200_rop_tab[] = { 1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ROP_CLEAR, 1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ROP_AND, 1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ROP_AND_REVERSE, 1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ROP_COPY, 1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ROP_AND_INVERTED, 1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ROP_NOOP, 1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ROP_XOR, 1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ROP_OR, 1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ROP_NOR, 1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ROP_EQUIV, 1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ROP_INVERT, 1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ROP_OR_REVERSE, 1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ROP_COPY_INVERTED, 1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ROP_OR_INVERTED, 1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ROP_NAND, 1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_ROP_SET, 1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200LogicOpCode( struct gl_context *ctx, GLenum opcode ) 1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint rop = (GLuint)opcode - GL_CLEAR; 1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT( rop < 16 ); 1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, msk ); 1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.msk.cmd[MSK_RB3D_ROPCNTL] = r200_rop_tab[rop]; 1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ============================================================= 1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * State enable/disable 1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200Enable( struct gl_context *ctx, GLenum cap, GLboolean state ) 1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p, flag; 1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( R200_DEBUG & RADEON_STATE ) 1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf( stderr, "%s( %s = %s )\n", __FUNCTION__, 1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr( cap ), 1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state ? "GL_TRUE" : "GL_FALSE" ); 1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch ( cap ) { 1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Fast track this one... 1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D: 1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D: 1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_3D: 1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA_TEST: 1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ctx ); 1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state) { 1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_ALPHA_TEST_ENABLE; 1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_ALPHA_TEST_ENABLE; 1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLEND: 1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COLOR_LOGIC_OP: 1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200_set_blend_state( ctx ); 1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_CLIP_PLANE0: 1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_CLIP_PLANE1: 1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_CLIP_PLANE2: 1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_CLIP_PLANE3: 1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_CLIP_PLANE4: 1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_CLIP_PLANE5: 1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p = cap-GL_CLIP_PLANE0; 1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, tcl ); 1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state) { 1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= (R200_UCP_ENABLE_0<<p); 1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ClipPlane( ctx, cap, NULL ); 1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~(R200_UCP_ENABLE_0<<p); 1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COLOR_MATERIAL: 1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ColorMaterial( ctx, 0, 0 ); 1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200UpdateMaterial( ctx ); 1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_CULL_FACE: 1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200CullFace( ctx, 0 ); 1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH_TEST: 1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, ctx ); 1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( state ) { 1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_Z_ENABLE; 1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_Z_ENABLE; 1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DITHER: 1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, ctx ); 1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( state ) { 1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_DITHER_ENABLE; 1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~rmesa->radeon.state.color.roundEnable; 1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_DITHER_ENABLE; 1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= rmesa->radeon.state.color.roundEnable; 1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FOG: 1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, ctx ); 1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( state ) { 1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_FOG_ENABLE; 1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200Fogfv( ctx, GL_FOG_MODE, NULL ); 1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_FOG_ENABLE; 1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, tcl); 1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~R200_TCL_FOG_MASK; 1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200UpdateSpecular( ctx ); /* for PK_SPEC */ 1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rmesa->radeon.TclFallback) 1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ChooseVertexState( ctx ); 1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_allow_light_in_model( ctx, !state ); 1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LIGHT0: 1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LIGHT1: 1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LIGHT2: 1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LIGHT3: 1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LIGHT4: 1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LIGHT5: 1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LIGHT6: 1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LIGHT7: 1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, tcl); 1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p = cap - GL_LIGHT0; 1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p&1) 1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flag = (R200_LIGHT_1_ENABLE | 1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_LIGHT_1_ENABLE_AMBIENT | 1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_LIGHT_1_ENABLE_SPECULAR); 1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flag = (R200_LIGHT_0_ENABLE | 1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_LIGHT_0_ENABLE_AMBIENT | 1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_LIGHT_0_ENABLE_SPECULAR); 1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state) 1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] |= flag; 1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] &= ~flag; 1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_light_colors( ctx, p ); 1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LIGHTING: 1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200UpdateSpecular(ctx); 1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* for reflection map fixup - might set recheck_texgen for all units too */ 1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.NewGLState |= _NEW_TEXTURE; 1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LINE_SMOOTH: 1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ctx ); 1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( state ) { 1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_ANTI_ALIAS_LINE; 1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_ANTI_ALIAS_LINE; 1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LINE_STIPPLE: 1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, set ); 1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( state ) { 1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.set.cmd[SET_RE_CNTL] |= R200_PATTERN_ENABLE; 1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.set.cmd[SET_RE_CNTL] &= ~R200_PATTERN_ENABLE; 1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_NORMALIZE: 1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, tcl ); 1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( state ) { 1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_NORMALIZE_NORMALS; 1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_NORMALIZE_NORMALS; 1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Pointsize registers on r200 only work for point sprites, and point smooth 1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * doesn't work for point sprites (and isn't needed for 1.0 sized aa points). 1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In any case, setting pointmin == pointsizemax == 1.0 for aa points 1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is enough to satisfy conform. 1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_POINT_SMOOTH: 1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* These don't really do anything, as we don't use the 3vtx 1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * primitives yet. 1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_POLYGON_OFFSET_POINT: 1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, set ); 1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( state ) { 1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.set.cmd[SET_SE_CNTL] |= R200_ZBIAS_ENABLE_POINT; 1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_ZBIAS_ENABLE_POINT; 1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_POLYGON_OFFSET_LINE: 1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, set ); 1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( state ) { 1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.set.cmd[SET_SE_CNTL] |= R200_ZBIAS_ENABLE_LINE; 1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_ZBIAS_ENABLE_LINE; 1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_POINT_SPRITE_ARB: 1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, spr ); 1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( state ) { 1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 6; i++) { 1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] |= 1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Point.CoordReplace[i] << (R200_PS_GEN_TEX_0_SHIFT + i); 1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] &= ~R200_PS_GEN_TEX_MASK; 1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_POLYGON_OFFSET_FILL: 1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, set ); 1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( state ) { 1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.set.cmd[SET_SE_CNTL] |= R200_ZBIAS_ENABLE_TRI; 1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_ZBIAS_ENABLE_TRI; 1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_POLYGON_SMOOTH: 1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ctx ); 1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( state ) { 1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_ANTI_ALIAS_POLY; 1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_ANTI_ALIAS_POLY; 1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_POLYGON_STIPPLE: 1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, set ); 1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( state ) { 1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.set.cmd[SET_RE_CNTL] |= R200_STIPPLE_ENABLE; 1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.set.cmd[SET_RE_CNTL] &= ~R200_STIPPLE_ENABLE; 1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RESCALE_NORMAL_EXT: { 1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean tmp = ctx->_NeedEyeCoords ? state : !state; 1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, tcl ); 1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( tmp ) { 1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_RESCALE_NORMALS; 1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_RESCALE_NORMALS; 1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SCISSOR_TEST: 1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_firevertices(&rmesa->radeon); 1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.state.scissor.enabled = state; 1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeonUpdateScissor( ctx ); 1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_STENCIL_TEST: 1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean hw_stencil = GL_FALSE; 1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->DrawBuffer) { 1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct radeon_renderbuffer *rrbStencil 1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = radeon_get_renderbuffer(ctx->DrawBuffer, BUFFER_STENCIL); 1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hw_stencil = (rrbStencil && rrbStencil->bo); 1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (hw_stencil) { 1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ctx ); 1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( state ) { 1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_STENCIL_ENABLE; 1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_STENCIL_ENABLE; 1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FALLBACK( rmesa, R200_FALLBACK_STENCIL, state ); 1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_GEN_Q: 1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_GEN_R: 1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_GEN_S: 1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_GEN_T: 1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Picked up in r200UpdateTextureState. 1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->recheck_texgen[ctx->Texture.CurrentUnit] = GL_TRUE; 1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COLOR_SUM_EXT: 1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200UpdateSpecular ( ctx ); 1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_VERTEX_PROGRAM_ARB: 1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!state) { 1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->curr_vp_hw = NULL; 1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, vap ); 2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL] &= ~R200_VAP_PROG_VTX_SHADER_ENABLE; 2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* mark all tcl atoms (tcl vector state got overwritten) dirty 2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org not sure about tcl scalar state - we need at least grd 2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org with vert progs too. 2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ucp looks like it doesn't get overwritten (may even work 2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org with vp for pos-invariant progs if we're lucky) */ 2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, mtl[0] ); 2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, mtl[1] ); 2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, fog ); 2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, glt ); 2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, eye ); 2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = R200_MTX_MV; i <= R200_MTX_TEX5; i++) { 2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, mat[i] ); 2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0 ; i < 8; i++) { 2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, lit[i] ); 2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, tcl ); 2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i <= ctx->Const.MaxClipPlanes; i++) { 2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Transform.ClipPlanesEnabled & (1 << i)) { 2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= (R200_UCP_ENABLE_0 << i); 2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* else { 2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~(R200_UCP_ENABLE_0 << i); 2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }*/ 2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* ugly. Need to call everything which might change compsel. */ 2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200UpdateSpecular( ctx ); 2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* shouldn't be necessary, as it's picked up anyway in r200ValidateState (_NEW_PROGRAM), 2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org but without it doom3 locks up at always the same places. Why? */ 2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* FIXME: This can (and should) be replaced by a call to the TCL_STATE_FLUSH reg before 2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org accessing VAP_SE_VAP_CNTL. Requires drm changes (done). Remove after some time... */ 2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200UpdateTextureState( ctx ); 2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* if we call r200UpdateTextureState we need the code below because we are calling it with 2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org non-current derived enabled values which may revert the state atoms for frag progs even when 2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org they already got disabled... ugh 2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Should really figure out why we need to call r200UpdateTextureState in the first place */ 2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint unit; 2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unit = 0; unit < R200_MAX_TEXTURE_UNITS; unit++) { 2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, pix[unit] ); 2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, tex[unit] ); 2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT] &= 2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ~(R200_TXFORMAT_ST_ROUTE_MASK | R200_TXFORMAT_LOOKUP_DISABLE); 2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT] |= unit << R200_TXFORMAT_ST_ROUTE_SHIFT; 2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* need to guard this with drmSupportsFragmentShader? Should never get here if 2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org we don't announce ATI_fs, right? */ 2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tex[unit].cmd[TEX_PP_TXMULTI_CTL] = 0; 2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, cst ); 2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, tf ); 2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.cst.cmd[CST_PP_CNTL_X] = 0; 2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* picked up later */ 2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* call functions which change hw state based on ARB_vp enabled or not. */ 2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200PointParameter( ctx, GL_POINT_DISTANCE_ATTENUATION, NULL ); 2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200Fogfv( ctx, GL_FOG_COORD_SRC, NULL ); 2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_VERTEX_PROGRAM_POINT_SIZE_ARB: 2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200PointParameter( ctx, GL_POINT_DISTANCE_ATTENUATION, NULL ); 2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FRAGMENT_SHADER_ATI: 2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( !state ) { 2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* restore normal tex env colors and make sure tex env combine will get updated 2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mark env atoms dirty (as their data was overwritten by afs even 2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if they didn't change) and restore tex coord routing */ 2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint unit; 2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unit = 0; unit < R200_MAX_TEXTURE_UNITS; unit++) { 2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, pix[unit] ); 2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, tex[unit] ); 2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT] &= 2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ~(R200_TXFORMAT_ST_ROUTE_MASK | R200_TXFORMAT_LOOKUP_DISABLE); 2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT] |= unit << R200_TXFORMAT_ST_ROUTE_SHIFT; 2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tex[unit].cmd[TEX_PP_TXMULTI_CTL] = 0; 2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, cst ); 2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, tf ); 2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.cst.cmd[CST_PP_CNTL_X] = 0; 2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* need to mark this dirty as pix/tf atoms have overwritten the data 2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org even if the data in the atoms didn't change */ 2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, atf ); 2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, afs[1] ); 2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* everything else picked up in r200UpdateTextureState hopefully */ 2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200LightingSpaceChange( struct gl_context *ctx ) 2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean tmp; 2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (R200_DEBUG & RADEON_STATE) 2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s %d BEFORE %x\n", __FUNCTION__, ctx->_NeedEyeCoords, 2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0]); 2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->_NeedEyeCoords) 2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = ctx->Transform.RescaleNormals; 2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = !ctx->Transform.RescaleNormals; 2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, tcl ); 2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( tmp ) { 2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_RESCALE_NORMALS; 2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_RESCALE_NORMALS; 2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (R200_DEBUG & RADEON_STATE) 2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s %d AFTER %x\n", __FUNCTION__, ctx->_NeedEyeCoords, 2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0]); 2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ============================================================= 2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Deferred state management - matrices, textures, other? 2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void upload_matrix( r200ContextPtr rmesa, GLfloat *src, int idx ) 2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float *dest = ((float *)R200_DB_STATE( mat[idx] ))+MAT_ELT_0; 2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0 ; i < 4 ; i++) { 2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *dest++ = src[i]; 2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *dest++ = src[i+4]; 2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *dest++ = src[i+8]; 2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *dest++ = src[i+12]; 2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] ); 2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void upload_matrix_t( r200ContextPtr rmesa, const GLfloat *src, int idx ) 2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float *dest = ((float *)R200_DB_STATE( mat[idx] ))+MAT_ELT_0; 2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dest, src, 16*sizeof(float)); 2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] ); 2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void update_texturematrix( struct gl_context *ctx ) 2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT( ctx ); 2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint tpc = rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_0]; 2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint compsel = rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL]; 2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int unit; 2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (R200_DEBUG & RADEON_STATE) 2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s before COMPSEL: %x\n", __FUNCTION__, 2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL]); 2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->TexMatEnabled = 0; 2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->TexMatCompSel = 0; 2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unit = 0 ; unit < ctx->Const.MaxTextureUnits; unit++) { 2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Texture.Unit[unit]._ReallyEnabled) 2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->TextureMatrixStack[unit].Top->type != MATRIX_IDENTITY) { 2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->TexMatEnabled |= (R200_TEXGEN_TEXMAT_0_ENABLE| 2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_TEXMAT_0_ENABLE) << unit; 2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->TexMatCompSel |= R200_OUTPUT_TEX_0 << unit; 2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rmesa->TexGenEnabled & (R200_TEXMAT_0_ENABLE << unit)) { 2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Need to preconcatenate any active texgen 2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * obj/eyeplane matrices: 2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _math_matrix_mul_matrix( &rmesa->tmpmat, 2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->TextureMatrixStack[unit].Top, 2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &rmesa->TexGenMatrix[unit] ); 2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org upload_matrix( rmesa, rmesa->tmpmat.m, R200_MTX_TEX0+unit ); 2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org upload_matrix( rmesa, ctx->TextureMatrixStack[unit].Top->m, 2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_MTX_TEX0+unit ); 2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (rmesa->TexGenEnabled & (R200_TEXMAT_0_ENABLE << unit)) { 2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org upload_matrix( rmesa, rmesa->TexGenMatrix[unit].m, 2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_MTX_TEX0+unit ); 2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tpc = (rmesa->TexMatEnabled | rmesa->TexGenEnabled); 2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tpc != rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_0]) { 2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, tcg); 2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_0] = tpc; 2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compsel &= ~R200_OUTPUT_TEX_MASK; 2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compsel |= rmesa->TexMatCompSel | rmesa->TexGenCompSel; 2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (compsel != rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL]) { 2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, vtx); 2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] = compsel; 2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean r200ValidateBuffers(struct gl_context *ctx) 2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct radeon_renderbuffer *rrb; 2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct radeon_dma_bo *dma_bo; 2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, ret; 2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (RADEON_DEBUG & RADEON_IOCTL) 2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s\n", __FUNCTION__); 2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_cs_space_reset_bos(rmesa->radeon.cmdbuf.cs); 2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rrb = radeon_get_colorbuffer(&rmesa->radeon); 2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* color buffer */ 2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rrb && rrb->bo) { 2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, rrb->bo, 2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, RADEON_GEM_DOMAIN_VRAM); 2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* depth buffer */ 2232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rrb = radeon_get_depthbuffer(&rmesa->radeon); 2233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* color buffer */ 2234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rrb && rrb->bo) { 2235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, rrb->bo, 2236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, RADEON_GEM_DOMAIN_VRAM); 2237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ctx->Const.MaxTextureImageUnits; ++i) { 2240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeonTexObj *t; 2241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Texture.Unit[i]._ReallyEnabled) 2243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 2244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t = radeon_tex_obj(ctx->Texture.Unit[i]._Current); 2246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (t->image_override && t->bo) 2247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, t->bo, 2248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); 2249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (t->mt->bo) 2250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, t->mt->bo, 2251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); 2252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dma_bo = first_elem(&rmesa->radeon.dma.reserved); 2255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs, dma_bo->bo, RADEON_GEM_DOMAIN_GTT, 0); 2257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) 2258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean r200ValidateState( struct gl_context *ctx ) 2264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 2266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint new_state = rmesa->radeon.NewGLState; 2267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (new_state & _NEW_BUFFERS) { 2269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_update_framebuffer(ctx); 2270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* this updates the DrawBuffer's Width/Height if it's a FBO */ 2271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_update_draw_buffer_bounds(ctx); 2272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(rmesa, ctx); 2274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (new_state & (_NEW_TEXTURE | _NEW_PROGRAM | _NEW_PROGRAM_CONSTANTS)) { 2277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200UpdateTextureState( ctx ); 2278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org new_state |= rmesa->radeon.NewGLState; /* may add TEXTURE_MATRIX */ 2279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200UpdateLocalViewer( ctx ); 2280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* we need to do a space check here */ 2283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!r200ValidateBuffers(ctx)) 2284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* FIXME: don't really need most of these when vertex progs are enabled */ 2287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Need an event driven matrix update? 2289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (new_state & (_NEW_MODELVIEW|_NEW_PROJECTION)) 2291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org upload_matrix( rmesa, ctx->_ModelProjectMatrix.m, R200_MTX_MVP ); 2292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Need these for lighting (shouldn't upload otherwise) 2294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (new_state & (_NEW_MODELVIEW)) { 2296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org upload_matrix( rmesa, ctx->ModelviewMatrixStack.Top->m, R200_MTX_MV ); 2297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org upload_matrix_t( rmesa, ctx->ModelviewMatrixStack.Top->inv, R200_MTX_IMV ); 2298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Does this need to be triggered on eg. modelview for 2301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texgen-derived objplane/eyeplane matrices? 2302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (new_state & (_NEW_TEXTURE|_NEW_TEXTURE_MATRIX)) { 2304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_texturematrix( ctx ); 2305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (new_state & (_NEW_LIGHT|_NEW_MODELVIEW|_MESA_NEW_NEED_EYE_COORDS)) { 2308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_light( ctx ); 2309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* emit all active clip planes if projection matrix changes. 2312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (new_state & (_NEW_PROJECTION)) { 2314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Transform.ClipPlanesEnabled) 2315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200UpdateClipPlanes( ctx ); 2316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (new_state & (_NEW_PROGRAM| 2319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _NEW_PROGRAM_CONSTANTS | 2320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* need to test for pretty much anything due to possible parameter bindings */ 2321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _NEW_MODELVIEW|_NEW_PROJECTION|_NEW_TRANSFORM| 2322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _NEW_LIGHT|_NEW_TEXTURE|_NEW_TEXTURE_MATRIX| 2323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _NEW_FOG|_NEW_POINT|_NEW_TRACK_MATRIX)) { 2324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->VertexProgram._Enabled) { 2325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200SetupVertexProg( ctx ); 2326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else TCL_FALLBACK(ctx, R200_TCL_FALLBACK_VERTEX_PROGRAM, 0); 2328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.NewGLState = 0; 2331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200InvalidateState( struct gl_context *ctx, GLuint new_state ) 2336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_InvalidateState( ctx, new_state ); 2338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swsetup_InvalidateState( ctx, new_state ); 2339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _vbo_InvalidateState( ctx, new_state ); 2340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _tnl_InvalidateState( ctx, new_state ); 2341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _ae_invalidate_state( ctx, new_state ); 2342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_CONTEXT(ctx)->radeon.NewGLState |= new_state; 2343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* A hack. The r200 can actually cope just fine with materials 2346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * between begin/ends, so fix this. 2347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Should map to inputs just like the generic vertex arrays for vertex progs. 2348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In theory there could still be too many and we'd still need a fallback. 2349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean check_material( struct gl_context *ctx ) 2351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNLcontext *tnl = TNL_CONTEXT(ctx); 2353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 2354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = _TNL_ATTRIB_MAT_FRONT_AMBIENT; 2356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i < _TNL_ATTRIB_MAT_BACK_INDEXES; 2357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i++) 2358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tnl->vb.AttribPtr[i] && 2359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->vb.AttribPtr[i]->stride) 2360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200WrapRunPipeline( struct gl_context *ctx ) 2366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 2368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean has_material; 2369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) 2371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s, newstate: %x\n", __FUNCTION__, rmesa->radeon.NewGLState); 2372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Validate state: 2374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rmesa->radeon.NewGLState) 2376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!r200ValidateState( ctx )) 2377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FALLBACK(rmesa, RADEON_FALLBACK_TEXTURE, GL_TRUE); 2378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org has_material = !ctx->VertexProgram._Enabled && ctx->Light.Enabled && check_material( ctx ); 2380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (has_material) { 2382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TCL_FALLBACK( ctx, R200_TCL_FALLBACK_MATERIAL, GL_TRUE ); 2383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Run the pipeline. 2386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _tnl_run_pipeline( ctx ); 2388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (has_material) { 2390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TCL_FALLBACK( ctx, R200_TCL_FALLBACK_MATERIAL, GL_FALSE ); 2391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200PolygonStipple( struct gl_context *ctx, const GLubyte *mask ) 2396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr r200 = R200_CONTEXT(ctx); 2398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 2399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_firevertices(&r200->radeon); 2401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_print(RADEON_STATE, RADEON_TRACE, 2403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "%s(%p) first 32 bits are %x.\n", 2404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __func__, 2405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx, 2406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *(uint32_t*)mask); 2407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE(r200, stp); 2409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Must flip pattern upside down. 2411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for ( i = 31 ; i >= 0; i--) { 2413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200->hw.stp.cmd[3 + i] = ((GLuint *) mask)[i]; 2414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Initialize the driver's state functions. 2417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200InitStateFuncs( radeonContextPtr radeon, struct dd_function_table *functions ) 2419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->UpdateState = r200InvalidateState; 2421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->LightingSpaceChange = r200LightingSpaceChange; 2422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->DrawBuffer = radeonDrawBuffer; 2424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->ReadBuffer = radeonReadBuffer; 2425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->CopyPixels = _mesa_meta_CopyPixels; 2427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->DrawPixels = _mesa_meta_DrawPixels; 2428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->ReadPixels = radeonReadPixels; 2429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->AlphaFunc = r200AlphaFunc; 2431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->BlendColor = r200BlendColor; 2432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->BlendEquationSeparate = r200BlendEquationSeparate; 2433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->BlendFuncSeparate = r200BlendFuncSeparate; 2434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->ClipPlane = r200ClipPlane; 2435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->ColorMask = r200ColorMask; 2436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->CullFace = r200CullFace; 2437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->DepthFunc = r200DepthFunc; 2438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->DepthMask = r200DepthMask; 2439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->DepthRange = r200DepthRange; 2440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->Enable = r200Enable; 2441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->Fogfv = r200Fogfv; 2442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->FrontFace = r200FrontFace; 2443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->Hint = NULL; 2444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->LightModelfv = r200LightModelfv; 2445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->Lightfv = r200Lightfv; 2446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->LineStipple = r200LineStipple; 2447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->LineWidth = r200LineWidth; 2448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->LogicOpcode = r200LogicOpCode; 2449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->PolygonMode = r200PolygonMode; 2450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->PolygonOffset = r200PolygonOffset; 2451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->PolygonStipple = r200PolygonStipple; 2452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->PointParameterfv = r200PointParameter; 2453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->PointSize = r200PointSize; 2454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->RenderMode = r200RenderMode; 2455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->Scissor = radeonScissor; 2456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->ShadeModel = r200ShadeModel; 2457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->StencilFuncSeparate = r200StencilFuncSeparate; 2458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->StencilMaskSeparate = r200StencilMaskSeparate; 2459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->StencilOpSeparate = r200StencilOpSeparate; 2460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->Viewport = r200Viewport; 2461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200InitTnlFuncs( struct gl_context *ctx ) 2465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange = r200UpdateMaterial; 2467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNL_CONTEXT(ctx)->Driver.RunPipeline = r200WrapRunPipeline; 2468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2469