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