s_context.c revision 8334c8a2169055cd87e55d32403d59b8e46deb59
106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/*
206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Mesa 3-D graphics library
3122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul * Version:  6.5.1
406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul *
5ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul *
706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a
806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * copy of this software and associated documentation files (the "Software"),
906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * to deal in the Software without restriction, including without limitation
1006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * and/or sell copies of the Software, and to permit persons to whom the
1206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Software is furnished to do so, subject to the following conditions:
1306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul *
1406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * The above copyright notice and this permission notice shall be included
1506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * in all copies or substantial portions of the Software.
1606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul *
1706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
2006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
2106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
2206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul *
2406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Authors:
2506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul *    Keith Whitwell <keith@tungstengraphics.com>
2606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul *    Brian Paul
2706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
2806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
2906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "imports.h"
3006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "bufferobj.h"
3106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "context.h"
3206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "colormac.h"
3306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "mtypes.h"
3406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "program.h"
35ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul#include "teximage.h"
3606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "swrast.h"
3706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_blend.h"
3806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_context.h"
3906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_lines.h"
4006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_points.h"
4106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_span.h"
4206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_triangle.h"
4306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_texfilter.h"
4406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
4506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
4606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
4706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Recompute the value of swrast->_RasterMask, etc. according to
4806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * the current context.  The _RasterMask field can be easily tested by
4906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * drivers to determine certain basic GL state (does the primitive need
5006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * stenciling, logic-op, fog, etc?).
5106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
5206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
5306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_rasterflags( GLcontext *ctx )
5406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
5506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
5606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   GLbitfield rasterMask = 0;
5706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
5806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Color.AlphaEnabled)           rasterMask |= ALPHATEST_BIT;
5906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Color.BlendEnabled)           rasterMask |= BLEND_BIT;
6006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Depth.Test)                   rasterMask |= DEPTH_BIT;
6106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (swrast->_FogEnabled)               rasterMask |= FOG_BIT;
6206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Scissor.Enabled)              rasterMask |= CLIP_BIT;
6306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Stencil.Enabled)              rasterMask |= STENCIL_BIT;
6406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Visual.rgbMode) {
6506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      const GLuint colorMask = *((GLuint *) &ctx->Color.ColorMask);
6606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (colorMask != 0xffffffff)        rasterMask |= MASKING_BIT;
6706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (ctx->Color._LogicOpEnabled)     rasterMask |= LOGIC_OP_BIT;
6806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (ctx->Texture._EnabledUnits)     rasterMask |= TEXTURE_BIT;
6906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
7006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   else {
7106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (ctx->Color.IndexMask != 0xffffffff) rasterMask |= MASKING_BIT;
7206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (ctx->Color.IndexLogicOpEnabled)     rasterMask |= LOGIC_OP_BIT;
7306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
7406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
7506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (   ctx->Viewport.X < 0
7606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul       || ctx->Viewport.X + ctx->Viewport.Width > (GLint) ctx->DrawBuffer->Width
7706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul       || ctx->Viewport.Y < 0
7806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul       || ctx->Viewport.Y + ctx->Viewport.Height > (GLint) ctx->DrawBuffer->Height) {
7906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      rasterMask |= CLIP_BIT;
8006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
8106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
8206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Query.CurrentOcclusionObject)
8306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      rasterMask |= OCCLUSION_BIT;
8406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
8506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
8606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   /* If we're not drawing to exactly one color buffer set the
8706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul    * MULTI_DRAW_BIT flag.  Also set it if we're drawing to no
8806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul    * buffers or the RGBA or CI mask disables all writes.
8906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul    */
9006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->DrawBuffer->_NumColorDrawBuffers[0] != 1) {
9106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      /* more than one color buffer designated for writing (or zero buffers) */
9206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      rasterMask |= MULTI_DRAW_BIT;
9306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
9406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   else if (ctx->Visual.rgbMode && *((GLuint *) ctx->Color.ColorMask) == 0) {
9506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      rasterMask |= MULTI_DRAW_BIT; /* all RGBA channels disabled */
9606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
9706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   else if (!ctx->Visual.rgbMode && ctx->Color.IndexMask==0) {
9806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      rasterMask |= MULTI_DRAW_BIT; /* all color index bits disabled */
9906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
10006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
10106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->FragmentProgram._Active) {
10206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      rasterMask |= FRAGPROG_BIT;
10306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
10406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
10506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->ShaderObjects._FragmentShaderPresent) {
10606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      rasterMask |= FRAGPROG_BIT;
10706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
10806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
10906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->ATIFragmentShader._Enabled) {
11006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      rasterMask |= ATIFRAGSHADER_BIT;
11106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
11206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
11306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#if CHAN_TYPE == GL_FLOAT
11406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Color.ClampFragmentColor == GL_TRUE) {
11506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      rasterMask |= CLAMPING_BIT;
11606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
11706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#endif
11806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
11906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->_RasterMask = rasterMask;
12006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
12106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
12206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
12306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
12406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Examine polycon culls tate to compute the _BackfaceSign field.
12506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * _BackfaceSign will be 0 if no culling, -1 if culling back-faces,
12606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * and 1 if culling front-faces.  The Polygon FrontFace state also
12706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * factors in.
12806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
12906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
13006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_polygon( GLcontext *ctx )
13106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
13206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   GLfloat backface_sign = 1;
13306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
13406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Polygon.CullFlag) {
13506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      backface_sign = 1;
13606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      switch(ctx->Polygon.CullFaceMode) {
13706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      case GL_BACK:
13806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 if(ctx->Polygon.FrontFace==GL_CCW)
13906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	    backface_sign = -1;
14006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 break;
14106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      case GL_FRONT:
14206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 if(ctx->Polygon.FrontFace!=GL_CCW)
14306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	    backface_sign = -1;
14406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 break;
14506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      default:
14606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      case GL_FRONT_AND_BACK:
14706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 backface_sign = 0;
14806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 break;
14906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      }
15006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
15106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   else {
15206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      backface_sign = 0;
15306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
15406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
15506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->_BackfaceSign = backface_sign;
15606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
15706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
15806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
15906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
16006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Update the _PreferPixelFog field to indicate if we need to compute
16106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * fog factors per-fragment.
16206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
16306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
16406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_fog_hint( GLcontext *ctx )
16506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
16606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
16706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->_PreferPixelFog = (!swrast->AllowVertexFog ||
16806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                              ctx->FragmentProgram._Enabled || /* not _Active! */
16906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			      (ctx->Hint.Fog == GL_NICEST &&
17006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			       swrast->AllowPixelFog));
17106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
17206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
17306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
17406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
17506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
17606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Update the swrast->_AnyTextureCombine flag.
17706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
17806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
17906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_texture_env( GLcontext *ctx )
18006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
18106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
18206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   GLuint i;
18306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->_AnyTextureCombine = GL_FALSE;
18406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
18506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (ctx->Texture.Unit[i].EnvMode == GL_COMBINE_EXT ||
18606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul          ctx->Texture.Unit[i].EnvMode == GL_COMBINE4_NV) {
18706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul         swrast->_AnyTextureCombine = GL_TRUE;
18806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul         return;
18906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      }
19006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
19106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
19206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
19306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
19406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
19506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Update swrast->_FogColor and swrast->_FogEnable values.
19606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
19706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
19806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_fog_state( GLcontext *ctx )
19906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
20006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
20106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
20206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   /* convert fog color to GLchan values */
20306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   CLAMPED_FLOAT_TO_CHAN(swrast->_FogColor[RCOMP], ctx->Fog.Color[RCOMP]);
20406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   CLAMPED_FLOAT_TO_CHAN(swrast->_FogColor[GCOMP], ctx->Fog.Color[GCOMP]);
20506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   CLAMPED_FLOAT_TO_CHAN(swrast->_FogColor[BCOMP], ctx->Fog.Color[BCOMP]);
20606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
20706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   /* determine if fog is needed, and if so, which fog mode */
20806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->_FogEnabled = GL_FALSE;
20906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->FragmentProgram._Active) {
21006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (ctx->FragmentProgram._Current->Base.Target==GL_FRAGMENT_PROGRAM_ARB) {
211122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul         const struct gl_fragment_program *fp
212122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul            = ctx->FragmentProgram._Current;
213122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul         if (fp->FogOption != GL_NONE) {
21406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul            swrast->_FogEnabled = GL_TRUE;
215122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul            swrast->_FogMode = fp->FogOption;
21606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul         }
21706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      }
21806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
21906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   else if (ctx->Fog.Enabled) {
22006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->_FogEnabled = GL_TRUE;
22106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->_FogMode = ctx->Fog.Mode;
22206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
22306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
22406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
22506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
22606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
22706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Update state for running fragment programs.  Basically, load the
22806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * program parameters with current state values.
22906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
23006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
23106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_fragment_program( GLcontext *ctx )
23206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
23306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->FragmentProgram._Active) {
234122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul      const struct gl_fragment_program *fp = ctx->FragmentProgram._Current;
235122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul      _mesa_load_state_parameters(ctx, fp->Base.Parameters);
23606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
23706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
23806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
23906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
24006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
24106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_DERIVED (_SWRAST_NEW_RASTERMASK |	\
24206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			     _NEW_TEXTURE |		\
24306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			     _NEW_HINT |		\
24406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			     _NEW_POLYGON )
24506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
24606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/* State referenced by _swrast_choose_triangle, _swrast_choose_line.
24706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
24806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_TRIANGLE (_SWRAST_NEW_DERIVED |		\
24906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			      _NEW_RENDERMODE|			\
25006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                              _NEW_POLYGON|			\
25106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                              _NEW_DEPTH|			\
25206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                              _NEW_STENCIL|			\
25306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                              _NEW_COLOR|			\
25406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                              _NEW_TEXTURE|			\
25506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                              _SWRAST_NEW_RASTERMASK|		\
25606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                              _NEW_LIGHT|			\
25706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                              _NEW_FOG |			\
25806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			      _DD_NEW_SEPARATE_SPECULAR)
25906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
26006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_LINE (_SWRAST_NEW_DERIVED |		\
26106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			  _NEW_RENDERMODE|		\
26206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                          _NEW_LINE|			\
26306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                          _NEW_TEXTURE|			\
26406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                          _NEW_LIGHT|			\
26506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                          _NEW_FOG|			\
26606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                          _NEW_DEPTH |			\
26706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                          _DD_NEW_SEPARATE_SPECULAR)
26806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
26906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_POINT (_SWRAST_NEW_DERIVED |	\
27006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			   _NEW_RENDERMODE |		\
27106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			   _NEW_POINT |			\
27206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			   _NEW_TEXTURE |		\
27306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			   _NEW_LIGHT |			\
27406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			   _NEW_FOG |			\
27506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                           _DD_NEW_SEPARATE_SPECULAR)
27606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
27706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_TEXTURE_SAMPLE_FUNC _NEW_TEXTURE
27806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
27906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_TEXTURE_ENV_MODE _NEW_TEXTURE
28006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
28106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_BLEND_FUNC _NEW_COLOR
28206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
28306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
28406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
28506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
28606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Stub for swrast->Triangle to select a true triangle function
28706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * after a state change.
28806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
28906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
29006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_triangle( GLcontext *ctx,
29106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			   const SWvertex *v0,
29206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                           const SWvertex *v1,
29306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                           const SWvertex *v2 )
29406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
29506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
29606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
29706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   _swrast_validate_derived( ctx );
29806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->choose_triangle( ctx );
29906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
30006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Texture._EnabledUnits == 0
30106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul       && NEED_SECONDARY_COLOR(ctx)
30206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul       && !ctx->FragmentProgram._Active) {
30306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      /* separate specular color, but no texture */
30406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->SpecTriangle = swrast->Triangle;
30506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->Triangle = _swrast_add_spec_terms_triangle;
30606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
30706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
30806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->Triangle( ctx, v0, v1, v2 );
30906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
31006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
31106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
31206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Called via swrast->Line.  Examine current GL state and choose a software
31306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * line routine.  Then call it.
31406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
31506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
31606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_line( GLcontext *ctx, const SWvertex *v0, const SWvertex *v1 )
31706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
31806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
31906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
32006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   _swrast_validate_derived( ctx );
32106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->choose_line( ctx );
32206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
32306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Texture._EnabledUnits == 0
32406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul       && NEED_SECONDARY_COLOR(ctx)
32506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul       && !ctx->FragmentProgram._Active) {
32606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->SpecLine = swrast->Line;
32706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->Line = _swrast_add_spec_terms_line;
32806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
32906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
33006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
33106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->Line( ctx, v0, v1 );
33206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
33306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
33406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
33506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Called via swrast->Point.  Examine current GL state and choose a software
33606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * point routine.  Then call it.
33706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
33806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
33906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_point( GLcontext *ctx, const SWvertex *v0 )
34006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
34106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
34206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
34306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   _swrast_validate_derived( ctx );
34406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->choose_point( ctx );
34506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
34606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Texture._EnabledUnits == 0
34706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul       && NEED_SECONDARY_COLOR(ctx)
34806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul       && !ctx->FragmentProgram._Active) {
34906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->SpecPoint = swrast->Point;
35006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->Point = _swrast_add_spec_terms_point;
35106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
35206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
35306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->Point( ctx, v0 );
35406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
35506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
35606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
35706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
35806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Called via swrast->BlendFunc.  Examine GL state to choose a blending
35906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * function, then call it.
36006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
36106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void _ASMAPI
36206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_blend_func( GLcontext *ctx, GLuint n,
36306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			     const GLubyte mask[],
36406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			     GLchan src[][4],
36506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			     CONST GLchan dst[][4] )
36606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
36706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
36806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
36906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   _swrast_validate_derived( ctx );
37006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   _swrast_choose_blend_func( ctx );
37106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
37206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->BlendFunc( ctx, n, mask, src, dst );
37306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
37406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
37506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
376ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul/**
377ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Make sure we have texture image data for all the textures we may need
378ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * for subsequent rendering.
379ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */
380ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paulstatic void
381ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul_swrast_validate_texture_images(GLcontext *ctx)
382ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul{
383ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
384ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   GLuint u;
385ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
386ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   if (!swrast->ValidateTextureImage || !ctx->Texture._EnabledUnits) {
387ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      /* no textures enabled, or no way to validate images! */
388ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      return;
389ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   }
390ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
391ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   for (u = 0; u < ctx->Const.MaxTextureImageUnits; u++) {
392ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      if (ctx->Texture.Unit[u]._ReallyEnabled) {
393ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         struct gl_texture_object *texObj = ctx->Texture.Unit[u]._Current;
394ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         ASSERT(texObj);
395ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         if (texObj) {
396ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul            GLuint numFaces = (texObj->Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1;
397ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul            GLuint face;
398ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul            for (face = 0; face < numFaces; face++) {
399ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul               GLuint lvl;
400ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul               for (lvl = texObj->BaseLevel; lvl <= texObj->_MaxLevel; lvl++) {
401ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                  struct gl_texture_image *texImg = texObj->Image[face][lvl];
402ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                  if (texImg && !texImg->Data) {
403ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                     swrast->ValidateTextureImage(ctx, texObj, face, lvl);
404ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                     ASSERT(texObj->Image[face][lvl]->Data);
405ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                  }
406ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul               }
407ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul            }
408ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         }
409ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      }
410ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   }
411ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul}
412ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
413ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
414ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul/**
415ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Free the texture image data attached to all currently enabled
416ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * textures.  Meant to be called by device drivers when transitioning
417ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * from software to hardware rendering.
418ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */
419ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paulvoid
420ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul_swrast_eject_texture_images(GLcontext *ctx)
421ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul{
422ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   GLuint u;
423ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
424ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   if (!ctx->Texture._EnabledUnits) {
425ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      /* no textures enabled */
426ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      return;
427ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   }
428ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
429ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   for (u = 0; u < ctx->Const.MaxTextureImageUnits; u++) {
430ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      if (ctx->Texture.Unit[u]._ReallyEnabled) {
431ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         struct gl_texture_object *texObj = ctx->Texture.Unit[u]._Current;
432ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         ASSERT(texObj);
433ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         if (texObj) {
434ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul            GLuint numFaces = (texObj->Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1;
435ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul            GLuint face;
436ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul            for (face = 0; face < numFaces; face++) {
437ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul               GLuint lvl;
438ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul               for (lvl = texObj->BaseLevel; lvl <= texObj->_MaxLevel; lvl++) {
439ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                  struct gl_texture_image *texImg = texObj->Image[face][lvl];
440ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                  if (texImg && texImg->Data) {
441ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                     _mesa_free_texmemory(texImg->Data);
442ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                     texImg->Data = NULL;
443ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                  }
444ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul               }
445ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul            }
446ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         }
447ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      }
448ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   }
449ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul}
450ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
451ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
452ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
45306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
45406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_sleep( GLcontext *ctx, GLbitfield new_state )
45506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
45606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   (void) ctx; (void) new_state;
45706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
45806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
45906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
46006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
46106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_invalidate_state( GLcontext *ctx, GLbitfield new_state )
46206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
46306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
46406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   GLuint i;
46506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
46606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->NewState |= new_state;
46706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
46806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   /* After 10 statechanges without any swrast functions being called,
46906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul    * put the module to sleep.
47006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul    */
47106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (++swrast->StateChanges > 10) {
47206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->InvalidateState = _swrast_sleep;
47306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->NewState = ~0;
47406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      new_state = ~0;
47506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
47606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
47706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (new_state & swrast->InvalidateTriangleMask)
47806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->Triangle = _swrast_validate_triangle;
47906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
48006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (new_state & swrast->InvalidateLineMask)
48106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->Line = _swrast_validate_line;
48206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
48306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (new_state & swrast->InvalidatePointMask)
48406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->Point = _swrast_validate_point;
48506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
48606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (new_state & _SWRAST_NEW_BLEND_FUNC)
48706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->BlendFunc = _swrast_validate_blend_func;
48806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
48906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (new_state & _SWRAST_NEW_TEXTURE_SAMPLE_FUNC)
490ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul      for (i = 0 ; i < ctx->Const.MaxTextureImageUnits ; i++)
49106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 swrast->TextureSample[i] = NULL;
49206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
49306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
49406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
49506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
49606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_update_texture_samplers(GLcontext *ctx)
49706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
49806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
49906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   GLuint u;
50006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
50106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   for (u = 0; u < ctx->Const.MaxTextureImageUnits; u++) {
50206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      const struct gl_texture_object *tObj = ctx->Texture.Unit[u]._Current;
50306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (tObj)
50406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul         swrast->TextureSample[u] =
50506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul            _swrast_choose_texture_sample_func(ctx, tObj);
50606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
50706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
50806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
50906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
51006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
51106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_validate_derived( GLcontext *ctx )
51206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
51306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
51406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
51506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (swrast->NewState) {
51606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (swrast->NewState & _NEW_POLYGON)
51706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 _swrast_update_polygon( ctx );
51806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
51906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (swrast->NewState & (_NEW_HINT | _NEW_PROGRAM))
52006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 _swrast_update_fog_hint( ctx );
52106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
52206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (swrast->NewState & _SWRAST_NEW_TEXTURE_ENV_MODE)
52306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 _swrast_update_texture_env( ctx );
52406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
52506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (swrast->NewState & (_NEW_FOG | _NEW_PROGRAM))
52606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul         _swrast_update_fog_state( ctx );
52706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
52806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (swrast->NewState & _NEW_PROGRAM)
52906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 _swrast_update_fragment_program( ctx );
53006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
53106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (swrast->NewState & _NEW_TEXTURE)
53206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul         _swrast_update_texture_samplers( ctx );
53306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
534ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      if (swrast->NewState & (_NEW_TEXTURE | _NEW_PROGRAM))
535ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         _swrast_validate_texture_images( ctx );
536ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
5378334c8a2169055cd87e55d32403d59b8e46deb59Brian Paul      if (swrast->NewState & _SWRAST_NEW_RASTERMASK)
5388334c8a2169055cd87e55d32403d59b8e46deb59Brian Paul 	 _swrast_update_rasterflags( ctx );
5398334c8a2169055cd87e55d32403d59b8e46deb59Brian Paul
54006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->NewState = 0;
54106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->StateChanges = 0;
54206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->InvalidateState = _swrast_invalidate_state;
54306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
54406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
54506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
54606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define SWRAST_DEBUG 0
54706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
54806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/* Public entrypoints:  See also s_accum.c, s_bitmap.c, etc.
54906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
55006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
55106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Quad( GLcontext *ctx,
55206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	      const SWvertex *v0, const SWvertex *v1,
55306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul              const SWvertex *v2, const SWvertex *v3 )
55406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
55506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
55606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_Quad\n");
55706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v0 );
55806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v1 );
55906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v2 );
56006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v3 );
56106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
56206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->Triangle( ctx, v0, v1, v3 );
56306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->Triangle( ctx, v1, v2, v3 );
56406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
56506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
56606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
56706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Triangle( GLcontext *ctx, const SWvertex *v0,
56806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                  const SWvertex *v1, const SWvertex *v2 )
56906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
57006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
57106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_Triangle\n");
57206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v0 );
57306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v1 );
57406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v2 );
57506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
57606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->Triangle( ctx, v0, v1, v2 );
57706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
57806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
57906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
58006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Line( GLcontext *ctx, const SWvertex *v0, const SWvertex *v1 )
58106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
58206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
58306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_Line\n");
58406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v0 );
58506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v1 );
58606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
58706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->Line( ctx, v0, v1 );
58806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
58906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
59006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
59106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_Point( GLcontext *ctx, const SWvertex *v0 )
59206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
59306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
59406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_Point\n");
59506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v0 );
59606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
59706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->Point( ctx, v0 );
59806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
59906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
60006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
60106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_InvalidateState( GLcontext *ctx, GLbitfield new_state )
60206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
60306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
60406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_InvalidateState\n");
60506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
60606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->InvalidateState( ctx, new_state );
60706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
60806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
60906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
61006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_ResetLineStipple( GLcontext *ctx )
61106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
61206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
61306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_ResetLineStipple\n");
61406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
61506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->StippleCounter = 0;
61606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
61706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
61806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
61906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_allow_vertex_fog( GLcontext *ctx, GLboolean value )
62006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
62106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
62206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_allow_vertex_fog %d\n", value);
62306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
62406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->InvalidateState( ctx, _NEW_HINT );
62506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->AllowVertexFog = value;
62606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
62706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
62806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
62906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_allow_pixel_fog( GLcontext *ctx, GLboolean value )
63006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
63106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
63206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_allow_pixel_fog %d\n", value);
63306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
63406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->InvalidateState( ctx, _NEW_HINT );
63506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->AllowPixelFog = value;
63606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
63706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
63806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
63906049e24164fc0bda9dea12fbcbdb827a731badbBrian PaulGLboolean
64006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_CreateContext( GLcontext *ctx )
64106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
64206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   GLuint i;
64306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = (SWcontext *)CALLOC(sizeof(SWcontext));
64406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
64506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
64606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_CreateContext\n");
64706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
64806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
64906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (!swrast)
65006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      return GL_FALSE;
65106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
65206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->NewState = ~0;
65306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
65406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->choose_point = _swrast_choose_point;
65506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->choose_line = _swrast_choose_line;
65606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->choose_triangle = _swrast_choose_triangle;
65706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
65806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->InvalidatePointMask = _SWRAST_NEW_POINT;
65906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->InvalidateLineMask = _SWRAST_NEW_LINE;
66006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->InvalidateTriangleMask = _SWRAST_NEW_TRIANGLE;
66106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
66206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->Point = _swrast_validate_point;
66306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->Line = _swrast_validate_line;
66406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->Triangle = _swrast_validate_triangle;
66506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->InvalidateState = _swrast_sleep;
66606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->BlendFunc = _swrast_validate_blend_func;
66706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
66806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->AllowVertexFog = GL_TRUE;
66906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->AllowPixelFog = GL_TRUE;
67006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
67106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   /* Optimized Accum buffer */
67206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->_IntegerAccumMode = GL_FALSE;
67306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->_IntegerAccumScaler = 0.0;
67406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
67506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++)
67606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->TextureSample[i] = NULL;
67706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
67806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->SpanArrays = MALLOC_STRUCT(span_arrays);
67906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (!swrast->SpanArrays) {
68006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      FREE(swrast);
68106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      return GL_FALSE;
68206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
68306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
68406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   /* init point span buffer */
68506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->PointSpan.primitive = GL_POINT;
68606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->PointSpan.start = 0;
68706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->PointSpan.end = 0;
68806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->PointSpan.facing = 0;
68906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->PointSpan.array = swrast->SpanArrays;
69006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
691ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul   swrast->TexelBuffer = (GLchan *) MALLOC(ctx->Const.MaxTextureImageUnits *
69206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                                           MAX_WIDTH * 4 * sizeof(GLchan));
69306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (!swrast->TexelBuffer) {
69406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      FREE(swrast->SpanArrays);
69506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      FREE(swrast);
69606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      return GL_FALSE;
69706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
69806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
69906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   ctx->swrast_context = swrast;
70006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
70106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   return GL_TRUE;
70206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
70306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
70406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
70506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_DestroyContext( GLcontext *ctx )
70606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
70706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
70806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
70906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
71006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_DestroyContext\n");
71106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
71206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
71306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   FREE( swrast->SpanArrays );
71406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   FREE( swrast->TexelBuffer );
71506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   FREE( swrast );
71606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
71706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   ctx->swrast_context = 0;
71806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
71906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
72006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
72106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstruct swrast_device_driver *
72206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_GetDeviceDriverReference( GLcontext *ctx )
72306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
72406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
72506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   return &swrast->Driver;
72606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
72706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
72806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
72906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_flush( GLcontext *ctx )
73006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
73106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
73206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   /* flush any pending fragments from rendering points */
73306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (swrast->PointSpan.end > 0) {
73406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (ctx->Visual.rgbMode) {
73506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul         _swrast_write_rgba_span(ctx, &(swrast->PointSpan));
73606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      }
73706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      else {
73806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul         _swrast_write_index_span(ctx, &(swrast->PointSpan));
73906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      }
74006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->PointSpan.end = 0;
74106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
74206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
74306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
74406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
74506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_render_primitive( GLcontext *ctx, GLenum prim )
74606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
74706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
74806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (swrast->Primitive == GL_POINTS && prim != GL_POINTS) {
74906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_flush(ctx);
75006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
75106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->Primitive = prim;
75206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
75306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
75406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
75506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
75606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_render_start( GLcontext *ctx )
75706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
75806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
75906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (swrast->Driver.SpanRenderStart)
76006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->Driver.SpanRenderStart( ctx );
76106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->PointSpan.end = 0;
76206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
76306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
76406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
76506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_render_finish( GLcontext *ctx )
76606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
76706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
76806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (swrast->Driver.SpanRenderFinish)
76906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->Driver.SpanRenderFinish( ctx );
77006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
77106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   _swrast_flush(ctx);
77206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
77306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
77406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
77506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define SWRAST_DEBUG_VERTICES 0
77606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
77706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
77806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul_swrast_print_vertex( GLcontext *ctx, const SWvertex *v )
77906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
78006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   GLuint i;
78106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
78206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG_VERTICES) {
78306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "win %f %f %f %f\n",
78406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                  v->win[0], v->win[1], v->win[2], v->win[3]);
78506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
786ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul      for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++)
78706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 if (ctx->Texture.Unit[i]._ReallyEnabled)
78806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	    _mesa_debug(ctx, "texcoord[%d] %f %f %f %f\n", i,
78906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                        v->texcoord[i][0], v->texcoord[i][1],
79006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                        v->texcoord[i][2], v->texcoord[i][3]);
79106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
79206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#if CHAN_TYPE == GL_FLOAT
79306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "color %f %f %f %f\n",
79406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                  v->color[0], v->color[1], v->color[2], v->color[3]);
79506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "spec %f %f %f %f\n",
79606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                  v->specular[0], v->specular[1],
79706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                  v->specular[2], v->specular[3]);
79806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#else
79906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "color %d %d %d %d\n",
80006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                  v->color[0], v->color[1], v->color[2], v->color[3]);
80106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "spec %d %d %d %d\n",
80206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                  v->specular[0], v->specular[1],
80306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                  v->specular[2], v->specular[3]);
80406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#endif
80506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "fog %f\n", v->fog);
80606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "index %d\n", v->index);
80706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "pointsize %f\n", v->pointSize);
80806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "\n");
80906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
81006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
811