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