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/context.h" 41ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/framebuffer.h" 4247941bfaea6e8a60e2c31f7a2c8c233f2a10ecb1Brian Paul#include "main/fbobject.h" 43bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen#include "main/simple_list.h" 44decc6e2a32ef49e673c081f30e19b8970155d887Brian Paul#include "main/state.h" 455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4680c88304fc9d09531b2530b74973821e47b46753Keith Whitwell#include "vbo/vbo.h" 475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/tnl.h" 485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_pipeline.h" 495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "swrast_setup/swrast_setup.h" 50e167403e5809c447870644bd9ea09fad369706cfAlex Deucher#include "drivers/common/meta.h" 515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_context.h" 5305304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie#include "radeon_mipmap_tree.h" 545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_ioctl.h" 555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_state.h" 565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tcl.h" 575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tex.h" 585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_swtcl.h" 595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 60f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonUpdateSpecular( struct gl_context *ctx ); 612d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger 625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Alpha blending 645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 66f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonAlphaFunc( struct gl_context *ctx, GLenum func, GLfloat ref ) 675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 684637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int pp_misc = rmesa->hw.ctx.cmd[CTX_PP_MISC]; 705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLubyte refByte; 715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLAMPED_FLOAT_TO_UBYTE(refByte, ref); 735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc &= ~(RADEON_ALPHA_TEST_OP_MASK | RADEON_REF_ALPHA_MASK); 775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= (refByte & RADEON_REF_ALPHA_MASK); 785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( func ) { 805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NEVER: 815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_FAIL; 825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LESS: 845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_LESS; 855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EQUAL: 875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_EQUAL; 885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LEQUAL: 905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_LEQUAL; 915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_GREATER: 935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_GREATER; 945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NOTEQUAL: 965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_NEQUAL; 975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_GEQUAL: 995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_GEQUAL; 1005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ALWAYS: 1025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul pp_misc |= RADEON_ALPHA_TEST_PASS; 1035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_MISC] = pp_misc; 1075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 1085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 109f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonBlendEquationSeparate( struct gl_context *ctx, 110c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick GLenum modeRGB, GLenum modeA ) 1115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 1124637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 1135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint b = rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] & ~RADEON_COMB_FCN_MASK; 1145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean fallback = GL_FALSE; 1155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 116c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick assert( modeRGB == modeA ); 117c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick 118c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick switch ( modeRGB ) { 1195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FUNC_ADD: 1205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LOGIC_OP: 1215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_COMB_FCN_ADD_CLAMP; 1225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FUNC_SUBTRACT: 1255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_COMB_FCN_SUB_CLAMP; 1265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 1295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Color.BlendEnabled) 1305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fallback = GL_TRUE; 1315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 1325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_COMB_FCN_ADD_CLAMP; 1335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_BLEND_EQ, fallback ); 1375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( !fallback ) { 1385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 1395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = b; 140888b1a9166abfb1b2873cf7c1eb2daf45a26c84fRoland Scheidegger if ( (ctx->Color.ColorLogicOpEnabled || (ctx->Color.BlendEnabled 14174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul && ctx->Color.Blend[0].EquationRGB == GL_LOGIC_OP)) ) { 1425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_ROP_ENABLE; 1435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 1445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE; 1455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 1485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 149f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonBlendFuncSeparate( struct gl_context *ctx, 15020a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick GLenum sfactorRGB, GLenum dfactorRGB, 15120a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick GLenum sfactorA, GLenum dfactorA ) 1525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 1534637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 1547dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle GLuint b = rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] & 1555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ~(RADEON_SRC_BLEND_MASK | RADEON_DST_BLEND_MASK); 1565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean fallback = GL_FALSE; 1575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul switch ( ctx->Color.Blend[0].SrcRGB ) { 1595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ZERO: 1605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ZERO; 1615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE: 1635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ONE; 1645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DST_COLOR: 1665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_DST_COLOR; 1675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_DST_COLOR: 1695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ONE_MINUS_DST_COLOR; 1705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SRC_COLOR: 1725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_SRC_COLOR; 1735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_SRC_COLOR: 1755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ONE_MINUS_SRC_COLOR; 1765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SRC_ALPHA: 1785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_SRC_ALPHA; 1795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_SRC_ALPHA: 1815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ONE_MINUS_SRC_ALPHA; 1825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DST_ALPHA: 1845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_DST_ALPHA; 1855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_DST_ALPHA: 1875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ONE_MINUS_DST_ALPHA; 1885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SRC_ALPHA_SATURATE: 1905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_SRC_ALPHA_SATURATE; 1915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CONSTANT_COLOR: 1935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_CONSTANT_COLOR: 1945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CONSTANT_ALPHA: 1955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_CONSTANT_ALPHA: 1965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Color.BlendEnabled) 1975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fallback = GL_TRUE; 1985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 1995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_SRC_BLEND_GL_ONE; 2005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 2025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul switch ( ctx->Color.Blend[0].DstRGB ) { 2065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ZERO: 2075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ZERO; 2085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE: 2105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ONE; 2115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SRC_COLOR: 2135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_SRC_COLOR; 2145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_SRC_COLOR: 2165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ONE_MINUS_SRC_COLOR; 2175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SRC_ALPHA: 2195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_SRC_ALPHA; 2205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_SRC_ALPHA: 2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ONE_MINUS_SRC_ALPHA; 2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DST_COLOR: 2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_DST_COLOR; 2265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_DST_COLOR: 2285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ONE_MINUS_DST_COLOR; 2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DST_ALPHA: 2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_DST_ALPHA; 2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_DST_ALPHA: 2345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ONE_MINUS_DST_ALPHA; 2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CONSTANT_COLOR: 2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_CONSTANT_COLOR: 2385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CONSTANT_ALPHA: 2395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ONE_MINUS_CONSTANT_ALPHA: 2405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Color.BlendEnabled) 2415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fallback = GL_TRUE; 2425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b |= RADEON_DST_BLEND_GL_ZERO; 2445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 2465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_BLEND_FUNC, fallback ); 2505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( !fallback ) { 2515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 2525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = b; 2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 2585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Depth testing 2595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 2605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 261f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonDepthFunc( struct gl_context *ctx, GLenum func ) 2625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 2634637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 2645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 2665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_Z_TEST_MASK; 2675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Depth.Func ) { 2695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NEVER: 2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_NEVER; 2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LESS: 2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_LESS; 2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EQUAL: 2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_EQUAL; 2775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LEQUAL: 2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_LEQUAL; 2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_GREATER: 2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_GREATER; 2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NOTEQUAL: 2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_NEQUAL; 2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_GEQUAL: 2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_GEQUAL; 2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ALWAYS: 2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_TEST_ALWAYS; 2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 297f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonDepthMask( struct gl_context *ctx, GLboolean flag ) 2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 2994637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 3005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 3015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( ctx->Depth.Mask ) { 3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_WRITE_ENABLE; 3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 3055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_Z_WRITE_ENABLE; 3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 3085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Fog 3125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 3135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 315f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonFogfv( struct gl_context *ctx, GLenum pname, const GLfloat *param ) 3165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 3174637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul union { int i; float f; } c, d; 319499f0685e8236eca410fce516de0e9bab7e25be8Brian Paul GLubyte col[4]; 3205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (pname) { 3225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FOG_MODE: 3235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (!ctx->Fog.Enabled) 3245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 3255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 3265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_TCL_FOG_MASK; 3275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (ctx->Fog.Mode) { 3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINEAR: 3295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_LINEAR; 3305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EXP: 3325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_EXP; 3335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EXP2: 3355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_EXP2; 3365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3402d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger /* fallthrough */ 3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FOG_DENSITY: 3422d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger case GL_FOG_START: 3432d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger case GL_FOG_END: 3442d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger if (!ctx->Fog.Enabled) 3452d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger return; 3462d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger c.i = rmesa->hw.fog.cmd[FOG_C]; 3472d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger d.i = rmesa->hw.fog.cmd[FOG_D]; 3485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (ctx->Fog.Mode) { 3495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EXP: 3505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = 0.0; 351512c994b92126a7575bb3cc327da40710b43f52cEric Anholt /* While this is the opposite sign from the DDK, it makes the fog test 352512c994b92126a7575bb3cc327da40710b43f52cEric Anholt * pass, and matches r200. 353512c994b92126a7575bb3cc327da40710b43f52cEric Anholt */ 354512c994b92126a7575bb3cc327da40710b43f52cEric Anholt d.f = -ctx->Fog.Density; 3555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EXP2: 3575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = 0.0; 3585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.f = -(ctx->Fog.Density * ctx->Fog.Density); 3595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3602d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger case GL_LINEAR: 3615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Fog.Start == ctx->Fog.End) { 3625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = 1.0F; 3635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul d.f = 1.0F; 3645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 3655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start); 366512c994b92126a7575bb3cc327da40710b43f52cEric Anholt /* While this is the opposite sign from the DDK, it makes the fog 367512c994b92126a7575bb3cc327da40710b43f52cEric Anholt * test pass, and matches r200. 368512c994b92126a7575bb3cc327da40710b43f52cEric Anholt */ 369512c994b92126a7575bb3cc327da40710b43f52cEric Anholt d.f = -1.0/(ctx->Fog.End-ctx->Fog.Start); 3705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3712d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger break; 3722d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger default: 3732d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger break; 3742d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger } 3752d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger if (c.i != rmesa->hw.fog.cmd[FOG_C] || d.i != rmesa->hw.fog.cmd[FOG_D]) { 3762d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger RADEON_STATECHANGE( rmesa, fog ); 3772d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger rmesa->hw.fog.cmd[FOG_C] = c.i; 3782d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger rmesa->hw.fog.cmd[FOG_D] = d.i; 3795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3817dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle case GL_FOG_COLOR: 3825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 383499f0685e8236eca410fce516de0e9bab7e25be8Brian Paul _mesa_unclamped_float_rgba_to_ubyte(col, ctx->Fog.Color ); 3842d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] &= ~RADEON_FOG_COLOR_MASK; 3852d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] |= 3865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonPackColor( 4, col[0], col[1], col[2], 0 ); 3875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3882d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger case GL_FOG_COORD_SRC: 3892d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger radeonUpdateSpecular( ctx ); 3905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 3915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 3925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 3975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Culling 3985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 400f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonCullFace( struct gl_context *ctx, GLenum unused ) 4015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 4024637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 4035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL]; 4045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint t = rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL]; 4055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s |= RADEON_FFACE_SOLID | RADEON_BFACE_SOLID; 4075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t &= ~(RADEON_CULL_FRONT | RADEON_CULL_BACK); 4085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( ctx->Polygon.CullFlag ) { 4105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Polygon.CullFaceMode ) { 4115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FRONT: 4125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s &= ~RADEON_FFACE_SOLID; 4135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t |= RADEON_CULL_FRONT; 4145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 4155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_BACK: 4165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s &= ~RADEON_BFACE_SOLID; 4175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t |= RADEON_CULL_BACK; 4185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 4195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FRONT_AND_BACK: 4205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s &= ~(RADEON_FFACE_SOLID | RADEON_BFACE_SOLID); 4215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t |= (RADEON_CULL_FRONT | RADEON_CULL_BACK); 4225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 4235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) { 4275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, set ); 4285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] = s; 4295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] != t ) { 4325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl ); 4335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] = t; 4345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 437f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonFrontFace( struct gl_context *ctx, GLenum mode ) 4385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 4394637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 440320b5abda5026f23f327c6f60c1b6287cc507e78smoki int cull_face = (mode == GL_CW) ? RADEON_FFACE_CULL_CW : RADEON_FFACE_CULL_CCW; 4415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, set ); 4435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_FFACE_CULL_DIR_MASK; 4445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 4465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_CULL_FRONT_IS_CCW; 4475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 44860e60bb3026a269fefe1cfd3312fdf3a7e4c595fMichel Dänzer /* Winding is inverted when rendering to FBO */ 44947941bfaea6e8a60e2c31f7a2c8c233f2a10ecb1Brian Paul if (ctx->DrawBuffer && _mesa_is_user_fbo(ctx->DrawBuffer)) 450320b5abda5026f23f327c6f60c1b6287cc507e78smoki cull_face = (mode == GL_CCW) ? RADEON_FFACE_CULL_CW : RADEON_FFACE_CULL_CCW; 451320b5abda5026f23f327c6f60c1b6287cc507e78smoki rmesa->hw.set.cmd[SET_SE_CNTL] |= cull_face; 45260e60bb3026a269fefe1cfd3312fdf3a7e4c595fMichel Dänzer 453320b5abda5026f23f327c6f60c1b6287cc507e78smoki if ( mode == GL_CCW ) 4545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_CULL_FRONT_IS_CCW; 4555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 4595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Line state 4605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 461f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonLineWidth( struct gl_context *ctx, GLfloat widthf ) 4625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 4634637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, lin ); 4665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, set ); 4675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Line width is stored in U6.4 format. 4695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 4705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] = (GLuint)(widthf * 16.0); 4715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( widthf > 1.0 ) { 4725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_WIDELINE_ENABLE; 4735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 4745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_WIDELINE_ENABLE; 4755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 478f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonLineStipple( struct gl_context *ctx, GLint factor, GLushort pattern ) 4795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 4804637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 4815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, lin ); 4837dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle rmesa->hw.lin.cmd[LIN_RE_LINE_PATTERN] = 4845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ((((GLuint)factor & 0xff) << 16) | ((GLuint)pattern)); 4855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 4895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Masks 4905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 491f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonColorMask( struct gl_context *ctx, 4925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean r, GLboolean g, 4935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean b, GLboolean a ) 4945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 4954637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 496504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie struct radeon_renderbuffer *rrb; 497504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie GLuint mask; 498504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie 499504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie rrb = radeon_get_colorbuffer(&rmesa->radeon); 500504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie if (!rrb) 501504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie return; 502504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie 503504d01b275169f019d375b4a8b5e935b9fd108d3Dave Airlie mask = radeonPackColor( rrb->cpp, 504fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul ctx->Color.ColorMask[0][RCOMP], 505fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul ctx->Color.ColorMask[0][GCOMP], 506fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul ctx->Color.ColorMask[0][BCOMP], 507fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul ctx->Color.ColorMask[0][ACOMP] ); 5085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] != mask ) { 5105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, msk ); 5115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] = mask; 5125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 5145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 5175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Polygon state 5185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 5195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 520f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonPolygonOffset( struct gl_context *ctx, 5215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat factor, GLfloat units ) 5225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5234637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 5248c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie const GLfloat depthScale = 1.0F / ctx->DrawBuffer->_DepthMaxF; 5258c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie float_ui32_type constant = { units * depthScale }; 52608e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger float_ui32_type factoru = { factor }; 5275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, zbs ); 52908e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_FACTOR] = factoru.ui32; 53008e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_CONSTANT] = constant.ui32; 5315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 5325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 533f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonPolygonMode( struct gl_context *ctx, GLenum face, GLenum mode ) 5345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5354637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 5365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean flag = (ctx->_TriangleCaps & DD_TRI_UNFILLED) != 0; 5375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Can't generally do unfilled via tcl, but some good special 5397dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle * cases work. 5405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 5415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_UNFILLED, flag); 5424637235183b80963536f2364e4d50fcb894886ddDave Airlie if (rmesa->radeon.TclFallback) { 5435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseRenderState( ctx ); 5445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseVertexState( ctx ); 5455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 5475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 5505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Rendering attributes 5515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 5525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * We really don't want to recalculate all this every time we bind a 5535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * texture. These things shouldn't change all that often, so it makes 5545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * sense to break them out of the core texture state update routines. 5555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 5565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Examine lighting and texture state to determine if separate specular 5585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * should be enabled. 5595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 560f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonUpdateSpecular( struct gl_context *ctx ) 5615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5624637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 5635a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell uint32_t p = rmesa->hw.ctx.cmd[CTX_PP_CNTL]; 5642d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger GLuint flag = 0; 5655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 5675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_SPECULAR; 5695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_DIFFUSE; 5705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] &= ~RADEON_TCL_VTX_PK_SPEC; 5715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] &= ~RADEON_TCL_VTX_PK_DIFFUSE; 5725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_LIGHTING_ENABLE; 5735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul p &= ~RADEON_SPECULAR_ENABLE; 5755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_DIFFUSE_SPECULAR_COMBINE; 5775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.Enabled && 5805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) { 5815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_SPECULAR; 5825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_DIFFUSE; 5835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC; 5845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE; 5855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE; 5865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul p |= RADEON_SPECULAR_ENABLE; 5877dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= 5885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ~RADEON_DIFFUSE_SPECULAR_COMBINE; 5895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else if (ctx->Light.Enabled) { 5915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_DIFFUSE; 5925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE; 5935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE; 5945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else if (ctx->Fog.ColorSumEnabled ) { 5955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC; 5965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE; 5975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul p |= RADEON_SPECULAR_ENABLE; 5985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 5995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE; 6005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Fog.Enabled) { 6035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC; 6042d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger if (ctx->Fog.FogCoordinateSource == GL_FRAGMENT_DEPTH) { 6052d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_SPECULAR; 6062d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger /* Bizzare: have to leave lighting enabled to get fog. */ 6072d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE; 6082d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger } 6092d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger else { 6102d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger /* cannot do tcl fog factor calculation with fog coord source 6112d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger * (send precomputed factors). Cannot use precomputed fog 6122d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger * factors together with tcl spec light (need tcl fallback) */ 6132d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger flag = (rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] & 6142d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger RADEON_TCL_COMPUTE_SPECULAR) != 0; 6152d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger } 6165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6177dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 6182d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_FOGCOORDSPEC, flag); 6195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 620decc6e2a32ef49e673c081f30e19b8970155d887Brian Paul if (_mesa_need_secondary_color(ctx)) { 6215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul assert( (p & RADEON_SPECULAR_ENABLE) != 0 ); 6225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 6235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul assert( (p & RADEON_SPECULAR_ENABLE) == 0 ); 6245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.ctx.cmd[CTX_PP_CNTL] != p ) { 6275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 6285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] = p; 6295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Update vertex/render formats 6325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6337dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle if (rmesa->radeon.TclFallback) { 6345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseRenderState( ctx ); 6355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseVertexState( ctx ); 6365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 6415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Materials 6425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6457dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle/* Update on colormaterial, material emmissive/ambient, 6465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * lightmodel.globalambient 6475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 648f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void update_global_ambient( struct gl_context *ctx ) 6495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6504637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 6515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul float *fcmd = (float *)RADEON_DB_STATE( glt ); 6525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Need to do more if both emmissive & ambient are PREMULT: 654f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger * Hope this is not needed for MULT 6555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ((rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] & 6575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ((3 << RADEON_EMISSIVE_SOURCE_SHIFT) | 6587dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle (3 << RADEON_AMBIENT_SOURCE_SHIFT))) == 0) 6595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 6607dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle COPY_3V( &fcmd[GLT_RED], 6615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_EMISSION]); 6625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ACC_SCALE_3V( &fcmd[GLT_RED], 6635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Light.Model.Ambient, 6645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT]); 6657dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle } 6665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 6675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 6685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_3V( &fcmd[GLT_RED], ctx->Light.Model.Ambient ); 6695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6707dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 6715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DB_STATECHANGE(rmesa, &rmesa->hw.glt); 6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6747dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle/* Update on change to 6755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * - light[p].colors 6765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * - light[p].enabled 6775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 678f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void update_light_colors( struct gl_context *ctx, GLuint p ) 6795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_light *l = &ctx->Light.Light[p]; 6815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* fprintf(stderr, "%s\n", __FUNCTION__); */ 6835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (l->Enabled) { 6854637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 6865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul float *fcmd = (float *)RADEON_DB_STATE( lit[p] ); 6875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6887dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle COPY_4V( &fcmd[LIT_AMBIENT_RED], l->Ambient ); 6895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_4V( &fcmd[LIT_DIFFUSE_RED], l->Diffuse ); 6905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_4V( &fcmd[LIT_SPECULAR_RED], l->Specular ); 6917dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] ); 6935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Also fallback for asym colormaterial mode in twoside lighting... 6975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 698f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void check_twoside_fallback( struct gl_context *ctx ) 6995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean fallback = GL_FALSE; 7015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint i; 7025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.Enabled && ctx->Light.Model.TwoSide) { 7045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.ColorMaterialEnabled && 7054cb3579e52fed48d623698610e31d05ac8c8946fBrian Paul (ctx->Light._ColorMaterialBitmask & BACK_MATERIAL_BITS) != 7064cb3579e52fed48d623698610e31d05ac8c8946fBrian Paul ((ctx->Light._ColorMaterialBitmask & FRONT_MATERIAL_BITS)<<1)) 7075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fallback = GL_TRUE; 7085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 7095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (i = MAT_ATTRIB_FRONT_AMBIENT; i < MAT_ATTRIB_FRONT_INDEXES; i+=2) 7105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (memcmp( ctx->Light.Material.Attrib[i], 7115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Light.Material.Attrib[i+1], 7125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul sizeof(GLfloat)*4) != 0) { 7137dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle fallback = GL_TRUE; 7145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 7155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_LIGHT_TWOSIDE, fallback ); 7205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 723f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonColorMaterial( struct gl_context *ctx, GLenum face, GLenum mode ) 7245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 7254637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 7265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint light_model_ctl1 = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]; 7275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 72827889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling light_model_ctl1 &= ~((3 << RADEON_EMISSIVE_SOURCE_SHIFT) | 72927889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling (3 << RADEON_AMBIENT_SOURCE_SHIFT) | 73027889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling (3 << RADEON_DIFFUSE_SOURCE_SHIFT) | 7317dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle (3 << RADEON_SPECULAR_SOURCE_SHIFT)); 7327dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 733f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger if (ctx->Light.ColorMaterialEnabled) { 7344cb3579e52fed48d623698610e31d05ac8c8946fBrian Paul GLuint mask = ctx->Light._ColorMaterialBitmask; 735f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger 7365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_EMISSION) { 73727889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE << 7385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_EMISSIVE_SOURCE_SHIFT); 7395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 740f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger else { 741f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << 742f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger RADEON_EMISSIVE_SOURCE_SHIFT); 743f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger } 7445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_AMBIENT) { 74627889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE << 7475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_AMBIENT_SOURCE_SHIFT); 7485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 749f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger else { 750f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << 751f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger RADEON_AMBIENT_SOURCE_SHIFT); 752f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger } 7537dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 7545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_DIFFUSE) { 75527889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE << 7565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DIFFUSE_SOURCE_SHIFT); 7575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 758f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger else { 759f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << 760f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger RADEON_DIFFUSE_SOURCE_SHIFT); 761f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger } 7627dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 7635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_SPECULAR) { 76427889274101df1c2dac05e9979d3b8002663bdc6Felix Kuehling light_model_ctl1 |= (RADEON_LM_SOURCE_VERTEX_DIFFUSE << 7655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_SPECULAR_SOURCE_SHIFT); 7665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 767f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger else { 768f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << 769f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger RADEON_SPECULAR_SOURCE_SHIFT); 770f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger } 771f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger } 772f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger else { 773f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger /* Default to MULT: 774f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger */ 775f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger light_model_ctl1 |= (RADEON_LM_SOURCE_STATE_MULT << RADEON_EMISSIVE_SOURCE_SHIFT) | 776f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger (RADEON_LM_SOURCE_STATE_MULT << RADEON_AMBIENT_SOURCE_SHIFT) | 777f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger (RADEON_LM_SOURCE_STATE_MULT << RADEON_DIFFUSE_SOURCE_SHIFT) | 778f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger (RADEON_LM_SOURCE_STATE_MULT << RADEON_SPECULAR_SOURCE_SHIFT); 779f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger } 7807dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 7815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (light_model_ctl1 != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]) { 7825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 7837dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] = light_model_ctl1; 7845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 787f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid radeonUpdateMaterial( struct gl_context *ctx ) 7885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 7894637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 7905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat (*mat)[4] = ctx->Light.Material.Attrib; 7915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( mtl ); 7925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint mask = ~0; 7937dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 7945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.ColorMaterialEnabled) 7954cb3579e52fed48d623698610e31d05ac8c8946fBrian Paul mask &= ~ctx->Light._ColorMaterialBitmask; 7965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7974e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen if (RADEON_DEBUG & RADEON_STATE) 7985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s\n", __FUNCTION__); 7995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8007dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 8015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_EMISSION) { 8025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_EMMISSIVE_RED] = mat[MAT_ATTRIB_FRONT_EMISSION][0]; 8035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_EMMISSIVE_GREEN] = mat[MAT_ATTRIB_FRONT_EMISSION][1]; 8045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_EMMISSIVE_BLUE] = mat[MAT_ATTRIB_FRONT_EMISSION][2]; 8055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_EMMISSIVE_ALPHA] = mat[MAT_ATTRIB_FRONT_EMISSION][3]; 8065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_AMBIENT) { 8085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_AMBIENT_RED] = mat[MAT_ATTRIB_FRONT_AMBIENT][0]; 8095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_AMBIENT_GREEN] = mat[MAT_ATTRIB_FRONT_AMBIENT][1]; 8105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_AMBIENT_BLUE] = mat[MAT_ATTRIB_FRONT_AMBIENT][2]; 8115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_AMBIENT_ALPHA] = mat[MAT_ATTRIB_FRONT_AMBIENT][3]; 8125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_DIFFUSE) { 8145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_DIFFUSE_RED] = mat[MAT_ATTRIB_FRONT_DIFFUSE][0]; 8155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_DIFFUSE_GREEN] = mat[MAT_ATTRIB_FRONT_DIFFUSE][1]; 8165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_DIFFUSE_BLUE] = mat[MAT_ATTRIB_FRONT_DIFFUSE][2]; 8175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_DIFFUSE_ALPHA] = mat[MAT_ATTRIB_FRONT_DIFFUSE][3]; 8185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_SPECULAR) { 8205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_SPECULAR_RED] = mat[MAT_ATTRIB_FRONT_SPECULAR][0]; 8215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_SPECULAR_GREEN] = mat[MAT_ATTRIB_FRONT_SPECULAR][1]; 8225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_SPECULAR_BLUE] = mat[MAT_ATTRIB_FRONT_SPECULAR][2]; 8235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_SPECULAR_ALPHA] = mat[MAT_ATTRIB_FRONT_SPECULAR][3]; 8245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mask & MAT_BIT_FRONT_SHININESS) { 8265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[MTL_SHININESS] = mat[MAT_ATTRIB_FRONT_SHININESS][0]; 8275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 829a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mtl ); 8305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 831a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer check_twoside_fallback( ctx ); 832f64f940281f0d716e0ddc641e7ef1728f143d67fRoland Scheidegger/* update_global_ambient( ctx );*/ 8335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 8345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* _NEW_LIGHT 8365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _NEW_MODELVIEW 8375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _MESA_NEW_NEED_EYE_COORDS 8385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 8395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Uses derived state from mesa: 8405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _VP_inf_norm 8415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _h_inf_norm 8425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _Position 8437391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul * _NormSpotDirection 8445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _ModelViewInvScale 8455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _NeedEyeCoords 8465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * _EyeZDir 8475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 8485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * which are calculated in light.c and are correct for the current 8495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * lighting space (model or eye), hence dependencies on _NEW_MODELVIEW 8507dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle * and _MESA_NEW_NEED_EYE_COORDS. 8515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 852f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void update_light( struct gl_context *ctx ) 8535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 8544637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 8555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Have to check these, or have an automatic shortcircuit mechanism 8575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * to remove noop statechanges. (Or just do a better job on the 8585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * front end). 8595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 8605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 8615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint tmp = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]; 8625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->_NeedEyeCoords) 8645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tmp &= ~RADEON_LIGHT_IN_MODELSPACE; 8655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 8665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tmp |= RADEON_LIGHT_IN_MODELSPACE; 8677dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 8685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Leave this test disabled: (unexplained q3 lockup) (even with 8705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul new packets) 8715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 8727dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle if (tmp != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]) 8735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 8745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 8755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] = tmp; 8765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 8805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( eye ); 8815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[EYE_X] = ctx->_EyeZDir[0]; 8825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[EYE_Y] = ctx->_EyeZDir[1]; 8835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[EYE_Z] = - ctx->_EyeZDir[2]; 8845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[EYE_RESCALE_FACTOR] = ctx->_ModelViewInvScale; 8855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.eye ); 8865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.Enabled) { 8915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint p; 8925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (p = 0 ; p < MAX_LIGHTS; p++) { 8935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.Light[p].Enabled) { 8945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_light *l = &ctx->Light.Light[p]; 8955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat *fcmd = (GLfloat *)RADEON_DB_STATE( lit[p] ); 8967dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 8975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (l->EyePosition[3] == 0.0) { 8987dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle COPY_3FV( &fcmd[LIT_POSITION_X], l->_VP_inf_norm ); 8997dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle COPY_3FV( &fcmd[LIT_DIRECTION_X], l->_h_inf_norm ); 9005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_POSITION_W] = 0; 9015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_DIRECTION_W] = 0; 9025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 9035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul COPY_4V( &fcmd[LIT_POSITION_X], l->_Position ); 9047391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul fcmd[LIT_DIRECTION_X] = -l->_NormSpotDirection[0]; 9057391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul fcmd[LIT_DIRECTION_Y] = -l->_NormSpotDirection[1]; 9067391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul fcmd[LIT_DIRECTION_Z] = -l->_NormSpotDirection[2]; 9075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_DIRECTION_W] = 0; 9085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] ); 9115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 9155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 916f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonLightfv( struct gl_context *ctx, GLenum light, 9175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLenum pname, const GLfloat *params ) 9185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 9194637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 9205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint p = light - GL_LIGHT0; 9215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_light *l = &ctx->Light.Light[p]; 9225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLfloat *fcmd = (GLfloat *)rmesa->hw.lit[p].cmd; 9237dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 9245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (pname) { 9267dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle case GL_AMBIENT: 9275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DIFFUSE: 9285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SPECULAR: 9295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul update_light_colors( ctx, p ); 9305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 9315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9327dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle case GL_SPOT_DIRECTION: 9337dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle /* picked up in update_light */ 9345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 9355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POSITION: { 9377dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle /* positions picked up in update_light, but can do flag here */ 9385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flag; 9395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2; 9405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* FIXME: Set RANGE_ATTEN only when needed */ 9427dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle if (p&1) 9435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul flag = RADEON_LIGHT_1_IS_LOCAL; 9445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 9455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul flag = RADEON_LIGHT_0_IS_LOCAL; 9465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 9485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (l->EyePosition[3] != 0.0F) 9495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[idx] |= flag; 9505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 9515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[idx] &= ~flag; 9525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 9535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SPOT_EXPONENT: 9565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, lit[p]); 9575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_SPOT_EXPONENT] = params[0]; 9585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 9595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SPOT_CUTOFF: { 9615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flag = (p&1) ? RADEON_LIGHT_1_IS_SPOT : RADEON_LIGHT_0_IS_SPOT; 9625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2; 9635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, lit[p]); 9655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_SPOT_CUTOFF] = l->_CosCutoff; 9665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 9685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (l->SpotCutoff != 180.0F) 9695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[idx] |= flag; 9705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 9715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[idx] &= ~flag; 9725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 9745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CONSTANT_ATTENUATION: 9775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, lit[p]); 9785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_ATTEN_CONST] = params[0]; 9795d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer if ( params[0] == 0.0 ) 9805d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer fcmd[LIT_ATTEN_CONST_INV] = FLT_MAX; 9815d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer else 9825d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer fcmd[LIT_ATTEN_CONST_INV] = 1.0 / params[0]; 9835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 9845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINEAR_ATTENUATION: 9855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, lit[p]); 9865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_ATTEN_LINEAR] = params[0]; 9875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 9885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_QUADRATIC_ATTENUATION: 9895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, lit[p]); 9905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fcmd[LIT_ATTEN_QUADRATIC] = params[0]; 9915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 9925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 9935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 9945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Set RANGE_ATTEN only when needed */ 9975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (pname) { 9985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POSITION: 9995d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer case GL_CONSTANT_ATTENUATION: 10005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINEAR_ATTENUATION: 10015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_QUADRATIC_ATTENUATION: 10025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 10035d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer GLuint *icmd = (GLuint *)RADEON_DB_STATE( tcl ); 10045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2; 10055d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer GLuint atten_flag = ( p&1 ) ? RADEON_LIGHT_1_ENABLE_RANGE_ATTEN 10065d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer : RADEON_LIGHT_0_ENABLE_RANGE_ATTEN; 10075d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer GLuint atten_const_flag = ( p&1 ) ? RADEON_LIGHT_1_CONSTANT_RANGE_ATTEN 10085d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer : RADEON_LIGHT_0_CONSTANT_RANGE_ATTEN; 10095d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer 10105d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer if ( l->EyePosition[3] == 0.0F || 10115d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer ( ( fcmd[LIT_ATTEN_CONST] == 0.0 || fcmd[LIT_ATTEN_CONST] == 1.0 ) && 10125d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) ) { 10135d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer /* Disable attenuation */ 10145d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer icmd[idx] &= ~atten_flag; 10155d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer } else { 10165d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer if ( fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) { 10175d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer /* Enable only constant portion of attenuation calculation */ 10185d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer icmd[idx] |= ( atten_flag | atten_const_flag ); 10195d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer } else { 10205d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer /* Enable full attenuation calculation */ 10215d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer icmd[idx] &= ~atten_const_flag; 10225d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer icmd[idx] |= atten_flag; 10235d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer } 10245d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer } 10255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10265d00e131d8a264498b8d050c3eded093ee5c42f2Michel Dänzer RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.tcl ); 10275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 10285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 10305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 10315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 10335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10347dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 10355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1037f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonLightModelfv( struct gl_context *ctx, GLenum pname, 10385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const GLfloat *param ) 10395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 10404637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 10415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (pname) { 10437dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle case GL_LIGHT_MODEL_AMBIENT: 10445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul update_global_ambient( ctx ); 10455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 10465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT_MODEL_LOCAL_VIEWER: 10485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 10495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.Model.LocalViewer) 10505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LOCAL_VIEWER; 10515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 10525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_LOCAL_VIEWER; 10535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 10545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT_MODEL_TWO_SIDE: 10565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 10575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Light.Model.TwoSide) 10585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_LIGHT_TWOSIDE; 10595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 10605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_LIGHT_TWOSIDE; 10615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul check_twoside_fallback( ctx ); 10635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10644637235183b80963536f2364e4d50fcb894886ddDave Airlie if (rmesa->radeon.TclFallback) { 10655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseRenderState( ctx ); 10665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseVertexState( ctx ); 10675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 10695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT_MODEL_COLOR_CONTROL: 10715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateSpecular(ctx); 10725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 10735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 10755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 10765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 10775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 10785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1079f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonShadeModel( struct gl_context *ctx, GLenum mode ) 10805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 10814637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 10825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL]; 10835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s &= ~(RADEON_DIFFUSE_SHADE_MASK | 10855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ALPHA_SHADE_MASK | 10865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_SPECULAR_SHADE_MASK | 10875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FOG_SHADE_MASK); 10885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 10895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( mode ) { 10905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FLAT: 10915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s |= (RADEON_DIFFUSE_SHADE_FLAT | 10925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ALPHA_SHADE_FLAT | 10935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_SPECULAR_SHADE_FLAT | 10945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FOG_SHADE_FLAT); 10955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 10965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SMOOTH: 10975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul s |= (RADEON_DIFFUSE_SHADE_GOURAUD | 10985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ALPHA_SHADE_GOURAUD | 10995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_SPECULAR_SHADE_GOURAUD | 11005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FOG_SHADE_GOURAUD); 11015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 11035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 11045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 11055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) { 11075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, set ); 11085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.set.cmd[SET_SE_CNTL] = s; 11095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 11105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 11115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 11145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * User clip planes 11155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 11165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1117f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonClipPlane( struct gl_context *ctx, GLenum plane, const GLfloat *eq ) 11185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 11195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint p = (GLint) plane - (GLint) GL_CLIP_PLANE0; 11204637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 11215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p]; 11225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ucp[p] ); 11245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_X] = ip[0]; 11255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1]; 11265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2]; 11275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_W] = ip[3]; 11285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 11295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1130f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonUpdateClipPlanes( struct gl_context *ctx ) 11315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 11324637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 11335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint p; 11345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (p = 0; p < ctx->Const.MaxClipPlanes; p++) { 11365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Transform.ClipPlanesEnabled & (1 << p)) { 11375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p]; 11385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ucp[p] ); 11405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_X] = ip[0]; 11415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1]; 11425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2]; 11435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ucp[p].cmd[UCP_W] = ip[3]; 11445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 11455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 11465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 11475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 11505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Stencil 11515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 11525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1153878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void 1154f9995b30756140724f41daf963fa06167912be7fKristian HøgsbergradeonStencilFuncSeparate( struct gl_context *ctx, GLenum face, GLenum func, 1155878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul GLint ref, GLuint mask ) 11565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 11574637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 115871b2504e0390fa19f133647c8686d830f8f40eb6Keith Whitwell GLuint refmask = (((ctx->Stencil.Ref[0] & 0xff) << RADEON_STENCIL_REF_SHIFT) | 115971b2504e0390fa19f133647c8686d830f8f40eb6Keith Whitwell ((ctx->Stencil.ValueMask[0] & 0xff) << RADEON_STENCIL_MASK_SHIFT)); 11605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 11625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, msk ); 11635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_STENCIL_TEST_MASK; 11655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~(RADEON_STENCIL_REF_MASK| 11665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STENCIL_VALUE_MASK); 11675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Stencil.Function[0] ) { 11695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NEVER: 11705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_NEVER; 11715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LESS: 11735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_LESS; 11745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_EQUAL: 11765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_EQUAL; 11775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LEQUAL: 11795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_LEQUAL; 11805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_GREATER: 11825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_GREATER; 11835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NOTEQUAL: 11855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_NEQUAL; 11865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_GEQUAL: 11885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_GEQUAL; 11895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ALWAYS: 11915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_TEST_ALWAYS; 11925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 11935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 11945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 11955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |= refmask; 11965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 11975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1198878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paulstatic void 1199f9995b30756140724f41daf963fa06167912be7fKristian HøgsbergradeonStencilMaskSeparate( struct gl_context *ctx, GLenum face, GLuint mask ) 12005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 12014637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 12025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, msk ); 12045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~RADEON_STENCIL_WRITE_MASK; 12055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |= 120671b2504e0390fa19f133647c8686d830f8f40eb6Keith Whitwell ((ctx->Stencil.WriteMask[0] & 0xff) << RADEON_STENCIL_WRITEMASK_SHIFT); 12075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 12085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1209f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonStencilOpSeparate( struct gl_context *ctx, GLenum face, GLenum fail, 1210878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul GLenum zfail, GLenum zpass ) 12115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 12124637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 12135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1214de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger /* radeon 7200 have stencil bug, DEC and INC_WRAP will actually both do DEC_WRAP, 1215de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger and DEC_WRAP (and INVERT) will do INVERT. No way to get correct INC_WRAP and DEC, 1216de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger but DEC_WRAP can be fixed by using DEC and INC_WRAP at least use INC. */ 12177dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 1218de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger GLuint tempRADEON_STENCIL_FAIL_DEC_WRAP; 1219de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger GLuint tempRADEON_STENCIL_FAIL_INC_WRAP; 1220de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger GLuint tempRADEON_STENCIL_ZFAIL_DEC_WRAP; 1221de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger GLuint tempRADEON_STENCIL_ZFAIL_INC_WRAP; 1222de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger GLuint tempRADEON_STENCIL_ZPASS_DEC_WRAP; 1223de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger GLuint tempRADEON_STENCIL_ZPASS_INC_WRAP; 12247dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 12254637235183b80963536f2364e4d50fcb894886ddDave Airlie if (rmesa->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_BROKEN_STENCIL) { 1226de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_FAIL_DEC_WRAP = RADEON_STENCIL_FAIL_DEC; 1227de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_FAIL_INC_WRAP = RADEON_STENCIL_FAIL_INC; 1228de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_ZFAIL_DEC_WRAP = RADEON_STENCIL_ZFAIL_DEC; 1229de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_ZFAIL_INC_WRAP = RADEON_STENCIL_ZFAIL_INC; 1230de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_ZPASS_DEC_WRAP = RADEON_STENCIL_ZPASS_DEC; 1231de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_ZPASS_INC_WRAP = RADEON_STENCIL_ZPASS_INC; 1232de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger } 1233de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger else { 1234de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_FAIL_DEC_WRAP = RADEON_STENCIL_FAIL_DEC_WRAP; 1235de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_FAIL_INC_WRAP = RADEON_STENCIL_FAIL_INC_WRAP; 1236de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_ZFAIL_DEC_WRAP = RADEON_STENCIL_ZFAIL_DEC_WRAP; 1237de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_ZFAIL_INC_WRAP = RADEON_STENCIL_ZFAIL_INC_WRAP; 1238de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_ZPASS_DEC_WRAP = RADEON_STENCIL_ZPASS_DEC_WRAP; 1239de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger tempRADEON_STENCIL_ZPASS_INC_WRAP = RADEON_STENCIL_ZPASS_INC_WRAP; 1240de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger } 12417dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 12425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 12435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~(RADEON_STENCIL_FAIL_MASK | 12445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STENCIL_ZFAIL_MASK | 12455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STENCIL_ZPASS_MASK); 12465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Stencil.FailFunc[0] ) { 12485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_KEEP: 12495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_KEEP; 12505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 12515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ZERO: 12525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_ZERO; 12535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 12545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_REPLACE: 12555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_REPLACE; 12565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 12575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INCR: 12585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_INC; 12595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 12605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DECR: 12615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_DEC; 12625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1263de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger case GL_INCR_WRAP: 1264de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_FAIL_INC_WRAP; 1265de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger break; 1266de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger case GL_DECR_WRAP: 1267de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_FAIL_DEC_WRAP; 1268de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger break; 12695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INVERT: 12705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_FAIL_INVERT; 12715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 12725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 12735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 12745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Stencil.ZFailFunc[0] ) { 12755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_KEEP: 12765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_KEEP; 12775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 12785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ZERO: 12795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_ZERO; 12805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 12815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_REPLACE: 12825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_REPLACE; 12835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 12845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INCR: 12855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_INC; 12865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 12875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DECR: 12885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_DEC; 12895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1290de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger case GL_INCR_WRAP: 1291de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZFAIL_INC_WRAP; 1292de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger break; 1293de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger case GL_DECR_WRAP: 1294de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZFAIL_DEC_WRAP; 1295de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger break; 12965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INVERT: 12975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZFAIL_INVERT; 12985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 12995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 13005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 13015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( ctx->Stencil.ZPassFunc[0] ) { 13025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_KEEP: 13035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_KEEP; 13045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ZERO: 13065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_ZERO; 13075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_REPLACE: 13095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_REPLACE; 13105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INCR: 13125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_INC; 13135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DECR: 13155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_DEC; 13165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1317de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger case GL_INCR_WRAP: 1318de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZPASS_INC_WRAP; 1319de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger break; 1320de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger case GL_DECR_WRAP: 1321de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= tempRADEON_STENCIL_ZPASS_DEC_WRAP; 1322de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger break; 13235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INVERT: 13245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_STENCIL_ZPASS_INVERT; 13255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 13265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 13275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 13285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 13295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 13305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 13315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 13325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Window position and viewport transformation 13335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 13345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 13355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* 13365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * To correctly position primitives: 13375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 13385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define SUBPIXEL_X 0.125 13395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define SUBPIXEL_Y 0.125 13405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 134116e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul 134216e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul/** 134316e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul * Called when window size or position changes or viewport or depth range 134416e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul * state is changed. We update the hardware viewport state here. 134516e7aebfe39bdd9c9fecb03ca3b0b617c2b449c8Brian Paul */ 1346f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid radeonUpdateWindow( struct gl_context *ctx ) 13475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 13484637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 1349d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIdrawable *dPriv = radeon_get_drawable(&rmesa->radeon); 1350d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg GLfloat xoffset = 0.0; 1351d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg GLfloat yoffset = dPriv ? (GLfloat) dPriv->h : 0; 13525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const GLfloat *v = ctx->Viewport._WindowMap.m; 135347941bfaea6e8a60e2c31f7a2c8c233f2a10ecb1Brian Paul const GLboolean render_to_fbo = (ctx->DrawBuffer ? _mesa_is_user_fbo(ctx->DrawBuffer) : 0); 13548c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie const GLfloat depthScale = 1.0F / ctx->DrawBuffer->_DepthMaxF; 13556c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie GLfloat y_scale, y_bias; 13566c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie 13576c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie if (render_to_fbo) { 13586c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie y_scale = 1.0; 13596c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie y_bias = 0; 13606c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie } else { 13616c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie y_scale = -1.0; 13626c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie y_bias = yoffset; 13636c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie } 13645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 136508e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger float_ui32_type sx = { v[MAT_SX] }; 136608e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger float_ui32_type tx = { v[MAT_TX] + xoffset + SUBPIXEL_X }; 13676c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie float_ui32_type sy = { v[MAT_SY] * y_scale }; 13686c48c93a5358ab04d6779afb14203bd1680a37a0Dave Airlie float_ui32_type ty = { (v[MAT_TY] * y_scale) + y_bias + SUBPIXEL_Y }; 13698c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie float_ui32_type sz = { v[MAT_SZ] * depthScale }; 13708c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie float_ui32_type tz = { v[MAT_TZ] * depthScale }; 137108e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger 13725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, vpt ); 13735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 137408e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE] = sx.ui32; 137508e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = tx.ui32; 137608e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE] = sy.ui32; 137708e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = ty.ui32; 137808e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE] = sz.ui32; 137908e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = tz.ui32; 13805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 13815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 13825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1383f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonViewport( struct gl_context *ctx, GLint x, GLint y, 13845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLsizei width, GLsizei height ) 13855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 13865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Don't pipeline viewport changes, conflict with window offset 13875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * setting below. Could apply deltas to rescue pipelined viewport 13885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * values, or keep the originals hanging around. 13895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 13905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateWindow( ctx ); 13912b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie 13922b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie radeon_viewport(ctx, x, y, width, height); 13935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 13945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1395f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonDepthRange( struct gl_context *ctx, GLclampd nearval, 13965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLclampd farval ) 13975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 13985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateWindow( ctx ); 13995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 14005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1401f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid radeonUpdateViewportOffset( struct gl_context *ctx ) 14025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 14034637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 1404d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIdrawable *dPriv = radeon_get_drawable(&rmesa->radeon); 1405d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg GLfloat xoffset = 0.0; 1406d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg GLfloat yoffset = (GLfloat)dPriv->h; 14075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const GLfloat *v = ctx->Viewport._WindowMap.m; 14085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 140908e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger float_ui32_type tx; 141008e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger float_ui32_type ty; 141108e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger 141208e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger tx.f = v[MAT_TX] + xoffset + SUBPIXEL_X; 141308e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger ty.f = (- v[MAT_TY]) + yoffset + SUBPIXEL_Y; 14145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 141508e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger if ( rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] != tx.ui32 || 141608e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] != ty.ui32 ) 14175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 14185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Note: this should also modify whatever data the context reset 14195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * code uses... 14205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 142108e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger RADEON_STATECHANGE( rmesa, vpt ); 142208e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = tx.ui32; 142308e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = ty.ui32; 142408e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger 14255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* update polygon stipple x/y screen offset */ 14265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 14275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint stx, sty; 14285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint m = rmesa->hw.msc.cmd[MSC_RE_MISC]; 14295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul m &= ~(RADEON_STIPPLE_X_OFFSET_MASK | 14315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STIPPLE_Y_OFFSET_MASK); 14325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* add magic offsets, then invert */ 1434d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg stx = 31 - ((-1) & RADEON_STIPPLE_COORD_MASK); 1435d24b81e0e0f4109f3256dc45b0adc5ffd59fb749Kristian Høgsberg sty = 31 - ((dPriv->h - 1) 14365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul & RADEON_STIPPLE_COORD_MASK); 14375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul m |= ((stx << RADEON_STIPPLE_X_OFFSET_SHIFT) | 14395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (sty << RADEON_STIPPLE_Y_OFFSET_SHIFT)); 14405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.msc.cmd[MSC_RE_MISC] != m ) { 14425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, msc ); 14435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msc.cmd[MSC_RE_MISC] = m; 14445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 14455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 14465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 14475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateScissor( ctx ); 14495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 14505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 14545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Miscellaneous 14555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 14565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1457f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonRenderMode( struct gl_context *ctx, GLenum mode ) 14585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 14594637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 14605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_RENDER_MODE, (mode != GL_RENDER) ); 14615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 14625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic GLuint radeon_rop_tab[] = { 14655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_CLEAR, 14665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_AND, 14675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_AND_REVERSE, 14685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_COPY, 14695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_AND_INVERTED, 14705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_NOOP, 14715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_XOR, 14725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_OR, 14735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_NOR, 14745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_EQUIV, 14755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_INVERT, 14765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_OR_REVERSE, 14775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_COPY_INVERTED, 14785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_OR_INVERTED, 14795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_NAND, 14805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_ROP_SET, 14815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}; 14825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1483f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonLogicOpCode( struct gl_context *ctx, GLenum opcode ) 14845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 14854637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 14865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint rop = (GLuint)opcode - GL_CLEAR; 14875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ASSERT( rop < 16 ); 14895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, msk ); 14915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.msk.cmd[MSK_RB3D_ROPCNTL] = radeon_rop_tab[rop]; 14925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 14935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 14945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 14955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * State enable/disable 14965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 14975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1498f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonEnable( struct gl_context *ctx, GLenum cap, GLboolean state ) 14995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 15004637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 15015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint p, flag; 15025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15034e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen if ( RADEON_DEBUG & RADEON_STATE ) 15045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf( stderr, "%s( %s = %s )\n", __FUNCTION__, 15055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_lookup_enum_by_nr( cap ), 15065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul state ? "GL_TRUE" : "GL_FALSE" ); 15075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( cap ) { 15095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Fast track this one... 15105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 15115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_1D: 15125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_2D: 15135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_3D: 15145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 15155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ALPHA_TEST: 15175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 15185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (state) { 15195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_ALPHA_TEST_ENABLE; 15205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 15215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ALPHA_TEST_ENABLE; 15225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 15235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 15245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_BLEND: 15265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 15275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (state) { 15285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_ALPHA_BLEND_ENABLE; 15295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 15305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ALPHA_BLEND_ENABLE; 15315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1532888b1a9166abfb1b2873cf7c1eb2daf45a26c84fRoland Scheidegger if ( (ctx->Color.ColorLogicOpEnabled || (ctx->Color.BlendEnabled 153374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul && ctx->Color.Blend[0].EquationRGB == GL_LOGIC_OP)) ) { 15345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_ROP_ENABLE; 15355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 15365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE; 15375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 15385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Catch a possible fallback: 15405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 15415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (state) { 1542c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick ctx->Driver.BlendEquationSeparate( ctx, 154374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul ctx->Color.Blend[0].EquationRGB, 154474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul ctx->Color.Blend[0].EquationA ); 154574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul ctx->Driver.BlendFuncSeparate( ctx, ctx->Color.Blend[0].SrcRGB, 154674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul ctx->Color.Blend[0].DstRGB, 154774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul ctx->Color.Blend[0].SrcA, 154874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul ctx->Color.Blend[0].DstA ); 15495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 15505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 15515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_BLEND_FUNC, GL_FALSE ); 15525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul FALLBACK( rmesa, RADEON_FALLBACK_BLEND_EQ, GL_FALSE ); 15535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 15545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 15555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLIP_PLANE0: 15575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLIP_PLANE1: 15585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLIP_PLANE2: 15595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLIP_PLANE3: 15605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLIP_PLANE4: 15617dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle case GL_CLIP_PLANE5: 15625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul p = cap-GL_CLIP_PLANE0; 15635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 15645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (state) { 15655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= (RADEON_UCP_ENABLE_0<<p); 15665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonClipPlane( ctx, cap, NULL ); 15675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 15685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 15695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~(RADEON_UCP_ENABLE_0<<p); 15705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 15715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 15725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_COLOR_MATERIAL: 15745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonColorMaterial( ctx, 0, 0 ); 1575a2c97eb2ffad0471aae34ab185461774318a57d6Michel Dänzer radeonUpdateMaterial( ctx ); 15765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 15775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CULL_FACE: 15795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonCullFace( ctx, 0 ); 15805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 15815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DEPTH_TEST: 15835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, ctx ); 15845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 15855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_Z_ENABLE; 15865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 15875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_Z_ENABLE; 15885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 15895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 15905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_DITHER: 15925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, ctx ); 15935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 15945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_DITHER_ENABLE; 1595d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~rmesa->radeon.state.color.roundEnable; 15965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 15975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_DITHER_ENABLE; 1598d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= rmesa->radeon.state.color.roundEnable; 15995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 16005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 16015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_FOG: 16035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, ctx ); 16045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 16055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_FOG_ENABLE; 16062c28dd892cfb43445d7e54df8b6a8331192f4e99Brian Paul radeonFogfv( ctx, GL_FOG_MODE, NULL ); 16075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 16085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_FOG_ENABLE; 16095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 16105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_TCL_FOG_MASK; 16115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 16125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateSpecular( ctx ); /* for PK_SPEC */ 16135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_allow_light_in_model( ctx, !state ); 16145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 16155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT0: 16175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT1: 16185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT2: 16195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT3: 16205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT4: 16215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT5: 16225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT6: 16235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHT7: 16245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 16255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul p = cap - GL_LIGHT0; 16267dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle if (p&1) 16275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul flag = (RADEON_LIGHT_1_ENABLE | 16287dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle RADEON_LIGHT_1_ENABLE_AMBIENT | 16295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_LIGHT_1_ENABLE_SPECULAR); 16305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 16315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul flag = (RADEON_LIGHT_0_ENABLE | 16327dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle RADEON_LIGHT_0_ENABLE_AMBIENT | 16335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_LIGHT_0_ENABLE_SPECULAR); 16345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (state) 16365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] |= flag; 16375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 16385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] &= ~flag; 16395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16407dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle /* 16415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 16425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul update_light_colors( ctx, p ); 16435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 16445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LIGHTING: 16465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 16475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateSpecular(ctx); 16485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul check_twoside_fallback( ctx ); 16495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 16505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINE_SMOOTH: 16525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 16535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 16545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_ANTI_ALIAS_LINE; 16555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 16565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ANTI_ALIAS_LINE; 16575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 16585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 16595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINE_STIPPLE: 16615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 16625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 16635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_PATTERN_ENABLE; 16645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 16655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_PATTERN_ENABLE; 16665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 16675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 16685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_COLOR_LOGIC_OP: 16705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 1671888b1a9166abfb1b2873cf7c1eb2daf45a26c84fRoland Scheidegger if ( (ctx->Color.ColorLogicOpEnabled || (ctx->Color.BlendEnabled 167274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul && ctx->Color.Blend[0].EquationRGB == GL_LOGIC_OP)) ) { 16735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_ROP_ENABLE; 16745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 16755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE; 16765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 16775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 16787dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 16795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NORMALIZE: 16805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 16815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 16825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_NORMALIZE_NORMALS; 16835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 16845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_NORMALIZE_NORMALS; 16855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 16865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 16875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POLYGON_OFFSET_POINT: 168930f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger RADEON_STATECHANGE( rmesa, set ); 169030f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger if ( state ) { 169130f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_ZBIAS_ENABLE_POINT; 169230f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger } else { 169330f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_POINT; 16945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 16955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 16965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 16975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POLYGON_OFFSET_LINE: 169830f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger RADEON_STATECHANGE( rmesa, set ); 169930f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger if ( state ) { 170030f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_ZBIAS_ENABLE_LINE; 170130f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger } else { 170230f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_LINE; 17035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POLYGON_OFFSET_FILL: 170730f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger RADEON_STATECHANGE( rmesa, set ); 170830f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger if ( state ) { 170930f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger rmesa->hw.set.cmd[SET_SE_CNTL] |= RADEON_ZBIAS_ENABLE_TRI; 171030f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger } else { 171130f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_TRI; 17125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POLYGON_SMOOTH: 17165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, ctx ); 17175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 17185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_ANTI_ALIAS_POLY; 17195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 17205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ANTI_ALIAS_POLY; 17215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_POLYGON_STIPPLE: 17255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, ctx ); 17265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( state ) { 17275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_STIPPLE_ENABLE; 17285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 17295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_STIPPLE_ENABLE; 17305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_RESCALE_NORMAL_EXT: { 17345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean tmp = ctx->_NeedEyeCoords ? state : !state; 17355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 17365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( tmp ) { 17375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_RESCALE_NORMALS; 17385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 17395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_RESCALE_NORMALS; 17405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_SCISSOR_TEST: 17451090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie radeon_firevertices(&rmesa->radeon); 1746d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie rmesa->radeon.state.scissor.enabled = state; 17475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateScissor( ctx ); 17485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_STENCIL_TEST: 17518c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie { 17528c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie GLboolean hw_stencil = GL_FALSE; 17538c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie if (ctx->DrawBuffer) { 17548c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie struct radeon_renderbuffer *rrbStencil 17558c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie = radeon_get_renderbuffer(ctx->DrawBuffer, BUFFER_STENCIL); 17568c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie hw_stencil = (rrbStencil && rrbStencil->bo); 17578c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie } 17588c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie 17598c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie if (hw_stencil) { 17608c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie RADEON_STATECHANGE( rmesa, ctx ); 17618c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie if ( state ) { 17628c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_STENCIL_ENABLE; 17638c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie } else { 17648c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_STENCIL_ENABLE; 17658c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie } 17665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 17678c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie FALLBACK( rmesa, RADEON_FALLBACK_STENCIL, state ); 17685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_GEN_Q: 17735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_GEN_R: 17745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_GEN_S: 17755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_GEN_T: 17765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Picked up in radeonUpdateTextureState. 17775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 17787dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle rmesa->recheck_texgen[ctx->Texture.CurrentUnit] = GL_TRUE; 17795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_COLOR_SUM_EXT: 17825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateSpecular ( ctx ); 17835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 17845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 17865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 17875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 17885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 17895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1791f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonLightingSpaceChange( struct gl_context *ctx ) 17925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 17934637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 17945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean tmp; 17955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tcl ); 17965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 17974e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen if (RADEON_DEBUG & RADEON_STATE) 17985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s %d BEFORE %x\n", __FUNCTION__, ctx->_NeedEyeCoords, 17995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]); 18005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->_NeedEyeCoords) 18025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tmp = ctx->Transform.RescaleNormals; 18035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 18045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tmp = !ctx->Transform.RescaleNormals; 18055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( tmp ) { 18075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_RESCALE_NORMALS; 18085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 18095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_RESCALE_NORMALS; 18105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 18115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18124e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen if (RADEON_DEBUG & RADEON_STATE) 18135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s %d AFTER %x\n", __FUNCTION__, ctx->_NeedEyeCoords, 18145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]); 18155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 18165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 18175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 18185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Deferred state management - matrices, textures, other? 18195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 18205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1821a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger 18224637235183b80963536f2364e4d50fcb894886ddDave Airlievoid radeonUploadTexMatrix( r100ContextPtr rmesa, 1823a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger int unit, GLboolean swapcols ) 1824a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger{ 1825a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger/* Here's how this works: on r100, only 3 tex coords can be submitted, so the 1826a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger vector looks like this probably: (s t r|q 0) (not sure if the last coord 1827a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger is hardwired to 0, could be 1 too). Interestingly, it actually looks like 1828a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger texgen generates all 4 coords, at least tests with projtex indicated that. 1829a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger So: if we need the q coord in the end (solely determined by the texture 1830a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger target, i.e. 2d / 1d / texrect targets) we swap the third and 4th row. 1831a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger Additionally, if we don't have texgen but 4 tex coords submitted, we swap 1832fab1f07d6ad01463897ae792f4b33738afb07369Jeff Smith column 3 and 4 (for the 2d / 1d / texrect targets) since the q coord 1833a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger will get submitted in the "wrong", i.e. 3rd, slot. 1834a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger If an app submits 3 coords for 2d targets, we assume it is saving on vertex 1835a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger size and using the texture matrix to swap the r and q coords around (ut2k3 1836a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger does exactly that), so we don't need the 3rd / 4th column swap - still need 1837a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger the 3rd / 4th row swap of course. This will potentially break for apps which 1838a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger use TexCoord3x just for fun. Additionally, it will never work if an app uses 1839a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger an "advanced" texture matrix and relies on all 4 texcoord inputs to generate 1840a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger the maximum needed 3. This seems impossible to do with hw tcl on r100, and 1841a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger incredibly hard to detect so we can't just fallback in such a case. Assume 1842a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger it never happens... - rs 1843a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger*/ 1844a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger 1845a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger int idx = TEXMAT_0 + unit; 1846a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger float *dest = ((float *)RADEON_DB_STATE( mat[idx] )) + MAT_ELT_0; 1847a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger int i; 18484637235183b80963536f2364e4d50fcb894886ddDave Airlie struct gl_texture_unit tUnit = rmesa->radeon.glCtx->Texture.Unit[unit]; 184911f763f5057490477a2771febe8923682f6a5adaRoland Scheidegger GLfloat *src = rmesa->tmpmat[unit].m; 1850a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger 1851a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger rmesa->TexMatColSwap &= ~(1 << unit); 1852a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger if ((tUnit._ReallyEnabled & (TEXTURE_3D_BIT | TEXTURE_CUBE_BIT)) == 0) { 1853a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger if (swapcols) { 1854a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger rmesa->TexMatColSwap |= 1 << unit; 1855a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger /* attention some elems are swapped 2 times! */ 1856a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[0]; 1857a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[4]; 1858a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[12]; 1859a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[8]; 1860a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[1]; 1861a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[5]; 1862a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[13]; 1863a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[9]; 1864a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[2]; 1865a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[6]; 1866a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[15]; 1867a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[11]; 1868a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger /* those last 4 are probably never used */ 1869a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[3]; 1870a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[7]; 1871a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[14]; 1872a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[10]; 1873a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 1874a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger else { 1875a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger for (i = 0; i < 2; i++) { 1876a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i]; 1877a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i+4]; 1878a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i+8]; 1879a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i+12]; 1880a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 1881a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger for (i = 3; i >= 2; i--) { 1882a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i]; 1883a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i+4]; 1884a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i+8]; 1885a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i+12]; 1886a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 1887a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 1888a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 1889a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger else { 1890a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger for (i = 0 ; i < 4 ; i++) { 1891a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i]; 1892a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i+4]; 1893a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i+8]; 1894a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger *dest++ = src[i+12]; 1895a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 1896a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 18975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1898a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] ); 1899a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger} 19005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19024637235183b80963536f2364e4d50fcb894886ddDave Airliestatic void upload_matrix( r100ContextPtr rmesa, GLfloat *src, int idx ) 19035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 19045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul float *dest = ((float *)RADEON_DB_STATE( mat[idx] ))+MAT_ELT_0; 19055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int i; 19065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (i = 0 ; i < 4 ; i++) { 19095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *dest++ = src[i]; 19105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *dest++ = src[i+4]; 19115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *dest++ = src[i+8]; 19125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *dest++ = src[i+12]; 19135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] ); 19165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 19175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19184637235183b80963536f2364e4d50fcb894886ddDave Airliestatic void upload_matrix_t( r100ContextPtr rmesa, GLfloat *src, int idx ) 19195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 19205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul float *dest = ((float *)RADEON_DB_STATE( mat[idx] ))+MAT_ELT_0; 19215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul memcpy(dest, src, 16*sizeof(float)); 19225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] ); 19235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 19245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1926f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void update_texturematrix( struct gl_context *ctx ) 19275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 19284637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT( ctx ); 19295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint tpc = rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL]; 19305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint vs = rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL]; 19315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int unit; 1932a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger GLuint texMatEnabled = 0; 1933a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger rmesa->NeedTexMatrix = 0; 1934a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger rmesa->TexMatColSwap = 0; 19355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 193630daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger for (unit = 0 ; unit < ctx->Const.MaxTextureUnits; unit++) { 1937a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger if (ctx->Texture.Unit[unit]._ReallyEnabled) { 1938a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger GLboolean needMatrix = GL_FALSE; 1939a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger if (ctx->TextureMatrixStack[unit].Top->type != MATRIX_IDENTITY) { 1940a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger needMatrix = GL_TRUE; 1941a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger texMatEnabled |= (RADEON_TEXGEN_TEXMAT_0_ENABLE | 1942a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger RADEON_TEXMAT_0_ENABLE) << unit; 1943a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger 1944a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger if (rmesa->TexGenEnabled & (RADEON_TEXMAT_0_ENABLE << unit)) { 1945a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger /* Need to preconcatenate any active texgen 1946a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger * obj/eyeplane matrices: 1947a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger */ 1948a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger _math_matrix_mul_matrix( &rmesa->tmpmat[unit], 194984c9e671edcc1358307879491bddef9f7d96f14bRoland Scheidegger ctx->TextureMatrixStack[unit].Top, 195084c9e671edcc1358307879491bddef9f7d96f14bRoland Scheidegger &rmesa->TexGenMatrix[unit] ); 1951a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 1952a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger else { 1953a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger _math_matrix_copy( &rmesa->tmpmat[unit], 1954a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger ctx->TextureMatrixStack[unit].Top ); 1955a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 195684c9e671edcc1358307879491bddef9f7d96f14bRoland Scheidegger } 1957a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger else if (rmesa->TexGenEnabled & (RADEON_TEXMAT_0_ENABLE << unit)) { 1958a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger _math_matrix_copy( &rmesa->tmpmat[unit], &rmesa->TexGenMatrix[unit] ); 1959a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger needMatrix = GL_TRUE; 1960a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 1961a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger if (needMatrix) { 1962a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger rmesa->NeedTexMatrix |= 1 << unit; 196311f763f5057490477a2771febe8923682f6a5adaRoland Scheidegger radeonUploadTexMatrix( rmesa, unit, 1964a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger !ctx->Texture.Unit[unit].TexGenEnabled ); 19655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1969a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger tpc = (texMatEnabled | rmesa->TexGenEnabled); 19705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 197130daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger /* TCL_TEX_COMPUTED_x is TCL_TEX_INPUT_x | 0x8 */ 197230daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger vs &= ~((RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_0_OUTPUT_SHIFT) | 197330daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger (RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_1_OUTPUT_SHIFT) | 197430daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger (RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_2_OUTPUT_SHIFT)); 197530daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger 197630daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger vs |= (((tpc & RADEON_TEXGEN_TEXMAT_0_ENABLE) << 197730daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger (RADEON_TCL_TEX_0_OUTPUT_SHIFT + 3)) | 197830daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger ((tpc & RADEON_TEXGEN_TEXMAT_1_ENABLE) << 197930daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger (RADEON_TCL_TEX_1_OUTPUT_SHIFT + 2)) | 198030daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger ((tpc & RADEON_TEXGEN_TEXMAT_2_ENABLE) << 198130daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger (RADEON_TCL_TEX_2_OUTPUT_SHIFT + 1))); 19825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (tpc != rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL] || 19845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul vs != rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL]) { 1985a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger 19865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE(rmesa, tcl); 19875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL] = tpc; 19885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] = vs; 19895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 19905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 19915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1992f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic GLboolean r100ValidateBuffers(struct gl_context *ctx) 199305304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie{ 199405304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 199505304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie struct radeon_renderbuffer *rrb; 1996c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie int i, ret; 199705304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie 1998c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie radeon_cs_space_reset_bos(rmesa->radeon.cmdbuf.cs); 19997dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 200005304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie rrb = radeon_get_colorbuffer(&rmesa->radeon); 200105304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie /* color buffer */ 200205304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie if (rrb && rrb->bo) { 2003c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, rrb->bo, 2004c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie 0, RADEON_GEM_DOMAIN_VRAM); 200505304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie } 200605304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie 200705304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie /* depth buffer */ 200805304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie rrb = radeon_get_depthbuffer(&rmesa->radeon); 200905304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie /* color buffer */ 201005304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie if (rrb && rrb->bo) { 2011c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, rrb->bo, 2012c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie 0, RADEON_GEM_DOMAIN_VRAM); 201305304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie } 20145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 201505304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie for (i = 0; i < ctx->Const.MaxTextureImageUnits; ++i) { 201605304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie radeonTexObj *t; 20177dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 201805304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie if (!ctx->Texture.Unit[i]._ReallyEnabled) 201905304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie continue; 202005304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie 202185957cb512e74c8ddeb5ba2e06df091943ab8400Dave Airlie t = rmesa->state.texture.unit[i].texobj; 2022a5da4acb9583db5289fcad410513d0fedcf9bab2Dave Airlie 2023a5da4acb9583db5289fcad410513d0fedcf9bab2Dave Airlie if (!t) 2024a5da4acb9583db5289fcad410513d0fedcf9bab2Dave Airlie continue; 202505304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie if (t->image_override && t->bo) 2026c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, t->bo, 202705304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); 202805304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie else if (t->mt->bo) 2029c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, t->mt->bo, 203005304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); 203105304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie } 203205304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie 2033bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs, first_elem(&rmesa->radeon.dma.reserved)->bo, RADEON_GEM_DOMAIN_GTT, 0); 2034c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie if (ret) 2035c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie return GL_FALSE; 2036c27f21f92d2cf9d23a9edb15d144eceb9ff383bcDave Airlie return GL_TRUE; 203705304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie} 203805304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie 2039f9995b30756140724f41daf963fa06167912be7fKristian HøgsbergGLboolean radeonValidateState( struct gl_context *ctx ) 20405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 20414637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 20424637235183b80963536f2364e4d50fcb894886ddDave Airlie GLuint new_state = rmesa->radeon.NewGLState; 20435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2044c514c1f99493147bbba7a1dbe157c0492f4cf2ebJerome Glisse if (new_state & _NEW_BUFFERS) { 20452b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie _mesa_update_framebuffer(ctx); 20462b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie /* this updates the DrawBuffer's Width/Height if it's a FBO */ 20472b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie _mesa_update_draw_buffer_bounds(ctx); 20482b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie RADEON_STATECHANGE(rmesa, ctx); 2049982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul } 2050982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul 20515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (new_state & _NEW_TEXTURE) { 20525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateTextureState( ctx ); 20534637235183b80963536f2364e4d50fcb894886ddDave Airlie new_state |= rmesa->radeon.NewGLState; /* may add TEXTURE_MATRIX */ 20545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 20555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 205605304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie /* we need to do a space check here */ 205705304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie if (!r100ValidateBuffers(ctx)) 205805304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie return GL_FALSE; 205905304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie 20605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Need an event driven matrix update? 20615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 20627dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle if (new_state & (_NEW_MODELVIEW|_NEW_PROJECTION)) 20635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul upload_matrix( rmesa, ctx->_ModelProjectMatrix.m, MODEL_PROJ ); 20645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Need these for lighting (shouldn't upload otherwise) 20665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 20675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (new_state & (_NEW_MODELVIEW)) { 20685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul upload_matrix( rmesa, ctx->ModelviewMatrixStack.Top->m, MODEL ); 20695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul upload_matrix_t( rmesa, ctx->ModelviewMatrixStack.Top->inv, MODEL_IT ); 20705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 20715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Does this need to be triggered on eg. modelview for 20735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * texgen-derived objplane/eyeplane matrices? 20745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 20755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (new_state & _NEW_TEXTURE_MATRIX) { 20765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul update_texturematrix( ctx ); 2077a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger } 20785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (new_state & (_NEW_LIGHT|_NEW_MODELVIEW|_MESA_NEW_NEED_EYE_COORDS)) { 20805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul update_light( ctx ); 20815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 20825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* emit all active clip planes if projection matrix changes. 20845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 20855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (new_state & (_NEW_PROJECTION)) { 20867dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle if (ctx->Transform.ClipPlanesEnabled) 20875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonUpdateClipPlanes( ctx ); 20885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 20895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20914637235183b80963536f2364e4d50fcb894886ddDave Airlie rmesa->radeon.NewGLState = 0; 209290ffce497395d8c02fee2ea4ee4c025eede3d876Alex Deucher 209390ffce497395d8c02fee2ea4ee4c025eede3d876Alex Deucher return GL_TRUE; 20945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 20955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 20965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2097f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonInvalidateState( struct gl_context *ctx, GLuint new_state ) 20985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 20995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _swrast_InvalidateState( ctx, new_state ); 21005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _swsetup_InvalidateState( ctx, new_state ); 210180c88304fc9d09531b2530b74973821e47b46753Keith Whitwell _vbo_InvalidateState( ctx, new_state ); 21025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _tnl_InvalidateState( ctx, new_state ); 21035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _ae_invalidate_state( ctx, new_state ); 21044637235183b80963536f2364e4d50fcb894886ddDave Airlie R100_CONTEXT(ctx)->radeon.NewGLState |= new_state; 21055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 21065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 210757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 210857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell/* A hack. Need a faster way to find this out. 210957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell */ 2110f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic GLboolean check_material( struct gl_context *ctx ) 211157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell{ 211257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell TNLcontext *tnl = TNL_CONTEXT(ctx); 211357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell GLint i; 211457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 21157dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle for (i = _TNL_ATTRIB_MAT_FRONT_AMBIENT; 21167dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle i < _TNL_ATTRIB_MAT_BACK_INDEXES; 211757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell i++) 211857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell if (tnl->vb.AttribPtr[i] && 211957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell tnl->vb.AttribPtr[i]->stride) 212057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell return GL_TRUE; 212157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 212257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell return GL_FALSE; 212357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell} 21247dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle 212557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 2126f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonWrapRunPipeline( struct gl_context *ctx ) 21275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 21284637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 212957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell GLboolean has_material; 21305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (0) 21324637235183b80963536f2364e4d50fcb894886ddDave Airlie fprintf(stderr, "%s, newstate: %x\n", __FUNCTION__, rmesa->radeon.NewGLState); 21335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Validate state: 21355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 21364637235183b80963536f2364e4d50fcb894886ddDave Airlie if (rmesa->radeon.NewGLState) 213705304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie if (!radeonValidateState( ctx )) 213805304d41f2d9ab7a66a8b976580c156b7b93a9d3Dave Airlie FALLBACK(rmesa, RADEON_FALLBACK_TEXTURE, GL_TRUE); 21395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 214057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell has_material = (ctx->Light.Enabled && check_material( ctx )); 214157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 214257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell if (has_material) { 21435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_MATERIAL, GL_TRUE ); 21445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 21455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Run the pipeline. 21477dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle */ 21485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _tnl_run_pipeline( ctx ); 21495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 215057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell if (has_material) { 21515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_MATERIAL, GL_FALSE ); 21525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 21535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 21545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2155f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonPolygonStipple( struct gl_context *ctx, const GLubyte *mask ) 21567d361537661b93a501c9533271458a41b965ea79Dave Airlie{ 21577d361537661b93a501c9533271458a41b965ea79Dave Airlie r100ContextPtr r100 = R100_CONTEXT(ctx); 21587d361537661b93a501c9533271458a41b965ea79Dave Airlie GLint i; 21597d361537661b93a501c9533271458a41b965ea79Dave Airlie 21607d361537661b93a501c9533271458a41b965ea79Dave Airlie radeon_firevertices(&r100->radeon); 21617d361537661b93a501c9533271458a41b965ea79Dave Airlie 21627d361537661b93a501c9533271458a41b965ea79Dave Airlie RADEON_STATECHANGE(r100, stp); 21637d361537661b93a501c9533271458a41b965ea79Dave Airlie 21647d361537661b93a501c9533271458a41b965ea79Dave Airlie /* Must flip pattern upside down. 21657d361537661b93a501c9533271458a41b965ea79Dave Airlie */ 21667d361537661b93a501c9533271458a41b965ea79Dave Airlie for ( i = 31 ; i >= 0; i--) { 21677d361537661b93a501c9533271458a41b965ea79Dave Airlie r100->hw.stp.cmd[3 + i] = ((GLuint *) mask)[i]; 21687d361537661b93a501c9533271458a41b965ea79Dave Airlie } 21697d361537661b93a501c9533271458a41b965ea79Dave Airlie} 21707d361537661b93a501c9533271458a41b965ea79Dave Airlie 21715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Initialize the driver's state functions. 2173275a563bea0c0eef7bcd52ddc493803acf94c37eBrian Paul * Many of the ctx->Driver functions might have been initialized to 2174275a563bea0c0eef7bcd52ddc493803acf94c37eBrian Paul * software defaults in the earlier _mesa_init_driver_functions() call. 21755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 21760973a1ec78fdedc5401cb1c0f6d027425c492509Eric Anholtvoid radeonInitStateFuncs( struct gl_context *ctx ) 21775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 21785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.UpdateState = radeonInvalidateState; 21795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.LightingSpaceChange = radeonLightingSpaceChange; 21805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.DrawBuffer = radeonDrawBuffer; 21825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ReadBuffer = radeonReadBuffer; 2183d9a19d8649e49acfac98c240bff88931be7743d7Alex Deucher ctx->Driver.CopyPixels = _mesa_meta_CopyPixels; 2184d9a19d8649e49acfac98c240bff88931be7743d7Alex Deucher ctx->Driver.DrawPixels = _mesa_meta_DrawPixels; 21850973a1ec78fdedc5401cb1c0f6d027425c492509Eric Anholt ctx->Driver.ReadPixels = radeonReadPixels; 21865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 21875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.AlphaFunc = radeonAlphaFunc; 2188c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick ctx->Driver.BlendEquationSeparate = radeonBlendEquationSeparate; 21895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.BlendFuncSeparate = radeonBlendFuncSeparate; 21905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ClipPlane = radeonClipPlane; 21915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ColorMask = radeonColorMask; 21925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.CullFace = radeonCullFace; 21935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.DepthFunc = radeonDepthFunc; 21945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.DepthMask = radeonDepthMask; 21955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.DepthRange = radeonDepthRange; 21965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Enable = radeonEnable; 21975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Fogfv = radeonFogfv; 21985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.FrontFace = radeonFrontFace; 21995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Hint = NULL; 22005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.LightModelfv = radeonLightModelfv; 22015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Lightfv = radeonLightfv; 22025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.LineStipple = radeonLineStipple; 22035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.LineWidth = radeonLineWidth; 22045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.LogicOpcode = radeonLogicOpCode; 22055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.PolygonMode = radeonPolygonMode; 220630f2d6f0cb34744c323c301573684b918332437fRoland Scheidegger ctx->Driver.PolygonOffset = radeonPolygonOffset; 22070973a1ec78fdedc5401cb1c0f6d027425c492509Eric Anholt ctx->Driver.PolygonStipple = radeonPolygonStipple; 22085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.RenderMode = radeonRenderMode; 22095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Scissor = radeonScissor; 22105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.ShadeModel = radeonShadeModel; 2211878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul ctx->Driver.StencilFuncSeparate = radeonStencilFuncSeparate; 2212878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul ctx->Driver.StencilMaskSeparate = radeonStencilMaskSeparate; 2213878c371e6cf6eb28afacc482d8aeaa0119f00d5bBrian Paul ctx->Driver.StencilOpSeparate = radeonStencilOpSeparate; 22145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Viewport = radeonViewport; 22155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 22165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange = radeonUpdateMaterial; 22175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TNL_CONTEXT(ctx)->Driver.RunPipeline = radeonWrapRunPipeline; 22185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 2219