s_context.c revision 3db3dc58bcc361637d7473ee4b7c4e3b036c283c
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 10506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->ATIFragmentShader._Enabled) { 10606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul rasterMask |= ATIFRAGSHADER_BIT; 10706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 10806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 10906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#if CHAN_TYPE == GL_FLOAT 11006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Color.ClampFragmentColor == GL_TRUE) { 11106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul rasterMask |= CLAMPING_BIT; 11206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 11306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#endif 11406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 11506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->_RasterMask = rasterMask; 11606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 11706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 11806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 11906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 12006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Examine polycon culls tate to compute the _BackfaceSign field. 12106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * _BackfaceSign will be 0 if no culling, -1 if culling back-faces, 12206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * and 1 if culling front-faces. The Polygon FrontFace state also 12306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * factors in. 12406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 12506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 12606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_polygon( GLcontext *ctx ) 12706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 1281fcb4ecc07685872c9c42569ba13faa1cad54d3cBrian GLfloat backface_sign; 12906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 13006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Polygon.CullFlag) { 1311fcb4ecc07685872c9c42569ba13faa1cad54d3cBrian backface_sign = 1.0; 1321fcb4ecc07685872c9c42569ba13faa1cad54d3cBrian switch (ctx->Polygon.CullFaceMode) { 13306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul case GL_BACK: 1341fcb4ecc07685872c9c42569ba13faa1cad54d3cBrian if (ctx->Polygon.FrontFace == GL_CCW) 1351fcb4ecc07685872c9c42569ba13faa1cad54d3cBrian backface_sign = -1.0; 13606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul break; 13706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul case GL_FRONT: 1381fcb4ecc07685872c9c42569ba13faa1cad54d3cBrian if (ctx->Polygon.FrontFace != GL_CCW) 1391fcb4ecc07685872c9c42569ba13faa1cad54d3cBrian backface_sign = -1.0; 14006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul break; 14106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul case GL_FRONT_AND_BACK: 1421fcb4ecc07685872c9c42569ba13faa1cad54d3cBrian /* fallthrough */ 1431fcb4ecc07685872c9c42569ba13faa1cad54d3cBrian default: 1441fcb4ecc07685872c9c42569ba13faa1cad54d3cBrian backface_sign = 0.0; 14506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul break; 14606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 14706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 14806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul else { 1491fcb4ecc07685872c9c42569ba13faa1cad54d3cBrian backface_sign = 0.0; 15006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 15106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 15206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->_BackfaceSign = backface_sign; 15306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 15406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 15506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 15606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 15706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Update the _PreferPixelFog field to indicate if we need to compute 15830a79f76fc4ae3bbf2307489bf9da1527f124e91Brian * fog blend factors (from the fog coords) per-fragment. 15906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 16006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 16106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_fog_hint( GLcontext *ctx ) 16206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 16306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 16406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_PreferPixelFog = (!swrast->AllowVertexFog || 16512ef1fbefcee964b715783d3ade6b69b2c699ed8Brian ctx->FragmentProgram._Current || 16606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul (ctx->Hint.Fog == GL_NICEST && 16706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->AllowPixelFog)); 16806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 16906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 17006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 17106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 17206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 17306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Update the swrast->_AnyTextureCombine flag. 17406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 17506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 17606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_texture_env( GLcontext *ctx ) 17706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 17806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 17906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLuint i; 18006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_AnyTextureCombine = GL_FALSE; 18106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul for (i = 0; i < ctx->Const.MaxTextureUnits; i++) { 18206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Texture.Unit[i].EnvMode == GL_COMBINE_EXT || 18306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul ctx->Texture.Unit[i].EnvMode == GL_COMBINE4_NV) { 18406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_AnyTextureCombine = GL_TRUE; 18506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return; 18606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 18706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 18806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 18906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 19006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 19106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 19206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Update swrast->_FogColor and swrast->_FogEnable values. 19306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 19406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 19506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_fog_state( GLcontext *ctx ) 19606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 19706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 19812ef1fbefcee964b715783d3ade6b69b2c699ed8Brian const struct gl_fragment_program *fp = ctx->FragmentProgram._Current; 19906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 20006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* determine if fog is needed, and if so, which fog mode */ 20106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_FogEnabled = GL_FALSE; 20212ef1fbefcee964b715783d3ade6b69b2c699ed8Brian if (fp && fp->Base.Target == GL_FRAGMENT_PROGRAM_ARB) { 20312ef1fbefcee964b715783d3ade6b69b2c699ed8Brian if (fp->FogOption != GL_NONE) { 20412ef1fbefcee964b715783d3ade6b69b2c699ed8Brian swrast->_FogEnabled = GL_TRUE; 20512ef1fbefcee964b715783d3ade6b69b2c699ed8Brian swrast->_FogMode = fp->FogOption; 20606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 20706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 20806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul else if (ctx->Fog.Enabled) { 20906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_FogEnabled = GL_TRUE; 21006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_FogMode = ctx->Fog.Mode; 21106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 21206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 21306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 21406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 21506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 21606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Update state for running fragment programs. Basically, load the 21706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * program parameters with current state values. 21806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 21906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 2205050b565deca3cad165cd2f68badc084b9aa5377Brian Paul_swrast_update_fragment_program(GLcontext *ctx, GLbitfield newState) 22106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 22212ef1fbefcee964b715783d3ade6b69b2c699ed8Brian const struct gl_fragment_program *fp = ctx->FragmentProgram._Current; 22312ef1fbefcee964b715783d3ade6b69b2c699ed8Brian if (fp) { 2246f676f4871b1701ec56298f9d22460677ed0e982Brian Paul#if 0 2256f676f4871b1701ec56298f9d22460677ed0e982Brian Paul /* XXX Need a way to trigger the initial loading of parameters 2266f676f4871b1701ec56298f9d22460677ed0e982Brian Paul * even when there's no recent state changes. 2276f676f4871b1701ec56298f9d22460677ed0e982Brian Paul */ 2285050b565deca3cad165cd2f68badc084b9aa5377Brian Paul if (fp->Base.Parameters->StateFlags & newState) 2296f676f4871b1701ec56298f9d22460677ed0e982Brian Paul#endif 2305050b565deca3cad165cd2f68badc084b9aa5377Brian Paul _mesa_load_state_parameters(ctx, fp->Base.Parameters); 23106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 23206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 23306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 23406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 23506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 23606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_DERIVED (_SWRAST_NEW_RASTERMASK | \ 23706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_TEXTURE | \ 23806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_HINT | \ 23906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_POLYGON ) 24006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 24106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/* State referenced by _swrast_choose_triangle, _swrast_choose_line. 24206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 24306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_TRIANGLE (_SWRAST_NEW_DERIVED | \ 24406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_RENDERMODE| \ 24506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_POLYGON| \ 24606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_DEPTH| \ 24706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_STENCIL| \ 24806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_COLOR| \ 24906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_TEXTURE| \ 25006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _SWRAST_NEW_RASTERMASK| \ 25106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_LIGHT| \ 25206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_FOG | \ 25306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _DD_NEW_SEPARATE_SPECULAR) 25406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 25506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_LINE (_SWRAST_NEW_DERIVED | \ 25606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_RENDERMODE| \ 25706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_LINE| \ 25806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_TEXTURE| \ 25906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_LIGHT| \ 26006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_FOG| \ 26106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_DEPTH | \ 26206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _DD_NEW_SEPARATE_SPECULAR) 26306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 26406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_POINT (_SWRAST_NEW_DERIVED | \ 26506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_RENDERMODE | \ 26606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_POINT | \ 26706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_TEXTURE | \ 26806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_LIGHT | \ 26906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_FOG | \ 27006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _DD_NEW_SEPARATE_SPECULAR) 27106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 27206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_TEXTURE_SAMPLE_FUNC _NEW_TEXTURE 27306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 27406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_TEXTURE_ENV_MODE _NEW_TEXTURE 27506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 27606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_BLEND_FUNC _NEW_COLOR 27706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 27806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 27906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 28006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 28106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Stub for swrast->Triangle to select a true triangle function 28206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * after a state change. 28306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 28406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 28506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_triangle( GLcontext *ctx, 28606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v0, 28706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v1, 28806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v2 ) 28906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 29006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 29106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 29206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_validate_derived( ctx ); 29306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_triangle( ctx ); 294d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul ASSERT(swrast->Triangle); 29506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 29606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Texture._EnabledUnits == 0 29706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul && NEED_SECONDARY_COLOR(ctx) 29812ef1fbefcee964b715783d3ade6b69b2c699ed8Brian && !ctx->FragmentProgram._Current) { 29906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* separate specular color, but no texture */ 30006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->SpecTriangle = swrast->Triangle; 30106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Triangle = _swrast_add_spec_terms_triangle; 30206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 30306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 30406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Triangle( ctx, v0, v1, v2 ); 30506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 30606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 30706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 30806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Called via swrast->Line. Examine current GL state and choose a software 30906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * line routine. Then call it. 31006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 31106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 31206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_line( GLcontext *ctx, const SWvertex *v0, const SWvertex *v1 ) 31306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 31406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 31506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 31606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_validate_derived( ctx ); 31706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_line( ctx ); 318d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul ASSERT(swrast->Line); 31906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 32006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Texture._EnabledUnits == 0 32106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul && NEED_SECONDARY_COLOR(ctx) 32212ef1fbefcee964b715783d3ade6b69b2c699ed8Brian && !ctx->FragmentProgram._Current) { 32306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->SpecLine = swrast->Line; 32406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Line = _swrast_add_spec_terms_line; 32506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 32606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 32706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 32806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Line( ctx, v0, v1 ); 32906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 33006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 33106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 33206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Called via swrast->Point. Examine current GL state and choose a software 33306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * point routine. Then call it. 33406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 33506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 33606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_point( GLcontext *ctx, const SWvertex *v0 ) 33706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 33806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 33906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 34006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_validate_derived( ctx ); 34106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_point( ctx ); 34206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 34306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Texture._EnabledUnits == 0 34406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul && NEED_SECONDARY_COLOR(ctx) 34512ef1fbefcee964b715783d3ade6b69b2c699ed8Brian && !ctx->FragmentProgram._Current) { 34606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->SpecPoint = swrast->Point; 34706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Point = _swrast_add_spec_terms_point; 34806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 34906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 35006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Point( ctx, v0 ); 35106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 35206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 35306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 35406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 35506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Called via swrast->BlendFunc. Examine GL state to choose a blending 35606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * function, then call it. 35706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 35806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void _ASMAPI 359a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul_swrast_validate_blend_func(GLcontext *ctx, GLuint n, const GLubyte mask[], 360d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul GLvoid *src, const GLvoid *dst, 361a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul GLenum chanType ) 36206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 36306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 36406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 365d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul _swrast_validate_derived( ctx ); /* why is this needed? */ 366d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul _swrast_choose_blend_func( ctx, chanType ); 36706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 368a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul swrast->BlendFunc( ctx, n, mask, src, dst, chanType ); 36906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 37006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 37106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 372ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul/** 373ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Make sure we have texture image data for all the textures we may need 374ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * for subsequent rendering. 375ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */ 376ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paulstatic void 377ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul_swrast_validate_texture_images(GLcontext *ctx) 378ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul{ 379ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 380ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint u; 381ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 382ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (!swrast->ValidateTextureImage || !ctx->Texture._EnabledUnits) { 383ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* no textures enabled, or no way to validate images! */ 384ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul return; 385ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 386ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 387ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (u = 0; u < ctx->Const.MaxTextureImageUnits; u++) { 388ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (ctx->Texture.Unit[u]._ReallyEnabled) { 389ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_object *texObj = ctx->Texture.Unit[u]._Current; 390ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul ASSERT(texObj); 391ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (texObj) { 392ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint numFaces = (texObj->Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; 393ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint face; 394ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (face = 0; face < numFaces; face++) { 3957e85b0a025a82c3ffed060a757a3b4adae03d269Brian GLint lvl; 396ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (lvl = texObj->BaseLevel; lvl <= texObj->_MaxLevel; lvl++) { 397ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_image *texImg = texObj->Image[face][lvl]; 398ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (texImg && !texImg->Data) { 399ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul swrast->ValidateTextureImage(ctx, texObj, face, lvl); 400ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul ASSERT(texObj->Image[face][lvl]->Data); 401ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 402ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 403ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 404ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 405ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 406ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 407ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul} 408ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 409ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 410ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul/** 411ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Free the texture image data attached to all currently enabled 412ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * textures. Meant to be called by device drivers when transitioning 413ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * from software to hardware rendering. 414ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */ 415ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paulvoid 416ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul_swrast_eject_texture_images(GLcontext *ctx) 417ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul{ 418ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint u; 419ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 420ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (!ctx->Texture._EnabledUnits) { 421ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* no textures enabled */ 422ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul return; 423ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 424ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 425ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (u = 0; u < ctx->Const.MaxTextureImageUnits; u++) { 426ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (ctx->Texture.Unit[u]._ReallyEnabled) { 427ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_object *texObj = ctx->Texture.Unit[u]._Current; 428ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul ASSERT(texObj); 429ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (texObj) { 430ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint numFaces = (texObj->Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; 431ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint face; 432ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (face = 0; face < numFaces; face++) { 4337e85b0a025a82c3ffed060a757a3b4adae03d269Brian GLint lvl; 434ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (lvl = texObj->BaseLevel; lvl <= texObj->_MaxLevel; lvl++) { 435ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_image *texImg = texObj->Image[face][lvl]; 436ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (texImg && texImg->Data) { 437ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul _mesa_free_texmemory(texImg->Data); 438ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul texImg->Data = NULL; 439ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 440ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 441ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 442ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 443ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 444ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 445ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul} 446ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 447ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 448ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 44906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 45006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_sleep( GLcontext *ctx, GLbitfield new_state ) 45106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 45206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul (void) ctx; (void) new_state; 45306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 45406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 45506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 45606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 45706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_invalidate_state( GLcontext *ctx, GLbitfield new_state ) 45806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 45906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 46006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLuint i; 46106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 46206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->NewState |= new_state; 46306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 46406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* After 10 statechanges without any swrast functions being called, 46506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * put the module to sleep. 46606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 46706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (++swrast->StateChanges > 10) { 46806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateState = _swrast_sleep; 46906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->NewState = ~0; 47006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul new_state = ~0; 47106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 47206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 47306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & swrast->InvalidateTriangleMask) 47406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Triangle = _swrast_validate_triangle; 47506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 47606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & swrast->InvalidateLineMask) 47706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Line = _swrast_validate_line; 47806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 47906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & swrast->InvalidatePointMask) 48006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Point = _swrast_validate_point; 48106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 48206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & _SWRAST_NEW_BLEND_FUNC) 48306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->BlendFunc = _swrast_validate_blend_func; 48406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 48506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & _SWRAST_NEW_TEXTURE_SAMPLE_FUNC) 486ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul for (i = 0 ; i < ctx->Const.MaxTextureImageUnits ; i++) 48706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->TextureSample[i] = NULL; 48806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 48906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 49006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 49104bda46739beb0dab7c8820bdbe67136470d42beBrianvoid 49206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_texture_samplers(GLcontext *ctx) 49306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 49406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 49506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLuint u; 49606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 49706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul for (u = 0; u < ctx->Const.MaxTextureImageUnits; u++) { 49806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const struct gl_texture_object *tObj = ctx->Texture.Unit[u]._Current; 4999a78ef980d89c0d18f859036d5a0cdf82acd303cBrian /* Note: If tObj is NULL, the sample function will be a simple 5009a78ef980d89c0d18f859036d5a0cdf82acd303cBrian * function that just returns opaque black (0,0,0,1). 5019a78ef980d89c0d18f859036d5a0cdf82acd303cBrian */ 5029a78ef980d89c0d18f859036d5a0cdf82acd303cBrian swrast->TextureSample[u] = _swrast_choose_texture_sample_func(ctx, tObj); 50306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 50406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 50506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 50606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 507dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian/** 5080bdf216dd06d5136b8529297297aa962bab548c2Brian * Update swrast->_ActiveAttribs and swrast->_NumActiveAttribs 509dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian */ 510dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brianstatic void 511dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian_swrast_update_fragment_attribs(GLcontext *ctx) 512dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian{ 513dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian SWcontext *swrast = SWRAST_CONTEXT(ctx); 5140bdf216dd06d5136b8529297297aa962bab548c2Brian GLuint attribsMask; 515dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 516dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian if (ctx->FragmentProgram._Current) { 5170bdf216dd06d5136b8529297297aa962bab548c2Brian attribsMask = ctx->FragmentProgram._Current->Base.InputsRead; 518dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian } 519dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian else { 520dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian GLuint u; 5210bdf216dd06d5136b8529297297aa962bab548c2Brian attribsMask = 0x0; 522dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 5233db3dc58bcc361637d7473ee4b7c4e3b036c283cBrian#if 0 /* not yet */ 524dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian if (ctx->Depth.Test) 5250bdf216dd06d5136b8529297297aa962bab548c2Brian attribsMask |= FRAG_BIT_WPOS; 526dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian if (NEED_SECONDARY_COLOR(ctx)) 5270bdf216dd06d5136b8529297297aa962bab548c2Brian attribsMask |= FRAG_BIT_COL1; 5283db3dc58bcc361637d7473ee4b7c4e3b036c283cBrian#endif 529dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian if (swrast->_FogEnabled) 5300bdf216dd06d5136b8529297297aa962bab548c2Brian attribsMask |= FRAG_BIT_FOGC; 531dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 532dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian for (u = 0; u < ctx->Const.MaxTextureUnits; u++) { 533dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian if (ctx->Texture.Unit[u]._ReallyEnabled) { 5340bdf216dd06d5136b8529297297aa962bab548c2Brian attribsMask |= FRAG_BIT_TEX(u); 535dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian } 536dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian } 537dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian } 538dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 5390bdf216dd06d5136b8529297297aa962bab548c2Brian /* Update _ActiveAttribs[] list */ 540dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian { 5410bdf216dd06d5136b8529297297aa962bab548c2Brian GLuint i, num = 0; 5420bdf216dd06d5136b8529297297aa962bab548c2Brian for (i = 0; i < FRAG_ATTRIB_MAX; i++) { 5430bdf216dd06d5136b8529297297aa962bab548c2Brian if (attribsMask & (1 << i)) 5440bdf216dd06d5136b8529297297aa962bab548c2Brian swrast->_ActiveAttribs[num++] = i; 545dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian } 5460bdf216dd06d5136b8529297297aa962bab548c2Brian swrast->_NumActiveAttribs = num; 547dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian } 548dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian} 549dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 550dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 5511c09bcfdda4083636a3ac27d804a34ef87875ce7Brian/** 5521c09bcfdda4083636a3ac27d804a34ef87875ce7Brian * Update the swrast->_ColorOutputsMask which indicates which color 5531c09bcfdda4083636a3ac27d804a34ef87875ce7Brian * renderbuffers (aka rendertargets) are being written to by the current 5541c09bcfdda4083636a3ac27d804a34ef87875ce7Brian * fragment program. 5551c09bcfdda4083636a3ac27d804a34ef87875ce7Brian * We also take glDrawBuffers() into account to skip outputs that are 5561c09bcfdda4083636a3ac27d804a34ef87875ce7Brian * set to GL_NONE. 5571c09bcfdda4083636a3ac27d804a34ef87875ce7Brian */ 5581c09bcfdda4083636a3ac27d804a34ef87875ce7Brianstatic void 5591c09bcfdda4083636a3ac27d804a34ef87875ce7Brian_swrast_update_color_outputs(GLcontext *ctx) 5601c09bcfdda4083636a3ac27d804a34ef87875ce7Brian{ 5611c09bcfdda4083636a3ac27d804a34ef87875ce7Brian SWcontext *swrast = SWRAST_CONTEXT(ctx); 5621c09bcfdda4083636a3ac27d804a34ef87875ce7Brian const struct gl_framebuffer *fb = ctx->DrawBuffer; 5631c09bcfdda4083636a3ac27d804a34ef87875ce7Brian 5641c09bcfdda4083636a3ac27d804a34ef87875ce7Brian swrast->_ColorOutputsMask = 0; 5651c09bcfdda4083636a3ac27d804a34ef87875ce7Brian swrast->_NumColorOutputs = 0; 5661c09bcfdda4083636a3ac27d804a34ef87875ce7Brian 5671c09bcfdda4083636a3ac27d804a34ef87875ce7Brian if (ctx->FragmentProgram._Current) { 5681c09bcfdda4083636a3ac27d804a34ef87875ce7Brian const GLbitfield outputsWritten 5691c09bcfdda4083636a3ac27d804a34ef87875ce7Brian = ctx->FragmentProgram._Current->Base.OutputsWritten; 5701c09bcfdda4083636a3ac27d804a34ef87875ce7Brian GLuint output; 5711c09bcfdda4083636a3ac27d804a34ef87875ce7Brian for (output = 0; output < ctx->Const.MaxDrawBuffers; output++) { 5721c09bcfdda4083636a3ac27d804a34ef87875ce7Brian if ((outputsWritten & (1 << (FRAG_RESULT_DATA0 + output))) 5731c09bcfdda4083636a3ac27d804a34ef87875ce7Brian && (fb->_NumColorDrawBuffers[output] > 0)) { 5741c09bcfdda4083636a3ac27d804a34ef87875ce7Brian swrast->_ColorOutputsMask |= (1 << output); 5751c09bcfdda4083636a3ac27d804a34ef87875ce7Brian swrast->_NumColorOutputs = output + 1; 5761c09bcfdda4083636a3ac27d804a34ef87875ce7Brian } 5771c09bcfdda4083636a3ac27d804a34ef87875ce7Brian } 5781c09bcfdda4083636a3ac27d804a34ef87875ce7Brian } 5791c09bcfdda4083636a3ac27d804a34ef87875ce7Brian if (swrast->_ColorOutputsMask == 0x0) { 5801c09bcfdda4083636a3ac27d804a34ef87875ce7Brian /* no fragment program, or frag prog didn't write to gl_FragData[] */ 5811c09bcfdda4083636a3ac27d804a34ef87875ce7Brian if (fb->_NumColorDrawBuffers[0] > 0) { 5821c09bcfdda4083636a3ac27d804a34ef87875ce7Brian swrast->_ColorOutputsMask = 0x1; 5831c09bcfdda4083636a3ac27d804a34ef87875ce7Brian swrast->_NumColorOutputs = 1; 5841c09bcfdda4083636a3ac27d804a34ef87875ce7Brian } 5851c09bcfdda4083636a3ac27d804a34ef87875ce7Brian } 5861c09bcfdda4083636a3ac27d804a34ef87875ce7Brian} 5871c09bcfdda4083636a3ac27d804a34ef87875ce7Brian 5881c09bcfdda4083636a3ac27d804a34ef87875ce7Brian 58906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 59006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_derived( GLcontext *ctx ) 59106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 59206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 59306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 59406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState) { 59506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & _NEW_POLYGON) 59606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_polygon( ctx ); 59706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 59806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & (_NEW_HINT | _NEW_PROGRAM)) 59906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_fog_hint( ctx ); 60006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 60106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & _SWRAST_NEW_TEXTURE_ENV_MODE) 60206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_texture_env( ctx ); 60306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 60406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & (_NEW_FOG | _NEW_PROGRAM)) 60506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_fog_state( ctx ); 60606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 6074e9e0aff790656821970ba74d8996718e415ea68Brian Paul if (swrast->NewState & (_NEW_MODELVIEW | 6084e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_PROJECTION | 6094e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_TEXTURE_MATRIX | 6104e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_FOG | 6114e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_LIGHT | 6124e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_LINE | 6134e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_TEXTURE | 6144e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_TRANSFORM | 6154e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_POINT | 6164e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_VIEWPORT | 6174e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_PROGRAM)) 6185050b565deca3cad165cd2f68badc084b9aa5377Brian Paul _swrast_update_fragment_program( ctx, swrast->NewState ); 61906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 62004bda46739beb0dab7c8820bdbe67136470d42beBrian if (swrast->NewState & (_NEW_TEXTURE | _NEW_PROGRAM)) 62106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_texture_samplers( ctx ); 62206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 623ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (swrast->NewState & (_NEW_TEXTURE | _NEW_PROGRAM)) 624ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul _swrast_validate_texture_images( ctx ); 625ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 6268334c8a2169055cd87e55d32403d59b8e46deb59Brian Paul if (swrast->NewState & _SWRAST_NEW_RASTERMASK) 6278334c8a2169055cd87e55d32403d59b8e46deb59Brian Paul _swrast_update_rasterflags( ctx ); 6288334c8a2169055cd87e55d32403d59b8e46deb59Brian Paul 629dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian if (swrast->NewState & (_NEW_DEPTH | 630dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian _NEW_FOG | 631dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian _NEW_PROGRAM | 632dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian _NEW_TEXTURE)) 633dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian _swrast_update_fragment_attribs(ctx); 634dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 6351c09bcfdda4083636a3ac27d804a34ef87875ce7Brian if (swrast->NewState & (_NEW_PROGRAM | _NEW_BUFFERS)) 6361c09bcfdda4083636a3ac27d804a34ef87875ce7Brian _swrast_update_color_outputs(ctx); 6371c09bcfdda4083636a3ac27d804a34ef87875ce7Brian 63806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->NewState = 0; 63906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->StateChanges = 0; 64006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateState = _swrast_invalidate_state; 64106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 64206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 64306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 64406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define SWRAST_DEBUG 0 64506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 64606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/* Public entrypoints: See also s_accum.c, s_bitmap.c, etc. 64706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 64806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 64906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Quad( GLcontext *ctx, 65006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v0, const SWvertex *v1, 65106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v2, const SWvertex *v3 ) 65206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 65306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 65406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_Quad\n"); 65506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v0 ); 65606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v1 ); 65706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v2 ); 65806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v3 ); 65906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 66006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Triangle( ctx, v0, v1, v3 ); 66106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Triangle( ctx, v1, v2, v3 ); 66206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 66306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 66406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 66506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Triangle( GLcontext *ctx, const SWvertex *v0, 66606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v1, const SWvertex *v2 ) 66706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 66806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 66906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_Triangle\n"); 67006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v0 ); 67106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v1 ); 67206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v2 ); 67306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 67406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Triangle( ctx, v0, v1, v2 ); 67506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 67606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 67706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 67806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Line( GLcontext *ctx, const SWvertex *v0, const SWvertex *v1 ) 67906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 68006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 68106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_Line\n"); 68206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v0 ); 68306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v1 ); 68406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 68506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Line( ctx, v0, v1 ); 68606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 68706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 68806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 68906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Point( GLcontext *ctx, const SWvertex *v0 ) 69006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 69106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 69206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_Point\n"); 69306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v0 ); 69406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 69506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Point( ctx, v0 ); 69606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 69706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 69806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 69906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_InvalidateState( GLcontext *ctx, GLbitfield new_state ) 70006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 70106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 70206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_InvalidateState\n"); 70306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 70406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->InvalidateState( ctx, new_state ); 70506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 70606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 70706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 70806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_ResetLineStipple( GLcontext *ctx ) 70906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 71006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 71106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_ResetLineStipple\n"); 71206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 71306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->StippleCounter = 0; 71406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 71506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 71606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 71706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_allow_vertex_fog( GLcontext *ctx, GLboolean value ) 71806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 71906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 72006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_allow_vertex_fog %d\n", value); 72106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 72206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->InvalidateState( ctx, _NEW_HINT ); 72306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->AllowVertexFog = value; 72406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 72506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 72606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 72706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_allow_pixel_fog( GLcontext *ctx, GLboolean value ) 72806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 72906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 73006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_allow_pixel_fog %d\n", value); 73106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 73206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->InvalidateState( ctx, _NEW_HINT ); 73306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->AllowPixelFog = value; 73406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 73506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 73606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 73706049e24164fc0bda9dea12fbcbdb827a731badbBrian PaulGLboolean 73806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_CreateContext( GLcontext *ctx ) 73906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 74006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLuint i; 74106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = (SWcontext *)CALLOC(sizeof(SWcontext)); 74206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 74306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 74406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_CreateContext\n"); 74506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 74606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 74706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (!swrast) 74806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return GL_FALSE; 74906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 75006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->NewState = ~0; 75106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 75206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_point = _swrast_choose_point; 75306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_line = _swrast_choose_line; 75406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_triangle = _swrast_choose_triangle; 75506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 75606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidatePointMask = _SWRAST_NEW_POINT; 75706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateLineMask = _SWRAST_NEW_LINE; 75806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateTriangleMask = _SWRAST_NEW_TRIANGLE; 75906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 76006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Point = _swrast_validate_point; 76106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Line = _swrast_validate_line; 76206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Triangle = _swrast_validate_triangle; 76306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateState = _swrast_sleep; 76406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->BlendFunc = _swrast_validate_blend_func; 76506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 76606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->AllowVertexFog = GL_TRUE; 76706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->AllowPixelFog = GL_TRUE; 76806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 76906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* Optimized Accum buffer */ 77006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_IntegerAccumMode = GL_FALSE; 77106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_IntegerAccumScaler = 0.0; 77206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 77306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++) 77406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->TextureSample[i] = NULL; 77506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 776cdb27e8242215271364602995d85607cfc06d441Brian Paul swrast->SpanArrays = MALLOC_STRUCT(sw_span_arrays); 77706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (!swrast->SpanArrays) { 77806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE(swrast); 77906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return GL_FALSE; 78006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 781a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul swrast->SpanArrays->ChanType = CHAN_TYPE; 782a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE 783a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul swrast->SpanArrays->rgba = swrast->SpanArrays->color.sz1.rgba; 784a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul swrast->SpanArrays->spec = swrast->SpanArrays->color.sz1.spec; 785a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul#elif CHAN_TYPE == GL_UNSIGNED_SHORT 786a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul swrast->SpanArrays->rgba = swrast->SpanArrays->color.sz2.rgba; 787a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul swrast->SpanArrays->spec = swrast->SpanArrays->color.sz2.spec; 788a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul#else 7894f9d3a07bbe731709e6819448d21dee609a37806Richard Hughes swrast->SpanArrays->rgba = swrast->SpanArrays->attribs[FRAG_ATTRIB_COL0]; 7904f9d3a07bbe731709e6819448d21dee609a37806Richard Hughes swrast->SpanArrays->spec = swrast->SpanArrays->attribs[FRAG_ATTRIB_COL1]; 791a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul#endif 79206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 79306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* init point span buffer */ 79406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.primitive = GL_POINT; 79506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.end = 0; 79606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.facing = 0; 79706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.array = swrast->SpanArrays; 79806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 799ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul swrast->TexelBuffer = (GLchan *) MALLOC(ctx->Const.MaxTextureImageUnits * 80006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul MAX_WIDTH * 4 * sizeof(GLchan)); 80106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (!swrast->TexelBuffer) { 80206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE(swrast->SpanArrays); 80306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE(swrast); 80406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return GL_FALSE; 80506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 80606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 80706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul ctx->swrast_context = swrast; 80806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 80906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return GL_TRUE; 81006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 81106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 81206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 81306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_DestroyContext( GLcontext *ctx ) 81406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 81506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 81606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 81706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 81806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_DestroyContext\n"); 81906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 82006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 82106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE( swrast->SpanArrays ); 82206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE( swrast->TexelBuffer ); 82306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE( swrast ); 82406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 82506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul ctx->swrast_context = 0; 82606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 82706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 82806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 82906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstruct swrast_device_driver * 83006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_GetDeviceDriverReference( GLcontext *ctx ) 83106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 83206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 83306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return &swrast->Driver; 83406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 83506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 83606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 83706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_flush( GLcontext *ctx ) 83806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 83906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 84006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* flush any pending fragments from rendering points */ 84106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->PointSpan.end > 0) { 84206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Visual.rgbMode) { 84306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_write_rgba_span(ctx, &(swrast->PointSpan)); 84406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 84506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul else { 84606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_write_index_span(ctx, &(swrast->PointSpan)); 84706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 84806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.end = 0; 84906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 85006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 85106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 85206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 85306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_render_primitive( GLcontext *ctx, GLenum prim ) 85406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 85506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 85606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->Primitive == GL_POINTS && prim != GL_POINTS) { 85706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_flush(ctx); 85806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 85906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Primitive = prim; 86006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 86106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 86206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 86306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 86406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_render_start( GLcontext *ctx ) 86506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 86606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 86706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->Driver.SpanRenderStart) 86806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Driver.SpanRenderStart( ctx ); 86906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.end = 0; 87006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 87106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 87206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 87306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_render_finish( GLcontext *ctx ) 87406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 87506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 87606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->Driver.SpanRenderFinish) 87706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Driver.SpanRenderFinish( ctx ); 87806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 87906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_flush(ctx); 88006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 88106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 88206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 88306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define SWRAST_DEBUG_VERTICES 0 88406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 88506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 88606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_print_vertex( GLcontext *ctx, const SWvertex *v ) 88706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 88806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLuint i; 88906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 89006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG_VERTICES) { 89106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "win %f %f %f %f\n", 89206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->win[0], v->win[1], v->win[2], v->win[3]); 89306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 894ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++) 89506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Texture.Unit[i]._ReallyEnabled) 89606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "texcoord[%d] %f %f %f %f\n", i, 897dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian v->attrib[FRAG_ATTRIB_TEX0 + i][0], 898dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian v->attrib[FRAG_ATTRIB_TEX0 + i][1], 899dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian v->attrib[FRAG_ATTRIB_TEX0 + i][2], 900dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian v->attrib[FRAG_ATTRIB_TEX0 + i][3]); 90106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 90206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#if CHAN_TYPE == GL_FLOAT 90306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "color %f %f %f %f\n", 90406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->color[0], v->color[1], v->color[2], v->color[3]); 90506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "spec %f %f %f %f\n", 90606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->specular[0], v->specular[1], 90706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->specular[2], v->specular[3]); 90806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#else 90906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "color %d %d %d %d\n", 91006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->color[0], v->color[1], v->color[2], v->color[3]); 91106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "spec %d %d %d %d\n", 91206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->specular[0], v->specular[1], 91306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->specular[2], v->specular[3]); 91406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#endif 915afc132e7a9c2b2c870b61ef10311272b36ea9bf2Brian _mesa_debug(ctx, "fog %f\n", v->attrib[FRAG_ATTRIB_FOGC][0]); 91606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "index %d\n", v->index); 91706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "pointsize %f\n", v->pointSize); 91806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "\n"); 91906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 92006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 921