s_context.c revision 8334c8a2169055cd87e55d32403d59b8e46deb59
106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/* 206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Mesa 3-D graphics library 3122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul * Version: 6.5.1 406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * 5ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul * Copyright (C) 1999-2006 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" 3406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "program.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 10106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->FragmentProgram._Active) { 10206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul rasterMask |= FRAGPROG_BIT; 10306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 10406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 10506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->ShaderObjects._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 || 16806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul ctx->FragmentProgram._Enabled || /* not _Active! */ 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); 20106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 20206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* convert fog color to GLchan values */ 20306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul CLAMPED_FLOAT_TO_CHAN(swrast->_FogColor[RCOMP], ctx->Fog.Color[RCOMP]); 20406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul CLAMPED_FLOAT_TO_CHAN(swrast->_FogColor[GCOMP], ctx->Fog.Color[GCOMP]); 20506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul CLAMPED_FLOAT_TO_CHAN(swrast->_FogColor[BCOMP], ctx->Fog.Color[BCOMP]); 20606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 20706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* determine if fog is needed, and if so, which fog mode */ 20806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_FogEnabled = GL_FALSE; 20906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->FragmentProgram._Active) { 21006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->FragmentProgram._Current->Base.Target==GL_FRAGMENT_PROGRAM_ARB) { 211122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul const struct gl_fragment_program *fp 212122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul = ctx->FragmentProgram._Current; 213122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul if (fp->FogOption != GL_NONE) { 21406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_FogEnabled = GL_TRUE; 215122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul swrast->_FogMode = fp->FogOption; 21606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 21706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 21806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 21906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul else if (ctx->Fog.Enabled) { 22006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_FogEnabled = GL_TRUE; 22106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_FogMode = ctx->Fog.Mode; 22206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 22306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 22406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 22506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 22606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 22706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Update state for running fragment programs. Basically, load the 22806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * program parameters with current state values. 22906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 23006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 23106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_fragment_program( GLcontext *ctx ) 23206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 23306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->FragmentProgram._Active) { 234122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul const struct gl_fragment_program *fp = ctx->FragmentProgram._Current; 235122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul _mesa_load_state_parameters(ctx, fp->Base.Parameters); 23606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 23706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 23806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 23906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 24006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 24106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_DERIVED (_SWRAST_NEW_RASTERMASK | \ 24206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_TEXTURE | \ 24306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_HINT | \ 24406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_POLYGON ) 24506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 24606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/* State referenced by _swrast_choose_triangle, _swrast_choose_line. 24706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 24806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_TRIANGLE (_SWRAST_NEW_DERIVED | \ 24906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_RENDERMODE| \ 25006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_POLYGON| \ 25106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_DEPTH| \ 25206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_STENCIL| \ 25306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_COLOR| \ 25406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_TEXTURE| \ 25506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _SWRAST_NEW_RASTERMASK| \ 25606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_LIGHT| \ 25706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_FOG | \ 25806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _DD_NEW_SEPARATE_SPECULAR) 25906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 26006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_LINE (_SWRAST_NEW_DERIVED | \ 26106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_RENDERMODE| \ 26206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_LINE| \ 26306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_TEXTURE| \ 26406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_LIGHT| \ 26506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_FOG| \ 26606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_DEPTH | \ 26706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _DD_NEW_SEPARATE_SPECULAR) 26806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 26906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_POINT (_SWRAST_NEW_DERIVED | \ 27006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_RENDERMODE | \ 27106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_POINT | \ 27206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_TEXTURE | \ 27306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_LIGHT | \ 27406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_FOG | \ 27506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _DD_NEW_SEPARATE_SPECULAR) 27606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 27706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_TEXTURE_SAMPLE_FUNC _NEW_TEXTURE 27806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 27906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_TEXTURE_ENV_MODE _NEW_TEXTURE 28006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 28106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_BLEND_FUNC _NEW_COLOR 28206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 28306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 28406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 28506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 28606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Stub for swrast->Triangle to select a true triangle function 28706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * after a state change. 28806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 28906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 29006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_triangle( GLcontext *ctx, 29106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v0, 29206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v1, 29306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v2 ) 29406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 29506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 29606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 29706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_validate_derived( ctx ); 29806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_triangle( ctx ); 29906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 30006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Texture._EnabledUnits == 0 30106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul && NEED_SECONDARY_COLOR(ctx) 30206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul && !ctx->FragmentProgram._Active) { 30306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* separate specular color, but no texture */ 30406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->SpecTriangle = swrast->Triangle; 30506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Triangle = _swrast_add_spec_terms_triangle; 30606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 30706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 30806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Triangle( ctx, v0, v1, v2 ); 30906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 31006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 31106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 31206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Called via swrast->Line. Examine current GL state and choose a software 31306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * line routine. Then call it. 31406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 31506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 31606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_line( GLcontext *ctx, const SWvertex *v0, const SWvertex *v1 ) 31706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 31806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 31906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 32006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_validate_derived( ctx ); 32106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_line( ctx ); 32206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 32306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Texture._EnabledUnits == 0 32406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul && NEED_SECONDARY_COLOR(ctx) 32506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul && !ctx->FragmentProgram._Active) { 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) 34806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul && !ctx->FragmentProgram._Active) { 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 36206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_blend_func( GLcontext *ctx, GLuint n, 36306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const GLubyte mask[], 36406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLchan src[][4], 36506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul CONST GLchan dst[][4] ) 36606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 36706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 36806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 36906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_validate_derived( ctx ); 37006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_choose_blend_func( ctx ); 37106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 37206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->BlendFunc( ctx, n, mask, src, dst ); 37306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 37406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 37506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 376ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul/** 377ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Make sure we have texture image data for all the textures we may need 378ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * for subsequent rendering. 379ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */ 380ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paulstatic void 381ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul_swrast_validate_texture_images(GLcontext *ctx) 382ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul{ 383ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 384ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint u; 385ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 386ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (!swrast->ValidateTextureImage || !ctx->Texture._EnabledUnits) { 387ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* no textures enabled, or no way to validate images! */ 388ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul return; 389ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 390ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 391ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (u = 0; u < ctx->Const.MaxTextureImageUnits; u++) { 392ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (ctx->Texture.Unit[u]._ReallyEnabled) { 393ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_object *texObj = ctx->Texture.Unit[u]._Current; 394ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul ASSERT(texObj); 395ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (texObj) { 396ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint numFaces = (texObj->Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; 397ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint face; 398ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (face = 0; face < numFaces; face++) { 399ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint lvl; 400ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (lvl = texObj->BaseLevel; lvl <= texObj->_MaxLevel; lvl++) { 401ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_image *texImg = texObj->Image[face][lvl]; 402ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (texImg && !texImg->Data) { 403ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul swrast->ValidateTextureImage(ctx, texObj, face, lvl); 404ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul ASSERT(texObj->Image[face][lvl]->Data); 405ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 406ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 407ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 408ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 409ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 410ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 411ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul} 412ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 413ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 414ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul/** 415ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Free the texture image data attached to all currently enabled 416ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * textures. Meant to be called by device drivers when transitioning 417ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * from software to hardware rendering. 418ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */ 419ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paulvoid 420ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul_swrast_eject_texture_images(GLcontext *ctx) 421ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul{ 422ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint u; 423ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 424ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (!ctx->Texture._EnabledUnits) { 425ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* no textures enabled */ 426ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul return; 427ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 428ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 429ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (u = 0; u < ctx->Const.MaxTextureImageUnits; u++) { 430ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (ctx->Texture.Unit[u]._ReallyEnabled) { 431ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_object *texObj = ctx->Texture.Unit[u]._Current; 432ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul ASSERT(texObj); 433ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (texObj) { 434ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint numFaces = (texObj->Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; 435ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint face; 436ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (face = 0; face < numFaces; face++) { 437ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint lvl; 438ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (lvl = texObj->BaseLevel; lvl <= texObj->_MaxLevel; lvl++) { 439ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_image *texImg = texObj->Image[face][lvl]; 440ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (texImg && texImg->Data) { 441ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul _mesa_free_texmemory(texImg->Data); 442ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul texImg->Data = NULL; 443ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 444ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 445ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 446ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 447ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 448ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 449ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul} 450ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 451ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 452ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 45306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 45406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_sleep( GLcontext *ctx, GLbitfield new_state ) 45506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 45606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul (void) ctx; (void) new_state; 45706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 45806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 45906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 46006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 46106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_invalidate_state( GLcontext *ctx, GLbitfield new_state ) 46206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 46306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 46406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLuint i; 46506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 46606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->NewState |= new_state; 46706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 46806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* After 10 statechanges without any swrast functions being called, 46906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * put the module to sleep. 47006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 47106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (++swrast->StateChanges > 10) { 47206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateState = _swrast_sleep; 47306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->NewState = ~0; 47406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul new_state = ~0; 47506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 47606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 47706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & swrast->InvalidateTriangleMask) 47806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Triangle = _swrast_validate_triangle; 47906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 48006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & swrast->InvalidateLineMask) 48106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Line = _swrast_validate_line; 48206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 48306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & swrast->InvalidatePointMask) 48406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Point = _swrast_validate_point; 48506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 48606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & _SWRAST_NEW_BLEND_FUNC) 48706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->BlendFunc = _swrast_validate_blend_func; 48806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 48906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & _SWRAST_NEW_TEXTURE_SAMPLE_FUNC) 490ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul for (i = 0 ; i < ctx->Const.MaxTextureImageUnits ; i++) 49106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->TextureSample[i] = NULL; 49206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 49306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 49406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 49506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 49606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_texture_samplers(GLcontext *ctx) 49706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 49806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 49906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLuint u; 50006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 50106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul for (u = 0; u < ctx->Const.MaxTextureImageUnits; u++) { 50206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const struct gl_texture_object *tObj = ctx->Texture.Unit[u]._Current; 50306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (tObj) 50406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->TextureSample[u] = 50506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_choose_texture_sample_func(ctx, tObj); 50606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 50706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 50806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 50906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 51006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 51106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_derived( GLcontext *ctx ) 51206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 51306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 51406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 51506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState) { 51606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & _NEW_POLYGON) 51706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_polygon( ctx ); 51806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 51906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & (_NEW_HINT | _NEW_PROGRAM)) 52006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_fog_hint( ctx ); 52106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 52206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & _SWRAST_NEW_TEXTURE_ENV_MODE) 52306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_texture_env( ctx ); 52406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 52506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & (_NEW_FOG | _NEW_PROGRAM)) 52606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_fog_state( ctx ); 52706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 52806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & _NEW_PROGRAM) 52906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_fragment_program( ctx ); 53006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 53106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & _NEW_TEXTURE) 53206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_texture_samplers( ctx ); 53306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 534ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (swrast->NewState & (_NEW_TEXTURE | _NEW_PROGRAM)) 535ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul _swrast_validate_texture_images( ctx ); 536ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 5378334c8a2169055cd87e55d32403d59b8e46deb59Brian Paul if (swrast->NewState & _SWRAST_NEW_RASTERMASK) 5388334c8a2169055cd87e55d32403d59b8e46deb59Brian Paul _swrast_update_rasterflags( ctx ); 5398334c8a2169055cd87e55d32403d59b8e46deb59Brian Paul 54006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->NewState = 0; 54106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->StateChanges = 0; 54206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateState = _swrast_invalidate_state; 54306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 54406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 54506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 54606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define SWRAST_DEBUG 0 54706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 54806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/* Public entrypoints: See also s_accum.c, s_bitmap.c, etc. 54906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 55006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 55106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Quad( GLcontext *ctx, 55206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v0, const SWvertex *v1, 55306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v2, const SWvertex *v3 ) 55406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 55506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 55606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_Quad\n"); 55706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v0 ); 55806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v1 ); 55906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v2 ); 56006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v3 ); 56106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 56206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Triangle( ctx, v0, v1, v3 ); 56306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Triangle( ctx, v1, v2, v3 ); 56406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 56506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 56606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 56706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Triangle( GLcontext *ctx, const SWvertex *v0, 56806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v1, const SWvertex *v2 ) 56906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 57006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 57106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_Triangle\n"); 57206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v0 ); 57306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v1 ); 57406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v2 ); 57506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 57606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Triangle( ctx, v0, v1, v2 ); 57706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 57806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 57906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 58006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Line( GLcontext *ctx, const SWvertex *v0, const SWvertex *v1 ) 58106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 58206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 58306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_Line\n"); 58406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v0 ); 58506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v1 ); 58606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 58706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Line( ctx, v0, v1 ); 58806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 58906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 59006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 59106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Point( GLcontext *ctx, const SWvertex *v0 ) 59206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 59306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 59406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_Point\n"); 59506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v0 ); 59606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 59706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Point( ctx, v0 ); 59806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 59906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 60006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 60106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_InvalidateState( GLcontext *ctx, GLbitfield new_state ) 60206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 60306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 60406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_InvalidateState\n"); 60506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 60606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->InvalidateState( ctx, new_state ); 60706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 60806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 60906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 61006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_ResetLineStipple( GLcontext *ctx ) 61106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 61206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 61306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_ResetLineStipple\n"); 61406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 61506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->StippleCounter = 0; 61606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 61706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 61806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 61906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_allow_vertex_fog( GLcontext *ctx, GLboolean value ) 62006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 62106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 62206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_allow_vertex_fog %d\n", value); 62306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 62406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->InvalidateState( ctx, _NEW_HINT ); 62506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->AllowVertexFog = value; 62606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 62706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 62806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 62906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_allow_pixel_fog( GLcontext *ctx, GLboolean value ) 63006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 63106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 63206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_allow_pixel_fog %d\n", value); 63306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 63406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->InvalidateState( ctx, _NEW_HINT ); 63506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->AllowPixelFog = value; 63606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 63706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 63806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 63906049e24164fc0bda9dea12fbcbdb827a731badbBrian PaulGLboolean 64006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_CreateContext( GLcontext *ctx ) 64106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 64206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLuint i; 64306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = (SWcontext *)CALLOC(sizeof(SWcontext)); 64406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 64506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 64606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_CreateContext\n"); 64706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 64806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 64906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (!swrast) 65006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return GL_FALSE; 65106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 65206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->NewState = ~0; 65306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 65406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_point = _swrast_choose_point; 65506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_line = _swrast_choose_line; 65606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_triangle = _swrast_choose_triangle; 65706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 65806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidatePointMask = _SWRAST_NEW_POINT; 65906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateLineMask = _SWRAST_NEW_LINE; 66006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateTriangleMask = _SWRAST_NEW_TRIANGLE; 66106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 66206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Point = _swrast_validate_point; 66306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Line = _swrast_validate_line; 66406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Triangle = _swrast_validate_triangle; 66506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateState = _swrast_sleep; 66606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->BlendFunc = _swrast_validate_blend_func; 66706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 66806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->AllowVertexFog = GL_TRUE; 66906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->AllowPixelFog = GL_TRUE; 67006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 67106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* Optimized Accum buffer */ 67206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_IntegerAccumMode = GL_FALSE; 67306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_IntegerAccumScaler = 0.0; 67406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 67506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++) 67606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->TextureSample[i] = NULL; 67706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 67806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->SpanArrays = MALLOC_STRUCT(span_arrays); 67906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (!swrast->SpanArrays) { 68006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE(swrast); 68106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return GL_FALSE; 68206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 68306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 68406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* init point span buffer */ 68506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.primitive = GL_POINT; 68606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.start = 0; 68706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.end = 0; 68806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.facing = 0; 68906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.array = swrast->SpanArrays; 69006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 691ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul swrast->TexelBuffer = (GLchan *) MALLOC(ctx->Const.MaxTextureImageUnits * 69206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul MAX_WIDTH * 4 * sizeof(GLchan)); 69306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (!swrast->TexelBuffer) { 69406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE(swrast->SpanArrays); 69506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE(swrast); 69606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return GL_FALSE; 69706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 69806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 69906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul ctx->swrast_context = swrast; 70006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 70106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return GL_TRUE; 70206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 70306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 70406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 70506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_DestroyContext( GLcontext *ctx ) 70606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 70706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 70806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 70906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 71006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_DestroyContext\n"); 71106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 71206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 71306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE( swrast->SpanArrays ); 71406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE( swrast->TexelBuffer ); 71506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE( swrast ); 71606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 71706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul ctx->swrast_context = 0; 71806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 71906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 72006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 72106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstruct swrast_device_driver * 72206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_GetDeviceDriverReference( GLcontext *ctx ) 72306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 72406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 72506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return &swrast->Driver; 72606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 72706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 72806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 72906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_flush( GLcontext *ctx ) 73006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 73106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 73206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* flush any pending fragments from rendering points */ 73306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->PointSpan.end > 0) { 73406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Visual.rgbMode) { 73506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_write_rgba_span(ctx, &(swrast->PointSpan)); 73606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 73706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul else { 73806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_write_index_span(ctx, &(swrast->PointSpan)); 73906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 74006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.end = 0; 74106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 74206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 74306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 74406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 74506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_render_primitive( GLcontext *ctx, GLenum prim ) 74606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 74706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 74806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->Primitive == GL_POINTS && prim != GL_POINTS) { 74906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_flush(ctx); 75006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 75106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Primitive = prim; 75206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 75306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 75406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 75506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 75606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_render_start( GLcontext *ctx ) 75706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 75806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 75906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->Driver.SpanRenderStart) 76006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Driver.SpanRenderStart( ctx ); 76106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.end = 0; 76206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 76306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 76406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 76506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_render_finish( GLcontext *ctx ) 76606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 76706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 76806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->Driver.SpanRenderFinish) 76906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Driver.SpanRenderFinish( ctx ); 77006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 77106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_flush(ctx); 77206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 77306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 77406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 77506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define SWRAST_DEBUG_VERTICES 0 77606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 77706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 77806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_print_vertex( GLcontext *ctx, const SWvertex *v ) 77906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 78006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLuint i; 78106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 78206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG_VERTICES) { 78306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "win %f %f %f %f\n", 78406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->win[0], v->win[1], v->win[2], v->win[3]); 78506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 786ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++) 78706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Texture.Unit[i]._ReallyEnabled) 78806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "texcoord[%d] %f %f %f %f\n", i, 78906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->texcoord[i][0], v->texcoord[i][1], 79006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->texcoord[i][2], v->texcoord[i][3]); 79106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 79206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#if CHAN_TYPE == GL_FLOAT 79306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "color %f %f %f %f\n", 79406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->color[0], v->color[1], v->color[2], v->color[3]); 79506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "spec %f %f %f %f\n", 79606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->specular[0], v->specular[1], 79706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->specular[2], v->specular[3]); 79806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#else 79906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "color %d %d %d %d\n", 80006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->color[0], v->color[1], v->color[2], v->color[3]); 80106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "spec %d %d %d %d\n", 80206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->specular[0], v->specular[1], 80306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->specular[2], v->specular[3]); 80406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#endif 80506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "fog %f\n", v->fog); 80606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "index %d\n", v->index); 80706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "pointsize %f\n", v->pointSize); 80806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "\n"); 80906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 81006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 811