radeon_state.c revision 30daa7529331057ecb470efb500152e9c4aa1ae5
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" 40e42a31350df04ae9d68b7ab4a14408f5d013b42fBrian Paul#include "light.h" 415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "state.h" 42cc5d04574406a86d9a4d7991370359dc3c94f9a7Felix Kuehling#include "context.h" 435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "array_cache/acache.h" 455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/tnl.h" 465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_pipeline.h" 475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "swrast_setup/swrast_setup.h" 485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_context.h" 505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_ioctl.h" 515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_state.h" 525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tcl.h" 535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tex.h" 545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_swtcl.h" 555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_vtxfmt.h" 56982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul#include "drirenderbuffer.h" 575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Alpha blending 605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonAlphaFunc( GLcontext *ctx, GLenum func, GLfloat ref ) 635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int pp_misc = rmesa->hw.ctx.cmd[CTX_PP_MISC]; 665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLubyte refByte; 675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLAMPED_FLOAT_TO_UBYTE(refByte, ref); 695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc &= ~(RADEON_ALPHA_TEST_OP_MASK | RADEON_REF_ALPHA_MASK); 735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= (refByte & RADEON_REF_ALPHA_MASK); 745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( func ) { 765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NEVER: 775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_FAIL; 785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LESS: 805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_LESS; 815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EQUAL: 835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_EQUAL; 845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LEQUAL: 865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_LEQUAL; 875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_GREATER: 895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_GREATER; 905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NOTEQUAL: 925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_NEQUAL; 935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_GEQUAL: 955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_GEQUAL; 965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ALWAYS: 985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_PASS; 995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_MISC] = pp_misc; 1035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 1045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 105c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanickstatic void radeonBlendEquationSeparate( GLcontext *ctx, 106c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick GLenum modeRGB, GLenum modeA ) 1075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 1085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 1095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint b = rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] & ~RADEON_COMB_FCN_MASK; 1105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean fallback = GL_FALSE; 1115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 112c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick assert( modeRGB == modeA ); 113c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick 114c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick switch ( modeRGB ) { 1155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FUNC_ADD: 1165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LOGIC_OP: 1175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_COMB_FCN_ADD_CLAMP; 1185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FUNC_SUBTRACT: 1215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_COMB_FCN_SUB_CLAMP; 1225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 1255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Color.BlendEnabled) 1265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fallback = GL_TRUE; 1275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 1285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_COMB_FCN_ADD_CLAMP; 1295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_BLEND_EQ, fallback ); 1335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( !fallback ) { 1345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 1355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = b; 13678bb0803cf722ad5273fc495791eb573bf8b4d21Michel Dänzer if ( ctx->Color._LogicOpEnabled ) { 1375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_ROP_ENABLE; 1385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 1395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE; 1405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 1435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14420a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanickstatic void radeonBlendFuncSeparate( GLcontext *ctx, 14520a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick GLenum sfactorRGB, GLenum dfactorRGB, 14620a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick GLenum sfactorA, GLenum dfactorA ) 1475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 1485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 1495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint b = rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] & 1505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ~(RADEON_SRC_BLEND_MASK | RADEON_DST_BLEND_MASK); 1515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean fallback = GL_FALSE; 1525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Color.BlendSrcRGB ) { 1545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ZERO: 1555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ZERO; 1565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE: 1585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ONE; 1595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DST_COLOR: 1615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_DST_COLOR; 1625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_DST_COLOR: 1645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ONE_MINUS_DST_COLOR; 1655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SRC_COLOR: 1675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_SRC_COLOR; 1685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_SRC_COLOR: 1705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ONE_MINUS_SRC_COLOR; 1715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SRC_ALPHA: 1735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_SRC_ALPHA; 1745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_SRC_ALPHA: 1765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ONE_MINUS_SRC_ALPHA; 1775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DST_ALPHA: 1795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_DST_ALPHA; 1805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_DST_ALPHA: 1825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ONE_MINUS_DST_ALPHA; 1835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SRC_ALPHA_SATURATE: 1855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_SRC_ALPHA_SATURATE; 1865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CONSTANT_COLOR: 1885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_CONSTANT_COLOR: 1895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CONSTANT_ALPHA: 1905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_CONSTANT_ALPHA: 1915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Color.BlendEnabled) 1925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fallback = GL_TRUE; 1935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 1945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ONE; 1955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 1975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Color.BlendDstRGB ) { 2015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ZERO: 2025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ZERO; 2035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE: 2055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ONE; 2065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SRC_COLOR: 2085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_SRC_COLOR; 2095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_SRC_COLOR: 2115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ONE_MINUS_SRC_COLOR; 2125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SRC_ALPHA: 2145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_SRC_ALPHA; 2155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_SRC_ALPHA: 2175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ONE_MINUS_SRC_ALPHA; 2185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DST_COLOR: 2205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_DST_COLOR; 2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_DST_COLOR: 2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ONE_MINUS_DST_COLOR; 2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DST_ALPHA: 2265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_DST_ALPHA; 2275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_DST_ALPHA: 2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ONE_MINUS_DST_ALPHA; 2305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CONSTANT_COLOR: 2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_CONSTANT_COLOR: 2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CONSTANT_ALPHA: 2345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_CONSTANT_ALPHA: 2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Color.BlendEnabled) 2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fallback = GL_TRUE; 2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 2385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ZERO; 2395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 2415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_BLEND_FUNC, fallback ); 2455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( !fallback ) { 2465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 2475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = b; 2485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 2505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Depth testing 2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDepthFunc( GLcontext *ctx, GLenum func ) 2575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 2585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 2595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 2615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_Z_TEST_MASK; 2625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Depth.Func ) { 2645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NEVER: 2655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_NEVER; 2665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LESS: 2685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_LESS; 2695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EQUAL: 2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_EQUAL; 2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LEQUAL: 2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_LEQUAL; 2755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_GREATER: 2775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_GREATER; 2785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NOTEQUAL: 2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_NEQUAL; 2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_GEQUAL: 2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_GEQUAL; 2845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ALWAYS: 2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_ALWAYS; 2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDepthMask( GLcontext *ctx, GLboolean flag ) 2935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( ctx->Depth.Mask ) { 2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_WRITE_ENABLE; 2995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 3005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_Z_WRITE_ENABLE; 3015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClearDepth( GLcontext *ctx, GLclampd d ) 3055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint format = (rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] & 3085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DEPTH_FORMAT_MASK); 3095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( format ) { 3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case RADEON_DEPTH_FORMAT_16BIT_INT_Z: 3125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.depth.clear = d * 0x0000ffff; 3135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case RADEON_DEPTH_FORMAT_24BIT_INT_Z: 3155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.depth.clear = d * 0x00ffffff; 3165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 3195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 3225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Fog 3235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 3245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonFogfv( GLcontext *ctx, GLenum pname, const GLfloat *param ) 3275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 3295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul union { int i; float f; } c, d; 3305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLchan col[4]; 3315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.i = rmesa->hw.fog.cmd[FOG_C]; 3335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.i = rmesa->hw.fog.cmd[FOG_D]; 3345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (pname) { 3365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FOG_MODE: 3375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (!ctx->Fog.Enabled) 3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_TCL_FOG_MASK; 3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (ctx->Fog.Mode) { 3425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINEAR: 3435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_LINEAR; 3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Fog.Start == ctx->Fog.End) { 3455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = 1.0F; 3465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.f = 1.0F; 3475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 3495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start); 3505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.f = 1.0/(ctx->Fog.End-ctx->Fog.Start); 3515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EXP: 3545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_EXP; 3555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = 0.0; 3565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.f = ctx->Fog.Density; 3575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EXP2: 3595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_EXP2; 3605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = 0.0; 3615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.f = -(ctx->Fog.Density * ctx->Fog.Density); 3625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 3645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 3655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FOG_DENSITY: 3685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (ctx->Fog.Mode) { 3695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EXP: 3705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = 0.0; 3715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.f = ctx->Fog.Density; 3725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EXP2: 3745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = 0.0; 3755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.f = -(ctx->Fog.Density * ctx->Fog.Density); 3765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 3785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FOG_START: 3825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FOG_END: 3835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Fog.Mode == GL_LINEAR) { 3845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Fog.Start == ctx->Fog.End) { 3855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = 1.0F; 3865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.f = 1.0F; 3875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 3885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start); 3895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.f = 1.0/(ctx->Fog.End-ctx->Fog.Start); 3905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FOG_COLOR: 3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul UNCLAMPED_FLOAT_TO_RGB_CHAN( col, ctx->Fog.Color ); 3965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] = 3975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonPackColor( 4, col[0], col[1], col[2], 0 ); 3985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FOG_COORDINATE_SOURCE_EXT: 4005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* What to do? 4015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 4025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 4035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 4045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 4055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (c.i != rmesa->hw.fog.cmd[FOG_C] || d.i != rmesa->hw.fog.cmd[FOG_D]) { 4085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, fog ); 4095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.fog.cmd[FOG_C] = c.i; 4105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.fog.cmd[FOG_D] = d.i; 4115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 4165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Scissoring 4175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 4185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 420ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirlstatic GLboolean intersect_rect( drm_clip_rect_t *out, 421ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl drm_clip_rect_t *a, 422ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl drm_clip_rect_t *b ) 4235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 4245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *out = *a; 4255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( b->x1 > out->x1 ) out->x1 = b->x1; 4265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( b->y1 > out->y1 ) out->y1 = b->y1; 4275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( b->x2 < out->x2 ) out->x2 = b->x2; 4285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( b->y2 < out->y2 ) out->y2 = b->y2; 4295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( out->x1 >= out->x2 ) return GL_FALSE; 4305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( out->y1 >= out->y2 ) return GL_FALSE; 4315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return GL_TRUE; 4325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonRecalcScissorRects( radeonContextPtr rmesa ) 4365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 437ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl drm_clip_rect_t *out; 4385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int i; 4395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Grow cliprect store? 4415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 4425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->state.scissor.numAllocedClipRects < rmesa->numClipRects) { 4435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul while (rmesa->state.scissor.numAllocedClipRects < rmesa->numClipRects) { 4445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.numAllocedClipRects += 1; /* zero case */ 4455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.numAllocedClipRects *= 2; 4465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->state.scissor.pClipRects) 4495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FREE(rmesa->state.scissor.pClipRects); 4505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.pClipRects = 4525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul MALLOC( rmesa->state.scissor.numAllocedClipRects * 453ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl sizeof(drm_clip_rect_t) ); 4545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->state.scissor.pClipRects == NULL ) { 4565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.numAllocedClipRects = 0; 4575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 4585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul out = rmesa->state.scissor.pClipRects; 4625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.numClipRects = 0; 4635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( i = 0 ; i < rmesa->numClipRects ; i++ ) { 4655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( intersect_rect( out, 4665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul &rmesa->pClipRects[i], 4675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul &rmesa->state.scissor.rect ) ) { 4685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.numClipRects++; 4695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul out++; 4705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonUpdateScissor( GLcontext *ctx ) 4765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 4775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 4785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->dri.drawable ) { 4805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul __DRIdrawablePrivate *dPriv = rmesa->dri.drawable; 4815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int x = ctx->Scissor.X; 4835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int y = dPriv->h - ctx->Scissor.Y - ctx->Scissor.Height; 4845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int w = ctx->Scissor.X + ctx->Scissor.Width - 1; 4855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int h = dPriv->h - ctx->Scissor.Y - 1; 4865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.rect.x1 = x + dPriv->x; 4885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.rect.y1 = y + dPriv->y; 4895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.rect.x2 = w + dPriv->x + 1; 4905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.rect.y2 = h + dPriv->y + 1; 4915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonRecalcScissorRects( rmesa ); 4935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonScissor( GLcontext *ctx, 4985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint x, GLint y, GLsizei w, GLsizei h ) 4995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 5015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( ctx->Scissor.Enabled ) { 5035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FIREVERTICES( rmesa ); /* don't pipeline cliprect changes */ 5045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateScissor( ctx ); 5055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 5085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 5115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Culling 5125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 5135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonCullFace( GLcontext *ctx, GLenum unused ) 5155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 5175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL]; 5185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint t = rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL]; 5195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s |= RADEON_FFACE_SOLID | RADEON_BFACE_SOLID; 5215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t &= ~(RADEON_CULL_FRONT | RADEON_CULL_BACK); 5225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( ctx->Polygon.CullFlag ) { 5245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Polygon.CullFaceMode ) { 5255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FRONT: 5265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s &= ~RADEON_FFACE_SOLID; 5275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t |= RADEON_CULL_FRONT; 5285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 5295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_BACK: 5305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s &= ~RADEON_BFACE_SOLID; 5315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t |= RADEON_CULL_BACK; 5325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 5335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FRONT_AND_BACK: 5345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s &= ~(RADEON_FFACE_SOLID | RADEON_BFACE_SOLID); 5355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t |= (RADEON_CULL_FRONT | RADEON_CULL_BACK); 5365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 5375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) { 5415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, set ); 5425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] = s; 5435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] != t ) { 5465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl ); 5475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] = t; 5485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 5505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonFrontFace( GLcontext *ctx, GLenum mode ) 5525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 5545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, set ); 5565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_FFACE_CULL_DIR_MASK; 5575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 5595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_CULL_FRONT_IS_CCW; 5605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( mode ) { 5625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CW: 5635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_FFACE_CULL_CW; 5645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 5655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CCW: 5665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_FFACE_CULL_CCW; 5675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_CULL_FRONT_IS_CCW; 5685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 5695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 5715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 5745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Line state 5755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 5765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLineWidth( GLcontext *ctx, GLfloat widthf ) 5775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 5795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, lin ); 5815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, set ); 5825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Line width is stored in U6.4 format. 5845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 5855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] = (GLuint)(widthf * 16.0); 5865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( widthf > 1.0 ) { 5875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_WIDELINE_ENABLE; 5885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 5895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_WIDELINE_ENABLE; 5905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 5925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLineStipple( GLcontext *ctx, GLint factor, GLushort pattern ) 5945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 5965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, lin ); 5985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.lin.cmd[LIN_RE_LINE_PATTERN] = 5995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ((((GLuint)factor & 0xff) << 16) | ((GLuint)pattern)); 6005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 6045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Masks 6055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonColorMask( GLcontext *ctx, 6075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean r, GLboolean g, 6085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean b, GLboolean a ) 6095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 6115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint mask = radeonPackColor( rmesa->radeonScreen->cpp, 6125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Color.ColorMask[RCOMP], 6135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Color.ColorMask[GCOMP], 6145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Color.ColorMask[BCOMP], 6155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Color.ColorMask[ACOMP] ); 6165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] != mask ) { 6185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, msk ); 6195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] = mask; 6205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 6255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Polygon state 6265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonPolygonOffset( GLcontext *ctx, 6295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat factor, GLfloat units ) 6305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 6325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat constant = units * rmesa->state.depth.scale; 6335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, zbs ); 6355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_FACTOR] = *(GLuint *)&factor; 6365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_CONSTANT] = *(GLuint *)&constant; 6375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonPolygonStipple( GLcontext *ctx, const GLubyte *mask ) 6405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 6425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint i; 643ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl drm_radeon_stipple_t stipple; 6445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Must flip pattern upside down. 6465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( i = 0 ; i < 32 ; i++ ) { 6485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.stipple.mask[31 - i] = ((GLuint *) mask)[i]; 6495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* TODO: push this into cmd mechanism 6525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FIREVERTICES( rmesa ); 6545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCK_HARDWARE( rmesa ); 6555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* FIXME: Use window x,y offsets into stipple RAM. 6575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul stipple.mask = rmesa->state.stipple.mask; 6595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul drmCommandWrite( rmesa->dri.fd, DRM_RADEON_STIPPLE, 660ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl &stipple, sizeof(drm_radeon_stipple_t) ); 6615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul UNLOCK_HARDWARE( rmesa ); 6625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonPolygonMode( GLcontext *ctx, GLenum face, GLenum mode ) 6655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 6675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean flag = (ctx->_TriangleCaps & DD_TRI_UNFILLED) != 0; 6685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Can't generally do unfilled via tcl, but some good special 6705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * cases work. 6715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_UNFILLED, flag); 6735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->TclFallback) { 6745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseRenderState( ctx ); 6755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseVertexState( ctx ); 6765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 6815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Rendering attributes 6825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 6835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * We really don't want to recalculate all this every time we bind a 6845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * texture. These things shouldn't change all that often, so it makes 6855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * sense to break them out of the core texture state update routines. 6865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Examine lighting and texture state to determine if separate specular 6895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * should be enabled. 6905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonUpdateSpecular( GLcontext *ctx ) 6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 69438b317d508a2a3a4cc6d700ebca80c3b06c913e2Alan Hourihane u_int32_t p = rmesa->hw.ctx.cmd[CTX_PP_CNTL]; 6955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 6975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_SPECULAR; 6995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_DIFFUSE; 7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] &= ~RADEON_TCL_VTX_PK_SPEC; 7015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] &= ~RADEON_TCL_VTX_PK_DIFFUSE; 7025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_LIGHTING_ENABLE; 7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul p &= ~RADEON_SPECULAR_ENABLE; 7055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_DIFFUSE_SPECULAR_COMBINE; 7075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.Enabled && 7105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) { 7115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_SPECULAR; 7125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_DIFFUSE; 7135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC; 7145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE; 7155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE; 7165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul p |= RADEON_SPECULAR_ENABLE; 7175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= 7185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ~RADEON_DIFFUSE_SPECULAR_COMBINE; 7195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else if (ctx->Light.Enabled) { 7215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_DIFFUSE; 7225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE; 7235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE; 7245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else if (ctx->Fog.ColorSumEnabled ) { 7255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC; 7265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE; 7275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul p |= RADEON_SPECULAR_ENABLE; 7285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 7295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE; 7305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Fog.Enabled) { 7335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_SPECULAR; 7345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC; 7355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Bizzare: have to leave lighting enabled to get fog. 7375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 7385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE; 7395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 74143b57728340e70827a114c384192ed319abdb5c6Keith Whitwell if (NEED_SECONDARY_COLOR(ctx)) { 7425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul assert( (p & RADEON_SPECULAR_ENABLE) != 0 ); 7435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 7445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul assert( (p & RADEON_SPECULAR_ENABLE) == 0 ); 7455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.ctx.cmd[CTX_PP_CNTL] != p ) { 7485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 7495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] = p; 7505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Update vertex/render formats 7535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 7545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->TclFallback) { 7555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseRenderState( ctx ); 7565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseVertexState( ctx ); 7575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 7625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Materials 7635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 7645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Update on colormaterial, material emmissive/ambient, 7675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * lightmodel.globalambient 7685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 7695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_global_ambient( GLcontext *ctx ) 7705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 7715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 7725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul float *fcmd = (float *)RADEON_DB_STATE( glt ); 7735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Need to do more if both emmissive & ambient are PREMULT: 775f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger * Hope this is not needed for MULT 7765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 7775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ((rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] & 7785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ((3 << RADEON_EMISSIVE_SOURCE_SHIFT) | 7795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (3 << RADEON_AMBIENT_SOURCE_SHIFT))) == 0) 7805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 7815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_3V( &fcmd[GLT_RED], 7825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_EMISSION]); 7835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ACC_SCALE_3V( &fcmd[GLT_RED], 7845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Light.Model.Ambient, 7855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT]); 7865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 7885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 7895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_3V( &fcmd[GLT_RED], ctx->Light.Model.Ambient ); 7905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DB_STATECHANGE(rmesa, &rmesa->hw.glt); 7935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Update on change to 7965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * - light[p].colors 7975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * - light[p].enabled 7985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 7995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_light_colors( GLcontext *ctx, GLuint p ) 8005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 8015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_light *l = &ctx->Light.Light[p]; 8025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* fprintf(stderr, "%s\n", __FUNCTION__); */ 8045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (l->Enabled) { 8065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 8075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul float *fcmd = (float *)RADEON_DB_STATE( lit[p] ); 8085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_4V( &fcmd[LIT_AMBIENT_RED], l->Ambient ); 8105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_4V( &fcmd[LIT_DIFFUSE_RED], l->Diffuse ); 8115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_4V( &fcmd[LIT_SPECULAR_RED], l->Specular ); 8125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] ); 8145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 8165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Also fallback for asym colormaterial mode in twoside lighting... 8185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 8195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void check_twoside_fallback( GLcontext *ctx ) 8205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 8215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean fallback = GL_FALSE; 8225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint i; 8235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.Enabled && ctx->Light.Model.TwoSide) { 8255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.ColorMaterialEnabled && 8265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (ctx->Light.ColorMaterialBitmask & BACK_MATERIAL_BITS) != 8275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ((ctx->Light.ColorMaterialBitmask & FRONT_MATERIAL_BITS)<<1)) 8285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fallback = GL_TRUE; 8295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 8305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (i = MAT_ATTRIB_FRONT_AMBIENT; i < MAT_ATTRIB_FRONT_INDEXES; i+=2) 8315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (memcmp( ctx->Light.Material.Attrib[i], 8325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Light.Material.Attrib[i+1], 8335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul sizeof(GLfloat)*4) != 0) { 8345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fallback = GL_TRUE; 8355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 8365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_LIGHT_TWOSIDE, fallback ); 8415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 8425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonColorMaterial( GLcontext *ctx, GLenum face, GLenum mode ) 8455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 8465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 8475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint light_model_ctl1 = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]; 8485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 84927889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling light_model_ctl1 &= ~((3 << RADEON_EMISSIVE_SOURCE_SHIFT) | 85027889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling (3 << RADEON_AMBIENT_SOURCE_SHIFT) | 85127889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling (3 << RADEON_DIFFUSE_SOURCE_SHIFT) | 85227889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling (3 << RADEON_SPECULAR_SOURCE_SHIFT)); 8535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 854f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger if (ctx->Light.ColorMaterialEnabled) { 855f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger GLuint mask = ctx->Light.ColorMaterialBitmask; 856f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger 8575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_EMISSION) { 85827889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE << 8595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_EMISSIVE_SOURCE_SHIFT); 8605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 861f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger else { 862f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << 863f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger RADEON_EMISSIVE_SOURCE_SHIFT); 864f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger } 8655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_AMBIENT) { 86727889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE << 8685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_AMBIENT_SOURCE_SHIFT); 8695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 870f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger else { 871f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << 872f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger RADEON_AMBIENT_SOURCE_SHIFT); 873f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger } 8745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_DIFFUSE) { 87627889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE << 8775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DIFFUSE_SOURCE_SHIFT); 8785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 879f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger else { 880f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << 881f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger RADEON_DIFFUSE_SOURCE_SHIFT); 882f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger } 8835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_SPECULAR) { 88527889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE << 8865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_SPECULAR_SOURCE_SHIFT); 8875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 888f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger else { 889f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << 890f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger RADEON_SPECULAR_SOURCE_SHIFT); 891f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger } 892f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger } 893f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger else { 894f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger /* Default to MULT: 895f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger */ 896f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << RADEON_EMISSIVE_SOURCE_SHIFT) | 897f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger (RADEON_LM_SOURCE_STATE_MULT << RADEON_AMBIENT_SOURCE_SHIFT) | 898f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger (RADEON_LM_SOURCE_STATE_MULT << RADEON_DIFFUSE_SOURCE_SHIFT) | 899f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger (RADEON_LM_SOURCE_STATE_MULT << RADEON_SPECULAR_SOURCE_SHIFT); 900f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger } 9015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (light_model_ctl1 != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]) { 9035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 9045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] = light_model_ctl1; 9055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 9075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonUpdateMaterial( GLcontext *ctx ) 9095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 9105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 9115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat (*mat)[4] = ctx->Light.Material.Attrib; 9125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( mtl ); 9135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint mask = ~0; 9145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.ColorMaterialEnabled) 9165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul mask &= ~ctx->Light.ColorMaterialBitmask; 9175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & DEBUG_STATE) 9195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s\n", __FUNCTION__); 9205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_EMISSION) { 9235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_EMMISSIVE_RED] = mat[MAT_ATTRIB_FRONT_EMISSION][0]; 9245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_EMMISSIVE_GREEN] = mat[MAT_ATTRIB_FRONT_EMISSION][1]; 9255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_EMMISSIVE_BLUE] = mat[MAT_ATTRIB_FRONT_EMISSION][2]; 9265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_EMMISSIVE_ALPHA] = mat[MAT_ATTRIB_FRONT_EMISSION][3]; 9275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_AMBIENT) { 9295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_AMBIENT_RED] = mat[MAT_ATTRIB_FRONT_AMBIENT][0]; 9305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_AMBIENT_GREEN] = mat[MAT_ATTRIB_FRONT_AMBIENT][1]; 9315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_AMBIENT_BLUE] = mat[MAT_ATTRIB_FRONT_AMBIENT][2]; 9325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_AMBIENT_ALPHA] = mat[MAT_ATTRIB_FRONT_AMBIENT][3]; 9335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_DIFFUSE) { 9355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_DIFFUSE_RED] = mat[MAT_ATTRIB_FRONT_DIFFUSE][0]; 9365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_DIFFUSE_GREEN] = mat[MAT_ATTRIB_FRONT_DIFFUSE][1]; 9375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_DIFFUSE_BLUE] = mat[MAT_ATTRIB_FRONT_DIFFUSE][2]; 9385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_DIFFUSE_ALPHA] = mat[MAT_ATTRIB_FRONT_DIFFUSE][3]; 9395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_SPECULAR) { 9415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_SPECULAR_RED] = mat[MAT_ATTRIB_FRONT_SPECULAR][0]; 9425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_SPECULAR_GREEN] = mat[MAT_ATTRIB_FRONT_SPECULAR][1]; 9435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_SPECULAR_BLUE] = mat[MAT_ATTRIB_FRONT_SPECULAR][2]; 9445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_SPECULAR_ALPHA] = mat[MAT_ATTRIB_FRONT_SPECULAR][3]; 9455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_SHININESS) { 9475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_SHININESS] = mat[MAT_ATTRIB_FRONT_SHININESS][0]; 9485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 950a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mtl ); 9515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 952a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer check_twoside_fallback( ctx ); 953f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger/* update_global_ambient( ctx );*/ 9545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 9555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* _NEW_LIGHT 9575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _NEW_MODELVIEW 9585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _MESA_NEW_NEED_EYE_COORDS 9595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 9605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Uses derived state from mesa: 9615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _VP_inf_norm 9625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _h_inf_norm 9635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _Position 9645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _NormDirection 9655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _ModelViewInvScale 9665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _NeedEyeCoords 9675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _EyeZDir 9685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 9695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * which are calculated in light.c and are correct for the current 9705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * lighting space (model or eye), hence dependencies on _NEW_MODELVIEW 9715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * and _MESA_NEW_NEED_EYE_COORDS. 9725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 9735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_light( GLcontext *ctx ) 9745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 9755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 9765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Have to check these, or have an automatic shortcircuit mechanism 9785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * to remove noop statechanges. (Or just do a better job on the 9795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * front end). 9805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 9815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 9825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint tmp = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]; 9835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->_NeedEyeCoords) 9855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tmp &= ~RADEON_LIGHT_IN_MODELSPACE; 9865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 9875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tmp |= RADEON_LIGHT_IN_MODELSPACE; 9885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Leave this test disabled: (unexplained q3 lockup) (even with 9915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul new packets) 9925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 9935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (tmp != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]) 9945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 9955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 9965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] = tmp; 9975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 10015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( eye ); 10025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[EYE_X] = ctx->_EyeZDir[0]; 10035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[EYE_Y] = ctx->_EyeZDir[1]; 10045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[EYE_Z] = - ctx->_EyeZDir[2]; 10055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[EYE_RESCALE_FACTOR] = ctx->_ModelViewInvScale; 10065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.eye ); 10075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.Enabled) { 10125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint p; 10135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (p = 0 ; p < MAX_LIGHTS; p++) { 10145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.Light[p].Enabled) { 10155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_light *l = &ctx->Light.Light[p]; 10165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( lit[p] ); 10175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (l->EyePosition[3] == 0.0) { 10195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_3FV( &fcmd[LIT_POSITION_X], l->_VP_inf_norm ); 10205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_3FV( &fcmd[LIT_DIRECTION_X], l->_h_inf_norm ); 10215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_POSITION_W] = 0; 10225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_DIRECTION_W] = 0; 10235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 10245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_4V( &fcmd[LIT_POSITION_X], l->_Position ); 10255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_DIRECTION_X] = -l->_NormDirection[0]; 10265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_DIRECTION_Y] = -l->_NormDirection[1]; 10275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_DIRECTION_Z] = -l->_NormDirection[2]; 10285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_DIRECTION_W] = 0; 10295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] ); 10325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 10365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLightfv( GLcontext *ctx, GLenum light, 10385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLenum pname, const GLfloat *params ) 10395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 10405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 10415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint p = light - GL_LIGHT0; 10425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_light *l = &ctx->Light.Light[p]; 10435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat *fcmd = (GLfloat *)rmesa->hw.lit[p].cmd; 10445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (pname) { 10475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_AMBIENT: 10485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DIFFUSE: 10495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SPECULAR: 10505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul update_light_colors( ctx, p ); 10515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 10525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SPOT_DIRECTION: 10545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* picked up in update_light */ 10555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 10565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POSITION: { 10585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* positions picked up in update_light, but can do flag here */ 10595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flag; 10605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2; 10615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* FIXME: Set RANGE_ATTEN only when needed */ 10635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (p&1) 10645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul flag = RADEON_LIGHT_1_IS_LOCAL; 10655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 10665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul flag = RADEON_LIGHT_0_IS_LOCAL; 10675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 10695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (l->EyePosition[3] != 0.0F) 10705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[idx] |= flag; 10715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 10725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[idx] &= ~flag; 10735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 10745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SPOT_EXPONENT: 10775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, lit[p]); 10785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_SPOT_EXPONENT] = params[0]; 10795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 10805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SPOT_CUTOFF: { 10825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flag = (p&1) ? RADEON_LIGHT_1_IS_SPOT : RADEON_LIGHT_0_IS_SPOT; 10835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2; 10845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, lit[p]); 10865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_SPOT_CUTOFF] = l->_CosCutoff; 10875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 10895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (l->SpotCutoff != 180.0F) 10905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[idx] |= flag; 10915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 10925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[idx] &= ~flag; 10935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 10955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CONSTANT_ATTENUATION: 10985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, lit[p]); 10995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_ATTEN_CONST] = params[0]; 11005d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer if ( params[0] == 0.0 ) 11015d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer fcmd[LIT_ATTEN_CONST_INV] = FLT_MAX; 11025d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer else 11035d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer fcmd[LIT_ATTEN_CONST_INV] = 1.0 / params[0]; 11045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINEAR_ATTENUATION: 11065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, lit[p]); 11075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_ATTEN_LINEAR] = params[0]; 11085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_QUADRATIC_ATTENUATION: 11105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, lit[p]); 11115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_ATTEN_QUADRATIC] = params[0]; 11125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 11145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 11155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 11165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Set RANGE_ATTEN only when needed */ 11185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (pname) { 11195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POSITION: 11205d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer case GL_CONSTANT_ATTENUATION: 11215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINEAR_ATTENUATION: 11225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_QUADRATIC_ATTENUATION: 11235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 11245d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer GLuint *icmd = (GLuint *)RADEON_DB_STATE( tcl ); 11255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2; 11265d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer GLuint atten_flag = ( p&1 ) ? RADEON_LIGHT_1_ENABLE_RANGE_ATTEN 11275d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer : RADEON_LIGHT_0_ENABLE_RANGE_ATTEN; 11285d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer GLuint atten_const_flag = ( p&1 ) ? RADEON_LIGHT_1_CONSTANT_RANGE_ATTEN 11295d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer : RADEON_LIGHT_0_CONSTANT_RANGE_ATTEN; 11305d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer 11315d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer if ( l->EyePosition[3] == 0.0F || 11325d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer ( ( fcmd[LIT_ATTEN_CONST] == 0.0 || fcmd[LIT_ATTEN_CONST] == 1.0 ) && 11335d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) ) { 11345d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer /* Disable attenuation */ 11355d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer icmd[idx] &= ~atten_flag; 11365d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer } else { 11375d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer if ( fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) { 11385d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer /* Enable only constant portion of attenuation calculation */ 11395d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer icmd[idx] |= ( atten_flag | atten_const_flag ); 11405d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer } else { 11415d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer /* Enable full attenuation calculation */ 11425d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer icmd[idx] &= ~atten_const_flag; 11435d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer icmd[idx] |= atten_flag; 11445d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer } 11455d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer } 11465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11475d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.tcl ); 11485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 11505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 11515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 11535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 11545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLightModelfv( GLcontext *ctx, GLenum pname, 11595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const GLfloat *param ) 11605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 11615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 11625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (pname) { 11645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT_MODEL_AMBIENT: 11655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul update_global_ambient( ctx ); 11665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT_MODEL_LOCAL_VIEWER: 11695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 11705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.Model.LocalViewer) 11715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LOCAL_VIEWER; 11725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 11735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_LOCAL_VIEWER; 11745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT_MODEL_TWO_SIDE: 11775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 11785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.Model.TwoSide) 11795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_LIGHT_TWOSIDE; 11805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 11815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_LIGHT_TWOSIDE; 11825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul check_twoside_fallback( ctx ); 11845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->TclFallback) { 11865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseRenderState( ctx ); 11875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseVertexState( ctx ); 11885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 11895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT_MODEL_COLOR_CONTROL: 11925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateSpecular(ctx); 11935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 11965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 11985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 11995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonShadeModel( GLcontext *ctx, GLenum mode ) 12015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 12025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 12035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL]; 12045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s &= ~(RADEON_DIFFUSE_SHADE_MASK | 12065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ALPHA_SHADE_MASK | 12075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_SPECULAR_SHADE_MASK | 12085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FOG_SHADE_MASK); 12095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( mode ) { 12115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FLAT: 12125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s |= (RADEON_DIFFUSE_SHADE_FLAT | 12135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ALPHA_SHADE_FLAT | 12145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_SPECULAR_SHADE_FLAT | 12155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FOG_SHADE_FLAT); 12165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 12175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SMOOTH: 12185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s |= (RADEON_DIFFUSE_SHADE_GOURAUD | 12195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ALPHA_SHADE_GOURAUD | 12205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_SPECULAR_SHADE_GOURAUD | 12215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FOG_SHADE_GOURAUD); 12225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 12235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 12245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 12255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 12265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) { 12285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, set ); 12295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] = s; 12305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 12315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 12325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 12355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * User clip planes 12365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 12375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClipPlane( GLcontext *ctx, GLenum plane, const GLfloat *eq ) 12395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 12405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint p = (GLint) plane - (GLint) GL_CLIP_PLANE0; 12415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 12425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p]; 12435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ucp[p] ); 12455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_X] = ip[0]; 12465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1]; 12475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2]; 12485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_W] = ip[3]; 12495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 12505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonUpdateClipPlanes( GLcontext *ctx ) 12525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 12535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 12545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint p; 12555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (p = 0; p < ctx->Const.MaxClipPlanes; p++) { 12575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Transform.ClipPlanesEnabled & (1 << p)) { 12585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p]; 12595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ucp[p] ); 12615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_X] = ip[0]; 12625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1]; 12635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2]; 12645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_W] = ip[3]; 12655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 12665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 12675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 12685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 12715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Stencil 12725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 12735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1274878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void 1275878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian PaulradeonStencilFuncSeparate( GLcontext *ctx, GLenum face, GLenum func, 1276878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian 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 1319878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void 1320878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian PaulradeonStencilMaskSeparate( GLcontext *ctx, GLenum face, GLuint mask ) 13215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 13225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 13235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 13245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, msk ); 13255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~RADEON_STENCIL_WRITE_MASK; 13265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |= 13275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (ctx->Stencil.WriteMask[0] << RADEON_STENCIL_WRITEMASK_SHIFT); 13285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 13295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1330878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void radeonStencilOpSeparate( GLcontext *ctx, GLenum face, GLenum fail, 1331878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul GLenum zfail, GLenum zpass ) 13325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 13335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 13345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1335de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger /* radeon 7200 have stencil bug, DEC and INC_WRAP will actually both do DEC_WRAP, 1336de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger and DEC_WRAP (and INVERT) will do INVERT. No way to get correct INC_WRAP and DEC, 1337de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger but DEC_WRAP can be fixed by using DEC and INC_WRAP at least use INC. */ 1338de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger 1339de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger GLuint tempRADEON_STENCIL_FAIL_DEC_WRAP; 1340de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger GLuint tempRADEON_STENCIL_FAIL_INC_WRAP; 1341de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger GLuint tempRADEON_STENCIL_ZFAIL_DEC_WRAP; 1342de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger GLuint tempRADEON_STENCIL_ZFAIL_INC_WRAP; 1343de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger GLuint tempRADEON_STENCIL_ZPASS_DEC_WRAP; 1344de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger GLuint tempRADEON_STENCIL_ZPASS_INC_WRAP; 1345de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger 1346de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger if (rmesa->radeonScreen->chipset & RADEON_CHIPSET_BROKEN_STENCIL) { 1347de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_FAIL_DEC_WRAP = RADEON_STENCIL_FAIL_DEC; 1348de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_FAIL_INC_WRAP = RADEON_STENCIL_FAIL_INC; 1349de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_ZFAIL_DEC_WRAP = RADEON_STENCIL_ZFAIL_DEC; 1350de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_ZFAIL_INC_WRAP = RADEON_STENCIL_ZFAIL_INC; 1351de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_ZPASS_DEC_WRAP = RADEON_STENCIL_ZPASS_DEC; 1352de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_ZPASS_INC_WRAP = RADEON_STENCIL_ZPASS_INC; 1353de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger } 1354de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger else { 1355de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_FAIL_DEC_WRAP = RADEON_STENCIL_FAIL_DEC_WRAP; 1356de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_FAIL_INC_WRAP = RADEON_STENCIL_FAIL_INC_WRAP; 1357de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_ZFAIL_DEC_WRAP = RADEON_STENCIL_ZFAIL_DEC_WRAP; 1358de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_ZFAIL_INC_WRAP = RADEON_STENCIL_ZFAIL_INC_WRAP; 1359de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_ZPASS_DEC_WRAP = RADEON_STENCIL_ZPASS_DEC_WRAP; 1360de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_ZPASS_INC_WRAP = RADEON_STENCIL_ZPASS_INC_WRAP; 1361de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger } 1362de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger 13635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 13645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~(RADEON_STENCIL_FAIL_MASK | 13655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STENCIL_ZFAIL_MASK | 13665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STENCIL_ZPASS_MASK); 13675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 13685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Stencil.FailFunc[0] ) { 13695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_KEEP: 13705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_KEEP; 13715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ZERO: 13735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_ZERO; 13745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_REPLACE: 13765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_REPLACE; 13775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INCR: 13795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_INC; 13805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DECR: 13825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_DEC; 13835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1384de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger case GL_INCR_WRAP: 1385de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_FAIL_INC_WRAP; 1386de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger break; 1387de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger case GL_DECR_WRAP: 1388de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_FAIL_DEC_WRAP; 1389de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger break; 13905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INVERT: 13915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_INVERT; 13925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 13945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 13955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Stencil.ZFailFunc[0] ) { 13965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_KEEP: 13975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_KEEP; 13985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ZERO: 14005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_ZERO; 14015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 14025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_REPLACE: 14035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_REPLACE; 14045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 14055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INCR: 14065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_INC; 14075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 14085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DECR: 14095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_DEC; 14105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1411de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger case GL_INCR_WRAP: 1412de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZFAIL_INC_WRAP; 1413de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger break; 1414de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger case GL_DECR_WRAP: 1415de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZFAIL_DEC_WRAP; 1416de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger break; 14175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INVERT: 14185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_INVERT; 14195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 14205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 14215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Stencil.ZPassFunc[0] ) { 14235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_KEEP: 14245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_KEEP; 14255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 14265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ZERO: 14275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_ZERO; 14285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 14295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_REPLACE: 14305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_REPLACE; 14315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 14325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INCR: 14335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_INC; 14345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 14355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DECR: 14365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_DEC; 14375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1438de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger case GL_INCR_WRAP: 1439de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZPASS_INC_WRAP; 1440de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger break; 1441de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger case GL_DECR_WRAP: 1442de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZPASS_DEC_WRAP; 1443de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger break; 14445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INVERT: 14455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_INVERT; 14465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 14475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 14485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 14495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClearStencil( GLcontext *ctx, GLint s ) 14515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 14525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 14535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.stencil.clear = 14555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ((GLuint) ctx->Stencil.Clear | 14565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (0xff << RADEON_STENCIL_MASK_SHIFT) | 14575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (ctx->Stencil.WriteMask[0] << RADEON_STENCIL_WRITEMASK_SHIFT)); 14585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 14595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 14625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Window position and viewport transformation 14635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 14645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* 14665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * To correctly position primitives: 14675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 14685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define SUBPIXEL_X 0.125 14695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define SUBPIXEL_Y 0.125 14705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 147116e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul 147216e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul/** 147316e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul * Called when window size or position changes or viewport or depth range 147416e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul * state is changed. We update the hardware viewport state here. 147516e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul */ 14765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonUpdateWindow( GLcontext *ctx ) 14775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 14785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 14795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul __DRIdrawablePrivate *dPriv = rmesa->dri.drawable; 14805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat xoffset = (GLfloat)dPriv->x; 14815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat yoffset = (GLfloat)dPriv->y + dPriv->h; 14825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const GLfloat *v = ctx->Viewport._WindowMap.m; 14835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat sx = v[MAT_SX]; 14855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat tx = v[MAT_TX] + xoffset + SUBPIXEL_X; 14865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat sy = - v[MAT_SY]; 14875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat ty = (- v[MAT_TY]) + yoffset + SUBPIXEL_Y; 14885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat sz = v[MAT_SZ] * rmesa->state.depth.scale; 14895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat tz = v[MAT_TZ] * rmesa->state.depth.scale; 14905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FIREVERTICES( rmesa ); 14915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, vpt ); 14925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE] = *(GLuint *)&sx; 14945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = *(GLuint *)&tx; 14955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE] = *(GLuint *)&sy; 14965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = *(GLuint *)&ty; 14975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE] = *(GLuint *)&sz; 14985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = *(GLuint *)&tz; 14995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 15005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonViewport( GLcontext *ctx, GLint x, GLint y, 15035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLsizei width, GLsizei height ) 15045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 15055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Don't pipeline viewport changes, conflict with window offset 15065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * setting below. Could apply deltas to rescue pipelined viewport 15075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * values, or keep the originals hanging around. 15085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 15095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FIREVERTICES( RADEON_CONTEXT(ctx) ); 15105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateWindow( ctx ); 15115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 15125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDepthRange( GLcontext *ctx, GLclampd nearval, 15145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLclampd farval ) 15155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 15165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateWindow( ctx ); 15175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 15185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonUpdateViewportOffset( GLcontext *ctx ) 15205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 15215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 15225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul __DRIdrawablePrivate *dPriv = rmesa->dri.drawable; 15235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat xoffset = (GLfloat)dPriv->x; 15245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat yoffset = (GLfloat)dPriv->y + dPriv->h; 15255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const GLfloat *v = ctx->Viewport._WindowMap.m; 15265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15274754fc653f43903265dc878f27826ebcf26dfdcbKeith Whitwell GLfloat tx = v[MAT_TX] + xoffset + SUBPIXEL_X; 15284754fc653f43903265dc878f27826ebcf26dfdcbKeith Whitwell GLfloat ty = (- v[MAT_TY]) + yoffset + SUBPIXEL_Y; 15295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] != *(GLuint *)&tx || 15315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] != *(GLuint *)&ty ) 15325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 15335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Note: this should also modify whatever data the context reset 15345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * code uses... 15355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 15365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = *(GLuint *)&tx; 15375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = *(GLuint *)&ty; 15385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* update polygon stipple x/y screen offset */ 15405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 15415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint stx, sty; 15425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint m = rmesa->hw.msc.cmd[MSC_RE_MISC]; 15435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul m &= ~(RADEON_STIPPLE_X_OFFSET_MASK | 15455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STIPPLE_Y_OFFSET_MASK); 15465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* add magic offsets, then invert */ 15485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul stx = 31 - ((rmesa->dri.drawable->x - 1) & RADEON_STIPPLE_COORD_MASK); 15495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul sty = 31 - ((rmesa->dri.drawable->y + rmesa->dri.drawable->h - 1) 15505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul & RADEON_STIPPLE_COORD_MASK); 15515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul m |= ((stx << RADEON_STIPPLE_X_OFFSET_SHIFT) | 15535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (sty << RADEON_STIPPLE_Y_OFFSET_SHIFT)); 15545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.msc.cmd[MSC_RE_MISC] != m ) { 15565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, msc ); 15575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msc.cmd[MSC_RE_MISC] = m; 15585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 15595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 15605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 15615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateScissor( ctx ); 15635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 15645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 15685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Miscellaneous 15695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 15705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonClearColor( GLcontext *ctx, const GLfloat color[4] ) 15725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 15735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 15745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLubyte c[4]; 15755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]); 15765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]); 15775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]); 15785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]); 15795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.color.clear = radeonPackColor( rmesa->radeonScreen->cpp, 15805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c[0], c[1], c[2], c[3] ); 15815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 15825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderMode( GLcontext *ctx, GLenum mode ) 15855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 15865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 15875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_RENDER_MODE, (mode != GL_RENDER) ); 15885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 15895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic GLuint radeon_rop_tab[] = { 15925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_CLEAR, 15935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_AND, 15945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_AND_REVERSE, 15955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_COPY, 15965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_AND_INVERTED, 15975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_NOOP, 15985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_XOR, 15995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_OR, 16005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_NOR, 16015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_EQUIV, 16025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_INVERT, 16035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_OR_REVERSE, 16045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_COPY_INVERTED, 16055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_OR_INVERTED, 16065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_NAND, 16075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_SET, 16085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}; 16095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLogicOpCode( GLcontext *ctx, GLenum opcode ) 16115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 16125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 16135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint rop = (GLuint)opcode - GL_CLEAR; 16145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ASSERT( rop < 16 ); 16165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, msk ); 16185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msk.cmd[MSK_RB3D_ROPCNTL] = radeon_rop_tab[rop]; 16195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 16205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 162216e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul/** 162316e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul * Set up the cliprects for either front or back-buffer drawing. 162416e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul */ 162516e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paulvoid radeonSetCliprects( radeonContextPtr rmesa ) 16265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 16275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul __DRIdrawablePrivate *dPriv = rmesa->dri.drawable; 16285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 162916e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul if (rmesa->glCtx->DrawBuffer->_ColorDrawBufferMask[0] 163016e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul == BUFFER_BIT_BACK_LEFT) { 16315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Can't ignore 2d windows if we are page flipping. 16325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 16335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( dPriv->numBackClipRects == 0 || rmesa->doPageFlip ) { 16345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->numClipRects = dPriv->numClipRects; 1635ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl rmesa->pClipRects = dPriv->pClipRects; 16365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 16375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 16385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->numClipRects = dPriv->numBackClipRects; 1639ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl rmesa->pClipRects = dPriv->pBackClipRects; 16405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 164116e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul } 164216e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul else { 164316e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul /* front buffer (or none, or multiple buffers */ 164416e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul rmesa->numClipRects = dPriv->numClipRects; 164516e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul rmesa->pClipRects = dPriv->pClipRects; 16465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 16475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->state.scissor.enabled) 16495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonRecalcScissorRects( rmesa ); 16505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 16515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1653982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul/** 1654982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul * Called via glDrawBuffer. 1655982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul */ 16565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDrawBuffer( GLcontext *ctx, GLenum mode ) 16575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 16585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 16595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & DEBUG_DRI) 16615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s %s\n", __FUNCTION__, 16625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_lookup_enum_by_nr( mode )); 16635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FIREVERTICES(rmesa); /* don't pipeline cliprect changes */ 16655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* 1667982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul * _ColorDrawBufferMask is easier to cope with than <mode>. 1668982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul * Check for software fallback, update cliprects. 16695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 1670e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul switch ( ctx->DrawBuffer->_ColorDrawBufferMask[0] ) { 1671e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul case BUFFER_BIT_FRONT_LEFT: 1672e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul case BUFFER_BIT_BACK_LEFT: 16735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_DRAW_BUFFER, GL_FALSE ); 16745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 16755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 167616e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul /* 0 (GL_NONE) buffers or multiple color drawing buffers */ 16775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_DRAW_BUFFER, GL_TRUE ); 16785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 16795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 16805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 168116e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul radeonSetCliprects( rmesa ); 168216e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul 1683982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul /* We'll set the drawing engine's offset/pitch parameters later 1684982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul * when we update other state. 16855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 16865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 16875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonReadBuffer( GLcontext *ctx, GLenum mode ) 16895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 16905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* nothing, until we implement h/w glRead/CopyPixels or CopyTexImage */ 16915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 16925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 16955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * State enable/disable 16965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 16975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonEnable( GLcontext *ctx, GLenum cap, GLboolean state ) 16995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 17005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 17015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint p, flag; 17025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( RADEON_DEBUG & DEBUG_STATE ) 17045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf( stderr, "%s( %s = %s )\n", __FUNCTION__, 17055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_lookup_enum_by_nr( cap ), 17065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul state ? "GL_TRUE" : "GL_FALSE" ); 17075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( cap ) { 17095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Fast track this one... 17105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 17115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_1D: 17125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_2D: 17135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_3D: 17145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ALPHA_TEST: 17175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 17185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (state) { 17195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_ALPHA_TEST_ENABLE; 17205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 17215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ALPHA_TEST_ENABLE; 17225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_BLEND: 17265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 17275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (state) { 17285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_ALPHA_BLEND_ENABLE; 17295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 17305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ALPHA_BLEND_ENABLE; 17315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 173278bb0803cf722ad5273fc495791eb573bf8b4d21Michel Dänzer if ( ctx->Color._LogicOpEnabled ) { 17335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_ROP_ENABLE; 17345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 17355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE; 17365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Catch a possible fallback: 17395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 17405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (state) { 1741c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick ctx->Driver.BlendEquationSeparate( ctx, 1742c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick ctx->Color.BlendEquationRGB, 1743c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick ctx->Color.BlendEquationA ); 174420a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick ctx->Driver.BlendFuncSeparate( ctx, ctx->Color.BlendSrcRGB, 174520a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick ctx->Color.BlendDstRGB, 1746253428f06a45d59cc50c9ccc4c8d17cd8c02c25dIan Romanick ctx->Color.BlendSrcA, 1747253428f06a45d59cc50c9ccc4c8d17cd8c02c25dIan Romanick ctx->Color.BlendDstA ); 17485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 17505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_BLEND_FUNC, GL_FALSE ); 17515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_BLEND_EQ, GL_FALSE ); 17525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLIP_PLANE0: 17565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLIP_PLANE1: 17575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLIP_PLANE2: 17585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLIP_PLANE3: 17595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLIP_PLANE4: 17605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLIP_PLANE5: 17615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul p = cap-GL_CLIP_PLANE0; 17625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 17635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (state) { 17645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= (RADEON_UCP_ENABLE_0<<p); 17655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonClipPlane( ctx, cap, NULL ); 17665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 17685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~(RADEON_UCP_ENABLE_0<<p); 17695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_COLOR_MATERIAL: 17735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonColorMaterial( ctx, 0, 0 ); 1774a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer radeonUpdateMaterial( ctx ); 17755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CULL_FACE: 17785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonCullFace( ctx, 0 ); 17795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DEPTH_TEST: 17825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, ctx ); 17835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 17845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_Z_ENABLE; 17855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 17865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_Z_ENABLE; 17875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DITHER: 17915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, ctx ); 17925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 17935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_DITHER_ENABLE; 179499ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~rmesa->state.color.roundEnable; 17955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 17965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_DITHER_ENABLE; 179799ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= rmesa->state.color.roundEnable; 17985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 18005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FOG: 18025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, ctx ); 18035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 18045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_FOG_ENABLE; 18052c28dd892cfb43445d7e54df8b6a8331192f4e99Brian Paul radeonFogfv( ctx, GL_FOG_MODE, NULL ); 18065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 18075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_FOG_ENABLE; 18085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 18095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_TCL_FOG_MASK; 18105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateSpecular( ctx ); /* for PK_SPEC */ 18125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->TclFallback) 18135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseVertexState( ctx ); 18145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_allow_light_in_model( ctx, !state ); 18155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 18165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT0: 18185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT1: 18195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT2: 18205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT3: 18215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT4: 18225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT5: 18235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT6: 18245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT7: 18255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 18265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul p = cap - GL_LIGHT0; 18275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (p&1) 18285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul flag = (RADEON_LIGHT_1_ENABLE | 18295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_LIGHT_1_ENABLE_AMBIENT | 18305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_LIGHT_1_ENABLE_SPECULAR); 18315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 18325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul flag = (RADEON_LIGHT_0_ENABLE | 18335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_LIGHT_0_ENABLE_AMBIENT | 18345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_LIGHT_0_ENABLE_SPECULAR); 18355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (state) 18375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] |= flag; 18385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 18395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] &= ~flag; 18405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* 18425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 18435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul update_light_colors( ctx, p ); 18445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 18455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHTING: 18475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 18485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateSpecular(ctx); 18495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul check_twoside_fallback( ctx ); 18505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 18515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINE_SMOOTH: 18535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 18545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 18555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_ANTI_ALIAS_LINE; 18565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 18575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ANTI_ALIAS_LINE; 18585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 18605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINE_STIPPLE: 18625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 18635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 18645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_PATTERN_ENABLE; 18655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 18665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_PATTERN_ENABLE; 18675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 18695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_COLOR_LOGIC_OP: 18715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 187278bb0803cf722ad5273fc495791eb573bf8b4d21Michel Dänzer if ( ctx->Color._LogicOpEnabled ) { 18735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_ROP_ENABLE; 18745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 18755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE; 18765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 18785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NORMALIZE: 18805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 18815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 18825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_NORMALIZE_NORMALS; 18835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 18845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_NORMALIZE_NORMALS; 18855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 18875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POLYGON_OFFSET_POINT: 188930f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger RADEON_STATECHANGE( rmesa, set ); 189030f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger if ( state ) { 189130f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_ZBIAS_ENABLE_POINT; 189230f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger } else { 189330f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_POINT; 18945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 18965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POLYGON_OFFSET_LINE: 189830f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger RADEON_STATECHANGE( rmesa, set ); 189930f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger if ( state ) { 190030f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_ZBIAS_ENABLE_LINE; 190130f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger } else { 190230f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_LINE; 19035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 19055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POLYGON_OFFSET_FILL: 190730f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger RADEON_STATECHANGE( rmesa, set ); 190830f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger if ( state ) { 190930f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_ZBIAS_ENABLE_TRI; 191030f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger } else { 191130f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_TRI; 19125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 19145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POLYGON_SMOOTH: 19165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 19175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 19185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_ANTI_ALIAS_POLY; 19195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 19205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ANTI_ALIAS_POLY; 19215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 19235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POLYGON_STIPPLE: 19255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, ctx ); 19265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 19275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_STIPPLE_ENABLE; 19285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 19295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_STIPPLE_ENABLE; 19305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 19325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_RESCALE_NORMAL_EXT: { 19345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean tmp = ctx->_NeedEyeCoords ? state : !state; 19355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 19365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( tmp ) { 19375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_RESCALE_NORMALS; 19385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 19395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_RESCALE_NORMALS; 19405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 19425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SCISSOR_TEST: 19455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FIREVERTICES( rmesa ); 19465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->state.scissor.enabled = state; 19475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateScissor( ctx ); 19485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 19495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_STENCIL_TEST: 19515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->state.stencil.hwBuffer ) { 19525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 19535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 19545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_STENCIL_ENABLE; 19555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 19565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_STENCIL_ENABLE; 19575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 19595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_STENCIL, state ); 19605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 19625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_GEN_Q: 19645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_GEN_R: 19655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_GEN_S: 19665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_GEN_T: 19675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Picked up in radeonUpdateTextureState. 19685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 19695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->recheck_texgen[ctx->Texture.CurrentUnit] = GL_TRUE; 19705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 19715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_COLOR_SUM_EXT: 19735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateSpecular ( ctx ); 19745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 19755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 19775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 19785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 19805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonLightingSpaceChange( GLcontext *ctx ) 19835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 19845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 19855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean tmp; 19865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 19875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & DEBUG_STATE) 19895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s %d BEFORE %x\n", __FUNCTION__, ctx->_NeedEyeCoords, 19905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]); 19915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->_NeedEyeCoords) 19935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tmp = ctx->Transform.RescaleNormals; 19945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 19955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tmp = !ctx->Transform.RescaleNormals; 19965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( tmp ) { 19985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_RESCALE_NORMALS; 19995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 20005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_RESCALE_NORMALS; 20015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 20025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & DEBUG_STATE) 20045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s %d AFTER %x\n", __FUNCTION__, ctx->_NeedEyeCoords, 20055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]); 20065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 20075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 20095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Deferred state management - matrices, textures, other? 20105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 20115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2012a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheideggerstatic void texmat_set_texrect( radeonContextPtr rmesa, 2013a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger struct gl_texture_object *tObj, GLuint unit ) 2014a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger{ 2015a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger const struct gl_texture_image *baseImage = tObj->Image[0][tObj->BaseLevel]; 2016a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger _math_matrix_set_identity( &rmesa->tmpmat[unit] ); 2017a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger rmesa->tmpmat[unit].m[0] = 1.0 / baseImage->Width; 2018a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger rmesa->tmpmat[unit].m[5] = 1.0 / baseImage->Height; 2019a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger 2020a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger} 2021a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger 2022a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheideggerstatic void texmat_fixup_texrect( radeonContextPtr rmesa, 2023a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger struct gl_texture_object *tObj, GLuint unit ) 2024a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger{ 2025a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger const struct gl_texture_image *baseImage = tObj->Image[0][tObj->BaseLevel]; 2026a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger GLuint i; 2027a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger for (i = 0; i < 4; i++) { 2028a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger rmesa->tmpmat[unit].m[i] = rmesa->tmpmat[unit].m[i] / baseImage->Width; 2029a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger rmesa->tmpmat[unit].m[i+4] = rmesa->tmpmat[unit].m[i+4] / baseImage->Height; 2030a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger }} 2031a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger 2032a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger 203311f763f5057490477a2771febe8923682f6a5adaRoland Scheideggervoid radeonUploadTexMatrix( radeonContextPtr rmesa, 2034a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger int unit, GLboolean swapcols ) 2035a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger{ 2036a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger/* Here's how this works: on r100, only 3 tex coords can be submitted, so the 2037a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger vector looks like this probably: (s t r|q 0) (not sure if the last coord 2038a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger is hardwired to 0, could be 1 too). Interestingly, it actually looks like 2039a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger texgen generates all 4 coords, at least tests with projtex indicated that. 2040a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger So: if we need the q coord in the end (solely determined by the texture 2041a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger target, i.e. 2d / 1d / texrect targets) we swap the third and 4th row. 2042a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger Additionally, if we don't have texgen but 4 tex coords submitted, we swap 2043a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger column 3 and 4 (for the 2d / 1d / texrect targets) since the the q coord 2044a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger will get submitted in the "wrong", i.e. 3rd, slot. 2045a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger If an app submits 3 coords for 2d targets, we assume it is saving on vertex 2046a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger size and using the texture matrix to swap the r and q coords around (ut2k3 2047a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger does exactly that), so we don't need the 3rd / 4th column swap - still need 2048a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger the 3rd / 4th row swap of course. This will potentially break for apps which 2049a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger use TexCoord3x just for fun. Additionally, it will never work if an app uses 2050a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger an "advanced" texture matrix and relies on all 4 texcoord inputs to generate 2051a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger the maximum needed 3. This seems impossible to do with hw tcl on r100, and 2052a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger incredibly hard to detect so we can't just fallback in such a case. Assume 2053a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger it never happens... - rs 2054a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger*/ 2055a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger 2056a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger int idx = TEXMAT_0 + unit; 2057a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger float *dest = ((float *)RADEON_DB_STATE( mat[idx] )) + MAT_ELT_0; 2058a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger int i; 2059a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger struct gl_texture_unit tUnit = rmesa->glCtx->Texture.Unit[unit]; 206011f763f5057490477a2771febe8923682f6a5adaRoland Scheidegger GLfloat *src = rmesa->tmpmat[unit].m; 2061a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger 2062a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger rmesa->TexMatColSwap &= ~(1 << unit); 2063a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger if ((tUnit._ReallyEnabled & (TEXTURE_3D_BIT | TEXTURE_CUBE_BIT)) == 0) { 2064a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger if (swapcols) { 2065a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger rmesa->TexMatColSwap |= 1 << unit; 2066a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger /* attention some elems are swapped 2 times! */ 2067a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[0]; 2068a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[4]; 2069a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[12]; 2070a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[8]; 2071a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[1]; 2072a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[5]; 2073a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[13]; 2074a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[9]; 2075a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[2]; 2076a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[6]; 2077a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[15]; 2078a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[11]; 2079a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger /* those last 4 are probably never used */ 2080a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[3]; 2081a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[7]; 2082a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[14]; 2083a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[10]; 2084a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 2085a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger else { 2086a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger for (i = 0; i < 2; i++) { 2087a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i]; 2088a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i+4]; 2089a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i+8]; 2090a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i+12]; 2091a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 2092a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger for (i = 3; i >= 2; i--) { 2093a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i]; 2094a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i+4]; 2095a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i+8]; 2096a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i+12]; 2097a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 2098a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 2099a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 2100a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger else { 2101a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger /* never used currently - no swapping needed at all presumably */ 2102a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger for (i = 0 ; i < 4 ; i++) { 2103a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i]; 2104a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i+4]; 2105a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i+8]; 2106a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i+12]; 2107a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 2108a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 21095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2110a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] ); 2111a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger} 21125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void upload_matrix( radeonContextPtr rmesa, GLfloat *src, int idx ) 21155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 21165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul float *dest = ((float *)RADEON_DB_STATE( mat[idx] ))+MAT_ELT_0; 21175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int i; 21185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (i = 0 ; i < 4 ; i++) { 21215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *dest++ = src[i]; 21225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *dest++ = src[i+4]; 21235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *dest++ = src[i+8]; 21245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *dest++ = src[i+12]; 21255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 21265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] ); 21285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 21295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void upload_matrix_t( radeonContextPtr rmesa, GLfloat *src, int idx ) 21315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 21325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul float *dest = ((float *)RADEON_DB_STATE( mat[idx] ))+MAT_ELT_0; 21335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul memcpy(dest, src, 16*sizeof(float)); 21345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] ); 21355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 21365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void update_texturematrix( GLcontext *ctx ) 21395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 21405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT( ctx ); 21415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint tpc = rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL]; 21425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint vs = rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL]; 21435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int unit; 2144a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger GLuint texMatEnabled = 0; 2145a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger rmesa->NeedTexMatrix = 0; 2146a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger rmesa->TexMatColSwap = 0; 21475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 214830daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger for (unit = 0 ; unit < ctx->Const.MaxTextureUnits; unit++) { 2149a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger if (ctx->Texture.Unit[unit]._ReallyEnabled) { 2150a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger GLboolean needMatrix = GL_FALSE; 2151a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger if (ctx->TextureMatrixStack[unit].Top->type != MATRIX_IDENTITY) { 2152a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger needMatrix = GL_TRUE; 2153a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger texMatEnabled |= (RADEON_TEXGEN_TEXMAT_0_ENABLE | 2154a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger RADEON_TEXMAT_0_ENABLE) << unit; 2155a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger 2156a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger if (rmesa->TexGenEnabled & (RADEON_TEXMAT_0_ENABLE << unit)) { 2157a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger /* Need to preconcatenate any active texgen 2158a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger * obj/eyeplane matrices: 2159a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger */ 2160a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger _math_matrix_mul_matrix( &rmesa->tmpmat[unit], 216184c9e671edcc1358307879491bddef9f7d96f14bRoland Scheidegger ctx->TextureMatrixStack[unit].Top, 216284c9e671edcc1358307879491bddef9f7d96f14bRoland Scheidegger &rmesa->TexGenMatrix[unit] ); 2163a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 2164a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger else { 2165a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger _math_matrix_copy( &rmesa->tmpmat[unit], 2166a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger ctx->TextureMatrixStack[unit].Top ); 2167a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 216884c9e671edcc1358307879491bddef9f7d96f14bRoland Scheidegger } 2169a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger else if (rmesa->TexGenEnabled & (RADEON_TEXMAT_0_ENABLE << unit)) { 2170a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger _math_matrix_copy( &rmesa->tmpmat[unit], &rmesa->TexGenMatrix[unit] ); 2171a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger needMatrix = GL_TRUE; 2172a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 2173a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger if (ctx->Texture.Unit[unit]._ReallyEnabled == TEXTURE_RECT_BIT) { 2174a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger texMatEnabled |= (RADEON_TEXGEN_TEXMAT_0_ENABLE | 2175a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger RADEON_TEXMAT_0_ENABLE) << unit; 2176a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger if (needMatrix) 2177a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger texmat_fixup_texrect( rmesa, ctx->Texture.Unit[unit]._Current, unit ); 2178a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger else 2179a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger texmat_set_texrect( rmesa, ctx->Texture.Unit[unit]._Current, unit ); 2180a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger needMatrix = GL_TRUE; 2181a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 2182a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger if (needMatrix) { 2183a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger rmesa->NeedTexMatrix |= 1 << unit; 218411f763f5057490477a2771febe8923682f6a5adaRoland Scheidegger radeonUploadTexMatrix( rmesa, unit, 2185a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger !ctx->Texture.Unit[unit].TexGenEnabled ); 21865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 21875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 21885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 21895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2190a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger tpc = (texMatEnabled | rmesa->TexGenEnabled); 21915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 219230daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger /* TCL_TEX_COMPUTED_x is TCL_TEX_INPUT_x | 0x8 */ 219330daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger vs &= ~((RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_0_OUTPUT_SHIFT) | 219430daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger (RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_1_OUTPUT_SHIFT) | 219530daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger (RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_2_OUTPUT_SHIFT)); 219630daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger 219730daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger vs |= (((tpc & RADEON_TEXGEN_TEXMAT_0_ENABLE) << 219830daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger (RADEON_TCL_TEX_0_OUTPUT_SHIFT + 3)) | 219930daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger ((tpc & RADEON_TEXGEN_TEXMAT_1_ENABLE) << 220030daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger (RADEON_TCL_TEX_1_OUTPUT_SHIFT + 2)) | 220130daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger ((tpc & RADEON_TEXGEN_TEXMAT_2_ENABLE) << 220230daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger (RADEON_TCL_TEX_2_OUTPUT_SHIFT + 1))); 22035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 22045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (tpc != rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL] || 22055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul vs != rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL]) { 2206a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger 22075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 22085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL] = tpc; 22095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] = vs; 22105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 22115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 22125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 22135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2214982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul/** 2215982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul * Tell the card where to render (offset, pitch). 2216982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul * Effected by glDrawBuffer, etc 2217982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul */ 2218982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paulvoid 2219982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian PaulradeonUpdateDrawBuffer(GLcontext *ctx) 2220982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul{ 2221982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 2222982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul struct gl_framebuffer *fb = ctx->DrawBuffer; 2223982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul driRenderbuffer *drb; 2224982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul 2225982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul if (fb->_ColorDrawBufferMask[0] == BUFFER_BIT_FRONT_LEFT) { 2226982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul /* draw to front */ 2227982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul drb = (driRenderbuffer *) fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer; 2228982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul } 2229982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul else if (fb->_ColorDrawBufferMask[0] == BUFFER_BIT_BACK_LEFT) { 2230982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul /* draw to back */ 2231982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul drb = (driRenderbuffer *) fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer; 2232982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul } 2233982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul else { 2234982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul /* drawing to multiple buffers, or none */ 2235982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul return; 2236982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul } 2237982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul 2238982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul assert(drb); 2239982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul assert(drb->flippedPitch); 2240982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul 2241982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 2242982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul 2243982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul /* Note: we used the (possibly) page-flipped values */ 2244982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] 2245982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul = ((drb->flippedOffset + rmesa->radeonScreen->fbLocation) 2246982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul & RADEON_COLOROFFSET_MASK); 2247982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] = drb->flippedPitch; 2248982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul if (rmesa->sarea->tiling_enabled) { 2249982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] |= RADEON_COLOR_TILE_ENABLE; 2250982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul } 2251982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul} 2252982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul 22535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 22545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonValidateState( GLcontext *ctx ) 22555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 22565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 22575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint new_state = rmesa->NewGLState; 22585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2259982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul if (new_state & (_NEW_BUFFERS | _NEW_COLOR | _NEW_PIXEL)) { 2260982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul radeonUpdateDrawBuffer(ctx); 2261982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul } 2262982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul 22635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (new_state & _NEW_TEXTURE) { 22645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateTextureState( ctx ); 22655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul new_state |= rmesa->NewGLState; /* may add TEXTURE_MATRIX */ 22665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 22675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 22685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Need an event driven matrix update? 22695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 22705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (new_state & (_NEW_MODELVIEW|_NEW_PROJECTION)) 22715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul upload_matrix( rmesa, ctx->_ModelProjectMatrix.m, MODEL_PROJ ); 22725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 22735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Need these for lighting (shouldn't upload otherwise) 22745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 22755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (new_state & (_NEW_MODELVIEW)) { 22765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul upload_matrix( rmesa, ctx->ModelviewMatrixStack.Top->m, MODEL ); 22775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul upload_matrix_t( rmesa, ctx->ModelviewMatrixStack.Top->inv, MODEL_IT ); 22785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 22795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 22805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Does this need to be triggered on eg. modelview for 22815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * texgen-derived objplane/eyeplane matrices? 22825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 22835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (new_state & _NEW_TEXTURE_MATRIX) { 22845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul update_texturematrix( ctx ); 2285a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 22865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 22875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (new_state & (_NEW_LIGHT|_NEW_MODELVIEW|_MESA_NEW_NEED_EYE_COORDS)) { 22885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul update_light( ctx ); 22895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 22905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 22915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* emit all active clip planes if projection matrix changes. 22925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 22935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (new_state & (_NEW_PROJECTION)) { 22945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Transform.ClipPlanesEnabled) 22955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateClipPlanes( ctx ); 22965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 22975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 22985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 22995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->NewGLState = 0; 23005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 23015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 23025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 23035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonInvalidateState( GLcontext *ctx, GLuint new_state ) 23045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 23055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _swrast_InvalidateState( ctx, new_state ); 23065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _swsetup_InvalidateState( ctx, new_state ); 23075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _ac_InvalidateState( ctx, new_state ); 23085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _tnl_InvalidateState( ctx, new_state ); 23095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _ae_invalidate_state( ctx, new_state ); 23105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_CONTEXT(ctx)->NewGLState |= new_state; 23115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonVtxfmtInvalidate( ctx ); 23125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 23135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 231457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 231557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell/* A hack. Need a faster way to find this out. 231657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell */ 231757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwellstatic GLboolean check_material( GLcontext *ctx ) 231857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell{ 231957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell TNLcontext *tnl = TNL_CONTEXT(ctx); 232057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell GLint i; 232157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 232257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell for (i = _TNL_ATTRIB_MAT_FRONT_AMBIENT; 232357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell i < _TNL_ATTRIB_MAT_BACK_INDEXES; 232457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell i++) 232557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell if (tnl->vb.AttribPtr[i] && 232657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell tnl->vb.AttribPtr[i]->stride) 232757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell return GL_TRUE; 232857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 232957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell return GL_FALSE; 233057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell} 233157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 233257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 23335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonWrapRunPipeline( GLcontext *ctx ) 23345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 23355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 233657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell GLboolean has_material; 23375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 23385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (0) 23395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s, newstate: %x\n", __FUNCTION__, rmesa->NewGLState); 23405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 23415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Validate state: 23425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 23435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (rmesa->NewGLState) 23445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonValidateState( ctx ); 23455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 234657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell has_material = (ctx->Light.Enabled && check_material( ctx )); 234757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 234857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell if (has_material) { 23495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_MATERIAL, GL_TRUE ); 23505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 23515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 23525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Run the pipeline. 23535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 23545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _tnl_run_pipeline( ctx ); 23555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 235657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell if (has_material) { 23575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_MATERIAL, GL_FALSE ); 23585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 23595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 23605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 23615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 23625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Initialize the driver's state functions. 2363275a563bea0c0eef7bcd52ddc493803acf94c37eBrian Paul * Many of the ctx->Driver functions might have been initialized to 2364275a563bea0c0eef7bcd52ddc493803acf94c37eBrian Paul * software defaults in the earlier _mesa_init_driver_functions() call. 23655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 23665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonInitStateFuncs( GLcontext *ctx ) 23675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 23685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.UpdateState = radeonInvalidateState; 23695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.LightingSpaceChange = radeonLightingSpaceChange; 23705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 23715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.DrawBuffer = radeonDrawBuffer; 23725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ReadBuffer = radeonReadBuffer; 23735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 23745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.AlphaFunc = radeonAlphaFunc; 2375c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick ctx->Driver.BlendEquationSeparate = radeonBlendEquationSeparate; 23765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.BlendFuncSeparate = radeonBlendFuncSeparate; 23775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ClearColor = radeonClearColor; 23785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ClearDepth = radeonClearDepth; 23795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ClearIndex = NULL; 23805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ClearStencil = radeonClearStencil; 23815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ClipPlane = radeonClipPlane; 23825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ColorMask = radeonColorMask; 23835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.CullFace = radeonCullFace; 23845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.DepthFunc = radeonDepthFunc; 23855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.DepthMask = radeonDepthMask; 23865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.DepthRange = radeonDepthRange; 23875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Enable = radeonEnable; 23885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Fogfv = radeonFogfv; 23895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.FrontFace = radeonFrontFace; 23905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Hint = NULL; 23915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.IndexMask = NULL; 23925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.LightModelfv = radeonLightModelfv; 23935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Lightfv = radeonLightfv; 23945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.LineStipple = radeonLineStipple; 23955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.LineWidth = radeonLineWidth; 23965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.LogicOpcode = radeonLogicOpCode; 23975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.PolygonMode = radeonPolygonMode; 239830f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger ctx->Driver.PolygonOffset = radeonPolygonOffset; 23995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.PolygonStipple = radeonPolygonStipple; 24005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.RenderMode = radeonRenderMode; 24015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Scissor = radeonScissor; 24025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ShadeModel = radeonShadeModel; 2403878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul ctx->Driver.StencilFuncSeparate = radeonStencilFuncSeparate; 2404878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul ctx->Driver.StencilMaskSeparate = radeonStencilMaskSeparate; 2405878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul ctx->Driver.StencilOpSeparate = radeonStencilOpSeparate; 24065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Viewport = radeonViewport; 24075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 24085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange = radeonUpdateMaterial; 24095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TNL_CONTEXT(ctx)->Driver.RunPipeline = radeonWrapRunPipeline; 24105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 2411