17c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell/*
27c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * Mesa 3-D graphics library
3fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian * Version:  7.1
45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
5fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
77c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
87c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * copy of this software and associated documentation files (the "Software"),
97c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * to deal in the Software without restriction, including without limitation
107c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense,
117c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * and/or sell copies of the Software, and to permit persons to whom the
127c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * Software is furnished to do so, subject to the following conditions:
135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
147c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * The above copyright notice and this permission notice shall be included
157c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * in all copies or substantial portions of the Software.
165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
177c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
187c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
197c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
207c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
217c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
227c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
237c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell *
247c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * Authors:
2505a4b37707d2c598ea68c05d07a3d65bcbf5a076Brian Paul *    Keith Whitwell <keith@tungstengraphics.com>
267c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell */
277c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell
28bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/glheader.h"
29bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/colormac.h"
30bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/macros.h"
31bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/mtypes.h"
327c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell
3323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#include "tnl/t_context.h"
3423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
357c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell#include "ss_triangle.h"
367c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell#include "ss_context.h"
377c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell
38e650c07f47ac6f49a4dfcb58290fd049092fb768Ian Romanick#define SS_OFFSET_BIT	    0x1
39e650c07f47ac6f49a4dfcb58290fd049092fb768Ian Romanick#define SS_TWOSIDE_BIT	    0x2
40e650c07f47ac6f49a4dfcb58290fd049092fb768Ian Romanick#define SS_UNFILLED_BIT	    0x4
41e650c07f47ac6f49a4dfcb58290fd049092fb768Ian Romanick#define SS_MAX_TRIFUNC      0x8
427c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell
433d38361b718d490e1e7fda64519952ec887cd149Keith Whitwellstatic tnl_triangle_func tri_tab[SS_MAX_TRIFUNC];
443d38361b718d490e1e7fda64519952ec887cd149Keith Whitwellstatic tnl_quad_func     quad_tab[SS_MAX_TRIFUNC];
457c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell
467c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell
47355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol/*
48355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol * Render a triangle respecting edge flags.
49355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol */
50f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergtypedef void (* swsetup_edge_render_prim_tri)(struct gl_context *ctx,
51355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                                              const GLubyte *ef,
52355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                                              GLuint e0,
53355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                                              GLuint e1,
54355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                                              GLuint e2,
55355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                                              const SWvertex *v0,
56355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                                              const SWvertex *v1,
57355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                                              const SWvertex *v2);
58355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol
59355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol/*
60355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol * Render a triangle using lines and respecting edge flags.
61355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol */
62355e9bb45c4f56f228c73e2886d907a75968209bMichal Krolstatic void
63f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swsetup_edge_render_line_tri(struct gl_context *ctx,
64355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                              const GLubyte *ef,
65355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                              GLuint e0,
66355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                              GLuint e1,
67355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                              GLuint e2,
68355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                              const SWvertex *v0,
69355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                              const SWvertex *v1,
70355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                              const SWvertex *v2)
71d43a5943d8952367d9292653800b47a85f905343Keith Whitwell{
7222144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   SScontext *swsetup = SWSETUP_CONTEXT(ctx);
73d43a5943d8952367d9292653800b47a85f905343Keith Whitwell
74d43a5943d8952367d9292653800b47a85f905343Keith Whitwell   if (swsetup->render_prim == GL_POLYGON) {
7522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      if (ef[e2]) _swrast_Line( ctx, v2, v0 );
7622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      if (ef[e0]) _swrast_Line( ctx, v0, v1 );
7722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      if (ef[e1]) _swrast_Line( ctx, v1, v2 );
78d43a5943d8952367d9292653800b47a85f905343Keith Whitwell   } else {
7922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      if (ef[e0]) _swrast_Line( ctx, v0, v1 );
8022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      if (ef[e1]) _swrast_Line( ctx, v1, v2 );
8122144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      if (ef[e2]) _swrast_Line( ctx, v2, v0 );
82d43a5943d8952367d9292653800b47a85f905343Keith Whitwell   }
83355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol}
84d43a5943d8952367d9292653800b47a85f905343Keith Whitwell
85355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol/*
86355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol * Render a triangle using points and respecting edge flags.
87355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol */
88355e9bb45c4f56f228c73e2886d907a75968209bMichal Krolstatic void
89f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swsetup_edge_render_point_tri(struct gl_context *ctx,
90355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                               const GLubyte *ef,
91355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                               GLuint e0,
92355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                               GLuint e1,
93355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                               GLuint e2,
94355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                               const SWvertex *v0,
95355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                               const SWvertex *v1,
96355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                               const SWvertex *v2)
97355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol{
98355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol   if (ef[e0]) _swrast_Point( ctx, v0 );
99355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol   if (ef[e1]) _swrast_Point( ctx, v1 );
100355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol   if (ef[e2]) _swrast_Point( ctx, v2 );
101355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol
102355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol   _swrast_flush(ctx);
103d43a5943d8952367d9292653800b47a85f905343Keith Whitwell}
104d43a5943d8952367d9292653800b47a85f905343Keith Whitwell
105355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol/*
106355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol * Render a triangle respecting cull and shade model.
107355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol */
108f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void _swsetup_render_tri(struct gl_context *ctx,
109355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                                GLuint e0,
110355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                                GLuint e1,
111355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                                GLuint e2,
112355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                                GLuint facing,
113355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol                                swsetup_edge_render_prim_tri render)
114d43a5943d8952367d9292653800b47a85f905343Keith Whitwell{
11522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   SScontext *swsetup = SWSETUP_CONTEXT(ctx);
116d43a5943d8952367d9292653800b47a85f905343Keith Whitwell   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
117d43a5943d8952367d9292653800b47a85f905343Keith Whitwell   GLubyte *ef = VB->EdgeFlag;
118d43a5943d8952367d9292653800b47a85f905343Keith Whitwell   SWvertex *verts = swsetup->verts;
119d43a5943d8952367d9292653800b47a85f905343Keith Whitwell   SWvertex *v0 = &verts[e0];
120d43a5943d8952367d9292653800b47a85f905343Keith Whitwell   SWvertex *v1 = &verts[e1];
121d43a5943d8952367d9292653800b47a85f905343Keith Whitwell   SWvertex *v2 = &verts[e2];
122d43a5943d8952367d9292653800b47a85f905343Keith Whitwell
12346b3f976542190dd3c217a46653159f77552764aBrian Paul   /* cull testing */
12446b3f976542190dd3c217a46653159f77552764aBrian Paul   if (ctx->Polygon.CullFlag) {
12546b3f976542190dd3c217a46653159f77552764aBrian Paul      if (facing == 1 && ctx->Polygon.CullFaceMode != GL_FRONT)
12646b3f976542190dd3c217a46653159f77552764aBrian Paul         return;
12746b3f976542190dd3c217a46653159f77552764aBrian Paul      if (facing == 0 && ctx->Polygon.CullFaceMode != GL_BACK)
12846b3f976542190dd3c217a46653159f77552764aBrian Paul         return;
12946b3f976542190dd3c217a46653159f77552764aBrian Paul   }
13046b3f976542190dd3c217a46653159f77552764aBrian Paul
131fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian   _swrast_SetFacing(ctx, facing);
132fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian
13329b4076f9acff96a867760fc885f5eaeb7586977Brian Paul   if (ctx->Light.ShadeModel == GL_FLAT) {
134355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol      GLchan c[2][4];
135355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol      GLfloat s[2][4];
136355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol
13729b4076f9acff96a867760fc885f5eaeb7586977Brian Paul      /* save colors/indexes for v0, v1 vertices */
138d43a5943d8952367d9292653800b47a85f905343Keith Whitwell      COPY_CHAN4(c[0], v0->color);
139d43a5943d8952367d9292653800b47a85f905343Keith Whitwell      COPY_CHAN4(c[1], v1->color);
1409e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      COPY_4V(s[0], v0->attrib[FRAG_ATTRIB_COL1]);
1419e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      COPY_4V(s[1], v1->attrib[FRAG_ATTRIB_COL1]);
142d43a5943d8952367d9292653800b47a85f905343Keith Whitwell
14329b4076f9acff96a867760fc885f5eaeb7586977Brian Paul      /* copy v2 color/indexes to v0, v1 indexes */
144d43a5943d8952367d9292653800b47a85f905343Keith Whitwell      COPY_CHAN4(v0->color, v2->color);
145d43a5943d8952367d9292653800b47a85f905343Keith Whitwell      COPY_CHAN4(v1->color, v2->color);
1469e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      COPY_4V(v0->attrib[FRAG_ATTRIB_COL1], v2->attrib[FRAG_ATTRIB_COL1]);
1479e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      COPY_4V(v1->attrib[FRAG_ATTRIB_COL1], v2->attrib[FRAG_ATTRIB_COL1]);
148d43a5943d8952367d9292653800b47a85f905343Keith Whitwell
149355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol      render(ctx, ef, e0, e1, e2, v0, v1, v2);
150d43a5943d8952367d9292653800b47a85f905343Keith Whitwell
151d43a5943d8952367d9292653800b47a85f905343Keith Whitwell      COPY_CHAN4(v0->color, c[0]);
152d43a5943d8952367d9292653800b47a85f905343Keith Whitwell      COPY_CHAN4(v1->color, c[1]);
1539e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      COPY_4V(v0->attrib[FRAG_ATTRIB_COL1], s[0]);
1549e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      COPY_4V(v1->attrib[FRAG_ATTRIB_COL1], s[1]);
155d43a5943d8952367d9292653800b47a85f905343Keith Whitwell   }
156355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol   else {
157355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol      render(ctx, ef, e0, e1, e2, v0, v1, v2);
158355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol   }
159d43a5943d8952367d9292653800b47a85f905343Keith Whitwell}
160d43a5943d8952367d9292653800b47a85f905343Keith Whitwell
161ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define SS_COLOR(a,b) UNCLAMPED_FLOAT_TO_RGBA_CHAN(a,b)
16264e32ffb6e7d324dcb46a18975db0c58719c51e7Tim Evans#define SS_SPEC(a,b) COPY_4V(a,b)
1637c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell#define SS_IND(a,b) (a = b)
1647c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell
1657c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell#define IND (0)
166cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define TAG(x) x##_rgba
1671e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell#include "ss_tritmp.h"
1681e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell
169e650c07f47ac6f49a4dfcb58290fd049092fb768Ian Romanick#define IND (SS_OFFSET_BIT)
170cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define TAG(x) x##_offset_rgba
1711e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell#include "ss_tritmp.h"
1721e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell
173e650c07f47ac6f49a4dfcb58290fd049092fb768Ian Romanick#define IND (SS_TWOSIDE_BIT)
174cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define TAG(x) x##_twoside_rgba
1751e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell#include "ss_tritmp.h"
1761e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell
177e650c07f47ac6f49a4dfcb58290fd049092fb768Ian Romanick#define IND (SS_OFFSET_BIT|SS_TWOSIDE_BIT)
178cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define TAG(x) x##_offset_twoside_rgba
1791e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell#include "ss_tritmp.h"
1801e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell
181e650c07f47ac6f49a4dfcb58290fd049092fb768Ian Romanick#define IND (SS_UNFILLED_BIT)
182cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define TAG(x) x##_unfilled_rgba
1831e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell#include "ss_tritmp.h"
1841e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell
185e650c07f47ac6f49a4dfcb58290fd049092fb768Ian Romanick#define IND (SS_OFFSET_BIT|SS_UNFILLED_BIT)
186cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define TAG(x) x##_offset_unfilled_rgba
1871e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell#include "ss_tritmp.h"
1881e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell
189e650c07f47ac6f49a4dfcb58290fd049092fb768Ian Romanick#define IND (SS_TWOSIDE_BIT|SS_UNFILLED_BIT)
190cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define TAG(x) x##_twoside_unfilled_rgba
1911e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell#include "ss_tritmp.h"
1921e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell
193e650c07f47ac6f49a4dfcb58290fd049092fb768Ian Romanick#define IND (SS_OFFSET_BIT|SS_TWOSIDE_BIT|SS_UNFILLED_BIT)
194cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define TAG(x) x##_offset_twoside_unfilled_rgba
1951e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell#include "ss_tritmp.h"
1961e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell
1977c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell
198f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid _swsetup_trifuncs_init( struct gl_context *ctx )
1997c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell{
2007c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell   (void) ctx;
2017c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell
202cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   init_rgba();
203cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   init_offset_rgba();
204cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   init_twoside_rgba();
205cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   init_offset_twoside_rgba();
206cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   init_unfilled_rgba();
207cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   init_offset_unfilled_rgba();
208cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   init_twoside_unfilled_rgba();
209cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   init_offset_twoside_unfilled_rgba();
2107c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell}
2117c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell
2127c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell
213f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void swsetup_points( struct gl_context *ctx, GLuint first, GLuint last )
214cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
215cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
216cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   SWvertex *verts = SWSETUP_CONTEXT(ctx)->verts;
217b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul   GLuint i;
21822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes
219cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (VB->Elts) {
22022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      for (i = first; i < last; i++)
221b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul	 if (VB->ClipMask[VB->Elts[i]] == 0)
222cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    _swrast_Point( ctx, &verts[VB->Elts[i]] );
223b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul   }
224b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul   else {
22522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      for (i = first; i < last; i++)
226b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul	 if (VB->ClipMask[i] == 0)
227cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    _swrast_Point( ctx, &verts[i] );
228cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
229cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}
230cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
231f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void swsetup_line( struct gl_context *ctx, GLuint v0, GLuint v1 )
23258e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell{
23358e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell   SWvertex *verts = SWSETUP_CONTEXT(ctx)->verts;
23458e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell   _swrast_Line( ctx, &verts[v0], &verts[v1] );
23558e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell}
23658e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell
23758e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell
23858e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell
239f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid _swsetup_choose_trifuncs( struct gl_context *ctx )
2407c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell{
2411182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell   TNLcontext *tnl = TNL_CONTEXT(ctx);
2427c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell   GLuint ind = 0;
2437c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell
244641b2307ec77e70a5b1db75934438d2fbb75613cBrian Paul   if (ctx->Polygon.OffsetPoint ||
245641b2307ec77e70a5b1db75934438d2fbb75613cBrian Paul       ctx->Polygon.OffsetLine ||
246641b2307ec77e70a5b1db75934438d2fbb75613cBrian Paul       ctx->Polygon.OffsetFill)
2477c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell      ind |= SS_OFFSET_BIT;
2487c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell
249609f35274c9dcf8607673ec1970efff583c97ed7Brian Paul   if ((ctx->Light.Enabled && ctx->Light.Model.TwoSide) ||
250256115bd5e6bb59f3019b52120ca804b7a5c00c0Brian       (ctx->VertexProgram._Current && ctx->VertexProgram.TwoSideEnabled))
2517c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell      ind |= SS_TWOSIDE_BIT;
2525e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
253be99e845bd7979fe46d38d9b294c1ba0a0aa95b8Brian Paul   /* We piggyback the two-sided stencil front/back determination on the
254be99e845bd7979fe46d38d9b294c1ba0a0aa95b8Brian Paul    * unfilled triangle path.
255be99e845bd7979fe46d38d9b294c1ba0a0aa95b8Brian Paul    */
25629b4076f9acff96a867760fc885f5eaeb7586977Brian Paul   if (ctx->Polygon.FrontMode != GL_FILL ||
25729b4076f9acff96a867760fc885f5eaeb7586977Brian Paul       ctx->Polygon.BackMode != GL_FILL ||
25842c34efd23d7ad05df9f3c71f7d52dd259e179d8Brian Paul       (ctx->Stencil.Enabled && ctx->Stencil._TestTwoSide))
2597c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell      ind |= SS_UNFILLED_BIT;
2607c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell
2611182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell   tnl->Driver.Render.Triangle = tri_tab[ind];
2621182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell   tnl->Driver.Render.Quad = quad_tab[ind];
2631182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell   tnl->Driver.Render.Line = swsetup_line;
2641182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell   tnl->Driver.Render.Points = swsetup_points;
2657c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell}
266