s_context.c revision dd34fe8679fa200e55cfaf8e80bbecdecea084e3
106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/* 206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Mesa 3-D graphics library 39a78ef980d89c0d18f859036d5a0cdf82acd303cBrian * Version: 6.5.3 406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * 59a78ef980d89c0d18f859036d5a0cdf82acd303cBrian * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. 606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * 706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a 806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * copy of this software and associated documentation files (the "Software"), 906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * to deal in the Software without restriction, including without limitation 1006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * and/or sell copies of the Software, and to permit persons to whom the 1206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Software is furnished to do so, subject to the following conditions: 1306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * 1406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * The above copyright notice and this permission notice shall be included 1506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * in all copies or substantial portions of the Software. 1606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * 1706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 2206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * 2406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Authors: 2506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Keith Whitwell <keith@tungstengraphics.com> 2606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Brian Paul 2706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 2806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 2906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "imports.h" 3006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "bufferobj.h" 3106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "context.h" 3206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "colormac.h" 3306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "mtypes.h" 3449f82803cc6ceaf1ecc3928a5417ef300f73f37dBrian#include "prog_statevars.h" 35ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul#include "teximage.h" 3606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "swrast.h" 3706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_blend.h" 3806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_context.h" 3906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_lines.h" 4006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_points.h" 4106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_span.h" 4206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_triangle.h" 4306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_texfilter.h" 4406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 4506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 4606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 4706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Recompute the value of swrast->_RasterMask, etc. according to 4806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * the current context. The _RasterMask field can be easily tested by 4906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * drivers to determine certain basic GL state (does the primitive need 5006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * stenciling, logic-op, fog, etc?). 5106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 5206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 5306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_rasterflags( GLcontext *ctx ) 5406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 5506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 5606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLbitfield rasterMask = 0; 5706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 5806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Color.AlphaEnabled) rasterMask |= ALPHATEST_BIT; 5906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Color.BlendEnabled) rasterMask |= BLEND_BIT; 6006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Depth.Test) rasterMask |= DEPTH_BIT; 6106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->_FogEnabled) rasterMask |= FOG_BIT; 6206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Scissor.Enabled) rasterMask |= CLIP_BIT; 6306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Stencil.Enabled) rasterMask |= STENCIL_BIT; 6406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Visual.rgbMode) { 6506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const GLuint colorMask = *((GLuint *) &ctx->Color.ColorMask); 6606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (colorMask != 0xffffffff) rasterMask |= MASKING_BIT; 6706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Color._LogicOpEnabled) rasterMask |= LOGIC_OP_BIT; 6806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Texture._EnabledUnits) rasterMask |= TEXTURE_BIT; 6906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 7006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul else { 7106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Color.IndexMask != 0xffffffff) rasterMask |= MASKING_BIT; 7206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Color.IndexLogicOpEnabled) rasterMask |= LOGIC_OP_BIT; 7306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 7406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 7506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if ( ctx->Viewport.X < 0 7606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul || ctx->Viewport.X + ctx->Viewport.Width > (GLint) ctx->DrawBuffer->Width 7706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul || ctx->Viewport.Y < 0 7806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul || ctx->Viewport.Y + ctx->Viewport.Height > (GLint) ctx->DrawBuffer->Height) { 7906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul rasterMask |= CLIP_BIT; 8006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 8106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 8206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Query.CurrentOcclusionObject) 8306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul rasterMask |= OCCLUSION_BIT; 8406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 8506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 8606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* If we're not drawing to exactly one color buffer set the 8706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * MULTI_DRAW_BIT flag. Also set it if we're drawing to no 8806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * buffers or the RGBA or CI mask disables all writes. 8906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 9006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->DrawBuffer->_NumColorDrawBuffers[0] != 1) { 9106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* more than one color buffer designated for writing (or zero buffers) */ 9206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul rasterMask |= MULTI_DRAW_BIT; 9306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 9406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul else if (ctx->Visual.rgbMode && *((GLuint *) ctx->Color.ColorMask) == 0) { 9506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul rasterMask |= MULTI_DRAW_BIT; /* all RGBA channels disabled */ 9606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 9706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul else if (!ctx->Visual.rgbMode && ctx->Color.IndexMask==0) { 9806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul rasterMask |= MULTI_DRAW_BIT; /* all color index bits disabled */ 9906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 10006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 10112ef1fbefcee964b715783d3ade6b69b2c699ed8Brian if (ctx->FragmentProgram._Current) { 10206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul rasterMask |= FRAGPROG_BIT; 10306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 10406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 1050bf5dbe002a64e198f55724cc1542602c012490fBrian if (ctx->Shader._FragmentShaderPresent) { 10606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul rasterMask |= FRAGPROG_BIT; 10706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 10806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 10906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->ATIFragmentShader._Enabled) { 11006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul rasterMask |= ATIFRAGSHADER_BIT; 11106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 11206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 11306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#if CHAN_TYPE == GL_FLOAT 11406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Color.ClampFragmentColor == GL_TRUE) { 11506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul rasterMask |= CLAMPING_BIT; 11606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 11706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#endif 11806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 11906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->_RasterMask = rasterMask; 12006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 12106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 12206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 12306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 12406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Examine polycon culls tate to compute the _BackfaceSign field. 12506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * _BackfaceSign will be 0 if no culling, -1 if culling back-faces, 12606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * and 1 if culling front-faces. The Polygon FrontFace state also 12706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * factors in. 12806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 12906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 13006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_polygon( GLcontext *ctx ) 13106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 13206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLfloat backface_sign = 1; 13306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 13406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Polygon.CullFlag) { 13506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul backface_sign = 1; 13606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul switch(ctx->Polygon.CullFaceMode) { 13706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul case GL_BACK: 13806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if(ctx->Polygon.FrontFace==GL_CCW) 13906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul backface_sign = -1; 14006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul break; 14106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul case GL_FRONT: 14206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if(ctx->Polygon.FrontFace!=GL_CCW) 14306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul backface_sign = -1; 14406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul break; 14506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul default: 14606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul case GL_FRONT_AND_BACK: 14706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul backface_sign = 0; 14806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul break; 14906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 15006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 15106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul else { 15206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul backface_sign = 0; 15306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 15406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 15506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->_BackfaceSign = backface_sign; 15606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 15706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 15806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 15906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 16006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Update the _PreferPixelFog field to indicate if we need to compute 16106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * fog factors per-fragment. 16206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 16306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 16406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_fog_hint( GLcontext *ctx ) 16506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 16606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 16706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_PreferPixelFog = (!swrast->AllowVertexFog || 16812ef1fbefcee964b715783d3ade6b69b2c699ed8Brian ctx->FragmentProgram._Current || 16906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul (ctx->Hint.Fog == GL_NICEST && 17006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->AllowPixelFog)); 17106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 17206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 17306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 17406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 17506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 17606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Update the swrast->_AnyTextureCombine flag. 17706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 17806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 17906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_texture_env( GLcontext *ctx ) 18006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 18106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 18206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLuint i; 18306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_AnyTextureCombine = GL_FALSE; 18406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul for (i = 0; i < ctx->Const.MaxTextureUnits; i++) { 18506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Texture.Unit[i].EnvMode == GL_COMBINE_EXT || 18606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul ctx->Texture.Unit[i].EnvMode == GL_COMBINE4_NV) { 18706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_AnyTextureCombine = GL_TRUE; 18806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return; 18906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 19006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 19106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 19206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 19306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 19406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 19506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Update swrast->_FogColor and swrast->_FogEnable values. 19606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 19706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 19806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_fog_state( GLcontext *ctx ) 19906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 20006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 20112ef1fbefcee964b715783d3ade6b69b2c699ed8Brian const struct gl_fragment_program *fp = ctx->FragmentProgram._Current; 20206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 20306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* determine if fog is needed, and if so, which fog mode */ 20406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_FogEnabled = GL_FALSE; 20512ef1fbefcee964b715783d3ade6b69b2c699ed8Brian if (fp && fp->Base.Target == GL_FRAGMENT_PROGRAM_ARB) { 20612ef1fbefcee964b715783d3ade6b69b2c699ed8Brian if (fp->FogOption != GL_NONE) { 20712ef1fbefcee964b715783d3ade6b69b2c699ed8Brian swrast->_FogEnabled = GL_TRUE; 20812ef1fbefcee964b715783d3ade6b69b2c699ed8Brian swrast->_FogMode = fp->FogOption; 20906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 21006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 21106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul else if (ctx->Fog.Enabled) { 21206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_FogEnabled = GL_TRUE; 21306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_FogMode = ctx->Fog.Mode; 21406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 21506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 21606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 21706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 21806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 21906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Update state for running fragment programs. Basically, load the 22006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * program parameters with current state values. 22106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 22206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 2235050b565deca3cad165cd2f68badc084b9aa5377Brian Paul_swrast_update_fragment_program(GLcontext *ctx, GLbitfield newState) 22406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 22512ef1fbefcee964b715783d3ade6b69b2c699ed8Brian const struct gl_fragment_program *fp = ctx->FragmentProgram._Current; 22612ef1fbefcee964b715783d3ade6b69b2c699ed8Brian if (fp) { 2276f676f4871b1701ec56298f9d22460677ed0e982Brian Paul#if 0 2286f676f4871b1701ec56298f9d22460677ed0e982Brian Paul /* XXX Need a way to trigger the initial loading of parameters 2296f676f4871b1701ec56298f9d22460677ed0e982Brian Paul * even when there's no recent state changes. 2306f676f4871b1701ec56298f9d22460677ed0e982Brian Paul */ 2315050b565deca3cad165cd2f68badc084b9aa5377Brian Paul if (fp->Base.Parameters->StateFlags & newState) 2326f676f4871b1701ec56298f9d22460677ed0e982Brian Paul#endif 2335050b565deca3cad165cd2f68badc084b9aa5377Brian Paul _mesa_load_state_parameters(ctx, fp->Base.Parameters); 23406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 23506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 23606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 23706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 23806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 23906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_DERIVED (_SWRAST_NEW_RASTERMASK | \ 24006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_TEXTURE | \ 24106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_HINT | \ 24206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_POLYGON ) 24306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 24406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/* State referenced by _swrast_choose_triangle, _swrast_choose_line. 24506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 24606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_TRIANGLE (_SWRAST_NEW_DERIVED | \ 24706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_RENDERMODE| \ 24806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_POLYGON| \ 24906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_DEPTH| \ 25006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_STENCIL| \ 25106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_COLOR| \ 25206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_TEXTURE| \ 25306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _SWRAST_NEW_RASTERMASK| \ 25406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_LIGHT| \ 25506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_FOG | \ 25606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _DD_NEW_SEPARATE_SPECULAR) 25706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 25806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_LINE (_SWRAST_NEW_DERIVED | \ 25906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_RENDERMODE| \ 26006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_LINE| \ 26106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_TEXTURE| \ 26206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_LIGHT| \ 26306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_FOG| \ 26406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_DEPTH | \ 26506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _DD_NEW_SEPARATE_SPECULAR) 26606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 26706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_POINT (_SWRAST_NEW_DERIVED | \ 26806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_RENDERMODE | \ 26906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_POINT | \ 27006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_TEXTURE | \ 27106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_LIGHT | \ 27206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_FOG | \ 27306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _DD_NEW_SEPARATE_SPECULAR) 27406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 27506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_TEXTURE_SAMPLE_FUNC _NEW_TEXTURE 27606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 27706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_TEXTURE_ENV_MODE _NEW_TEXTURE 27806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 27906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_BLEND_FUNC _NEW_COLOR 28006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 28106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 28206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 28306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 28406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Stub for swrast->Triangle to select a true triangle function 28506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * after a state change. 28606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 28706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 28806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_triangle( GLcontext *ctx, 28906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v0, 29006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v1, 29106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v2 ) 29206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 29306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 29406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 29506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_validate_derived( ctx ); 29606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_triangle( ctx ); 297d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul ASSERT(swrast->Triangle); 29806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 29906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Texture._EnabledUnits == 0 30006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul && NEED_SECONDARY_COLOR(ctx) 30112ef1fbefcee964b715783d3ade6b69b2c699ed8Brian && !ctx->FragmentProgram._Current) { 30206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* separate specular color, but no texture */ 30306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->SpecTriangle = swrast->Triangle; 30406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Triangle = _swrast_add_spec_terms_triangle; 30506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 30606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 30706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Triangle( ctx, v0, v1, v2 ); 30806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 30906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 31006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 31106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Called via swrast->Line. Examine current GL state and choose a software 31206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * line routine. Then call it. 31306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 31406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 31506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_line( GLcontext *ctx, const SWvertex *v0, const SWvertex *v1 ) 31606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 31706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 31806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 31906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_validate_derived( ctx ); 32006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_line( ctx ); 321d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul ASSERT(swrast->Line); 32206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 32306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Texture._EnabledUnits == 0 32406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul && NEED_SECONDARY_COLOR(ctx) 32512ef1fbefcee964b715783d3ade6b69b2c699ed8Brian && !ctx->FragmentProgram._Current) { 32606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->SpecLine = swrast->Line; 32706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Line = _swrast_add_spec_terms_line; 32806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 32906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 33006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 33106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Line( ctx, v0, v1 ); 33206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 33306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 33406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 33506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Called via swrast->Point. Examine current GL state and choose a software 33606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * point routine. Then call it. 33706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 33806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 33906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_point( GLcontext *ctx, const SWvertex *v0 ) 34006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 34106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 34206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 34306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_validate_derived( ctx ); 34406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_point( ctx ); 34506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 34606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Texture._EnabledUnits == 0 34706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul && NEED_SECONDARY_COLOR(ctx) 34812ef1fbefcee964b715783d3ade6b69b2c699ed8Brian && !ctx->FragmentProgram._Current) { 34906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->SpecPoint = swrast->Point; 35006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Point = _swrast_add_spec_terms_point; 35106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 35206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 35306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Point( ctx, v0 ); 35406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 35506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 35606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 35706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 35806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Called via swrast->BlendFunc. Examine GL state to choose a blending 35906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * function, then call it. 36006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 36106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void _ASMAPI 362a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul_swrast_validate_blend_func(GLcontext *ctx, GLuint n, const GLubyte mask[], 363d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul GLvoid *src, const GLvoid *dst, 364a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul GLenum chanType ) 36506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 36606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 36706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 368d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul _swrast_validate_derived( ctx ); /* why is this needed? */ 369d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul _swrast_choose_blend_func( ctx, chanType ); 37006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 371a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul swrast->BlendFunc( ctx, n, mask, src, dst, chanType ); 37206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 37306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 37406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 375ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul/** 376ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Make sure we have texture image data for all the textures we may need 377ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * for subsequent rendering. 378ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */ 379ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paulstatic void 380ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul_swrast_validate_texture_images(GLcontext *ctx) 381ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul{ 382ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 383ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint u; 384ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 385ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (!swrast->ValidateTextureImage || !ctx->Texture._EnabledUnits) { 386ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* no textures enabled, or no way to validate images! */ 387ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul return; 388ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 389ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 390ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (u = 0; u < ctx->Const.MaxTextureImageUnits; u++) { 391ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (ctx->Texture.Unit[u]._ReallyEnabled) { 392ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_object *texObj = ctx->Texture.Unit[u]._Current; 393ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul ASSERT(texObj); 394ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (texObj) { 395ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint numFaces = (texObj->Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; 396ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint face; 397ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (face = 0; face < numFaces; face++) { 398ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint lvl; 399ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (lvl = texObj->BaseLevel; lvl <= texObj->_MaxLevel; lvl++) { 400ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_image *texImg = texObj->Image[face][lvl]; 401ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (texImg && !texImg->Data) { 402ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul swrast->ValidateTextureImage(ctx, texObj, face, lvl); 403ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul ASSERT(texObj->Image[face][lvl]->Data); 404ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 405ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 406ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 407ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 408ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 409ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 410ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul} 411ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 412ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 413ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul/** 414ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Free the texture image data attached to all currently enabled 415ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * textures. Meant to be called by device drivers when transitioning 416ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * from software to hardware rendering. 417ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */ 418ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paulvoid 419ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul_swrast_eject_texture_images(GLcontext *ctx) 420ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul{ 421ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint u; 422ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 423ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (!ctx->Texture._EnabledUnits) { 424ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* no textures enabled */ 425ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul return; 426ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 427ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 428ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (u = 0; u < ctx->Const.MaxTextureImageUnits; u++) { 429ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (ctx->Texture.Unit[u]._ReallyEnabled) { 430ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_object *texObj = ctx->Texture.Unit[u]._Current; 431ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul ASSERT(texObj); 432ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (texObj) { 433ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint numFaces = (texObj->Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; 434ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint face; 435ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (face = 0; face < numFaces; face++) { 436ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint lvl; 437ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (lvl = texObj->BaseLevel; lvl <= texObj->_MaxLevel; lvl++) { 438ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_image *texImg = texObj->Image[face][lvl]; 439ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (texImg && texImg->Data) { 440ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul _mesa_free_texmemory(texImg->Data); 441ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul texImg->Data = NULL; 442ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 443ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 444ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 445ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 446ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 447ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 448ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul} 449ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 450ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 451ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 45206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 45306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_sleep( GLcontext *ctx, GLbitfield new_state ) 45406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 45506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul (void) ctx; (void) new_state; 45606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 45706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 45806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 45906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 46006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_invalidate_state( GLcontext *ctx, GLbitfield new_state ) 46106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 46206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 46306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLuint i; 46406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 46506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->NewState |= new_state; 46606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 46706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* After 10 statechanges without any swrast functions being called, 46806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * put the module to sleep. 46906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 47006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (++swrast->StateChanges > 10) { 47106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateState = _swrast_sleep; 47206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->NewState = ~0; 47306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul new_state = ~0; 47406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 47506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 47606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & swrast->InvalidateTriangleMask) 47706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Triangle = _swrast_validate_triangle; 47806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 47906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & swrast->InvalidateLineMask) 48006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Line = _swrast_validate_line; 48106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 48206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & swrast->InvalidatePointMask) 48306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Point = _swrast_validate_point; 48406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 48506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & _SWRAST_NEW_BLEND_FUNC) 48606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->BlendFunc = _swrast_validate_blend_func; 48706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 48806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & _SWRAST_NEW_TEXTURE_SAMPLE_FUNC) 489ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul for (i = 0 ; i < ctx->Const.MaxTextureImageUnits ; i++) 49006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->TextureSample[i] = NULL; 49106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 49206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 49306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 49406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 49506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_texture_samplers(GLcontext *ctx) 49606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 49706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 49806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLuint u; 49906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 50006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul for (u = 0; u < ctx->Const.MaxTextureImageUnits; u++) { 50106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const struct gl_texture_object *tObj = ctx->Texture.Unit[u]._Current; 5029a78ef980d89c0d18f859036d5a0cdf82acd303cBrian /* Note: If tObj is NULL, the sample function will be a simple 5039a78ef980d89c0d18f859036d5a0cdf82acd303cBrian * function that just returns opaque black (0,0,0,1). 5049a78ef980d89c0d18f859036d5a0cdf82acd303cBrian */ 5059a78ef980d89c0d18f859036d5a0cdf82acd303cBrian swrast->TextureSample[u] = _swrast_choose_texture_sample_func(ctx, tObj); 50606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 50706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 50806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 50906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 510dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian/** 511dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian * Update the swrast->_FragmentAttribs field. 512dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian */ 513dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brianstatic void 514dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian_swrast_update_fragment_attribs(GLcontext *ctx) 515dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian{ 516dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian SWcontext *swrast = SWRAST_CONTEXT(ctx); 517dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 518dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian if (ctx->FragmentProgram._Current) { 519dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian swrast->_FragmentAttribs 520dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian = ctx->FragmentProgram._Current->Base.InputsRead; 521dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian } 522dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian else { 523dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian GLuint u; 524dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian swrast->_FragmentAttribs = 0x0; 525dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 526dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian if (ctx->Depth.Test) 527dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian swrast->_FragmentAttribs |= FRAG_BIT_WPOS; 528dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian if (NEED_SECONDARY_COLOR(ctx)) 529dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian swrast->_FragmentAttribs |= FRAG_BIT_COL1; 530dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian if (swrast->_FogEnabled) 531dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian swrast->_FragmentAttribs |= FRAG_BIT_FOGC; 532dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 533dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian for (u = 0; u < ctx->Const.MaxTextureUnits; u++) { 534dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian if (ctx->Texture.Unit[u]._ReallyEnabled) { 535dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian swrast->_FragmentAttribs |= FRAG_BIT_TEX(u); 536dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian } 537dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian } 538dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian } 539dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 540dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian /* Find lowest, highest bit set in _FragmentAttribs */ 541dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian { 542dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian GLuint bits = swrast->_FragmentAttribs; 543dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian GLuint i = 0;; 544dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian while (bits) { 545dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian i++; 546dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian bits = bits >> 1; 547dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian } 548dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian swrast->_MaxFragmentAttrib = i; 549dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian swrast->_MinFragmentAttrib = FRAG_ATTRIB_TEX0; /* XXX temporary */ 550dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian } 551dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian} 552dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 553dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 55406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 55506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_derived( GLcontext *ctx ) 55606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 55706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 55806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 55906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState) { 56006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & _NEW_POLYGON) 56106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_polygon( ctx ); 56206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 56306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & (_NEW_HINT | _NEW_PROGRAM)) 56406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_fog_hint( ctx ); 56506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 56606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & _SWRAST_NEW_TEXTURE_ENV_MODE) 56706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_texture_env( ctx ); 56806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 56906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & (_NEW_FOG | _NEW_PROGRAM)) 57006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_fog_state( ctx ); 57106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 5724e9e0aff790656821970ba74d8996718e415ea68Brian Paul if (swrast->NewState & (_NEW_MODELVIEW | 5734e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_PROJECTION | 5744e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_TEXTURE_MATRIX | 5754e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_FOG | 5764e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_LIGHT | 5774e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_LINE | 5784e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_TEXTURE | 5794e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_TRANSFORM | 5804e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_POINT | 5814e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_VIEWPORT | 5824e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_PROGRAM)) 5835050b565deca3cad165cd2f68badc084b9aa5377Brian Paul _swrast_update_fragment_program( ctx, swrast->NewState ); 58406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 58506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & _NEW_TEXTURE) 58606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_texture_samplers( ctx ); 58706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 588ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (swrast->NewState & (_NEW_TEXTURE | _NEW_PROGRAM)) 589ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul _swrast_validate_texture_images( ctx ); 590ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 5918334c8a2169055cd87e55d32403d59b8e46deb59Brian Paul if (swrast->NewState & _SWRAST_NEW_RASTERMASK) 5928334c8a2169055cd87e55d32403d59b8e46deb59Brian Paul _swrast_update_rasterflags( ctx ); 5938334c8a2169055cd87e55d32403d59b8e46deb59Brian Paul 594dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian if (swrast->NewState & (_NEW_DEPTH | 595dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian _NEW_FOG | 596dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian _NEW_PROGRAM | 597dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian _NEW_TEXTURE)) 598dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian _swrast_update_fragment_attribs(ctx); 599dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 60006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->NewState = 0; 60106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->StateChanges = 0; 60206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateState = _swrast_invalidate_state; 60306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 60406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 60506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 60606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define SWRAST_DEBUG 0 60706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 60806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/* Public entrypoints: See also s_accum.c, s_bitmap.c, etc. 60906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 61006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 61106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Quad( GLcontext *ctx, 61206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v0, const SWvertex *v1, 61306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v2, const SWvertex *v3 ) 61406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 61506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 61606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_Quad\n"); 61706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v0 ); 61806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v1 ); 61906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v2 ); 62006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v3 ); 62106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 62206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Triangle( ctx, v0, v1, v3 ); 62306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Triangle( ctx, v1, v2, v3 ); 62406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 62506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 62606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 62706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Triangle( GLcontext *ctx, const SWvertex *v0, 62806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v1, const SWvertex *v2 ) 62906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 63006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 63106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_Triangle\n"); 63206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v0 ); 63306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v1 ); 63406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v2 ); 63506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 63606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Triangle( ctx, v0, v1, v2 ); 63706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 63806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 63906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 64006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Line( GLcontext *ctx, const SWvertex *v0, const SWvertex *v1 ) 64106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 64206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 64306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_Line\n"); 64406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v0 ); 64506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v1 ); 64606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 64706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Line( ctx, v0, v1 ); 64806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 64906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 65006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 65106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Point( GLcontext *ctx, const SWvertex *v0 ) 65206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 65306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 65406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_Point\n"); 65506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v0 ); 65606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 65706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Point( ctx, v0 ); 65806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 65906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 66006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 66106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_InvalidateState( GLcontext *ctx, GLbitfield new_state ) 66206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 66306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 66406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_InvalidateState\n"); 66506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 66606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->InvalidateState( ctx, new_state ); 66706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 66806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 66906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 67006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_ResetLineStipple( GLcontext *ctx ) 67106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 67206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 67306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_ResetLineStipple\n"); 67406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 67506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->StippleCounter = 0; 67606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 67706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 67806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 67906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_allow_vertex_fog( GLcontext *ctx, GLboolean value ) 68006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 68106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 68206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_allow_vertex_fog %d\n", value); 68306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 68406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->InvalidateState( ctx, _NEW_HINT ); 68506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->AllowVertexFog = value; 68606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 68706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 68806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 68906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_allow_pixel_fog( GLcontext *ctx, GLboolean value ) 69006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 69106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 69206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_allow_pixel_fog %d\n", value); 69306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 69406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->InvalidateState( ctx, _NEW_HINT ); 69506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->AllowPixelFog = value; 69606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 69706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 69806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 69906049e24164fc0bda9dea12fbcbdb827a731badbBrian PaulGLboolean 70006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_CreateContext( GLcontext *ctx ) 70106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 70206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLuint i; 70306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = (SWcontext *)CALLOC(sizeof(SWcontext)); 70406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 70506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 70606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_CreateContext\n"); 70706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 70806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 70906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (!swrast) 71006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return GL_FALSE; 71106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 71206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->NewState = ~0; 71306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 71406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_point = _swrast_choose_point; 71506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_line = _swrast_choose_line; 71606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_triangle = _swrast_choose_triangle; 71706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 71806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidatePointMask = _SWRAST_NEW_POINT; 71906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateLineMask = _SWRAST_NEW_LINE; 72006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateTriangleMask = _SWRAST_NEW_TRIANGLE; 72106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 72206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Point = _swrast_validate_point; 72306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Line = _swrast_validate_line; 72406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Triangle = _swrast_validate_triangle; 72506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateState = _swrast_sleep; 72606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->BlendFunc = _swrast_validate_blend_func; 72706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 72806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->AllowVertexFog = GL_TRUE; 72906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->AllowPixelFog = GL_TRUE; 73006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 73106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* Optimized Accum buffer */ 73206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_IntegerAccumMode = GL_FALSE; 73306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_IntegerAccumScaler = 0.0; 73406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 73506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++) 73606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->TextureSample[i] = NULL; 73706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 738cdb27e8242215271364602995d85607cfc06d441Brian Paul swrast->SpanArrays = MALLOC_STRUCT(sw_span_arrays); 73906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (!swrast->SpanArrays) { 74006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE(swrast); 74106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return GL_FALSE; 74206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 743a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul swrast->SpanArrays->ChanType = CHAN_TYPE; 744a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE 745a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul swrast->SpanArrays->rgba = swrast->SpanArrays->color.sz1.rgba; 746a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul swrast->SpanArrays->spec = swrast->SpanArrays->color.sz1.spec; 747a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul#elif CHAN_TYPE == GL_UNSIGNED_SHORT 748a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul swrast->SpanArrays->rgba = swrast->SpanArrays->color.sz2.rgba; 749a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul swrast->SpanArrays->spec = swrast->SpanArrays->color.sz2.spec; 750a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul#else 751a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul swrast->SpanArrays->rgba = swrast->SpanArrays->color.sz4.rgba; 752a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul swrast->SpanArrays->spec = swrast->SpanArrays->color.sz4.spec; 753a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul#endif 75406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 75506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* init point span buffer */ 75606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.primitive = GL_POINT; 75706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.end = 0; 75806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.facing = 0; 75906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.array = swrast->SpanArrays; 76006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 761ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul swrast->TexelBuffer = (GLchan *) MALLOC(ctx->Const.MaxTextureImageUnits * 76206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul MAX_WIDTH * 4 * sizeof(GLchan)); 76306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (!swrast->TexelBuffer) { 76406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE(swrast->SpanArrays); 76506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE(swrast); 76606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return GL_FALSE; 76706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 76806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 76906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul ctx->swrast_context = swrast; 77006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 77106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return GL_TRUE; 77206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 77306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 77406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 77506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_DestroyContext( GLcontext *ctx ) 77606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 77706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 77806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 77906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 78006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_DestroyContext\n"); 78106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 78206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 78306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE( swrast->SpanArrays ); 78406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE( swrast->TexelBuffer ); 78506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE( swrast ); 78606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 78706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul ctx->swrast_context = 0; 78806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 78906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 79006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 79106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstruct swrast_device_driver * 79206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_GetDeviceDriverReference( GLcontext *ctx ) 79306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 79406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 79506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return &swrast->Driver; 79606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 79706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 79806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 79906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_flush( GLcontext *ctx ) 80006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 80106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 80206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* flush any pending fragments from rendering points */ 80306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->PointSpan.end > 0) { 80406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Visual.rgbMode) { 80506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_write_rgba_span(ctx, &(swrast->PointSpan)); 80606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 80706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul else { 80806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_write_index_span(ctx, &(swrast->PointSpan)); 80906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 81006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.end = 0; 81106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 81206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 81306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 81406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 81506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_render_primitive( GLcontext *ctx, GLenum prim ) 81606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 81706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 81806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->Primitive == GL_POINTS && prim != GL_POINTS) { 81906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_flush(ctx); 82006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 82106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Primitive = prim; 82206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 82306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 82406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 82506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 82606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_render_start( GLcontext *ctx ) 82706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 82806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 82906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->Driver.SpanRenderStart) 83006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Driver.SpanRenderStart( ctx ); 83106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.end = 0; 83206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 83306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 83406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 83506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_render_finish( GLcontext *ctx ) 83606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 83706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 83806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->Driver.SpanRenderFinish) 83906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Driver.SpanRenderFinish( ctx ); 84006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 84106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_flush(ctx); 84206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 84306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 84406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 84506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define SWRAST_DEBUG_VERTICES 0 84606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 84706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 84806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_print_vertex( GLcontext *ctx, const SWvertex *v ) 84906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 85006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLuint i; 85106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 85206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG_VERTICES) { 85306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "win %f %f %f %f\n", 85406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->win[0], v->win[1], v->win[2], v->win[3]); 85506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 856ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++) 85706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Texture.Unit[i]._ReallyEnabled) 85806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "texcoord[%d] %f %f %f %f\n", i, 859dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian v->attrib[FRAG_ATTRIB_TEX0 + i][0], 860dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian v->attrib[FRAG_ATTRIB_TEX0 + i][1], 861dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian v->attrib[FRAG_ATTRIB_TEX0 + i][2], 862dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian v->attrib[FRAG_ATTRIB_TEX0 + i][3]); 86306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 86406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#if CHAN_TYPE == GL_FLOAT 86506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "color %f %f %f %f\n", 86606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->color[0], v->color[1], v->color[2], v->color[3]); 86706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "spec %f %f %f %f\n", 86806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->specular[0], v->specular[1], 86906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->specular[2], v->specular[3]); 87006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#else 87106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "color %d %d %d %d\n", 87206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->color[0], v->color[1], v->color[2], v->color[3]); 87306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "spec %d %d %d %d\n", 87406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->specular[0], v->specular[1], 87506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->specular[2], v->specular[3]); 87606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#endif 87706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "fog %f\n", v->fog); 87806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "index %d\n", v->index); 87906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "pointsize %f\n", v->pointSize); 88006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "\n"); 88106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 88206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 883