106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/*
206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Mesa 3-D graphics library
3e4b037051e79a607044ed233b7eda66cf1873245Brian * Version:  7.1
406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul *
5505606349e5154c67d1a857d7125048669a594c3Brian Paul * Copyright (C) 1999-2008  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
29101d1a658a614d1e2ec02b1e697f6161291af653José Fonseca#include "main/imports.h"
30bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/bufferobj.h"
31101d1a658a614d1e2ec02b1e697f6161291af653José Fonseca#include "main/colormac.h"
32101d1a658a614d1e2ec02b1e697f6161291af653José Fonseca#include "main/mtypes.h"
33f4a93e0665881dd58a95abb6525676bd1cc2e6afBrian Paul#include "main/samplerobj.h"
34bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/teximage.h"
35ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_parameter.h"
36ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_statevars.h"
37bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "swrast.h"
3806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_blend.h"
3906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_context.h"
4006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_lines.h"
4106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_points.h"
4206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_span.h"
43baeefef2c0445bfd717a3086fdd9b5bd5d9cb675Brian Paul#include "s_texfetch.h"
4406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_triangle.h"
4506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#include "s_texfilter.h"
4606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
4706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
4806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
4906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Recompute the value of swrast->_RasterMask, etc. according to
5006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * the current context.  The _RasterMask field can be easily tested by
5106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * drivers to determine certain basic GL state (does the primitive need
5206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * stenciling, logic-op, fog, etc?).
5306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
5406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
55f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_update_rasterflags( struct gl_context *ctx )
5606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
5706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
5806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   GLbitfield rasterMask = 0;
59fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   GLuint i;
6006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
6106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Color.AlphaEnabled)           rasterMask |= ALPHATEST_BIT;
6206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Color.BlendEnabled)           rasterMask |= BLEND_BIT;
6306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Depth.Test)                   rasterMask |= DEPTH_BIT;
6406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (swrast->_FogEnabled)               rasterMask |= FOG_BIT;
6506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Scissor.Enabled)              rasterMask |= CLIP_BIT;
6691e61f435a71436c209934a0ece165b540aba3e0Brian Paul   if (ctx->Stencil._Enabled)             rasterMask |= STENCIL_BIT;
672b7911d37dc1518b9047b02acdc6f8476abad70fIan Romanick   for (i = 0; i < ctx->Const.MaxDrawBuffers; i++) {
682b7911d37dc1518b9047b02acdc6f8476abad70fIan Romanick      if (!ctx->Color.ColorMask[i][0] ||
692b7911d37dc1518b9047b02acdc6f8476abad70fIan Romanick          !ctx->Color.ColorMask[i][1] ||
702b7911d37dc1518b9047b02acdc6f8476abad70fIan Romanick          !ctx->Color.ColorMask[i][2] ||
712b7911d37dc1518b9047b02acdc6f8476abad70fIan Romanick          !ctx->Color.ColorMask[i][3]) {
722b7911d37dc1518b9047b02acdc6f8476abad70fIan Romanick         rasterMask |= MASKING_BIT;
732b7911d37dc1518b9047b02acdc6f8476abad70fIan Romanick         break;
74fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul      }
7506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
762836aab2031d5b6926923fbc70f867ec638301bdIan Romanick   if (ctx->Color.ColorLogicOpEnabled) rasterMask |= LOGIC_OP_BIT;
772b7911d37dc1518b9047b02acdc6f8476abad70fIan Romanick   if (ctx->Texture._EnabledUnits)     rasterMask |= TEXTURE_BIT;
7806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (   ctx->Viewport.X < 0
7906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul       || ctx->Viewport.X + ctx->Viewport.Width > (GLint) ctx->DrawBuffer->Width
8006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul       || ctx->Viewport.Y < 0
8106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul       || ctx->Viewport.Y + ctx->Viewport.Height > (GLint) ctx->DrawBuffer->Height) {
8206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      rasterMask |= CLIP_BIT;
8306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
8406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
8506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Query.CurrentOcclusionObject)
8606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      rasterMask |= OCCLUSION_BIT;
8706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
8806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
8906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   /* If we're not drawing to exactly one color buffer set the
9006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul    * MULTI_DRAW_BIT flag.  Also set it if we're drawing to no
9106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul    * buffers or the RGBA or CI mask disables all writes.
9206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul    */
93ff73c783cc47361ff0dd819c82d067b4b85870ddBrian   if (ctx->DrawBuffer->_NumColorDrawBuffers != 1) {
9406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      /* more than one color buffer designated for writing (or zero buffers) */
9506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      rasterMask |= MULTI_DRAW_BIT;
9606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
9706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
982b7911d37dc1518b9047b02acdc6f8476abad70fIan Romanick   for (i = 0; i < ctx->Const.MaxDrawBuffers; i++) {
992b7911d37dc1518b9047b02acdc6f8476abad70fIan Romanick      if (ctx->Color.ColorMask[i][0] +
1002b7911d37dc1518b9047b02acdc6f8476abad70fIan Romanick          ctx->Color.ColorMask[i][1] +
1012b7911d37dc1518b9047b02acdc6f8476abad70fIan Romanick          ctx->Color.ColorMask[i][2] +
1022b7911d37dc1518b9047b02acdc6f8476abad70fIan Romanick          ctx->Color.ColorMask[i][3] == 0) {
1032b7911d37dc1518b9047b02acdc6f8476abad70fIan Romanick         rasterMask |= MULTI_DRAW_BIT; /* all RGBA channels disabled */
1042b7911d37dc1518b9047b02acdc6f8476abad70fIan Romanick         break;
105fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul      }
106fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   }
107fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul
108fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul
1091c0f1dd42a50464eeb81de4aad8eecf24b3d6c89Chad Versace   if (_swrast_use_fragment_program(ctx)) {
11006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      rasterMask |= FRAGPROG_BIT;
11106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
11206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
11306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->ATIFragmentShader._Enabled) {
11406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      rasterMask |= ATIFRAGSHADER_BIT;
11506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
11606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
11706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#if CHAN_TYPE == GL_FLOAT
11806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Color.ClampFragmentColor == GL_TRUE) {
11906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      rasterMask |= CLAMPING_BIT;
12006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
12106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#endif
12206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
12306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->_RasterMask = rasterMask;
12406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
12506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
12606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
12706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
128507d43f95bc1623f413603e7f8c134553d11c184Brian * Examine polygon cull state to compute the _BackfaceCullSign field.
129fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian * _BackfaceCullSign will be 0 if no culling, -1 if culling back-faces,
13006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * and 1 if culling front-faces.  The Polygon FrontFace state also
13106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * factors in.
13206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
13306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
134f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_update_polygon( struct gl_context *ctx )
13506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
1361fcb4ecc07685872c9c42569ba13faa1cad54d3cBrian   GLfloat backface_sign;
13706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
13806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (ctx->Polygon.CullFlag) {
1391fcb4ecc07685872c9c42569ba13faa1cad54d3cBrian      switch (ctx->Polygon.CullFaceMode) {
14006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      case GL_BACK:
141880411c72aee7c0ec81366bdf6ab8cf25bebb9d5Brian Paul         backface_sign = -1.0F;
14206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 break;
14306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      case GL_FRONT:
144880411c72aee7c0ec81366bdf6ab8cf25bebb9d5Brian Paul         backface_sign = 1.0F;
14506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 break;
14606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      case GL_FRONT_AND_BACK:
1471fcb4ecc07685872c9c42569ba13faa1cad54d3cBrian         /* fallthrough */
1481fcb4ecc07685872c9c42569ba13faa1cad54d3cBrian      default:
149880411c72aee7c0ec81366bdf6ab8cf25bebb9d5Brian Paul	 backface_sign = 0.0F;
15006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      }
15106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
15206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   else {
153880411c72aee7c0ec81366bdf6ab8cf25bebb9d5Brian Paul      backface_sign = 0.0F;
15406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
15506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
156fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian   SWRAST_CONTEXT(ctx)->_BackfaceCullSign = backface_sign;
157fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian
158fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian   /* This is for front/back-face determination, but not for culling */
159fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian   SWRAST_CONTEXT(ctx)->_BackfaceSign
160880411c72aee7c0ec81366bdf6ab8cf25bebb9d5Brian Paul      = (ctx->Polygon.FrontFace == GL_CW) ? -1.0F : 1.0F;
16106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
16206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
16306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
164fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian
16506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
16606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Update the _PreferPixelFog field to indicate if we need to compute
16730a79f76fc4ae3bbf2307489bf9da1527f124e91Brian * fog blend factors (from the fog coords) per-fragment.
16806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
16906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
170f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_update_fog_hint( struct gl_context *ctx )
17106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
17206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
17306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->_PreferPixelFog = (!swrast->AllowVertexFog ||
1741c0f1dd42a50464eeb81de4aad8eecf24b3d6c89Chad Versace			      _swrast_use_fragment_program(ctx) ||
17506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			      (ctx->Hint.Fog == GL_NICEST &&
17606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			       swrast->AllowPixelFog));
17706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
17806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
17906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
18006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
18106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
1827aed2b0c30c6d29d70efd2402a68a8e3de98418cBrian Paul * Update the swrast->_TextureCombinePrimary flag.
18306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
18406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
185f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_update_texture_env( struct gl_context *ctx )
18606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
18706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
18806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   GLuint i;
1897aed2b0c30c6d29d70efd2402a68a8e3de98418cBrian Paul
1907aed2b0c30c6d29d70efd2402a68a8e3de98418cBrian Paul   swrast->_TextureCombinePrimary = GL_FALSE;
1917aed2b0c30c6d29d70efd2402a68a8e3de98418cBrian Paul
19206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
1937aed2b0c30c6d29d70efd2402a68a8e3de98418cBrian Paul      const struct gl_tex_env_combine_state *combine =
1947aed2b0c30c6d29d70efd2402a68a8e3de98418cBrian Paul         ctx->Texture.Unit[i]._CurrentCombine;
1957aed2b0c30c6d29d70efd2402a68a8e3de98418cBrian Paul      GLuint term;
1967aed2b0c30c6d29d70efd2402a68a8e3de98418cBrian Paul      for (term = 0; term < combine->_NumArgsRGB; term++) {
1977aed2b0c30c6d29d70efd2402a68a8e3de98418cBrian Paul         if (combine->SourceRGB[term] == GL_PRIMARY_COLOR) {
1987aed2b0c30c6d29d70efd2402a68a8e3de98418cBrian Paul            swrast->_TextureCombinePrimary = GL_TRUE;
1997aed2b0c30c6d29d70efd2402a68a8e3de98418cBrian Paul            return;
2007aed2b0c30c6d29d70efd2402a68a8e3de98418cBrian Paul         }
2017aed2b0c30c6d29d70efd2402a68a8e3de98418cBrian Paul         if (combine->SourceA[term] == GL_PRIMARY_COLOR) {
2027aed2b0c30c6d29d70efd2402a68a8e3de98418cBrian Paul            swrast->_TextureCombinePrimary = GL_TRUE;
2037aed2b0c30c6d29d70efd2402a68a8e3de98418cBrian Paul            return;
2047aed2b0c30c6d29d70efd2402a68a8e3de98418cBrian Paul         }
20506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      }
20606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
20706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
20806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
20906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
21006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
2119e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian * Determine if we can defer texturing/shading until after Z/stencil
2129e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian * testing.  This potentially allows us to skip texturing/shading for
2139e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian * lots of fragments.
2149e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian */
2159e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrianstatic void
216f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_update_deferred_texture(struct gl_context *ctx)
2179e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian{
2189e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   SWcontext *swrast = SWRAST_CONTEXT(ctx);
2199e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   if (ctx->Color.AlphaEnabled) {
2209e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      /* alpha test depends on post-texture/shader colors */
2219e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      swrast->_DeferredTexture = GL_FALSE;
2229e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   }
2239e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   else {
2241c0f1dd42a50464eeb81de4aad8eecf24b3d6c89Chad Versace      GLboolean use_fprog = _swrast_use_fragment_program(ctx);
2259e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      const struct gl_fragment_program *fprog
2269e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian         = ctx->FragmentProgram._Current;
2271c0f1dd42a50464eeb81de4aad8eecf24b3d6c89Chad Versace      if (use_fprog && (fprog->Base.OutputsWritten & (1 << FRAG_RESULT_DEPTH))) {
2289e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian         /* Z comes from fragment program/shader */
2299e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian         swrast->_DeferredTexture = GL_FALSE;
2309e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      }
2311c0f1dd42a50464eeb81de4aad8eecf24b3d6c89Chad Versace      else if (use_fprog && fprog->UsesKill) {
23218656201ef62da1892d66e0899001ae82e2555c2Brian Paul         swrast->_DeferredTexture = GL_FALSE;
23318656201ef62da1892d66e0899001ae82e2555c2Brian Paul      }
2349e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      else if (ctx->Query.CurrentOcclusionObject) {
2359e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian         /* occlusion query depends on shader discard/kill results */
2369e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian         swrast->_DeferredTexture = GL_FALSE;
2379e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      }
2389e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      else {
2399e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian         swrast->_DeferredTexture = GL_TRUE;
2409e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      }
2419e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   }
2429e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian}
2439e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian
2449e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian
2459e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian/**
24606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Update swrast->_FogColor and swrast->_FogEnable values.
24706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
24806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
249f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_update_fog_state( struct gl_context *ctx )
25006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
25106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
25212ef1fbefcee964b715783d3ade6b69b2c699ed8Brian   const struct gl_fragment_program *fp = ctx->FragmentProgram._Current;
25306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
254b64dc2a275714ae67c735298d8104ff292c60edfBrian Paul   assert((fp == NULL) ||
255b64dc2a275714ae67c735298d8104ff292c60edfBrian Paul          (fp->Base.Target == GL_FRAGMENT_PROGRAM_ARB) ||
256b64dc2a275714ae67c735298d8104ff292c60edfBrian Paul          (fp->Base.Target == GL_FRAGMENT_PROGRAM_NV));
257f0188d4b08b84aa72c6d8148ca94e40d665c7b68Ian Romanick
25806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   /* determine if fog is needed, and if so, which fog mode */
2591c0f1dd42a50464eeb81de4aad8eecf24b3d6c89Chad Versace   swrast->_FogEnabled = (!_swrast_use_fragment_program(ctx) &&
2601c0f1dd42a50464eeb81de4aad8eecf24b3d6c89Chad Versace			  ctx->Fog.Enabled);
26106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
26206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
26306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
26406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
26506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Update state for running fragment programs.  Basically, load the
26606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * program parameters with current state values.
26706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
26806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
269f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_update_fragment_program(struct gl_context *ctx, GLbitfield newState)
27006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
2711c0f1dd42a50464eeb81de4aad8eecf24b3d6c89Chad Versace   if (!_swrast_use_fragment_program(ctx))
2721c0f1dd42a50464eeb81de4aad8eecf24b3d6c89Chad Versace      return;
2731c0f1dd42a50464eeb81de4aad8eecf24b3d6c89Chad Versace
2741c0f1dd42a50464eeb81de4aad8eecf24b3d6c89Chad Versace   _mesa_load_state_parameters(ctx,
2751c0f1dd42a50464eeb81de4aad8eecf24b3d6c89Chad Versace                               ctx->FragmentProgram._Current->Base.Parameters);
27606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
27706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
27806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
27976ac75af8e5481b498981c133836efa2101be2dcBrian Paul/**
28076ac75af8e5481b498981c133836efa2101be2dcBrian Paul * See if we can do early diffuse+specular (primary+secondary) color
28176ac75af8e5481b498981c133836efa2101be2dcBrian Paul * add per vertex instead of per-fragment.
28276ac75af8e5481b498981c133836efa2101be2dcBrian Paul */
28376ac75af8e5481b498981c133836efa2101be2dcBrian Paulstatic void
284f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_update_specular_vertex_add(struct gl_context *ctx)
28576ac75af8e5481b498981c133836efa2101be2dcBrian Paul{
28676ac75af8e5481b498981c133836efa2101be2dcBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
28776ac75af8e5481b498981c133836efa2101be2dcBrian Paul   GLboolean separateSpecular = ctx->Fog.ColorSumEnabled ||
28876ac75af8e5481b498981c133836efa2101be2dcBrian Paul      (ctx->Light.Enabled &&
28976ac75af8e5481b498981c133836efa2101be2dcBrian Paul       ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR);
29076ac75af8e5481b498981c133836efa2101be2dcBrian Paul
29176ac75af8e5481b498981c133836efa2101be2dcBrian Paul   swrast->SpecularVertexAdd = (separateSpecular
29276ac75af8e5481b498981c133836efa2101be2dcBrian Paul                                && ctx->Texture._EnabledUnits == 0x0
2931c0f1dd42a50464eeb81de4aad8eecf24b3d6c89Chad Versace                                && !_swrast_use_fragment_program(ctx)
29476ac75af8e5481b498981c133836efa2101be2dcBrian Paul                                && !ctx->ATIFragmentShader._Enabled);
29576ac75af8e5481b498981c133836efa2101be2dcBrian Paul}
29676ac75af8e5481b498981c133836efa2101be2dcBrian Paul
29706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
29806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_DERIVED (_SWRAST_NEW_RASTERMASK |	\
29988527220e44fd36c317f73e667bc6abebb0af112Brian Paul                             _NEW_PROGRAM_CONSTANTS |   \
30006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			     _NEW_TEXTURE |		\
30106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			     _NEW_HINT |		\
30206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			     _NEW_POLYGON )
30306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
30406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/* State referenced by _swrast_choose_triangle, _swrast_choose_line.
30506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
30606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_TRIANGLE (_SWRAST_NEW_DERIVED |		\
30706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			      _NEW_RENDERMODE|			\
30806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                              _NEW_POLYGON|			\
30906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                              _NEW_DEPTH|			\
31006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                              _NEW_STENCIL|			\
31106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                              _NEW_COLOR|			\
31206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                              _NEW_TEXTURE|			\
31306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                              _SWRAST_NEW_RASTERMASK|		\
31406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                              _NEW_LIGHT|			\
31506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                              _NEW_FOG |			\
316938aaec981761a51043f4f68289c9a3f0e12e19cBrian Paul			      _MESA_NEW_SEPARATE_SPECULAR)
31706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
31806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_LINE (_SWRAST_NEW_DERIVED |		\
31906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			  _NEW_RENDERMODE|		\
32006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                          _NEW_LINE|			\
32106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                          _NEW_TEXTURE|			\
32206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                          _NEW_LIGHT|			\
32306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                          _NEW_FOG|			\
32406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                          _NEW_DEPTH |			\
325938aaec981761a51043f4f68289c9a3f0e12e19cBrian Paul                          _MESA_NEW_SEPARATE_SPECULAR)
32606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
32706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_POINT (_SWRAST_NEW_DERIVED |	\
32806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			   _NEW_RENDERMODE |		\
32906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			   _NEW_POINT |			\
33006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			   _NEW_TEXTURE |		\
33106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			   _NEW_LIGHT |			\
33206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			   _NEW_FOG |			\
333938aaec981761a51043f4f68289c9a3f0e12e19cBrian Paul                           _MESA_NEW_SEPARATE_SPECULAR)
33406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
33506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_TEXTURE_SAMPLE_FUNC _NEW_TEXTURE
33606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
33706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_TEXTURE_ENV_MODE _NEW_TEXTURE
33806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
33906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define _SWRAST_NEW_BLEND_FUNC _NEW_COLOR
34006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
34106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
34206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
34306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
34406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Stub for swrast->Triangle to select a true triangle function
34506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * after a state change.
34606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
34706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
348f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_validate_triangle( struct gl_context *ctx,
34906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul			   const SWvertex *v0,
35006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                           const SWvertex *v1,
35106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                           const SWvertex *v2 )
35206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
35306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
35406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
35506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   _swrast_validate_derived( ctx );
35606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->choose_triangle( ctx );
357d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul   ASSERT(swrast->Triangle);
35806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
35976ac75af8e5481b498981c133836efa2101be2dcBrian Paul   if (swrast->SpecularVertexAdd) {
36006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      /* separate specular color, but no texture */
36106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->SpecTriangle = swrast->Triangle;
36206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->Triangle = _swrast_add_spec_terms_triangle;
36306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
36406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
36506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->Triangle( ctx, v0, v1, v2 );
36606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
36706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
36806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
36906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Called via swrast->Line.  Examine current GL state and choose a software
37006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * line routine.  Then call it.
37106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
37206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
373f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_validate_line( struct gl_context *ctx, const SWvertex *v0, const SWvertex *v1 )
37406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
37506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
37606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
37706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   _swrast_validate_derived( ctx );
37806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->choose_line( ctx );
379d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul   ASSERT(swrast->Line);
38006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
38176ac75af8e5481b498981c133836efa2101be2dcBrian Paul   if (swrast->SpecularVertexAdd) {
38206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->SpecLine = swrast->Line;
38306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->Line = _swrast_add_spec_terms_line;
38406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
38506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
38606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->Line( ctx, v0, v1 );
38706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
38806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
38906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
39006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Called via swrast->Point.  Examine current GL state and choose a software
39106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * point routine.  Then call it.
39206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
39306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
394f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_validate_point( struct gl_context *ctx, const SWvertex *v0 )
39506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
39606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
39706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
39806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   _swrast_validate_derived( ctx );
39906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->choose_point( ctx );
40006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
40176ac75af8e5481b498981c133836efa2101be2dcBrian Paul   if (swrast->SpecularVertexAdd) {
40206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->SpecPoint = swrast->Point;
40306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->Point = _swrast_add_spec_terms_point;
40406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
40506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
40606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->Point( ctx, v0 );
40706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
40806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
40906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
41006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul/**
41106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * Called via swrast->BlendFunc.  Examine GL state to choose a blending
41206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul * function, then call it.
41306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
41406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void _ASMAPI
415f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_validate_blend_func(struct gl_context *ctx, GLuint n, const GLubyte mask[],
416d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul                            GLvoid *src, const GLvoid *dst,
417a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul                            GLenum chanType )
41806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
41906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
42006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
421d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul   _swrast_validate_derived( ctx ); /* why is this needed? */
422d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul   _swrast_choose_blend_func( ctx, chanType );
42306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
424a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul   swrast->BlendFunc( ctx, n, mask, src, dst, chanType );
42506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
42606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
42706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
428f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_sleep( struct gl_context *ctx, GLbitfield new_state )
42906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
43006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   (void) ctx; (void) new_state;
43106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
43206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
43306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
43406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstatic void
435f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_invalidate_state( struct gl_context *ctx, GLbitfield new_state )
43606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
43706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
43806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   GLuint i;
43906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
44006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->NewState |= new_state;
44106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
44206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   /* After 10 statechanges without any swrast functions being called,
44306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul    * put the module to sleep.
44406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul    */
44506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (++swrast->StateChanges > 10) {
44606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->InvalidateState = _swrast_sleep;
44706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->NewState = ~0;
44806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      new_state = ~0;
44906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
45006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
45106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (new_state & swrast->InvalidateTriangleMask)
45206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->Triangle = _swrast_validate_triangle;
45306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
45406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (new_state & swrast->InvalidateLineMask)
45506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->Line = _swrast_validate_line;
45606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
45706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (new_state & swrast->InvalidatePointMask)
45806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->Point = _swrast_validate_point;
45906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
46006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (new_state & _SWRAST_NEW_BLEND_FUNC)
46106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->BlendFunc = _swrast_validate_blend_func;
46206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
46306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (new_state & _SWRAST_NEW_TEXTURE_SAMPLE_FUNC)
464ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul      for (i = 0 ; i < ctx->Const.MaxTextureImageUnits ; i++)
46506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 swrast->TextureSample[i] = NULL;
46606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
46706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
46806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
46904bda46739beb0dab7c8820bdbe67136470d42beBrianvoid
470f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_update_texture_samplers(struct gl_context *ctx)
47106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
47206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
47306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   GLuint u;
47406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
4759ba4311e71f510797e1b446ab7dc6b6d4dc55dd5Brian   if (!swrast)
4769ba4311e71f510797e1b446ab7dc6b6d4dc55dd5Brian      return; /* pipe hack */
4779ba4311e71f510797e1b446ab7dc6b6d4dc55dd5Brian
47806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   for (u = 0; u < ctx->Const.MaxTextureImageUnits; u++) {
479ce82914f5ad4bb9148370826099925590e9798fdBrian Paul      struct gl_texture_object *tObj = ctx->Texture.Unit[u]._Current;
4809a78ef980d89c0d18f859036d5a0cdf82acd303cBrian      /* Note: If tObj is NULL, the sample function will be a simple
4819a78ef980d89c0d18f859036d5a0cdf82acd303cBrian       * function that just returns opaque black (0,0,0,1).
4829a78ef980d89c0d18f859036d5a0cdf82acd303cBrian       */
483cbdc1d53542b3ecca0085399c4bb3b3371f94809Pauli Nieminen      _mesa_update_fetch_functions(ctx, u);
484f4a93e0665881dd58a95abb6525676bd1cc2e6afBrian Paul      swrast->TextureSample[u] =
485f4a93e0665881dd58a95abb6525676bd1cc2e6afBrian Paul         _swrast_choose_texture_sample_func(ctx, tObj,
486f4a93e0665881dd58a95abb6525676bd1cc2e6afBrian Paul                                            _mesa_get_samplerobj(ctx, u));
48706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
48806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
48906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
49006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
491dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian/**
492fe11b2c04bf206bd50654c31e6789519c6c07563Brian * Update swrast->_ActiveAttribs, swrast->_NumActiveAttribs,
493fe11b2c04bf206bd50654c31e6789519c6c07563Brian * swrast->_ActiveAtttribMask.
494dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian */
495dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brianstatic void
496f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_update_active_attribs(struct gl_context *ctx)
497dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian{
498dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian   SWcontext *swrast = SWRAST_CONTEXT(ctx);
4998dffb6bdab25dcacf165851e9d1fdb3beb73099aBrian Paul   GLbitfield64 attribsMask;
5009e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian
5019e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   /*
5029e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian    * Compute _ActiveAttribsMask = which fragment attributes are needed.
5039e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian    */
5041c0f1dd42a50464eeb81de4aad8eecf24b3d6c89Chad Versace   if (_swrast_use_fragment_program(ctx)) {
5059e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      /* fragment program/shader */
5060bdf216dd06d5136b8529297297aa962bab548c2Brian      attribsMask = ctx->FragmentProgram._Current->Base.InputsRead;
50704255489617f6eeb9604daba14efed8376d1d824Brian      attribsMask &= ~FRAG_BIT_WPOS; /* WPOS is always handled specially */
508dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian   }
5099e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   else if (ctx->ATIFragmentShader._Enabled) {
5109e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      attribsMask = ~0;  /* XXX fix me */
5119e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   }
512dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian   else {
5139e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      /* fixed function */
5140bdf216dd06d5136b8529297297aa962bab548c2Brian      attribsMask = 0x0;
515dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian
5169e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian#if CHAN_TYPE == GL_FLOAT
5179e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      attribsMask |= FRAG_BIT_COL0;
5183db3dc58bcc361637d7473ee4b7c4e3b036c283cBrian#endif
5199e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian
5209e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      if (ctx->Fog.ColorSumEnabled ||
5219e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian          (ctx->Light.Enabled &&
5229e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian           ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR)) {
5239e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian         attribsMask |= FRAG_BIT_COL1;
5249e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      }
5259e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian
526dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian      if (swrast->_FogEnabled)
5270bdf216dd06d5136b8529297297aa962bab548c2Brian         attribsMask |= FRAG_BIT_FOGC;
528dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian
5299e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      attribsMask |= (ctx->Texture._EnabledUnits << FRAG_ATTRIB_TEX0);
530dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian   }
531dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian
5329e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   swrast->_ActiveAttribMask = attribsMask;
5336d27194dffa52e076aba49edb222a70fcc77628bBrian
5340bdf216dd06d5136b8529297297aa962bab548c2Brian   /* Update _ActiveAttribs[] list */
535dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian   {
5360bdf216dd06d5136b8529297297aa962bab548c2Brian      GLuint i, num = 0;
5370bdf216dd06d5136b8529297297aa962bab548c2Brian      for (i = 0; i < FRAG_ATTRIB_MAX; i++) {
538706400f0a7a59bba89eca8e97a1ada45445ee6dfBrian Paul         if (attribsMask & BITFIELD64_BIT(i)) {
5390bdf216dd06d5136b8529297297aa962bab548c2Brian            swrast->_ActiveAttribs[num++] = i;
5409e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian            /* how should this attribute be interpolated? */
5419e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian            if (i == FRAG_ATTRIB_COL0 || i == FRAG_ATTRIB_COL1)
5429e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian               swrast->_InterpMode[i] = ctx->Light.ShadeModel;
5439e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian            else
5449e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian               swrast->_InterpMode[i] = GL_SMOOTH;
5459e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian         }
546dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian      }
5470bdf216dd06d5136b8529297297aa962bab548c2Brian      swrast->_NumActiveAttribs = num;
548dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian   }
549dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian}
550dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian
551dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian
55206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
553f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_validate_derived( struct gl_context *ctx )
55406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
55506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
55606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
55706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (swrast->NewState) {
55806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (swrast->NewState & _NEW_POLYGON)
55906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 _swrast_update_polygon( ctx );
56006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
56106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (swrast->NewState & (_NEW_HINT | _NEW_PROGRAM))
56206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 _swrast_update_fog_hint( ctx );
56306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
56406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (swrast->NewState & _SWRAST_NEW_TEXTURE_ENV_MODE)
56506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 _swrast_update_texture_env( ctx );
56606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
56706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      if (swrast->NewState & (_NEW_FOG | _NEW_PROGRAM))
56806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul         _swrast_update_fog_state( ctx );
56906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
5707872b8e37e13719fbea71b3a92507eb00e7fc9dbBrian Paul      if (swrast->NewState & (_NEW_PROGRAM_CONSTANTS | _NEW_PROGRAM))
5715050b565deca3cad165cd2f68badc084b9aa5377Brian Paul	 _swrast_update_fragment_program( ctx, swrast->NewState );
57206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
5739e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      if (swrast->NewState & (_NEW_TEXTURE | _NEW_PROGRAM)) {
574e4b037051e79a607044ed233b7eda66cf1873245Brian         _swrast_update_texture_samplers( ctx );
5759e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      }
576ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
577e4b037051e79a607044ed233b7eda66cf1873245Brian      if (swrast->NewState & (_NEW_COLOR | _NEW_PROGRAM))
578e4b037051e79a607044ed233b7eda66cf1873245Brian         _swrast_update_deferred_texture(ctx);
579e4b037051e79a607044ed233b7eda66cf1873245Brian
5808334c8a2169055cd87e55d32403d59b8e46deb59Brian Paul      if (swrast->NewState & _SWRAST_NEW_RASTERMASK)
5818334c8a2169055cd87e55d32403d59b8e46deb59Brian Paul 	 _swrast_update_rasterflags( ctx );
5828334c8a2169055cd87e55d32403d59b8e46deb59Brian Paul
583dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian      if (swrast->NewState & (_NEW_DEPTH |
584dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian                              _NEW_FOG |
5859e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian                              _NEW_LIGHT |
586dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian                              _NEW_PROGRAM |
587dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian                              _NEW_TEXTURE))
588fe11b2c04bf206bd50654c31e6789519c6c07563Brian         _swrast_update_active_attribs(ctx);
589dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian
59076ac75af8e5481b498981c133836efa2101be2dcBrian Paul      if (swrast->NewState & (_NEW_FOG |
59176ac75af8e5481b498981c133836efa2101be2dcBrian Paul                              _NEW_PROGRAM |
59276ac75af8e5481b498981c133836efa2101be2dcBrian Paul                              _NEW_LIGHT |
59376ac75af8e5481b498981c133836efa2101be2dcBrian Paul                              _NEW_TEXTURE))
59476ac75af8e5481b498981c133836efa2101be2dcBrian Paul         _swrast_update_specular_vertex_add(ctx);
59576ac75af8e5481b498981c133836efa2101be2dcBrian Paul
59606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->NewState = 0;
59706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->StateChanges = 0;
59806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->InvalidateState = _swrast_invalidate_state;
59906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
60006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
60106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
60206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define SWRAST_DEBUG 0
60306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
604bb887b72f71e1323ce35c676f5207a6b2424fed4Brian Paul/* Public entrypoints:  See also s_bitmap.c, etc.
60506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul */
60606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
607f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_Quad( struct gl_context *ctx,
60806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	      const SWvertex *v0, const SWvertex *v1,
60906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul              const SWvertex *v2, const SWvertex *v3 )
61006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
61106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
61206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_Quad\n");
61306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v0 );
61406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v1 );
61506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v2 );
61606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v3 );
61706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
61806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->Triangle( ctx, v0, v1, v3 );
61906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->Triangle( ctx, v1, v2, v3 );
62006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
62106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
62206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
623f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_Triangle( struct gl_context *ctx, const SWvertex *v0,
62406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                  const SWvertex *v1, const SWvertex *v2 )
62506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
62606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
62706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_Triangle\n");
62806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v0 );
62906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v1 );
63006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v2 );
63106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
63206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->Triangle( ctx, v0, v1, v2 );
63306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
63406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
63506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
636f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_Line( struct gl_context *ctx, const SWvertex *v0, const SWvertex *v1 )
63706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
63806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
63906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_Line\n");
64006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v0 );
64106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v1 );
64206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
64306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->Line( ctx, v0, v1 );
64406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
64506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
64606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
647f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_Point( struct gl_context *ctx, const SWvertex *v0 )
64806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
64906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
65006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_Point\n");
65106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_print_vertex( ctx, v0 );
65206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
65306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->Point( ctx, v0 );
65406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
65506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
65606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
657f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_InvalidateState( struct gl_context *ctx, GLbitfield new_state )
65806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
65906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
66006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_InvalidateState\n");
66106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
66206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->InvalidateState( ctx, new_state );
66306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
66406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
66506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
666f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_ResetLineStipple( struct gl_context *ctx )
66706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
66806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
66906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_ResetLineStipple\n");
67006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
67106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->StippleCounter = 0;
67206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
67306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
67406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
675f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_SetFacing(struct gl_context *ctx, GLuint facing)
676fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian{
677fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian   SWRAST_CONTEXT(ctx)->PointLineFacing = facing;
678fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian}
679fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian
680fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrianvoid
681f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_allow_vertex_fog( struct gl_context *ctx, GLboolean value )
68206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
68306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
68406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_allow_vertex_fog %d\n", value);
68506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
68606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->InvalidateState( ctx, _NEW_HINT );
68706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->AllowVertexFog = value;
68806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
68906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
69006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
691f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_allow_pixel_fog( struct gl_context *ctx, GLboolean value )
69206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
69306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
69406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_allow_pixel_fog %d\n", value);
69506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
69606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->InvalidateState( ctx, _NEW_HINT );
69706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWRAST_CONTEXT(ctx)->AllowPixelFog = value;
69806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
69906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
70006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
701e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul/**
702e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul * Initialize native program limits by copying the logical limits.
703e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul * See comments in init_program_limits() in context.c
704e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul */
705e26e9f77e761775592204edb53b6028eef0c1f11Brian Paulstatic void
706e26e9f77e761775592204edb53b6028eef0c1f11Brian Paulinit_program_native_limits(struct gl_program_constants *prog)
707e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul{
708e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul   prog->MaxNativeInstructions = prog->MaxInstructions;
709e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul   prog->MaxNativeAluInstructions = prog->MaxAluInstructions;
710e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul   prog->MaxNativeTexInstructions = prog->MaxTexInstructions;
711e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul   prog->MaxNativeTexIndirections = prog->MaxTexIndirections;
712e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul   prog->MaxNativeAttribs = prog->MaxAttribs;
713e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul   prog->MaxNativeTemps = prog->MaxTemps;
714e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul   prog->MaxNativeAddressRegs = prog->MaxAddressRegs;
715e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul   prog->MaxNativeParameters = prog->MaxParameters;
716e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul}
717e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul
718e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul
71906049e24164fc0bda9dea12fbcbdb827a731badbBrian PaulGLboolean
720f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_CreateContext( struct gl_context *ctx )
72106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
72206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   GLuint i;
72306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = (SWcontext *)CALLOC(sizeof(SWcontext));
724e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger#ifdef _OPENMP
7257d960a352f9b4ae263371c5f318299e8cbabe277Brian Paul   const GLuint maxThreads = omp_get_max_threads();
726e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger#else
7277d960a352f9b4ae263371c5f318299e8cbabe277Brian Paul   const GLuint maxThreads = 1;
728e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger#endif
72906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
73047d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul   assert(ctx->Const.MaxViewportWidth <= SWRAST_MAX_WIDTH);
73147d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul   assert(ctx->Const.MaxViewportHeight <= SWRAST_MAX_WIDTH);
73208687c7912f3d1b8f5420ba3c0a4fc474fa80d37Brian Paul
733cb49def3d6f946def1f53c736d1179ed9b576ab1Brian Paul   assert(ctx->Const.MaxRenderbufferSize <= SWRAST_MAX_WIDTH);
734cb49def3d6f946def1f53c736d1179ed9b576ab1Brian Paul
73547d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul   /* make sure largest texture image is <= SWRAST_MAX_WIDTH in size */
73647d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul   assert((1 << (ctx->Const.MaxTextureLevels - 1)) <= SWRAST_MAX_WIDTH);
73747d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul   assert((1 << (ctx->Const.MaxCubeTextureLevels - 1)) <= SWRAST_MAX_WIDTH);
73847d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul   assert((1 << (ctx->Const.Max3DTextureLevels - 1)) <= SWRAST_MAX_WIDTH);
73908687c7912f3d1b8f5420ba3c0a4fc474fa80d37Brian Paul
74070d3363757d286f2fa97c9b60268a96156fdb224Brian Paul   assert(PROG_MAX_WIDTH == SWRAST_MAX_WIDTH);
74170d3363757d286f2fa97c9b60268a96156fdb224Brian Paul
74206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
74306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_CreateContext\n");
74406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
74506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
74606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (!swrast)
74706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      return GL_FALSE;
74806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
74906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->NewState = ~0;
75006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
75106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->choose_point = _swrast_choose_point;
75206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->choose_line = _swrast_choose_line;
75306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->choose_triangle = _swrast_choose_triangle;
75406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
75506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->InvalidatePointMask = _SWRAST_NEW_POINT;
75606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->InvalidateLineMask = _SWRAST_NEW_LINE;
75706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->InvalidateTriangleMask = _SWRAST_NEW_TRIANGLE;
75806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
75906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->Point = _swrast_validate_point;
76006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->Line = _swrast_validate_line;
76106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->Triangle = _swrast_validate_triangle;
76206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->InvalidateState = _swrast_sleep;
76306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->BlendFunc = _swrast_validate_blend_func;
76406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
76506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->AllowVertexFog = GL_TRUE;
76606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->AllowPixelFog = GL_TRUE;
76706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
76868da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul   swrast->Driver.SpanRenderStart = _swrast_span_render_start;
76968da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul   swrast->Driver.SpanRenderFinish = _swrast_span_render_finish;
77068da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul
77106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++)
77206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->TextureSample[i] = NULL;
77306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
774e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger   /* SpanArrays is global and shared by all SWspan instances. However, when
775e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger    * using multiple threads, it is necessary to have one SpanArrays instance
776e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger    * per thread.
777e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger    */
778e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger   swrast->SpanArrays = (SWspanarrays *) MALLOC(maxThreads * sizeof(SWspanarrays));
77906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (!swrast->SpanArrays) {
78006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      FREE(swrast);
78106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      return GL_FALSE;
78206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
783e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger   for(i = 0; i < maxThreads; i++) {
784e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger      swrast->SpanArrays[i].ChanType = CHAN_TYPE;
785a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
786e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger      swrast->SpanArrays[i].rgba = swrast->SpanArrays[i].rgba8;
787a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul#elif CHAN_TYPE == GL_UNSIGNED_SHORT
788e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger      swrast->SpanArrays[i].rgba = swrast->SpanArrays[i].rgba16;
789a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul#else
790e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger      swrast->SpanArrays[i].rgba = swrast->SpanArrays[i].attribs[FRAG_ATTRIB_COL0];
791a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul#endif
792e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger   }
79306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
79406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   /* init point span buffer */
79506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->PointSpan.primitive = GL_POINT;
79606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->PointSpan.end = 0;
79706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->PointSpan.facing = 0;
79806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->PointSpan.array = swrast->SpanArrays;
79906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
800e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul   init_program_native_limits(&ctx->Const.VertexProgram);
801e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul   init_program_native_limits(&ctx->Const.GeometryProgram);
802e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul   init_program_native_limits(&ctx->Const.FragmentProgram);
803e26e9f77e761775592204edb53b6028eef0c1f11Brian Paul
80406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   ctx->swrast_context = swrast;
80506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
80647d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul   swrast->stencil_temp.buf1 = (GLubyte *) malloc(SWRAST_MAX_WIDTH * sizeof(GLubyte));
80747d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul   swrast->stencil_temp.buf2 = (GLubyte *) malloc(SWRAST_MAX_WIDTH * sizeof(GLubyte));
80847d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul   swrast->stencil_temp.buf3 = (GLubyte *) malloc(SWRAST_MAX_WIDTH * sizeof(GLubyte));
80947d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul   swrast->stencil_temp.buf4 = (GLubyte *) malloc(SWRAST_MAX_WIDTH * sizeof(GLubyte));
81032bf36106ea433038b524311fc10cc5b835862f1Brian Paul
81132bf36106ea433038b524311fc10cc5b835862f1Brian Paul   if (!swrast->stencil_temp.buf1 ||
81232bf36106ea433038b524311fc10cc5b835862f1Brian Paul       !swrast->stencil_temp.buf2 ||
81332bf36106ea433038b524311fc10cc5b835862f1Brian Paul       !swrast->stencil_temp.buf3 ||
81432bf36106ea433038b524311fc10cc5b835862f1Brian Paul       !swrast->stencil_temp.buf4) {
81532bf36106ea433038b524311fc10cc5b835862f1Brian Paul      _swrast_DestroyContext(ctx);
81632bf36106ea433038b524311fc10cc5b835862f1Brian Paul      return GL_FALSE;
81732bf36106ea433038b524311fc10cc5b835862f1Brian Paul   }
81832bf36106ea433038b524311fc10cc5b835862f1Brian Paul
81906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   return GL_TRUE;
82006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
82106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
82206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
823f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_DestroyContext( struct gl_context *ctx )
82406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
82506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
82606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
82706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG) {
82806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "_swrast_DestroyContext\n");
82906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
83006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
83106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   FREE( swrast->SpanArrays );
832ec2d0decbd739df99cac4baba57fe0005bf4894dBrian Paul   if (swrast->ZoomedArrays)
833ec2d0decbd739df99cac4baba57fe0005bf4894dBrian Paul      FREE( swrast->ZoomedArrays );
83406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   FREE( swrast->TexelBuffer );
83532bf36106ea433038b524311fc10cc5b835862f1Brian Paul
83632bf36106ea433038b524311fc10cc5b835862f1Brian Paul   free(swrast->stencil_temp.buf1);
83732bf36106ea433038b524311fc10cc5b835862f1Brian Paul   free(swrast->stencil_temp.buf2);
83832bf36106ea433038b524311fc10cc5b835862f1Brian Paul   free(swrast->stencil_temp.buf3);
83932bf36106ea433038b524311fc10cc5b835862f1Brian Paul   free(swrast->stencil_temp.buf4);
84032bf36106ea433038b524311fc10cc5b835862f1Brian Paul
84106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   FREE( swrast );
84206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
84306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   ctx->swrast_context = 0;
84406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
84506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
84606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
84706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulstruct swrast_device_driver *
848f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_GetDeviceDriverReference( struct gl_context *ctx )
84906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
85006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
85106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   return &swrast->Driver;
85206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
85306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
85406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
855f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_flush( struct gl_context *ctx )
85606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
85706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
85806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   /* flush any pending fragments from rendering points */
85906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (swrast->PointSpan.end > 0) {
8602b7911d37dc1518b9047b02acdc6f8476abad70fIan Romanick      _swrast_write_rgba_span(ctx, &(swrast->PointSpan));
86106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->PointSpan.end = 0;
86206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
86306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
86406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
86506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
866f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_render_primitive( struct gl_context *ctx, GLenum prim )
86706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
86806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
86906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (swrast->Primitive == GL_POINTS && prim != GL_POINTS) {
87006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _swrast_flush(ctx);
87106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
87206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->Primitive = prim;
87306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
87406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
87506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
87668da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul/** called via swrast->Driver.SpanRenderStart() */
87768da4b50e9b6aa72a9b155f650952620063e1b94Brian Paulvoid
87868da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul_swrast_span_render_start(struct gl_context *ctx)
87968da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul{
88068da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul   _swrast_map_textures(ctx);
88168da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul   _swrast_map_renderbuffers(ctx);
88268da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul}
88368da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul
88468da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul
88568da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul/** called via swrast->Driver.SpanRenderFinish() */
88668da4b50e9b6aa72a9b155f650952620063e1b94Brian Paulvoid
88768da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul_swrast_span_render_finish(struct gl_context *ctx)
88868da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul{
88968da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul   _swrast_unmap_textures(ctx);
89068da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul   _swrast_unmap_renderbuffers(ctx);
89168da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul}
89268da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul
89368da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul
89406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
895f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_render_start( struct gl_context *ctx )
89606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
89706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
89806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (swrast->Driver.SpanRenderStart)
89906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      swrast->Driver.SpanRenderStart( ctx );
90006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   swrast->PointSpan.end = 0;
90106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
90206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
90306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
904f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_render_finish( struct gl_context *ctx )
90506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
90606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
90706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
90806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   _swrast_flush(ctx);
909fc9f74839d50ab5480ae657524cf2ddebf55d451Brian Paul
910fc9f74839d50ab5480ae657524cf2ddebf55d451Brian Paul   if (swrast->Driver.SpanRenderFinish)
911fc9f74839d50ab5480ae657524cf2ddebf55d451Brian Paul      swrast->Driver.SpanRenderFinish( ctx );
91206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
91306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
91406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
91506049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#define SWRAST_DEBUG_VERTICES 0
91606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
91706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paulvoid
918f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_print_vertex( struct gl_context *ctx, const SWvertex *v )
91906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul{
92006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   GLuint i;
92106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
92206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   if (SWRAST_DEBUG_VERTICES) {
92306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "win %f %f %f %f\n",
9249e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian                  v->attrib[FRAG_ATTRIB_WPOS][0],
9259e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian                  v->attrib[FRAG_ATTRIB_WPOS][1],
9269e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian                  v->attrib[FRAG_ATTRIB_WPOS][2],
9279e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian                  v->attrib[FRAG_ATTRIB_WPOS][3]);
92806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
929ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul      for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++)
93006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	 if (ctx->Texture.Unit[i]._ReallyEnabled)
93106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul	    _mesa_debug(ctx, "texcoord[%d] %f %f %f %f\n", i,
932dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian                        v->attrib[FRAG_ATTRIB_TEX0 + i][0],
933dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian                        v->attrib[FRAG_ATTRIB_TEX0 + i][1],
934dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian                        v->attrib[FRAG_ATTRIB_TEX0 + i][2],
935dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian                        v->attrib[FRAG_ATTRIB_TEX0 + i][3]);
93606049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul
93706049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#if CHAN_TYPE == GL_FLOAT
93806049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "color %f %f %f %f\n",
93906049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                  v->color[0], v->color[1], v->color[2], v->color[3]);
94006049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#else
94106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "color %d %d %d %d\n",
94206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul                  v->color[0], v->color[1], v->color[2], v->color[3]);
94306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul#endif
9449e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      _mesa_debug(ctx, "spec %g %g %g %g\n",
9459e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian                  v->attrib[FRAG_ATTRIB_COL1][0],
9469e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian                  v->attrib[FRAG_ATTRIB_COL1][1],
9479e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian                  v->attrib[FRAG_ATTRIB_COL1][2],
9489e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian                  v->attrib[FRAG_ATTRIB_COL1][3]);
949afc132e7a9c2b2c870b61ef10311272b36ea9bf2Brian      _mesa_debug(ctx, "fog %f\n", v->attrib[FRAG_ATTRIB_FOGC][0]);
95086af037e6a1643284f87c5e01c3fcb09dd07bf35Eric Anholt      _mesa_debug(ctx, "index %f\n", v->attrib[FRAG_ATTRIB_CI][0]);
95106049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "pointsize %f\n", v->pointSize);
95206049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul      _mesa_debug(ctx, "\n");
95306049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul   }
95406049e24164fc0bda9dea12fbcbdb827a731badbBrian Paul}
955