s_context.c revision e4b037051e79a607044ed233b7eda66cf1873245
106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/* 206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Mesa 3-D graphics library 3e4b037051e79a607044ed233b7eda66cf1873245Brian * Version: 7.1 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/** 1929e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian * Determine if we can defer texturing/shading until after Z/stencil 1939e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian * testing. This potentially allows us to skip texturing/shading for 1949e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian * lots of fragments. 1959e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian */ 1969e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrianstatic void 1979e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian_swrast_update_deferred_texture(GLcontext *ctx) 1989e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian{ 1999e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian SWcontext *swrast = SWRAST_CONTEXT(ctx); 2009e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian if (ctx->Color.AlphaEnabled) { 2019e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /* alpha test depends on post-texture/shader colors */ 2029e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian swrast->_DeferredTexture = GL_FALSE; 2039e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian } 2049e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian else { 2059e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian const struct gl_fragment_program *fprog 2069e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian = ctx->FragmentProgram._Current; 2079e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian if (fprog && (fprog->Base.OutputsWritten & (1 << FRAG_RESULT_DEPR))) { 2089e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /* Z comes from fragment program/shader */ 2099e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian swrast->_DeferredTexture = GL_FALSE; 2109e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian } 2119e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian else if (ctx->Query.CurrentOcclusionObject) { 2129e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /* occlusion query depends on shader discard/kill results */ 2139e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian swrast->_DeferredTexture = GL_FALSE; 2149e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian } 2159e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian else { 2169e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian swrast->_DeferredTexture = GL_TRUE; 2179e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian } 2189e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian } 2199e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian} 2209e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian 2219e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian 2229e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian/** 22306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Update swrast->_FogColor and swrast->_FogEnable values. 22406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 22506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 22606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_fog_state( GLcontext *ctx ) 22706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 22806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 22912ef1fbefcee964b715783d3ade6b69b2c699ed8Brian const struct gl_fragment_program *fp = ctx->FragmentProgram._Current; 23006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 23106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* determine if fog is needed, and if so, which fog mode */ 23206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_FogEnabled = GL_FALSE; 23312ef1fbefcee964b715783d3ade6b69b2c699ed8Brian if (fp && fp->Base.Target == GL_FRAGMENT_PROGRAM_ARB) { 23412ef1fbefcee964b715783d3ade6b69b2c699ed8Brian if (fp->FogOption != GL_NONE) { 23512ef1fbefcee964b715783d3ade6b69b2c699ed8Brian swrast->_FogEnabled = GL_TRUE; 23612ef1fbefcee964b715783d3ade6b69b2c699ed8Brian swrast->_FogMode = fp->FogOption; 23706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 23806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 23906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul else if (ctx->Fog.Enabled) { 24006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_FogEnabled = GL_TRUE; 24106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_FogMode = ctx->Fog.Mode; 24206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 24306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 24406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 24506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 24606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 24706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Update state for running fragment programs. Basically, load the 24806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * program parameters with current state values. 24906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 25006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 2515050b565deca3cad165cd2f68badc084b9aa5377Brian Paul_swrast_update_fragment_program(GLcontext *ctx, GLbitfield newState) 25206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 25312ef1fbefcee964b715783d3ade6b69b2c699ed8Brian const struct gl_fragment_program *fp = ctx->FragmentProgram._Current; 25412ef1fbefcee964b715783d3ade6b69b2c699ed8Brian if (fp) { 2556f676f4871b1701ec56298f9d22460677ed0e982Brian Paul#if 0 2566f676f4871b1701ec56298f9d22460677ed0e982Brian Paul /* XXX Need a way to trigger the initial loading of parameters 2576f676f4871b1701ec56298f9d22460677ed0e982Brian Paul * even when there's no recent state changes. 2586f676f4871b1701ec56298f9d22460677ed0e982Brian Paul */ 2595050b565deca3cad165cd2f68badc084b9aa5377Brian Paul if (fp->Base.Parameters->StateFlags & newState) 2606f676f4871b1701ec56298f9d22460677ed0e982Brian Paul#endif 2615050b565deca3cad165cd2f68badc084b9aa5377Brian Paul _mesa_load_state_parameters(ctx, fp->Base.Parameters); 26206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 26306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 26406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 26506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 26606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 26706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_DERIVED (_SWRAST_NEW_RASTERMASK | \ 26806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_TEXTURE | \ 26906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_HINT | \ 27006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_POLYGON ) 27106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 27206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/* State referenced by _swrast_choose_triangle, _swrast_choose_line. 27306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 27406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_TRIANGLE (_SWRAST_NEW_DERIVED | \ 27506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_RENDERMODE| \ 27606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_POLYGON| \ 27706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_DEPTH| \ 27806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_STENCIL| \ 27906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_COLOR| \ 28006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_TEXTURE| \ 28106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _SWRAST_NEW_RASTERMASK| \ 28206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_LIGHT| \ 28306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_FOG | \ 28406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _DD_NEW_SEPARATE_SPECULAR) 28506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 28606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_LINE (_SWRAST_NEW_DERIVED | \ 28706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_RENDERMODE| \ 28806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_LINE| \ 28906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_TEXTURE| \ 29006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_LIGHT| \ 29106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_FOG| \ 29206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_DEPTH | \ 29306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _DD_NEW_SEPARATE_SPECULAR) 29406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 29506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_POINT (_SWRAST_NEW_DERIVED | \ 29606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_RENDERMODE | \ 29706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_POINT | \ 29806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_TEXTURE | \ 29906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_LIGHT | \ 30006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _NEW_FOG | \ 30106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _DD_NEW_SEPARATE_SPECULAR) 30206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 30306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_TEXTURE_SAMPLE_FUNC _NEW_TEXTURE 30406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 30506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_TEXTURE_ENV_MODE _NEW_TEXTURE 30606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 30706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_BLEND_FUNC _NEW_COLOR 30806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 30906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 31006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 31106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 31206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Stub for swrast->Triangle to select a true triangle function 31306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * after a state change. 31406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 31506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 31606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_triangle( GLcontext *ctx, 31706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v0, 31806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v1, 31906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v2 ) 32006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 32106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 32206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 32306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_validate_derived( ctx ); 32406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_triangle( ctx ); 325d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul ASSERT(swrast->Triangle); 32606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 32706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Texture._EnabledUnits == 0 32806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul && NEED_SECONDARY_COLOR(ctx) 32912ef1fbefcee964b715783d3ade6b69b2c699ed8Brian && !ctx->FragmentProgram._Current) { 33006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* separate specular color, but no texture */ 33106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->SpecTriangle = swrast->Triangle; 33206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Triangle = _swrast_add_spec_terms_triangle; 33306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 33406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 33506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Triangle( ctx, v0, v1, v2 ); 33606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 33706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 33806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 33906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Called via swrast->Line. Examine current GL state and choose a software 34006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * line routine. Then call it. 34106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 34206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 34306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_line( GLcontext *ctx, const SWvertex *v0, const SWvertex *v1 ) 34406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 34506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 34606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 34706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_validate_derived( ctx ); 34806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_line( ctx ); 349d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul ASSERT(swrast->Line); 35006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 35106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Texture._EnabledUnits == 0 35206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul && NEED_SECONDARY_COLOR(ctx) 35312ef1fbefcee964b715783d3ade6b69b2c699ed8Brian && !ctx->FragmentProgram._Current) { 35406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->SpecLine = swrast->Line; 35506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Line = _swrast_add_spec_terms_line; 35606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 35706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 35806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Line( ctx, v0, v1 ); 35906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 36006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 36106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 36206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Called via swrast->Point. Examine current GL state and choose a software 36306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * point routine. Then call it. 36406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 36506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 36606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_point( GLcontext *ctx, const SWvertex *v0 ) 36706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 36806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 36906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 37006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_validate_derived( ctx ); 37106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_point( ctx ); 37206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 37306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Texture._EnabledUnits == 0 37406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul && NEED_SECONDARY_COLOR(ctx) 37512ef1fbefcee964b715783d3ade6b69b2c699ed8Brian && !ctx->FragmentProgram._Current) { 37606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->SpecPoint = swrast->Point; 37706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Point = _swrast_add_spec_terms_point; 37806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 37906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 38006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Point( ctx, v0 ); 38106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 38206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 38306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 38406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/** 38506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Called via swrast->BlendFunc. Examine GL state to choose a blending 38606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * function, then call it. 38706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 38806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void _ASMAPI 389a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul_swrast_validate_blend_func(GLcontext *ctx, GLuint n, const GLubyte mask[], 390d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul GLvoid *src, const GLvoid *dst, 391a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul GLenum chanType ) 39206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 39306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 39406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 395d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul _swrast_validate_derived( ctx ); /* why is this needed? */ 396d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul _swrast_choose_blend_func( ctx, chanType ); 39706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 398a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul swrast->BlendFunc( ctx, n, mask, src, dst, chanType ); 39906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 40006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 40106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 402ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul/** 403ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Make sure we have texture image data for all the textures we may need 404ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * for subsequent rendering. 405ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */ 406ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paulstatic void 407ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul_swrast_validate_texture_images(GLcontext *ctx) 408ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul{ 409ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 410ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint u; 411ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 412ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (!swrast->ValidateTextureImage || !ctx->Texture._EnabledUnits) { 413ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* no textures enabled, or no way to validate images! */ 414ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul return; 415ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 416ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 417ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (u = 0; u < ctx->Const.MaxTextureImageUnits; u++) { 418ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (ctx->Texture.Unit[u]._ReallyEnabled) { 419ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_object *texObj = ctx->Texture.Unit[u]._Current; 420ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul ASSERT(texObj); 421ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (texObj) { 422ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint numFaces = (texObj->Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; 423ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint face; 424ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (face = 0; face < numFaces; face++) { 4257e85b0a025a82c3ffed060a757a3b4adae03d269Brian GLint lvl; 426ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (lvl = texObj->BaseLevel; lvl <= texObj->_MaxLevel; lvl++) { 427ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_image *texImg = texObj->Image[face][lvl]; 428ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (texImg && !texImg->Data) { 429ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul swrast->ValidateTextureImage(ctx, texObj, face, lvl); 430ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul ASSERT(texObj->Image[face][lvl]->Data); 431ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 432ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 433ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 434ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 435ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 436ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 437ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul} 438ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 439ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 440ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul/** 441ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Free the texture image data attached to all currently enabled 442ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * textures. Meant to be called by device drivers when transitioning 443ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * from software to hardware rendering. 444ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */ 445ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paulvoid 446ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul_swrast_eject_texture_images(GLcontext *ctx) 447ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul{ 448ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint u; 449ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 450ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (!ctx->Texture._EnabledUnits) { 451ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* no textures enabled */ 452ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul return; 453ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 454ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 455ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (u = 0; u < ctx->Const.MaxTextureImageUnits; u++) { 456ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (ctx->Texture.Unit[u]._ReallyEnabled) { 457ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_object *texObj = ctx->Texture.Unit[u]._Current; 458ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul ASSERT(texObj); 459ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (texObj) { 460ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint numFaces = (texObj->Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; 461ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint face; 462ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (face = 0; face < numFaces; face++) { 4637e85b0a025a82c3ffed060a757a3b4adae03d269Brian GLint lvl; 464ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (lvl = texObj->BaseLevel; lvl <= texObj->_MaxLevel; lvl++) { 465ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_image *texImg = texObj->Image[face][lvl]; 466ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (texImg && texImg->Data) { 467ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul _mesa_free_texmemory(texImg->Data); 468ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul texImg->Data = NULL; 469ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 470ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 471ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 472ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 473ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 474ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 475ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul} 476ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 477ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 478ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 47906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 48006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_sleep( GLcontext *ctx, GLbitfield new_state ) 48106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 48206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul (void) ctx; (void) new_state; 48306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 48406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 48506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 48606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void 48706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_invalidate_state( GLcontext *ctx, GLbitfield new_state ) 48806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 48906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 49006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLuint i; 49106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 49206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->NewState |= new_state; 49306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 49406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* After 10 statechanges without any swrast functions being called, 49506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * put the module to sleep. 49606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 49706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (++swrast->StateChanges > 10) { 49806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateState = _swrast_sleep; 49906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->NewState = ~0; 50006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul new_state = ~0; 50106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 50206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 50306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & swrast->InvalidateTriangleMask) 50406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Triangle = _swrast_validate_triangle; 50506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 50606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & swrast->InvalidateLineMask) 50706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Line = _swrast_validate_line; 50806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 50906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & swrast->InvalidatePointMask) 51006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Point = _swrast_validate_point; 51106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 51206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & _SWRAST_NEW_BLEND_FUNC) 51306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->BlendFunc = _swrast_validate_blend_func; 51406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 51506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (new_state & _SWRAST_NEW_TEXTURE_SAMPLE_FUNC) 516ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul for (i = 0 ; i < ctx->Const.MaxTextureImageUnits ; i++) 51706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->TextureSample[i] = NULL; 51806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 51906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 52006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 52104bda46739beb0dab7c8820bdbe67136470d42beBrianvoid 52206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_texture_samplers(GLcontext *ctx) 52306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 52406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 52506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLuint u; 52606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 52706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul for (u = 0; u < ctx->Const.MaxTextureImageUnits; u++) { 52806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const struct gl_texture_object *tObj = ctx->Texture.Unit[u]._Current; 5299a78ef980d89c0d18f859036d5a0cdf82acd303cBrian /* Note: If tObj is NULL, the sample function will be a simple 5309a78ef980d89c0d18f859036d5a0cdf82acd303cBrian * function that just returns opaque black (0,0,0,1). 5319a78ef980d89c0d18f859036d5a0cdf82acd303cBrian */ 5329a78ef980d89c0d18f859036d5a0cdf82acd303cBrian swrast->TextureSample[u] = _swrast_choose_texture_sample_func(ctx, tObj); 53306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 53406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 53506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 53606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 537dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian/** 5389e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian * Update swrast->_ActiveAttribs, swrast->_NumActiveAttribs, swrast->_ActiveAtttribMask. 539dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian */ 540dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brianstatic void 541dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian_swrast_update_fragment_attribs(GLcontext *ctx) 542dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian{ 543dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian SWcontext *swrast = SWRAST_CONTEXT(ctx); 5440bdf216dd06d5136b8529297297aa962bab548c2Brian GLuint attribsMask; 5459e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian 5469e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /* 5479e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian * Compute _ActiveAttribsMask = which fragment attributes are needed. 5489e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian */ 549dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian if (ctx->FragmentProgram._Current) { 5509e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /* fragment program/shader */ 5510bdf216dd06d5136b8529297297aa962bab548c2Brian attribsMask = ctx->FragmentProgram._Current->Base.InputsRead; 55204255489617f6eeb9604daba14efed8376d1d824Brian attribsMask &= ~FRAG_BIT_WPOS; /* WPOS is always handled specially */ 553dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian } 5549e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian else if (ctx->ATIFragmentShader._Enabled) { 5559e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian attribsMask = ~0; /* XXX fix me */ 5569e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian } 557dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian else { 5589e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /* fixed function */ 5590bdf216dd06d5136b8529297297aa962bab548c2Brian attribsMask = 0x0; 560dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 5619e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian#if CHAN_TYPE == GL_FLOAT 5629e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian attribsMask |= FRAG_BIT_COL0; 5633db3dc58bcc361637d7473ee4b7c4e3b036c283cBrian#endif 5649e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian 5659e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian if (ctx->Fog.ColorSumEnabled || 5669e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian (ctx->Light.Enabled && 5679e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR)) { 5689e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian attribsMask |= FRAG_BIT_COL1; 5699e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian } 5709e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian 571dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian if (swrast->_FogEnabled) 5720bdf216dd06d5136b8529297297aa962bab548c2Brian attribsMask |= FRAG_BIT_FOGC; 573dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 5749e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian attribsMask |= (ctx->Texture._EnabledUnits << FRAG_ATTRIB_TEX0); 575dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian } 576dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 5779e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian swrast->_ActiveAttribMask = attribsMask; 5786d27194dffa52e076aba49edb222a70fcc77628bBrian 5790bdf216dd06d5136b8529297297aa962bab548c2Brian /* Update _ActiveAttribs[] list */ 580dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian { 5810bdf216dd06d5136b8529297297aa962bab548c2Brian GLuint i, num = 0; 5820bdf216dd06d5136b8529297297aa962bab548c2Brian for (i = 0; i < FRAG_ATTRIB_MAX; i++) { 5839e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian if (attribsMask & (1 << i)) { 5840bdf216dd06d5136b8529297297aa962bab548c2Brian swrast->_ActiveAttribs[num++] = i; 5859e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /* how should this attribute be interpolated? */ 5869e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian if (i == FRAG_ATTRIB_COL0 || i == FRAG_ATTRIB_COL1) 5879e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian swrast->_InterpMode[i] = ctx->Light.ShadeModel; 5889e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian else 5899e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian swrast->_InterpMode[i] = GL_SMOOTH; 5909e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian } 591dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian } 5920bdf216dd06d5136b8529297297aa962bab548c2Brian swrast->_NumActiveAttribs = num; 593dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian } 594dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian} 595dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 596dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 5971c09bcfdda4083636a3ac27d804a34ef87875ce7Brian/** 5981c09bcfdda4083636a3ac27d804a34ef87875ce7Brian * Update the swrast->_ColorOutputsMask which indicates which color 5991c09bcfdda4083636a3ac27d804a34ef87875ce7Brian * renderbuffers (aka rendertargets) are being written to by the current 6001c09bcfdda4083636a3ac27d804a34ef87875ce7Brian * fragment program. 6011c09bcfdda4083636a3ac27d804a34ef87875ce7Brian * We also take glDrawBuffers() into account to skip outputs that are 6021c09bcfdda4083636a3ac27d804a34ef87875ce7Brian * set to GL_NONE. 6031c09bcfdda4083636a3ac27d804a34ef87875ce7Brian */ 6041c09bcfdda4083636a3ac27d804a34ef87875ce7Brianstatic void 6051c09bcfdda4083636a3ac27d804a34ef87875ce7Brian_swrast_update_color_outputs(GLcontext *ctx) 6061c09bcfdda4083636a3ac27d804a34ef87875ce7Brian{ 6071c09bcfdda4083636a3ac27d804a34ef87875ce7Brian SWcontext *swrast = SWRAST_CONTEXT(ctx); 6081c09bcfdda4083636a3ac27d804a34ef87875ce7Brian const struct gl_framebuffer *fb = ctx->DrawBuffer; 6091c09bcfdda4083636a3ac27d804a34ef87875ce7Brian 6101c09bcfdda4083636a3ac27d804a34ef87875ce7Brian swrast->_ColorOutputsMask = 0; 6111c09bcfdda4083636a3ac27d804a34ef87875ce7Brian swrast->_NumColorOutputs = 0; 6121c09bcfdda4083636a3ac27d804a34ef87875ce7Brian 6131c09bcfdda4083636a3ac27d804a34ef87875ce7Brian if (ctx->FragmentProgram._Current) { 6141c09bcfdda4083636a3ac27d804a34ef87875ce7Brian const GLbitfield outputsWritten 6151c09bcfdda4083636a3ac27d804a34ef87875ce7Brian = ctx->FragmentProgram._Current->Base.OutputsWritten; 6161c09bcfdda4083636a3ac27d804a34ef87875ce7Brian GLuint output; 6171c09bcfdda4083636a3ac27d804a34ef87875ce7Brian for (output = 0; output < ctx->Const.MaxDrawBuffers; output++) { 6181c09bcfdda4083636a3ac27d804a34ef87875ce7Brian if ((outputsWritten & (1 << (FRAG_RESULT_DATA0 + output))) 6191c09bcfdda4083636a3ac27d804a34ef87875ce7Brian && (fb->_NumColorDrawBuffers[output] > 0)) { 6201c09bcfdda4083636a3ac27d804a34ef87875ce7Brian swrast->_ColorOutputsMask |= (1 << output); 6211c09bcfdda4083636a3ac27d804a34ef87875ce7Brian swrast->_NumColorOutputs = output + 1; 6221c09bcfdda4083636a3ac27d804a34ef87875ce7Brian } 6231c09bcfdda4083636a3ac27d804a34ef87875ce7Brian } 6241c09bcfdda4083636a3ac27d804a34ef87875ce7Brian } 6251c09bcfdda4083636a3ac27d804a34ef87875ce7Brian if (swrast->_ColorOutputsMask == 0x0) { 6261c09bcfdda4083636a3ac27d804a34ef87875ce7Brian /* no fragment program, or frag prog didn't write to gl_FragData[] */ 6271c09bcfdda4083636a3ac27d804a34ef87875ce7Brian if (fb->_NumColorDrawBuffers[0] > 0) { 6281c09bcfdda4083636a3ac27d804a34ef87875ce7Brian swrast->_ColorOutputsMask = 0x1; 6291c09bcfdda4083636a3ac27d804a34ef87875ce7Brian swrast->_NumColorOutputs = 1; 6301c09bcfdda4083636a3ac27d804a34ef87875ce7Brian } 6311c09bcfdda4083636a3ac27d804a34ef87875ce7Brian } 6321c09bcfdda4083636a3ac27d804a34ef87875ce7Brian} 6331c09bcfdda4083636a3ac27d804a34ef87875ce7Brian 6341c09bcfdda4083636a3ac27d804a34ef87875ce7Brian 63506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 63606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_derived( GLcontext *ctx ) 63706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 63806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 63906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 64006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState) { 64106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & _NEW_POLYGON) 64206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_polygon( ctx ); 64306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 64406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & (_NEW_HINT | _NEW_PROGRAM)) 64506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_fog_hint( ctx ); 64606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 64706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & _SWRAST_NEW_TEXTURE_ENV_MODE) 64806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_texture_env( ctx ); 64906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 65006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->NewState & (_NEW_FOG | _NEW_PROGRAM)) 65106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_update_fog_state( ctx ); 65206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 6534e9e0aff790656821970ba74d8996718e415ea68Brian Paul if (swrast->NewState & (_NEW_MODELVIEW | 6544e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_PROJECTION | 6554e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_TEXTURE_MATRIX | 6564e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_FOG | 6574e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_LIGHT | 6584e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_LINE | 6594e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_TEXTURE | 6604e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_TRANSFORM | 6614e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_POINT | 6624e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_VIEWPORT | 6634e9e0aff790656821970ba74d8996718e415ea68Brian Paul _NEW_PROGRAM)) 6645050b565deca3cad165cd2f68badc084b9aa5377Brian Paul _swrast_update_fragment_program( ctx, swrast->NewState ); 66506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 6669e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian if (swrast->NewState & (_NEW_TEXTURE | _NEW_PROGRAM)) { 667e4b037051e79a607044ed233b7eda66cf1873245Brian _swrast_update_texture_samplers( ctx ); 6689e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian _swrast_validate_texture_images(ctx); 6699e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian } 670ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 671e4b037051e79a607044ed233b7eda66cf1873245Brian if (swrast->NewState & (_NEW_COLOR | _NEW_PROGRAM)) 672e4b037051e79a607044ed233b7eda66cf1873245Brian _swrast_update_deferred_texture(ctx); 673e4b037051e79a607044ed233b7eda66cf1873245Brian 6748334c8a2169055cd87e55d32403d59b8e46deb59Brian Paul if (swrast->NewState & _SWRAST_NEW_RASTERMASK) 6758334c8a2169055cd87e55d32403d59b8e46deb59Brian Paul _swrast_update_rasterflags( ctx ); 6768334c8a2169055cd87e55d32403d59b8e46deb59Brian Paul 677dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian if (swrast->NewState & (_NEW_DEPTH | 678dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian _NEW_FOG | 6799e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian _NEW_LIGHT | 680dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian _NEW_PROGRAM | 681dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian _NEW_TEXTURE)) 682dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian _swrast_update_fragment_attribs(ctx); 683dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 6841c09bcfdda4083636a3ac27d804a34ef87875ce7Brian if (swrast->NewState & (_NEW_PROGRAM | _NEW_BUFFERS)) 6851c09bcfdda4083636a3ac27d804a34ef87875ce7Brian _swrast_update_color_outputs(ctx); 6861c09bcfdda4083636a3ac27d804a34ef87875ce7Brian 68706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->NewState = 0; 68806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->StateChanges = 0; 68906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateState = _swrast_invalidate_state; 69006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 69106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 69206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 69306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define SWRAST_DEBUG 0 69406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 69506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/* Public entrypoints: See also s_accum.c, s_bitmap.c, etc. 69606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */ 69706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 69806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Quad( GLcontext *ctx, 69906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v0, const SWvertex *v1, 70006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v2, const SWvertex *v3 ) 70106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 70206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 70306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_Quad\n"); 70406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v0 ); 70506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v1 ); 70606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v2 ); 70706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v3 ); 70806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 70906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Triangle( ctx, v0, v1, v3 ); 71006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Triangle( ctx, v1, v2, v3 ); 71106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 71206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 71306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 71406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Triangle( GLcontext *ctx, const SWvertex *v0, 71506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul const SWvertex *v1, const SWvertex *v2 ) 71606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 71706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 71806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_Triangle\n"); 71906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v0 ); 72006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v1 ); 72106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v2 ); 72206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 72306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Triangle( ctx, v0, v1, v2 ); 72406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 72506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 72606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 72706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Line( GLcontext *ctx, const SWvertex *v0, const SWvertex *v1 ) 72806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 72906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 73006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_Line\n"); 73106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v0 ); 73206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v1 ); 73306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 73406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Line( ctx, v0, v1 ); 73506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 73606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 73706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 73806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Point( GLcontext *ctx, const SWvertex *v0 ) 73906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 74006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 74106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_Point\n"); 74206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_print_vertex( ctx, v0 ); 74306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 74406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->Point( ctx, v0 ); 74506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 74606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 74706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 74806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_InvalidateState( GLcontext *ctx, GLbitfield new_state ) 74906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 75006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 75106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_InvalidateState\n"); 75206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 75306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->InvalidateState( ctx, new_state ); 75406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 75506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 75606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 75706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_ResetLineStipple( GLcontext *ctx ) 75806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 75906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 76006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_ResetLineStipple\n"); 76106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 76206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->StippleCounter = 0; 76306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 76406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 76506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 76606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_allow_vertex_fog( GLcontext *ctx, GLboolean value ) 76706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 76806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 76906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_allow_vertex_fog %d\n", value); 77006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 77106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->InvalidateState( ctx, _NEW_HINT ); 77206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->AllowVertexFog = value; 77306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 77406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 77506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 77606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_allow_pixel_fog( GLcontext *ctx, GLboolean value ) 77706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 77806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 77906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_allow_pixel_fog %d\n", value); 78006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 78106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->InvalidateState( ctx, _NEW_HINT ); 78206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWRAST_CONTEXT(ctx)->AllowPixelFog = value; 78306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 78406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 78506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 78606049e24164fc0bda9dea12fbcbdb827a731badbBrian PaulGLboolean 78706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_CreateContext( GLcontext *ctx ) 78806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 78906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLuint i; 79006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = (SWcontext *)CALLOC(sizeof(SWcontext)); 79106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 79206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 79306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_CreateContext\n"); 79406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 79506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 79606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (!swrast) 79706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return GL_FALSE; 79806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 79906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->NewState = ~0; 80006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 80106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_point = _swrast_choose_point; 80206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_line = _swrast_choose_line; 80306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->choose_triangle = _swrast_choose_triangle; 80406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 80506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidatePointMask = _SWRAST_NEW_POINT; 80606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateLineMask = _SWRAST_NEW_LINE; 80706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateTriangleMask = _SWRAST_NEW_TRIANGLE; 80806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 80906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Point = _swrast_validate_point; 81006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Line = _swrast_validate_line; 81106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Triangle = _swrast_validate_triangle; 81206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->InvalidateState = _swrast_sleep; 81306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->BlendFunc = _swrast_validate_blend_func; 81406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 81506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->AllowVertexFog = GL_TRUE; 81606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->AllowPixelFog = GL_TRUE; 81706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 81806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* Optimized Accum buffer */ 81906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_IntegerAccumMode = GL_FALSE; 82006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->_IntegerAccumScaler = 0.0; 82106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 82206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++) 82306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->TextureSample[i] = NULL; 82406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 825cdb27e8242215271364602995d85607cfc06d441Brian Paul swrast->SpanArrays = MALLOC_STRUCT(sw_span_arrays); 82606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (!swrast->SpanArrays) { 82706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE(swrast); 82806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return GL_FALSE; 82906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 830a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul swrast->SpanArrays->ChanType = CHAN_TYPE; 831a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE 8329e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian swrast->SpanArrays->rgba = swrast->SpanArrays->rgba8; 833a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul#elif CHAN_TYPE == GL_UNSIGNED_SHORT 8349e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian swrast->SpanArrays->rgba = swrast->SpanArrays->rgba16; 835a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul#else 8364f9d3a07bbe731709e6819448d21dee609a37806Richard Hughes swrast->SpanArrays->rgba = swrast->SpanArrays->attribs[FRAG_ATTRIB_COL0]; 837a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul#endif 83806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 83906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* init point span buffer */ 84006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.primitive = GL_POINT; 84106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.end = 0; 84206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.facing = 0; 84306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.array = swrast->SpanArrays; 84406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 845ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul swrast->TexelBuffer = (GLchan *) MALLOC(ctx->Const.MaxTextureImageUnits * 84606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul MAX_WIDTH * 4 * sizeof(GLchan)); 84706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (!swrast->TexelBuffer) { 84806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE(swrast->SpanArrays); 84906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE(swrast); 85006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return GL_FALSE; 85106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 85206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 85306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul ctx->swrast_context = swrast; 85406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 85506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return GL_TRUE; 85606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 85706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 85806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 85906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_DestroyContext( GLcontext *ctx ) 86006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 86106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 86206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 86306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG) { 86406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "_swrast_DestroyContext\n"); 86506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 86606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 86706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE( swrast->SpanArrays ); 86806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE( swrast->TexelBuffer ); 86906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul FREE( swrast ); 87006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 87106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul ctx->swrast_context = 0; 87206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 87306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 87406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 87506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstruct swrast_device_driver * 87606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_GetDeviceDriverReference( GLcontext *ctx ) 87706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 87806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 87906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul return &swrast->Driver; 88006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 88106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 88206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 88306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_flush( GLcontext *ctx ) 88406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 88506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 88606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul /* flush any pending fragments from rendering points */ 88706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->PointSpan.end > 0) { 88806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Visual.rgbMode) { 88906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_write_rgba_span(ctx, &(swrast->PointSpan)); 89006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 89106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul else { 89206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_write_index_span(ctx, &(swrast->PointSpan)); 89306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 89406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.end = 0; 89506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 89606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 89706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 89806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 89906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_render_primitive( GLcontext *ctx, GLenum prim ) 90006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 90106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 90206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->Primitive == GL_POINTS && prim != GL_POINTS) { 90306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_flush(ctx); 90406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 90506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Primitive = prim; 90606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 90706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 90806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 90906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 91006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_render_start( GLcontext *ctx ) 91106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 91206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 91306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->Driver.SpanRenderStart) 91406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Driver.SpanRenderStart( ctx ); 91506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->PointSpan.end = 0; 91606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 91706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 91806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 91906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_render_finish( GLcontext *ctx ) 92006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 92106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 92206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (swrast->Driver.SpanRenderFinish) 92306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul swrast->Driver.SpanRenderFinish( ctx ); 92406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 92506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _swrast_flush(ctx); 92606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 92706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 92806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 92906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define SWRAST_DEBUG_VERTICES 0 93006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 93106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid 93206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_print_vertex( GLcontext *ctx, const SWvertex *v ) 93306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{ 93406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul GLuint i; 93506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 93606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (SWRAST_DEBUG_VERTICES) { 93706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "win %f %f %f %f\n", 9389e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian v->attrib[FRAG_ATTRIB_WPOS][0], 9399e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian v->attrib[FRAG_ATTRIB_WPOS][1], 9409e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian v->attrib[FRAG_ATTRIB_WPOS][2], 9419e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian v->attrib[FRAG_ATTRIB_WPOS][3]); 94206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 943ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++) 94406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul if (ctx->Texture.Unit[i]._ReallyEnabled) 94506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "texcoord[%d] %f %f %f %f\n", i, 946dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian v->attrib[FRAG_ATTRIB_TEX0 + i][0], 947dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian v->attrib[FRAG_ATTRIB_TEX0 + i][1], 948dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian v->attrib[FRAG_ATTRIB_TEX0 + i][2], 949dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian v->attrib[FRAG_ATTRIB_TEX0 + i][3]); 95006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul 95106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#if CHAN_TYPE == GL_FLOAT 95206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "color %f %f %f %f\n", 95306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->color[0], v->color[1], v->color[2], v->color[3]); 95406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#else 95506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "color %d %d %d %d\n", 95606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul v->color[0], v->color[1], v->color[2], v->color[3]); 95706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#endif 9589e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian _mesa_debug(ctx, "spec %g %g %g %g\n", 9599e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian v->attrib[FRAG_ATTRIB_COL1][0], 9609e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian v->attrib[FRAG_ATTRIB_COL1][1], 9619e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian v->attrib[FRAG_ATTRIB_COL1][2], 9629e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian v->attrib[FRAG_ATTRIB_COL1][3]); 963afc132e7a9c2b2c870b61ef10311272b36ea9bf2Brian _mesa_debug(ctx, "fog %f\n", v->attrib[FRAG_ATTRIB_FOGC][0]); 9649e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian _mesa_debug(ctx, "index %d\n", v->attrib[FRAG_ATTRIB_CI][0]); 96506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "pointsize %f\n", v->pointSize); 96606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul _mesa_debug(ctx, "\n"); 96706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul } 96806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul} 969