radeon_state.c revision f64f940281f0d716e0ddc641e7ef1728f143d67f
15df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_state.c,v 1.8 2002/12/16 16:18:58 dawes Exp $ */ 25df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/************************************************************************** 35df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 45df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulCopyright 2000, 2001 VA Linux Systems Inc., Fremont, California. 55df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 65df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulAll Rights Reserved. 75df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 85df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulPermission is hereby granted, free of charge, to any person obtaining 95df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paula copy of this software and associated documentation files (the 105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul"Software"), to deal in the Software without restriction, including 115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulwithout limitation the rights to use, copy, modify, merge, publish, 125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Pauldistribute, sublicense, and/or sell copies of the Software, and to 135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulpermit persons to whom the Software is furnished to do so, subject to 145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulthe following conditions: 155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulThe above copyright notice and this permission notice (including the 175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulnext paragraph) shall be included in all copies or substantial 185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulportions of the Software. 195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul**************************************************************************/ 295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* 315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Authors: 325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Gareth Hughes <gareth@valinux.com> 335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Keith Whitwell <keith@tungstengraphics.com> 345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "glheader.h" 375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "imports.h" 385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "api_arrayelt.h" 395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "enums.h" 405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "colormac.h" 415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "state.h" 42cc5d04574406a86d9a4d7991370359dc3c94f9a7Felix Kuehling#include "context.h" 435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "swrast/swrast.h" 455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "array_cache/acache.h" 465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/tnl.h" 475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_pipeline.h" 485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "main/light.h" 495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "swrast_setup/swrast_setup.h" 505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_context.h" 525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_ioctl.h" 535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_state.h" 545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tcl.h" 555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tex.h" 565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_swtcl.h" 575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_vtxfmt.h" 585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Alpha blending 615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonAlphaFunc( GLcontext *ctx, GLenum func, GLfloat ref ) 645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int pp_misc = rmesa->hw.ctx.cmd[CTX_PP_MISC]; 675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLubyte refByte; 685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLAMPED_FLOAT_TO_UBYTE(refByte, ref); 705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc &= ~(RADEON_ALPHA_TEST_OP_MASK | RADEON_REF_ALPHA_MASK); 745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= (refByte & RADEON_REF_ALPHA_MASK); 755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( func ) { 775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NEVER: 785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_FAIL; 795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LESS: 815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_LESS; 825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EQUAL: 845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_EQUAL; 855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LEQUAL: 875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_LEQUAL; 885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_GREATER: 905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_GREATER; 915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NOTEQUAL: 935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_NEQUAL; 945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_GEQUAL: 965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_GEQUAL; 975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ALWAYS: 995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_PASS; 1005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_MISC] = pp_misc; 1045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 1055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 106c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanickstatic void radeonBlendEquationSeparate( GLcontext *ctx, 107c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick GLenum modeRGB, GLenum modeA ) 1085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 1095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 1105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint b = rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] & ~RADEON_COMB_FCN_MASK; 1115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean fallback = GL_FALSE; 1125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 113c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick assert( modeRGB == modeA ); 114c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick 115c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick switch ( modeRGB ) { 1165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FUNC_ADD: 1175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LOGIC_OP: 1185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_COMB_FCN_ADD_CLAMP; 1195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FUNC_SUBTRACT: 1225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_COMB_FCN_SUB_CLAMP; 1235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 1265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Color.BlendEnabled) 1275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fallback = GL_TRUE; 1285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 1295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_COMB_FCN_ADD_CLAMP; 1305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_BLEND_EQ, fallback ); 1345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( !fallback ) { 1355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 1365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = b; 13778bb0803cf722ad5273fc495791eb573bf8b4d21Michel Dänzer if ( ctx->Color._LogicOpEnabled ) { 1385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_ROP_ENABLE; 1395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 1405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE; 1415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 1445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14520a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanickstatic void radeonBlendFuncSeparate( GLcontext *ctx, 14620a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick GLenum sfactorRGB, GLenum dfactorRGB, 14720a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick GLenum sfactorA, GLenum dfactorA ) 1485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 1495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 1505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint b = rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] & 1515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ~(RADEON_SRC_BLEND_MASK | RADEON_DST_BLEND_MASK); 1525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean fallback = GL_FALSE; 1535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Color.BlendSrcRGB ) { 1555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ZERO: 1565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ZERO; 1575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE: 1595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ONE; 1605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DST_COLOR: 1625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_DST_COLOR; 1635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_DST_COLOR: 1655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ONE_MINUS_DST_COLOR; 1665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SRC_COLOR: 1685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_SRC_COLOR; 1695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_SRC_COLOR: 1715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ONE_MINUS_SRC_COLOR; 1725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SRC_ALPHA: 1745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_SRC_ALPHA; 1755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_SRC_ALPHA: 1775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ONE_MINUS_SRC_ALPHA; 1785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DST_ALPHA: 1805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_DST_ALPHA; 1815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_DST_ALPHA: 1835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ONE_MINUS_DST_ALPHA; 1845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SRC_ALPHA_SATURATE: 1865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_SRC_ALPHA_SATURATE; 1875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CONSTANT_COLOR: 1895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_CONSTANT_COLOR: 1905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CONSTANT_ALPHA: 1915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_CONSTANT_ALPHA: 1925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Color.BlendEnabled) 1935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fallback = GL_TRUE; 1945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 1955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ONE; 1965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 1985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Color.BlendDstRGB ) { 2025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ZERO: 2035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ZERO; 2045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE: 2065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ONE; 2075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SRC_COLOR: 2095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_SRC_COLOR; 2105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_SRC_COLOR: 2125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ONE_MINUS_SRC_COLOR; 2135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SRC_ALPHA: 2155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_SRC_ALPHA; 2165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_SRC_ALPHA: 2185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ONE_MINUS_SRC_ALPHA; 2195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DST_COLOR: 2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_DST_COLOR; 2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_DST_COLOR: 2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ONE_MINUS_DST_COLOR; 2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DST_ALPHA: 2275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_DST_ALPHA; 2285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_DST_ALPHA: 2305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ONE_MINUS_DST_ALPHA; 2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CONSTANT_COLOR: 2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_CONSTANT_COLOR: 2345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CONSTANT_ALPHA: 2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_CONSTANT_ALPHA: 2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Color.BlendEnabled) 2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fallback = GL_TRUE; 2385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 2395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ZERO; 2405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 2425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_BLEND_FUNC, fallback ); 2465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( !fallback ) { 2475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 2485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = b; 2495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 2515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Depth testing 2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 2565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDepthFunc( GLcontext *ctx, GLenum func ) 2585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 2595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 2605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 2625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_Z_TEST_MASK; 2635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Depth.Func ) { 2655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NEVER: 2665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_NEVER; 2675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LESS: 2695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_LESS; 2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EQUAL: 2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_EQUAL; 2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LEQUAL: 2755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_LEQUAL; 2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_GREATER: 2785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_GREATER; 2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NOTEQUAL: 2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_NEQUAL; 2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_GEQUAL: 2845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_GEQUAL; 2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ALWAYS: 2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_ALWAYS; 2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDepthMask( GLcontext *ctx, GLboolean flag ) 2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 2975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( ctx->Depth.Mask ) { 2995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_WRITE_ENABLE; 3005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 3015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_Z_WRITE_ENABLE; 3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClearDepth( GLcontext *ctx, GLclampd d ) 3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 3085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint format = (rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] & 3095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DEPTH_FORMAT_MASK); 3105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( format ) { 3125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case RADEON_DEPTH_FORMAT_16BIT_INT_Z: 3135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.depth.clear = d * 0x0000ffff; 3145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case RADEON_DEPTH_FORMAT_24BIT_INT_Z: 3165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.depth.clear = d * 0x00ffffff; 3175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 3205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 3235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Fog 3245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 3255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonFogfv( GLcontext *ctx, GLenum pname, const GLfloat *param ) 3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 3295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 3305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul union { int i; float f; } c, d; 3315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLchan col[4]; 3325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.i = rmesa->hw.fog.cmd[FOG_C]; 3345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.i = rmesa->hw.fog.cmd[FOG_D]; 3355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (pname) { 3375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FOG_MODE: 3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (!ctx->Fog.Enabled) 3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_TCL_FOG_MASK; 3425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (ctx->Fog.Mode) { 3435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINEAR: 3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_LINEAR; 3455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Fog.Start == ctx->Fog.End) { 3465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = 1.0F; 3475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.f = 1.0F; 3485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 3505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start); 3515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.f = 1.0/(ctx->Fog.End-ctx->Fog.Start); 3525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EXP: 3555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_EXP; 3565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = 0.0; 3575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.f = ctx->Fog.Density; 3585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EXP2: 3605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_EXP2; 3615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = 0.0; 3625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.f = -(ctx->Fog.Density * ctx->Fog.Density); 3635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 3655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 3665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FOG_DENSITY: 3695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (ctx->Fog.Mode) { 3705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EXP: 3715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = 0.0; 3725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.f = ctx->Fog.Density; 3735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EXP2: 3755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = 0.0; 3765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.f = -(ctx->Fog.Density * ctx->Fog.Density); 3775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 3795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FOG_START: 3835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FOG_END: 3845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Fog.Mode == GL_LINEAR) { 3855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Fog.Start == ctx->Fog.End) { 3865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = 1.0F; 3875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.f = 1.0F; 3885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 3895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start); 3905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.f = 1.0/(ctx->Fog.End-ctx->Fog.Start); 3915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FOG_COLOR: 3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 3965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul UNCLAMPED_FLOAT_TO_RGB_CHAN( col, ctx->Fog.Color ); 3975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] = 3985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonPackColor( 4, col[0], col[1], col[2], 0 ); 3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 4005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FOG_COORDINATE_SOURCE_EXT: 4015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* What to do? 4025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 4035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 4045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 4055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 4065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (c.i != rmesa->hw.fog.cmd[FOG_C] || d.i != rmesa->hw.fog.cmd[FOG_D]) { 4095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, fog ); 4105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.fog.cmd[FOG_C] = c.i; 4115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.fog.cmd[FOG_D] = d.i; 4125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 4175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Scissoring 4185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 4195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic GLboolean intersect_rect( XF86DRIClipRectPtr out, 4225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul XF86DRIClipRectPtr a, 4235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul XF86DRIClipRectPtr b ) 4245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 4255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *out = *a; 4265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( b->x1 > out->x1 ) out->x1 = b->x1; 4275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( b->y1 > out->y1 ) out->y1 = b->y1; 4285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( b->x2 < out->x2 ) out->x2 = b->x2; 4295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( b->y2 < out->y2 ) out->y2 = b->y2; 4305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( out->x1 >= out->x2 ) return GL_FALSE; 4315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( out->y1 >= out->y2 ) return GL_FALSE; 4325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return GL_TRUE; 4335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonRecalcScissorRects( radeonContextPtr rmesa ) 4375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 4385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul XF86DRIClipRectPtr out; 4395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int i; 4405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Grow cliprect store? 4425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 4435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->state.scissor.numAllocedClipRects < rmesa->numClipRects) { 4445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul while (rmesa->state.scissor.numAllocedClipRects < rmesa->numClipRects) { 4455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.numAllocedClipRects += 1; /* zero case */ 4465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.numAllocedClipRects *= 2; 4475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->state.scissor.pClipRects) 4505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FREE(rmesa->state.scissor.pClipRects); 4515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.pClipRects = 4535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul MALLOC( rmesa->state.scissor.numAllocedClipRects * 4545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul sizeof(XF86DRIClipRectRec) ); 4555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->state.scissor.pClipRects == NULL ) { 4575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.numAllocedClipRects = 0; 4585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 4595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul out = rmesa->state.scissor.pClipRects; 4635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.numClipRects = 0; 4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( i = 0 ; i < rmesa->numClipRects ; i++ ) { 4665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( intersect_rect( out, 4675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul &rmesa->pClipRects[i], 4685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul &rmesa->state.scissor.rect ) ) { 4695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.numClipRects++; 4705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul out++; 4715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonUpdateScissor( GLcontext *ctx ) 4775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 4785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 4795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->dri.drawable ) { 4815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul __DRIdrawablePrivate *dPriv = rmesa->dri.drawable; 4825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int x = ctx->Scissor.X; 4845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int y = dPriv->h - ctx->Scissor.Y - ctx->Scissor.Height; 4855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int w = ctx->Scissor.X + ctx->Scissor.Width - 1; 4865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int h = dPriv->h - ctx->Scissor.Y - 1; 4875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.rect.x1 = x + dPriv->x; 4895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.rect.y1 = y + dPriv->y; 4905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.rect.x2 = w + dPriv->x + 1; 4915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.rect.y2 = h + dPriv->y + 1; 4925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonRecalcScissorRects( rmesa ); 4945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonScissor( GLcontext *ctx, 4995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint x, GLint y, GLsizei w, GLsizei h ) 5005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 5025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( ctx->Scissor.Enabled ) { 5045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FIREVERTICES( rmesa ); /* don't pipeline cliprect changes */ 5055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateScissor( ctx ); 5065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 5095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 5125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Culling 5135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 5145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonCullFace( GLcontext *ctx, GLenum unused ) 5165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 5185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL]; 5195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint t = rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL]; 5205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s |= RADEON_FFACE_SOLID | RADEON_BFACE_SOLID; 5225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t &= ~(RADEON_CULL_FRONT | RADEON_CULL_BACK); 5235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( ctx->Polygon.CullFlag ) { 5255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Polygon.CullFaceMode ) { 5265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FRONT: 5275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s &= ~RADEON_FFACE_SOLID; 5285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t |= RADEON_CULL_FRONT; 5295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 5305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_BACK: 5315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s &= ~RADEON_BFACE_SOLID; 5325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t |= RADEON_CULL_BACK; 5335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 5345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FRONT_AND_BACK: 5355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s &= ~(RADEON_FFACE_SOLID | RADEON_BFACE_SOLID); 5365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t |= (RADEON_CULL_FRONT | RADEON_CULL_BACK); 5375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 5385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) { 5425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, set ); 5435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] = s; 5445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] != t ) { 5475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl ); 5485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] = t; 5495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 5515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonFrontFace( GLcontext *ctx, GLenum mode ) 5535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 5555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, set ); 5575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_FFACE_CULL_DIR_MASK; 5585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 5605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_CULL_FRONT_IS_CCW; 5615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( mode ) { 5635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CW: 5645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_FFACE_CULL_CW; 5655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 5665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CCW: 5675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_FFACE_CULL_CCW; 5685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_CULL_FRONT_IS_CCW; 5695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 5705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 5725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 5755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Line state 5765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 5775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLineWidth( GLcontext *ctx, GLfloat widthf ) 5785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 5805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, lin ); 5825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, set ); 5835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Line width is stored in U6.4 format. 5855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 5865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] = (GLuint)(widthf * 16.0); 5875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( widthf > 1.0 ) { 5885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_WIDELINE_ENABLE; 5895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 5905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_WIDELINE_ENABLE; 5915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 5935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLineStipple( GLcontext *ctx, GLint factor, GLushort pattern ) 5955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 5975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, lin ); 5995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.lin.cmd[LIN_RE_LINE_PATTERN] = 6005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ((((GLuint)factor & 0xff) << 16) | ((GLuint)pattern)); 6015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 6055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Masks 6065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonColorMask( GLcontext *ctx, 6085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean r, GLboolean g, 6095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean b, GLboolean a ) 6105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 6125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint mask = radeonPackColor( rmesa->radeonScreen->cpp, 6135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Color.ColorMask[RCOMP], 6145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Color.ColorMask[GCOMP], 6155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Color.ColorMask[BCOMP], 6165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Color.ColorMask[ACOMP] ); 6175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] != mask ) { 6195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, msk ); 6205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] = mask; 6215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 6265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Polygon state 6275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonPolygonOffset( GLcontext *ctx, 6305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat factor, GLfloat units ) 6315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 6335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat constant = units * rmesa->state.depth.scale; 6345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, zbs ); 6365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_FACTOR] = *(GLuint *)&factor; 6375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_CONSTANT] = *(GLuint *)&constant; 6385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonPolygonStipple( GLcontext *ctx, const GLubyte *mask ) 6415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 6435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint i; 6445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul drmRadeonStipple stipple; 6455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Must flip pattern upside down. 6475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( i = 0 ; i < 32 ; i++ ) { 6495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.stipple.mask[31 - i] = ((GLuint *) mask)[i]; 6505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* TODO: push this into cmd mechanism 6535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FIREVERTICES( rmesa ); 6555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCK_HARDWARE( rmesa ); 6565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* FIXME: Use window x,y offsets into stipple RAM. 6585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul stipple.mask = rmesa->state.stipple.mask; 6605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul drmCommandWrite( rmesa->dri.fd, DRM_RADEON_STIPPLE, 6615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul &stipple, sizeof(drmRadeonStipple) ); 6625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul UNLOCK_HARDWARE( rmesa ); 6635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonPolygonMode( GLcontext *ctx, GLenum face, GLenum mode ) 6665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 6685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean flag = (ctx->_TriangleCaps & DD_TRI_UNFILLED) != 0; 6695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Can't generally do unfilled via tcl, but some good special 6715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * cases work. 6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_UNFILLED, flag); 6745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->TclFallback) { 6755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseRenderState( ctx ); 6765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseVertexState( ctx ); 6775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 6825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Rendering attributes 6835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 6845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * We really don't want to recalculate all this every time we bind a 6855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * texture. These things shouldn't change all that often, so it makes 6865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * sense to break them out of the core texture state update routines. 6875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Examine lighting and texture state to determine if separate specular 6905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * should be enabled. 6915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonUpdateSpecular( GLcontext *ctx ) 6935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 6955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CARD32 p = rmesa->hw.ctx.cmd[CTX_PP_CNTL]; 6965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 6985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_SPECULAR; 7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_DIFFUSE; 7015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] &= ~RADEON_TCL_VTX_PK_SPEC; 7025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] &= ~RADEON_TCL_VTX_PK_DIFFUSE; 7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_LIGHTING_ENABLE; 7045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul p &= ~RADEON_SPECULAR_ENABLE; 7065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_DIFFUSE_SPECULAR_COMBINE; 7085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.Enabled && 7115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) { 7125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_SPECULAR; 7135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_DIFFUSE; 7145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC; 7155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE; 7165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE; 7175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul p |= RADEON_SPECULAR_ENABLE; 7185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= 7195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ~RADEON_DIFFUSE_SPECULAR_COMBINE; 7205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else if (ctx->Light.Enabled) { 7225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_DIFFUSE; 7235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE; 7245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE; 7255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else if (ctx->Fog.ColorSumEnabled ) { 7265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC; 7275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE; 7285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul p |= RADEON_SPECULAR_ENABLE; 7295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 7305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE; 7315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Fog.Enabled) { 7345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_SPECULAR; 7355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC; 7365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Bizzare: have to leave lighting enabled to get fog. 7385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 7395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE; 7405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 74243b57728340e70827a114c384192ed319abdb5c6Keith Whitwell if (NEED_SECONDARY_COLOR(ctx)) { 7435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul assert( (p & RADEON_SPECULAR_ENABLE) != 0 ); 7445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 7455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul assert( (p & RADEON_SPECULAR_ENABLE) == 0 ); 7465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.ctx.cmd[CTX_PP_CNTL] != p ) { 7495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 7505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] = p; 7515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Update vertex/render formats 7545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 7555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->TclFallback) { 7565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseRenderState( ctx ); 7575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseVertexState( ctx ); 7585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 7635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Materials 7645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 7655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Update on colormaterial, material emmissive/ambient, 7685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * lightmodel.globalambient 7695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 7705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_global_ambient( GLcontext *ctx ) 7715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 7725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 7735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul float *fcmd = (float *)RADEON_DB_STATE( glt ); 7745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Need to do more if both emmissive & ambient are PREMULT: 776f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger * Hope this is not needed for MULT 7775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 7785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ((rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] & 7795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ((3 << RADEON_EMISSIVE_SOURCE_SHIFT) | 7805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (3 << RADEON_AMBIENT_SOURCE_SHIFT))) == 0) 7815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 7825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_3V( &fcmd[GLT_RED], 7835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_EMISSION]); 7845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ACC_SCALE_3V( &fcmd[GLT_RED], 7855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Light.Model.Ambient, 7865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT]); 7875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 7895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 7905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_3V( &fcmd[GLT_RED], ctx->Light.Model.Ambient ); 7915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DB_STATECHANGE(rmesa, &rmesa->hw.glt); 7945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Update on change to 7975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * - light[p].colors 7985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * - light[p].enabled 7995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 8005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_light_colors( GLcontext *ctx, GLuint p ) 8015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 8025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_light *l = &ctx->Light.Light[p]; 8035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* fprintf(stderr, "%s\n", __FUNCTION__); */ 8055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (l->Enabled) { 8075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 8085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul float *fcmd = (float *)RADEON_DB_STATE( lit[p] ); 8095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_4V( &fcmd[LIT_AMBIENT_RED], l->Ambient ); 8115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_4V( &fcmd[LIT_DIFFUSE_RED], l->Diffuse ); 8125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_4V( &fcmd[LIT_SPECULAR_RED], l->Specular ); 8135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] ); 8155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 8175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Also fallback for asym colormaterial mode in twoside lighting... 8195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 8205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void check_twoside_fallback( GLcontext *ctx ) 8215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 8225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean fallback = GL_FALSE; 8235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint i; 8245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.Enabled && ctx->Light.Model.TwoSide) { 8265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.ColorMaterialEnabled && 8275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (ctx->Light.ColorMaterialBitmask & BACK_MATERIAL_BITS) != 8285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ((ctx->Light.ColorMaterialBitmask & FRONT_MATERIAL_BITS)<<1)) 8295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fallback = GL_TRUE; 8305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 8315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (i = MAT_ATTRIB_FRONT_AMBIENT; i < MAT_ATTRIB_FRONT_INDEXES; i+=2) 8325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (memcmp( ctx->Light.Material.Attrib[i], 8335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Light.Material.Attrib[i+1], 8345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul sizeof(GLfloat)*4) != 0) { 8355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fallback = GL_TRUE; 8365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 8375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_LIGHT_TWOSIDE, fallback ); 8425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 8435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonColorMaterial( GLcontext *ctx, GLenum face, GLenum mode ) 8465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 8475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 8485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint light_model_ctl1 = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]; 8495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 85027889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling light_model_ctl1 &= ~((3 << RADEON_EMISSIVE_SOURCE_SHIFT) | 85127889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling (3 << RADEON_AMBIENT_SOURCE_SHIFT) | 85227889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling (3 << RADEON_DIFFUSE_SOURCE_SHIFT) | 85327889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling (3 << RADEON_SPECULAR_SOURCE_SHIFT)); 8545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 855f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger if (ctx->Light.ColorMaterialEnabled) { 856f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger GLuint mask = ctx->Light.ColorMaterialBitmask; 857f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger 8585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_EMISSION) { 85927889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE << 8605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_EMISSIVE_SOURCE_SHIFT); 8615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 862f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger else { 863f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << 864f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger RADEON_EMISSIVE_SOURCE_SHIFT); 865f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger } 8665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_AMBIENT) { 86827889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE << 8695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_AMBIENT_SOURCE_SHIFT); 8705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 871f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger else { 872f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << 873f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger RADEON_AMBIENT_SOURCE_SHIFT); 874f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger } 8755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_DIFFUSE) { 87727889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE << 8785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DIFFUSE_SOURCE_SHIFT); 8795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 880f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger else { 881f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << 882f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger RADEON_DIFFUSE_SOURCE_SHIFT); 883f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger } 8845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_SPECULAR) { 88627889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE << 8875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_SPECULAR_SOURCE_SHIFT); 8885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 889f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger else { 890f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << 891f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger RADEON_SPECULAR_SOURCE_SHIFT); 892f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger } 893f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger } 894f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger else { 895f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger /* Default to MULT: 896f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger */ 897f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << RADEON_EMISSIVE_SOURCE_SHIFT) | 898f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger (RADEON_LM_SOURCE_STATE_MULT << RADEON_AMBIENT_SOURCE_SHIFT) | 899f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger (RADEON_LM_SOURCE_STATE_MULT << RADEON_DIFFUSE_SOURCE_SHIFT) | 900f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger (RADEON_LM_SOURCE_STATE_MULT << RADEON_SPECULAR_SOURCE_SHIFT); 901f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger } 9025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (light_model_ctl1 != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]) { 9045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 9055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] = light_model_ctl1; 9065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 9085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonUpdateMaterial( GLcontext *ctx ) 9105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 9115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 9125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat (*mat)[4] = ctx->Light.Material.Attrib; 9135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( mtl ); 9145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint mask = ~0; 9155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.ColorMaterialEnabled) 9175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul mask &= ~ctx->Light.ColorMaterialBitmask; 9185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & DEBUG_STATE) 9205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s\n", __FUNCTION__); 9215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_EMISSION) { 9245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_EMMISSIVE_RED] = mat[MAT_ATTRIB_FRONT_EMISSION][0]; 9255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_EMMISSIVE_GREEN] = mat[MAT_ATTRIB_FRONT_EMISSION][1]; 9265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_EMMISSIVE_BLUE] = mat[MAT_ATTRIB_FRONT_EMISSION][2]; 9275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_EMMISSIVE_ALPHA] = mat[MAT_ATTRIB_FRONT_EMISSION][3]; 9285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_AMBIENT) { 9305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_AMBIENT_RED] = mat[MAT_ATTRIB_FRONT_AMBIENT][0]; 9315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_AMBIENT_GREEN] = mat[MAT_ATTRIB_FRONT_AMBIENT][1]; 9325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_AMBIENT_BLUE] = mat[MAT_ATTRIB_FRONT_AMBIENT][2]; 9335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_AMBIENT_ALPHA] = mat[MAT_ATTRIB_FRONT_AMBIENT][3]; 9345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_DIFFUSE) { 9365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_DIFFUSE_RED] = mat[MAT_ATTRIB_FRONT_DIFFUSE][0]; 9375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_DIFFUSE_GREEN] = mat[MAT_ATTRIB_FRONT_DIFFUSE][1]; 9385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_DIFFUSE_BLUE] = mat[MAT_ATTRIB_FRONT_DIFFUSE][2]; 9395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_DIFFUSE_ALPHA] = mat[MAT_ATTRIB_FRONT_DIFFUSE][3]; 9405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_SPECULAR) { 9425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_SPECULAR_RED] = mat[MAT_ATTRIB_FRONT_SPECULAR][0]; 9435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_SPECULAR_GREEN] = mat[MAT_ATTRIB_FRONT_SPECULAR][1]; 9445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_SPECULAR_BLUE] = mat[MAT_ATTRIB_FRONT_SPECULAR][2]; 9455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_SPECULAR_ALPHA] = mat[MAT_ATTRIB_FRONT_SPECULAR][3]; 9465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_SHININESS) { 9485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_SHININESS] = mat[MAT_ATTRIB_FRONT_SHININESS][0]; 9495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 951a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mtl ); 9525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 953a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer check_twoside_fallback( ctx ); 954f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger/* update_global_ambient( ctx );*/ 9555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 9565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* _NEW_LIGHT 9585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _NEW_MODELVIEW 9595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _MESA_NEW_NEED_EYE_COORDS 9605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 9615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Uses derived state from mesa: 9625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _VP_inf_norm 9635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _h_inf_norm 9645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _Position 9655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _NormDirection 9665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _ModelViewInvScale 9675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _NeedEyeCoords 9685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _EyeZDir 9695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 9705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * which are calculated in light.c and are correct for the current 9715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * lighting space (model or eye), hence dependencies on _NEW_MODELVIEW 9725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * and _MESA_NEW_NEED_EYE_COORDS. 9735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 9745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_light( GLcontext *ctx ) 9755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 9765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 9775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Have to check these, or have an automatic shortcircuit mechanism 9795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * to remove noop statechanges. (Or just do a better job on the 9805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * front end). 9815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 9825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 9835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint tmp = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]; 9845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->_NeedEyeCoords) 9865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tmp &= ~RADEON_LIGHT_IN_MODELSPACE; 9875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 9885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tmp |= RADEON_LIGHT_IN_MODELSPACE; 9895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Leave this test disabled: (unexplained q3 lockup) (even with 9925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul new packets) 9935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 9945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (tmp != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]) 9955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 9965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 9975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] = tmp; 9985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 10025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( eye ); 10035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[EYE_X] = ctx->_EyeZDir[0]; 10045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[EYE_Y] = ctx->_EyeZDir[1]; 10055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[EYE_Z] = - ctx->_EyeZDir[2]; 10065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[EYE_RESCALE_FACTOR] = ctx->_ModelViewInvScale; 10075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.eye ); 10085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.Enabled) { 10135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint p; 10145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (p = 0 ; p < MAX_LIGHTS; p++) { 10155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.Light[p].Enabled) { 10165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_light *l = &ctx->Light.Light[p]; 10175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( lit[p] ); 10185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (l->EyePosition[3] == 0.0) { 10205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_3FV( &fcmd[LIT_POSITION_X], l->_VP_inf_norm ); 10215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_3FV( &fcmd[LIT_DIRECTION_X], l->_h_inf_norm ); 10225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_POSITION_W] = 0; 10235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_DIRECTION_W] = 0; 10245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 10255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_4V( &fcmd[LIT_POSITION_X], l->_Position ); 10265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_DIRECTION_X] = -l->_NormDirection[0]; 10275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_DIRECTION_Y] = -l->_NormDirection[1]; 10285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_DIRECTION_Z] = -l->_NormDirection[2]; 10295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_DIRECTION_W] = 0; 10305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] ); 10335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 10375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLightfv( GLcontext *ctx, GLenum light, 10395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLenum pname, const GLfloat *params ) 10405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 10415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 10425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint p = light - GL_LIGHT0; 10435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_light *l = &ctx->Light.Light[p]; 10445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat *fcmd = (GLfloat *)rmesa->hw.lit[p].cmd; 10455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (pname) { 10485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_AMBIENT: 10495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DIFFUSE: 10505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SPECULAR: 10515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul update_light_colors( ctx, p ); 10525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 10535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SPOT_DIRECTION: 10555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* picked up in update_light */ 10565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 10575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POSITION: { 10595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* positions picked up in update_light, but can do flag here */ 10605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flag; 10615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2; 10625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* FIXME: Set RANGE_ATTEN only when needed */ 10645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (p&1) 10655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul flag = RADEON_LIGHT_1_IS_LOCAL; 10665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 10675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul flag = RADEON_LIGHT_0_IS_LOCAL; 10685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 10705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (l->EyePosition[3] != 0.0F) 10715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[idx] |= flag; 10725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 10735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[idx] &= ~flag; 10745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 10755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SPOT_EXPONENT: 10785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, lit[p]); 10795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_SPOT_EXPONENT] = params[0]; 10805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 10815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SPOT_CUTOFF: { 10835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flag = (p&1) ? RADEON_LIGHT_1_IS_SPOT : RADEON_LIGHT_0_IS_SPOT; 10845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2; 10855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, lit[p]); 10875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_SPOT_CUTOFF] = l->_CosCutoff; 10885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 10905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (l->SpotCutoff != 180.0F) 10915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[idx] |= flag; 10925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 10935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[idx] &= ~flag; 10945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 10965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CONSTANT_ATTENUATION: 10995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, lit[p]); 11005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_ATTEN_CONST] = params[0]; 11015d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer if ( params[0] == 0.0 ) 11025d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer fcmd[LIT_ATTEN_CONST_INV] = FLT_MAX; 11035d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer else 11045d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer fcmd[LIT_ATTEN_CONST_INV] = 1.0 / params[0]; 11055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINEAR_ATTENUATION: 11075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, lit[p]); 11085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_ATTEN_LINEAR] = params[0]; 11095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_QUADRATIC_ATTENUATION: 11115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, lit[p]); 11125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_ATTEN_QUADRATIC] = params[0]; 11135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 11155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 11165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 11175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Set RANGE_ATTEN only when needed */ 11195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (pname) { 11205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POSITION: 11215d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer case GL_CONSTANT_ATTENUATION: 11225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINEAR_ATTENUATION: 11235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_QUADRATIC_ATTENUATION: 11245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 11255d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer GLuint *icmd = (GLuint *)RADEON_DB_STATE( tcl ); 11265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2; 11275d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer GLuint atten_flag = ( p&1 ) ? RADEON_LIGHT_1_ENABLE_RANGE_ATTEN 11285d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer : RADEON_LIGHT_0_ENABLE_RANGE_ATTEN; 11295d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer GLuint atten_const_flag = ( p&1 ) ? RADEON_LIGHT_1_CONSTANT_RANGE_ATTEN 11305d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer : RADEON_LIGHT_0_CONSTANT_RANGE_ATTEN; 11315d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer 11325d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer if ( l->EyePosition[3] == 0.0F || 11335d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer ( ( fcmd[LIT_ATTEN_CONST] == 0.0 || fcmd[LIT_ATTEN_CONST] == 1.0 ) && 11345d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) ) { 11355d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer /* Disable attenuation */ 11365d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer icmd[idx] &= ~atten_flag; 11375d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer } else { 11385d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer if ( fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) { 11395d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer /* Enable only constant portion of attenuation calculation */ 11405d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer icmd[idx] |= ( atten_flag | atten_const_flag ); 11415d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer } else { 11425d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer /* Enable full attenuation calculation */ 11435d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer icmd[idx] &= ~atten_const_flag; 11445d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer icmd[idx] |= atten_flag; 11455d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer } 11465d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer } 11475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11485d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.tcl ); 11495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 11515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 11525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 11545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 11555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLightModelfv( GLcontext *ctx, GLenum pname, 11605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const GLfloat *param ) 11615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 11625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 11635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (pname) { 11655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT_MODEL_AMBIENT: 11665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul update_global_ambient( ctx ); 11675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT_MODEL_LOCAL_VIEWER: 11705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 11715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.Model.LocalViewer) 11725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LOCAL_VIEWER; 11735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 11745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_LOCAL_VIEWER; 11755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT_MODEL_TWO_SIDE: 11785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 11795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.Model.TwoSide) 11805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_LIGHT_TWOSIDE; 11815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 11825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_LIGHT_TWOSIDE; 11835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul check_twoside_fallback( ctx ); 11855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->TclFallback) { 11875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseRenderState( ctx ); 11885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseVertexState( ctx ); 11895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 11905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT_MODEL_COLOR_CONTROL: 11935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateSpecular(ctx); 11945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 11975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 11995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 12005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonShadeModel( GLcontext *ctx, GLenum mode ) 12025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 12035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 12045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL]; 12055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s &= ~(RADEON_DIFFUSE_SHADE_MASK | 12075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ALPHA_SHADE_MASK | 12085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_SPECULAR_SHADE_MASK | 12095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FOG_SHADE_MASK); 12105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( mode ) { 12125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FLAT: 12135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s |= (RADEON_DIFFUSE_SHADE_FLAT | 12145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ALPHA_SHADE_FLAT | 12155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_SPECULAR_SHADE_FLAT | 12165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FOG_SHADE_FLAT); 12175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 12185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SMOOTH: 12195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s |= (RADEON_DIFFUSE_SHADE_GOURAUD | 12205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ALPHA_SHADE_GOURAUD | 12215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_SPECULAR_SHADE_GOURAUD | 12225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FOG_SHADE_GOURAUD); 12235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 12245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 12255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 12265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 12275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) { 12295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, set ); 12305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] = s; 12315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 12325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 12335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 12365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * User clip planes 12375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 12385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClipPlane( GLcontext *ctx, GLenum plane, const GLfloat *eq ) 12405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 12415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint p = (GLint) plane - (GLint) GL_CLIP_PLANE0; 12425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 12435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p]; 12445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ucp[p] ); 12465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_X] = ip[0]; 12475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1]; 12485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2]; 12495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_W] = ip[3]; 12505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 12515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonUpdateClipPlanes( GLcontext *ctx ) 12535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 12545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 12555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint p; 12565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (p = 0; p < ctx->Const.MaxClipPlanes; p++) { 12585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Transform.ClipPlanesEnabled & (1 << p)) { 12595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p]; 12605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ucp[p] ); 12625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_X] = ip[0]; 12635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1]; 12645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2]; 12655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_W] = ip[3]; 12665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 12675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 12685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 12695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 12725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Stencil 12735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 12745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonStencilFunc( GLcontext *ctx, GLenum func, 12765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint ref, GLuint mask ) 12775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 12785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 12795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint refmask = ((ctx->Stencil.Ref[0] << RADEON_STENCIL_REF_SHIFT) | 12805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (ctx->Stencil.ValueMask[0] << RADEON_STENCIL_MASK_SHIFT)); 12815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 12835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, msk ); 12845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_STENCIL_TEST_MASK; 12865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~(RADEON_STENCIL_REF_MASK| 12875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STENCIL_VALUE_MASK); 12885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Stencil.Function[0] ) { 12905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NEVER: 12915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_NEVER; 12925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 12935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LESS: 12945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_LESS; 12955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 12965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EQUAL: 12975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_EQUAL; 12985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 12995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LEQUAL: 13005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_LEQUAL; 13015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_GREATER: 13035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_GREATER; 13045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NOTEQUAL: 13065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_NEQUAL; 13075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_GEQUAL: 13095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_GEQUAL; 13105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ALWAYS: 13125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_ALWAYS; 13135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 13155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 13165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |= refmask; 13175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 13185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 13195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonStencilMask( GLcontext *ctx, GLuint mask ) 13205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 13215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 13225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 13235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, msk ); 13245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~RADEON_STENCIL_WRITE_MASK; 13255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |= 13265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (ctx->Stencil.WriteMask[0] << RADEON_STENCIL_WRITEMASK_SHIFT); 13275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 13285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 13295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonStencilOp( GLcontext *ctx, GLenum fail, 13305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLenum zfail, GLenum zpass ) 13315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 13325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 13335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 13345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 13355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~(RADEON_STENCIL_FAIL_MASK | 13365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STENCIL_ZFAIL_MASK | 13375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STENCIL_ZPASS_MASK); 13385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 13395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Stencil.FailFunc[0] ) { 13405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_KEEP: 13415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_KEEP; 13425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ZERO: 13445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_ZERO; 13455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_REPLACE: 13475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_REPLACE; 13485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INCR: 13505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_INC; 13515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DECR: 13535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_DEC; 13545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INVERT: 13565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_INVERT; 13575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 13595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 13605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Stencil.ZFailFunc[0] ) { 13615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_KEEP: 13625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_KEEP; 13635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ZERO: 13655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_ZERO; 13665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_REPLACE: 13685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_REPLACE; 13695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INCR: 13715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_INC; 13725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DECR: 13745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_DEC; 13755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INVERT: 13775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_INVERT; 13785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 13805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 13815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Stencil.ZPassFunc[0] ) { 13825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_KEEP: 13835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_KEEP; 13845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ZERO: 13865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_ZERO; 13875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_REPLACE: 13895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_REPLACE; 13905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INCR: 13925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_INC; 13935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DECR: 13955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_DEC; 13965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INVERT: 13985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_INVERT; 13995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 14005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 14015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 14025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClearStencil( GLcontext *ctx, GLint s ) 14045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 14055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 14065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.stencil.clear = 14085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ((GLuint) ctx->Stencil.Clear | 14095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (0xff << RADEON_STENCIL_MASK_SHIFT) | 14105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (ctx->Stencil.WriteMask[0] << RADEON_STENCIL_WRITEMASK_SHIFT)); 14115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 14125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 14155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Window position and viewport transformation 14165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 14175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* 14195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * To correctly position primitives: 14205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 14215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define SUBPIXEL_X 0.125 14225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define SUBPIXEL_Y 0.125 14235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonUpdateWindow( GLcontext *ctx ) 14255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 14265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 14275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul __DRIdrawablePrivate *dPriv = rmesa->dri.drawable; 14285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat xoffset = (GLfloat)dPriv->x; 14295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat yoffset = (GLfloat)dPriv->y + dPriv->h; 14305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const GLfloat *v = ctx->Viewport._WindowMap.m; 14315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat sx = v[MAT_SX]; 14335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat tx = v[MAT_TX] + xoffset + SUBPIXEL_X; 14345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat sy = - v[MAT_SY]; 14355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat ty = (- v[MAT_TY]) + yoffset + SUBPIXEL_Y; 14365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat sz = v[MAT_SZ] * rmesa->state.depth.scale; 14375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat tz = v[MAT_TZ] * rmesa->state.depth.scale; 14385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FIREVERTICES( rmesa ); 14395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, vpt ); 14405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE] = *(GLuint *)&sx; 14425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = *(GLuint *)&tx; 14435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE] = *(GLuint *)&sy; 14445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = *(GLuint *)&ty; 14455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE] = *(GLuint *)&sz; 14465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = *(GLuint *)&tz; 14475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 14485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonViewport( GLcontext *ctx, GLint x, GLint y, 14525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLsizei width, GLsizei height ) 14535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 14545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Don't pipeline viewport changes, conflict with window offset 14555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * setting below. Could apply deltas to rescue pipelined viewport 14565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * values, or keep the originals hanging around. 14575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 14585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FIREVERTICES( RADEON_CONTEXT(ctx) ); 14595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateWindow( ctx ); 14605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 14615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDepthRange( GLcontext *ctx, GLclampd nearval, 14635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLclampd farval ) 14645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 14655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateWindow( ctx ); 14665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 14675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonUpdateViewportOffset( GLcontext *ctx ) 14695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 14705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 14715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul __DRIdrawablePrivate *dPriv = rmesa->dri.drawable; 14725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat xoffset = (GLfloat)dPriv->x; 14735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat yoffset = (GLfloat)dPriv->y + dPriv->h; 14745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const GLfloat *v = ctx->Viewport._WindowMap.m; 14755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat tx = v[MAT_TX] + xoffset; 14775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat ty = (- v[MAT_TY]) + yoffset; 14785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] != *(GLuint *)&tx || 14805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] != *(GLuint *)&ty ) 14815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 14825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Note: this should also modify whatever data the context reset 14835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * code uses... 14845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 14855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = *(GLuint *)&tx; 14865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = *(GLuint *)&ty; 14875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* update polygon stipple x/y screen offset */ 14895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 14905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint stx, sty; 14915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint m = rmesa->hw.msc.cmd[MSC_RE_MISC]; 14925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul m &= ~(RADEON_STIPPLE_X_OFFSET_MASK | 14945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STIPPLE_Y_OFFSET_MASK); 14955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* add magic offsets, then invert */ 14975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul stx = 31 - ((rmesa->dri.drawable->x - 1) & RADEON_STIPPLE_COORD_MASK); 14985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul sty = 31 - ((rmesa->dri.drawable->y + rmesa->dri.drawable->h - 1) 14995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul & RADEON_STIPPLE_COORD_MASK); 15005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul m |= ((stx << RADEON_STIPPLE_X_OFFSET_SHIFT) | 15025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (sty << RADEON_STIPPLE_Y_OFFSET_SHIFT)); 15035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.msc.cmd[MSC_RE_MISC] != m ) { 15055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, msc ); 15065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msc.cmd[MSC_RE_MISC] = m; 15075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 15085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 15095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 15105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateScissor( ctx ); 15125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 15135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 15175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Miscellaneous 15185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 15195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClearColor( GLcontext *ctx, const GLfloat color[4] ) 15215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 15225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 15235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLubyte c[4]; 15245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]); 15255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]); 15265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]); 15275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]); 15285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.color.clear = radeonPackColor( rmesa->radeonScreen->cpp, 15295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c[0], c[1], c[2], c[3] ); 15305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 15315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderMode( GLcontext *ctx, GLenum mode ) 15345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 15355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 15365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_RENDER_MODE, (mode != GL_RENDER) ); 15375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 15385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic GLuint radeon_rop_tab[] = { 15415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_CLEAR, 15425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_AND, 15435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_AND_REVERSE, 15445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_COPY, 15455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_AND_INVERTED, 15465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_NOOP, 15475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_XOR, 15485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_OR, 15495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_NOR, 15505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_EQUIV, 15515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_INVERT, 15525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_OR_REVERSE, 15535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_COPY_INVERTED, 15545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_OR_INVERTED, 15555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_NAND, 15565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_SET, 15575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}; 15585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLogicOpCode( GLcontext *ctx, GLenum opcode ) 15605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 15615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 15625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint rop = (GLuint)opcode - GL_CLEAR; 15635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ASSERT( rop < 16 ); 15655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, msk ); 15675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msk.cmd[MSK_RB3D_ROPCNTL] = radeon_rop_tab[rop]; 15685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 15695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonSetCliprects( radeonContextPtr rmesa, GLenum mode ) 15725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 15735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul __DRIdrawablePrivate *dPriv = rmesa->dri.drawable; 15745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( mode ) { 15765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FRONT_LEFT: 15775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->numClipRects = dPriv->numClipRects; 15785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->pClipRects = (XF86DRIClipRectPtr)dPriv->pClipRects; 15795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 15805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_BACK_LEFT: 15815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Can't ignore 2d windows if we are page flipping. 15825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 15835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( dPriv->numBackClipRects == 0 || rmesa->doPageFlip ) { 15845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->numClipRects = dPriv->numClipRects; 15855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->pClipRects = (XF86DRIClipRectPtr)dPriv->pClipRects; 15865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 15875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 15885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->numClipRects = dPriv->numBackClipRects; 15895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->pClipRects = (XF86DRIClipRectPtr)dPriv->pBackClipRects; 15905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 15915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 15925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 15935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "bad mode in radeonSetCliprects\n"); 15945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 15955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 15965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->state.scissor.enabled) 15985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonRecalcScissorRects( rmesa ); 15995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 16005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDrawBuffer( GLcontext *ctx, GLenum mode ) 16035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 16045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 16055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & DEBUG_DRI) 16075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s %s\n", __FUNCTION__, 16085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_lookup_enum_by_nr( mode )); 16095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FIREVERTICES(rmesa); /* don't pipeline cliprect changes */ 16115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* 16135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _DrawDestMask is easier to cope with than <mode>. 16145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 16155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Color._DrawDestMask ) { 16165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case FRONT_LEFT_BIT: 16175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_DRAW_BUFFER, GL_FALSE ); 16185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonSetCliprects( rmesa, GL_FRONT_LEFT ); 16195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 16205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case BACK_LEFT_BIT: 16215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_DRAW_BUFFER, GL_FALSE ); 16225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonSetCliprects( rmesa, GL_BACK_LEFT ); 16235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 16245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 16255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* GL_NONE or GL_FRONT_AND_BACK or stereo left&right, etc */ 16265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_DRAW_BUFFER, GL_TRUE ); 16275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 16285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 16295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* We want to update the s/w rast state too so that r200SetBuffer() 16315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * gets called. 16325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 16335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _swrast_DrawBuffer(ctx, mode); 16345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 163699ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = ((rmesa->state.color.drawOffset + 163799ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane rmesa->radeonScreen->fbLocation) 163899ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane & RADEON_COLOROFFSET_MASK); 16395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] = rmesa->state.color.drawPitch; 16405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 16415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonReadBuffer( GLcontext *ctx, GLenum mode ) 16435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 16445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* nothing, until we implement h/w glRead/CopyPixels or CopyTexImage */ 16455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 16465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 16495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * State enable/disable 16505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 16515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonEnable( GLcontext *ctx, GLenum cap, GLboolean state ) 16535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 16545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 16555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint p, flag; 16565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( RADEON_DEBUG & DEBUG_STATE ) 16585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf( stderr, "%s( %s = %s )\n", __FUNCTION__, 16595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_lookup_enum_by_nr( cap ), 16605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul state ? "GL_TRUE" : "GL_FALSE" ); 16615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( cap ) { 16635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Fast track this one... 16645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 16655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_1D: 16665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_2D: 16675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_3D: 16685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 16695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ALPHA_TEST: 16715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 16725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (state) { 16735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_ALPHA_TEST_ENABLE; 16745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 16755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ALPHA_TEST_ENABLE; 16765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 16775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 16785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_BLEND: 16805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 16815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (state) { 16825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_ALPHA_BLEND_ENABLE; 16835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 16845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ALPHA_BLEND_ENABLE; 16855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 168678bb0803cf722ad5273fc495791eb573bf8b4d21Michel Dänzer if ( ctx->Color._LogicOpEnabled ) { 16875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_ROP_ENABLE; 16885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 16895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE; 16905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 16915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Catch a possible fallback: 16935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 16945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (state) { 1695c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick ctx->Driver.BlendEquationSeparate( ctx, 1696c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick ctx->Color.BlendEquationRGB, 1697c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick ctx->Color.BlendEquationA ); 169820a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick ctx->Driver.BlendFuncSeparate( ctx, ctx->Color.BlendSrcRGB, 169920a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick ctx->Color.BlendDstRGB, 1700253428f06a45d59cc50c9ccc4c8d17cd8c02c25dIan Romanick ctx->Color.BlendSrcA, 1701253428f06a45d59cc50c9ccc4c8d17cd8c02c25dIan Romanick ctx->Color.BlendDstA ); 17025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 17045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_BLEND_FUNC, GL_FALSE ); 17055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_BLEND_EQ, GL_FALSE ); 17065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLIP_PLANE0: 17105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLIP_PLANE1: 17115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLIP_PLANE2: 17125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLIP_PLANE3: 17135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLIP_PLANE4: 17145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLIP_PLANE5: 17155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul p = cap-GL_CLIP_PLANE0; 17165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 17175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (state) { 17185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= (RADEON_UCP_ENABLE_0<<p); 17195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonClipPlane( ctx, cap, NULL ); 17205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 17225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~(RADEON_UCP_ENABLE_0<<p); 17235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_COLOR_MATERIAL: 17275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonColorMaterial( ctx, 0, 0 ); 1728a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer radeonUpdateMaterial( ctx ); 17295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CULL_FACE: 17325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonCullFace( ctx, 0 ); 17335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DEPTH_TEST: 17365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, ctx ); 17375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 17385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_Z_ENABLE; 17395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 17405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_Z_ENABLE; 17415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DITHER: 17455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, ctx ); 17465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 17475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_DITHER_ENABLE; 174899ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~rmesa->state.color.roundEnable; 17495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 17505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_DITHER_ENABLE; 175199ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= rmesa->state.color.roundEnable; 17525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FOG: 17565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, ctx ); 17575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 17585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_FOG_ENABLE; 17595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonFogfv( ctx, GL_FOG_MODE, 0 ); 17605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 17615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_FOG_ENABLE; 17625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 17635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_TCL_FOG_MASK; 17645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateSpecular( ctx ); /* for PK_SPEC */ 17665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->TclFallback) 17675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseVertexState( ctx ); 17685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_allow_light_in_model( ctx, !state ); 17695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT0: 17725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT1: 17735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT2: 17745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT3: 17755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT4: 17765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT5: 17775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT6: 17785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT7: 17795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 17805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul p = cap - GL_LIGHT0; 17815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (p&1) 17825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul flag = (RADEON_LIGHT_1_ENABLE | 17835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_LIGHT_1_ENABLE_AMBIENT | 17845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_LIGHT_1_ENABLE_SPECULAR); 17855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 17865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul flag = (RADEON_LIGHT_0_ENABLE | 17875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_LIGHT_0_ENABLE_AMBIENT | 17885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_LIGHT_0_ENABLE_SPECULAR); 17895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (state) 17915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] |= flag; 17925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 17935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] &= ~flag; 17945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* 17965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 17975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul update_light_colors( ctx, p ); 17985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHTING: 18015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 18025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateSpecular(ctx); 18035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul check_twoside_fallback( ctx ); 18045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 18055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINE_SMOOTH: 18075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 18085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 18095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_ANTI_ALIAS_LINE; 18105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 18115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ANTI_ALIAS_LINE; 18125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 18145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINE_STIPPLE: 18165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 18175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 18185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_PATTERN_ENABLE; 18195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 18205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_PATTERN_ENABLE; 18215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 18235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_COLOR_LOGIC_OP: 18255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 182678bb0803cf722ad5273fc495791eb573bf8b4d21Michel Dänzer if ( ctx->Color._LogicOpEnabled ) { 18275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_ROP_ENABLE; 18285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 18295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE; 18305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 18325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NORMALIZE: 18345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 18355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 18365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_NORMALIZE_NORMALS; 18375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 18385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_NORMALIZE_NORMALS; 18395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 18415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POLYGON_OFFSET_POINT: 18435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->dri.drmMinor == 1) { 18445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseRenderState( ctx ); 18455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 18475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, set ); 18485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 18495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_ZBIAS_ENABLE_POINT; 18505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 18515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_POINT; 18525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 18555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POLYGON_OFFSET_LINE: 18575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->dri.drmMinor == 1) { 18585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseRenderState( ctx ); 18595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 18615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, set ); 18625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 18635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_ZBIAS_ENABLE_LINE; 18645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 18655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_LINE; 18665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 18695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POLYGON_OFFSET_FILL: 18715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->dri.drmMinor == 1) { 18725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseRenderState( ctx ); 18735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 18755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, set ); 18765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 18775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_ZBIAS_ENABLE_TRI; 18785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 18795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_TRI; 18805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 18835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POLYGON_SMOOTH: 18855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 18865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 18875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_ANTI_ALIAS_POLY; 18885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 18895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ANTI_ALIAS_POLY; 18905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 18925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POLYGON_STIPPLE: 18945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, ctx ); 18955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 18965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_STIPPLE_ENABLE; 18975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 18985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_STIPPLE_ENABLE; 18995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 19015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_RESCALE_NORMAL_EXT: { 19035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean tmp = ctx->_NeedEyeCoords ? state : !state; 19045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 19055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( tmp ) { 19065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_RESCALE_NORMALS; 19075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 19085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_RESCALE_NORMALS; 19095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 19115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SCISSOR_TEST: 19145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FIREVERTICES( rmesa ); 19155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.enabled = state; 19165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateScissor( ctx ); 19175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 19185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_STENCIL_TEST: 19205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->state.stencil.hwBuffer ) { 19215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 19225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 19235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_STENCIL_ENABLE; 19245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 19255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_STENCIL_ENABLE; 19265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 19285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_STENCIL, state ); 19295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 19315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_GEN_Q: 19335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_GEN_R: 19345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_GEN_S: 19355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_GEN_T: 19365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Picked up in radeonUpdateTextureState. 19375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 19385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->recheck_texgen[ctx->Texture.CurrentUnit] = GL_TRUE; 19395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 19405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_COLOR_SUM_EXT: 19425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateSpecular ( ctx ); 19435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 19445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 19465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 19475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 19495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLightingSpaceChange( GLcontext *ctx ) 19525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 19535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 19545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean tmp; 19555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 19565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & DEBUG_STATE) 19585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s %d BEFORE %x\n", __FUNCTION__, ctx->_NeedEyeCoords, 19595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]); 19605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->_NeedEyeCoords) 19625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tmp = ctx->Transform.RescaleNormals; 19635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 19645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tmp = !ctx->Transform.RescaleNormals; 19655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( tmp ) { 19675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_RESCALE_NORMALS; 19685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 19695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_RESCALE_NORMALS; 19705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & DEBUG_STATE) 19735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s %d AFTER %x\n", __FUNCTION__, ctx->_NeedEyeCoords, 19745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]); 19755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 19765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 19785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Deferred state management - matrices, textures, other? 19795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 19805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void upload_matrix( radeonContextPtr rmesa, GLfloat *src, int idx ) 19855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 19865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul float *dest = ((float *)RADEON_DB_STATE( mat[idx] ))+MAT_ELT_0; 19875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int i; 19885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (i = 0 ; i < 4 ; i++) { 19915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *dest++ = src[i]; 19925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *dest++ = src[i+4]; 19935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *dest++ = src[i+8]; 19945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *dest++ = src[i+12]; 19955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] ); 19985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 19995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void upload_matrix_t( radeonContextPtr rmesa, GLfloat *src, int idx ) 20015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 20025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul float *dest = ((float *)RADEON_DB_STATE( mat[idx] ))+MAT_ELT_0; 20035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul memcpy(dest, src, 16*sizeof(float)); 20045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] ); 20055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 20065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_texturematrix( GLcontext *ctx ) 20095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 20105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT( ctx ); 20115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint tpc = rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL]; 20125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint vs = rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL]; 20135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int unit; 20145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->TexMatEnabled = 0; 20165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (unit = 0 ; unit < 2; unit++) { 20185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (!ctx->Texture.Unit[unit]._ReallyEnabled) { 20195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 20205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else if (ctx->TextureMatrixStack[unit].Top->type != MATRIX_IDENTITY) { 20215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint inputshift = RADEON_TEXGEN_0_INPUT_SHIFT + unit*4; 20225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->TexMatEnabled |= (RADEON_TEXGEN_TEXMAT_0_ENABLE| 20245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_TEXMAT_0_ENABLE) << unit; 20255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->TexGenEnabled & (RADEON_TEXMAT_0_ENABLE << unit)) { 20275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Need to preconcatenate any active texgen 20285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * obj/eyeplane matrices: 20295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 20305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _math_matrix_mul_matrix( &rmesa->tmpmat, 20315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul &rmesa->TexGenMatrix[unit], 20325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->TextureMatrixStack[unit].Top ); 20335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul upload_matrix( rmesa, rmesa->tmpmat.m, TEXMAT_0+unit ); 20345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 20355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 20365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->TexMatEnabled |= 20375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (RADEON_TEXGEN_INPUT_TEXCOORD_0+unit) << inputshift; 20385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul upload_matrix( rmesa, ctx->TextureMatrixStack[unit].Top->m, 20395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TEXMAT_0+unit ); 20405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 20415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 20425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else if (rmesa->TexGenEnabled & (RADEON_TEXMAT_0_ENABLE << unit)) { 20435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul upload_matrix( rmesa, rmesa->TexGenMatrix[unit].m, 20445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TEXMAT_0+unit ); 20455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 20465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 20475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tpc = (rmesa->TexMatEnabled | rmesa->TexGenEnabled); 20505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul vs &= ~((0xf << RADEON_TCL_TEX_0_OUTPUT_SHIFT) | 20525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (0xf << RADEON_TCL_TEX_1_OUTPUT_SHIFT)); 20535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (tpc & RADEON_TEXGEN_TEXMAT_0_ENABLE) 20555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul vs |= RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_0_OUTPUT_SHIFT; 20565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 20575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul vs |= RADEON_TCL_TEX_INPUT_TEX_0 << RADEON_TCL_TEX_0_OUTPUT_SHIFT; 20585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (tpc & RADEON_TEXGEN_TEXMAT_1_ENABLE) 20605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul vs |= RADEON_TCL_TEX_COMPUTED_TEX_1 << RADEON_TCL_TEX_1_OUTPUT_SHIFT; 20615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 20625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul vs |= RADEON_TCL_TEX_INPUT_TEX_1 << RADEON_TCL_TEX_1_OUTPUT_SHIFT; 20635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (tpc != rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL] || 20655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul vs != rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL]) { 20665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 20685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL] = tpc; 20695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] = vs; 20705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 20715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 20725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonValidateState( GLcontext *ctx ) 20765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 20775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 20785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint new_state = rmesa->NewGLState; 20795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (new_state & _NEW_TEXTURE) { 20815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateTextureState( ctx ); 20825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul new_state |= rmesa->NewGLState; /* may add TEXTURE_MATRIX */ 20835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 20845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Need an event driven matrix update? 20865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 20875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (new_state & (_NEW_MODELVIEW|_NEW_PROJECTION)) 20885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul upload_matrix( rmesa, ctx->_ModelProjectMatrix.m, MODEL_PROJ ); 20895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Need these for lighting (shouldn't upload otherwise) 20915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 20925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (new_state & (_NEW_MODELVIEW)) { 20935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul upload_matrix( rmesa, ctx->ModelviewMatrixStack.Top->m, MODEL ); 20945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul upload_matrix_t( rmesa, ctx->ModelviewMatrixStack.Top->inv, MODEL_IT ); 20955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 20965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Does this need to be triggered on eg. modelview for 20985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * texgen-derived objplane/eyeplane matrices? 20995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 21005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (new_state & _NEW_TEXTURE_MATRIX) { 21015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul update_texturematrix( ctx ); 21025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 21035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (new_state & (_NEW_LIGHT|_NEW_MODELVIEW|_MESA_NEW_NEED_EYE_COORDS)) { 21055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul update_light( ctx ); 21065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 21075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* emit all active clip planes if projection matrix changes. 21095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 21105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (new_state & (_NEW_PROJECTION)) { 21115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Transform.ClipPlanesEnabled) 21125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateClipPlanes( ctx ); 21135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 21145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->NewGLState = 0; 21175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 21185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonInvalidateState( GLcontext *ctx, GLuint new_state ) 21215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 21225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _swrast_InvalidateState( ctx, new_state ); 21235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _swsetup_InvalidateState( ctx, new_state ); 21245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _ac_InvalidateState( ctx, new_state ); 21255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _tnl_InvalidateState( ctx, new_state ); 21265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _ae_invalidate_state( ctx, new_state ); 21275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_CONTEXT(ctx)->NewGLState |= new_state; 21285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonVtxfmtInvalidate( ctx ); 21295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 21305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 213157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 213257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell/* A hack. Need a faster way to find this out. 213357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell */ 213457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwellstatic GLboolean check_material( GLcontext *ctx ) 213557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell{ 213657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell TNLcontext *tnl = TNL_CONTEXT(ctx); 213757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell GLint i; 213857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 213957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell for (i = _TNL_ATTRIB_MAT_FRONT_AMBIENT; 214057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell i < _TNL_ATTRIB_MAT_BACK_INDEXES; 214157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell i++) 214257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell if (tnl->vb.AttribPtr[i] && 214357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell tnl->vb.AttribPtr[i]->stride) 214457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell return GL_TRUE; 214557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 214657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell return GL_FALSE; 214757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell} 214857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 214957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 21505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonWrapRunPipeline( GLcontext *ctx ) 21515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 21525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 215357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell GLboolean has_material; 21545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (0) 21565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s, newstate: %x\n", __FUNCTION__, rmesa->NewGLState); 21575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Validate state: 21595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 21605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->NewGLState) 21615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonValidateState( ctx ); 21625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 216357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell has_material = (ctx->Light.Enabled && check_material( ctx )); 216457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 216557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell if (has_material) { 21665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_MATERIAL, GL_TRUE ); 21675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 21685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Run the pipeline. 21705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 21715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _tnl_run_pipeline( ctx ); 21725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 217357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell if (has_material) { 21745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_MATERIAL, GL_FALSE ); 21755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 21765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 21775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Initialize the driver's state functions. 21805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 21815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonInitStateFuncs( GLcontext *ctx ) 21825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 21835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.UpdateState = radeonInvalidateState; 21845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.LightingSpaceChange = radeonLightingSpaceChange; 21855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.DrawBuffer = radeonDrawBuffer; 21875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ReadBuffer = radeonReadBuffer; 21885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.AlphaFunc = radeonAlphaFunc; 2190c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick ctx->Driver.BlendEquationSeparate = radeonBlendEquationSeparate; 21915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.BlendFuncSeparate = radeonBlendFuncSeparate; 21925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ClearColor = radeonClearColor; 21935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ClearDepth = radeonClearDepth; 21945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ClearIndex = NULL; 21955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ClearStencil = radeonClearStencil; 21965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ClipPlane = radeonClipPlane; 21975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ColorMask = radeonColorMask; 21985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.CullFace = radeonCullFace; 21995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.DepthFunc = radeonDepthFunc; 22005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.DepthMask = radeonDepthMask; 22015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.DepthRange = radeonDepthRange; 22025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Enable = radeonEnable; 22035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Fogfv = radeonFogfv; 22045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.FrontFace = radeonFrontFace; 22055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Hint = NULL; 22065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.IndexMask = NULL; 22075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.LightModelfv = radeonLightModelfv; 22085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Lightfv = radeonLightfv; 22095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.LineStipple = radeonLineStipple; 22105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.LineWidth = radeonLineWidth; 22115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.LogicOpcode = radeonLogicOpCode; 22125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.PolygonMode = radeonPolygonMode; 22135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 22145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_CONTEXT(ctx)->dri.drmMinor > 1) 22155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.PolygonOffset = radeonPolygonOffset; 22165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 22175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.PolygonStipple = radeonPolygonStipple; 22185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.RenderMode = radeonRenderMode; 22195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Scissor = radeonScissor; 22205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ShadeModel = radeonShadeModel; 22215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.StencilFunc = radeonStencilFunc; 22225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.StencilMask = radeonStencilMask; 22235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.StencilOp = radeonStencilOp; 22245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Viewport = radeonViewport; 22255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 22265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Pixel path fallbacks 22275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 22285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Accum = _swrast_Accum; 22295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Bitmap = _swrast_Bitmap; 22305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.CopyPixels = _swrast_CopyPixels; 22315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.DrawPixels = _swrast_DrawPixels; 22325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ReadPixels = _swrast_ReadPixels; 22335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 22345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Swrast hooks for imaging extensions: 22355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 22365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.CopyColorTable = _swrast_CopyColorTable; 22375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable; 22385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D; 22395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D; 22405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 22415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange = radeonUpdateMaterial; 22425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TNL_CONTEXT(ctx)->Driver.RunPipeline = radeonWrapRunPipeline; 22435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 2244