ss_triangle.c revision 1182ffeec39bf419928ba862c225e80a439fee7a
1fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse/* $Id: ss_triangle.c,v 1.14 2001/07/12 22:09:21 keithw Exp $ */
2fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse
3fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse/*
4fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * Mesa 3-D graphics library
5fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * Version:  3.5
6fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse *
7fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
8fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse *
9fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a
10fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * copy of this software and associated documentation files (the "Software"),
11fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * to deal in the Software without restriction, including without limitation
12fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * and/or sell copies of the Software, and to permit persons to whom the
14fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * Software is furnished to do so, subject to the following conditions:
15fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse *
16fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * The above copyright notice and this permission notice shall be included
17fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * in all copies or substantial portions of the Software.
18fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse *
19fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24555c8d500a4a09445a892316610a428d408318edMarek Olšák * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák *
26fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * Authors:
27330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák *    Keith Whitwell <keithw@valinux.com>
288fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch */
298fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch
308fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "glheader.h"
31d1cc87c0b64c2221b079015a6c3b593af83f0758Dave Airlie#include "colormac.h"
323fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#include "macros.h"
333fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#include "mtypes.h"
343fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
353fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#include "tnl/t_context.h"
363fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
373fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#include "ss_triangle.h"
383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#include "ss_context.h"
393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#define SS_RGBA_BIT         0x1
413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#define SS_OFFSET_BIT	    0x2
423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#define SS_TWOSIDE_BIT	    0x4
433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#define SS_UNFILLED_BIT	    0x8
443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#define SS_MAX_TRIFUNC      0x10
453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic triangle_func tri_tab[SS_MAX_TRIFUNC];
473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic quad_func     quad_tab[SS_MAX_TRIFUNC];
483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic void _swsetup_render_line_tri( GLcontext *ctx,
513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet				      GLuint e0, GLuint e1, GLuint e2 )
523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{
533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   SScontext *swsetup = SWSETUP_CONTEXT(ctx);
543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   GLubyte *ef = VB->EdgeFlag;
563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   SWvertex *verts = swsetup->verts;
573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   SWvertex *v0 = &verts[e0];
583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   SWvertex *v1 = &verts[e1];
593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   SWvertex *v2 = &verts[e2];
603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   GLchan c[2][4];
613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   GLchan s[2][4];
623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   GLuint i[2];
633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   if (ctx->_TriangleCaps & DD_FLATSHADE) {
653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      COPY_CHAN4(c[0], v0->color);
663fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      COPY_CHAN4(c[1], v1->color);
673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      COPY_CHAN4(s[0], v0->specular);
683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      COPY_CHAN4(s[1], v1->specular);
693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      i[0] = v0->index;
703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      i[1] = v1->index;
713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
723fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      COPY_CHAN4(v0->color, v2->color);
733fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      COPY_CHAN4(v1->color, v2->color);
743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      COPY_CHAN4(v0->specular, v2->specular);
753fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      COPY_CHAN4(v1->specular, v2->specular);
763fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      v0->index = v2->index;
773fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      v1->index = v2->index;
783fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   }
793fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
803fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   if (swsetup->render_prim == GL_POLYGON) {
813fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      if (ef[e2]) _swrast_Line( ctx, v2, v0 );
823fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      if (ef[e0]) _swrast_Line( ctx, v0, v1 );
833fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      if (ef[e1]) _swrast_Line( ctx, v1, v2 );
843fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   } else {
853fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      if (ef[e0]) _swrast_Line( ctx, v0, v1 );
863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      if (ef[e1]) _swrast_Line( ctx, v1, v2 );
873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      if (ef[e2]) _swrast_Line( ctx, v2, v0 );
883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   }
893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   if (ctx->_TriangleCaps & DD_FLATSHADE) {
913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      COPY_CHAN4(v0->color, c[0]);
923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      COPY_CHAN4(v1->color, c[1]);
933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      COPY_CHAN4(v0->specular, s[0]);
943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      COPY_CHAN4(v1->specular, s[1]);
953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      v0->index = i[0];
963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      v1->index = i[1];
973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   }
983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet}
993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic void _swsetup_render_point_tri( GLcontext *ctx,
1013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet				       GLuint e0, GLuint e1, GLuint e2 )
1023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{
1038698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák   SScontext *swsetup = SWSETUP_CONTEXT(ctx);
1043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
1053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   GLubyte *ef = VB->EdgeFlag;
1063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   SWvertex *verts = swsetup->verts;
1073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   SWvertex *v0 = &verts[e0];
1083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   SWvertex *v1 = &verts[e1];
1093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   SWvertex *v2 = &verts[e2];
1103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   GLchan c[2][4];
1113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   GLchan s[2][4];
1123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   GLuint i[2];
1138698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák
1148698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák   if (ctx->_TriangleCaps & DD_FLATSHADE) {
1153fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      COPY_CHAN4(c[0], v0->color);
1168698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák      COPY_CHAN4(c[1], v1->color);
1178698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák      COPY_CHAN4(s[0], v0->specular);
1183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      COPY_CHAN4(s[1], v1->specular);
1193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      i[0] = v0->index;
1203fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      i[1] = v1->index;
121eb44c36df842af010269eda1be77c4aea8ebe736Dave Airlie
1223fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      COPY_CHAN4(v0->color, v2->color);
1233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      COPY_CHAN4(v1->color, v2->color);
1243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      COPY_CHAN4(v0->specular, v2->specular);
1253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      COPY_CHAN4(v1->specular, v2->specular);
1263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      v0->index = v2->index;
1273fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      v1->index = v2->index;
1283fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   }
1293fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1303fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   if (ef[e0]) _swrast_Point( ctx, v0 );
1313fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   if (ef[e1]) _swrast_Point( ctx, v1 );
1323fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   if (ef[e2]) _swrast_Point( ctx, v2 );
133866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie
1343fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   if (ctx->_TriangleCaps & DD_FLATSHADE) {
13589954723bfeef59d055d2332ff112f0204b48130Marek Olšák      COPY_CHAN4(v0->color, c[0]);
13689954723bfeef59d055d2332ff112f0204b48130Marek Olšák      COPY_CHAN4(v1->color, c[1]);
137866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie      COPY_CHAN4(v0->specular, s[0]);
13889954723bfeef59d055d2332ff112f0204b48130Marek Olšák      COPY_CHAN4(v1->specular, s[1]);
1393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      v0->index = i[0];
1403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet      v1->index = i[1];
1413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet   }
1423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet}
1433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#define SS_COLOR(a,b) UNCLAMPED_FLOAT_TO_RGBA_CHAN(a,b)
1453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#define SS_SPEC(a,b) UNCLAMPED_FLOAT_TO_RGB_CHAN(a,b)
1463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#define SS_IND(a,b) (a = b)
1473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#define IND (0)
149ac35ded4733883037316d556af596524e5e02535Marek Olšák#define TAG(x) x
1503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#include "ss_tritmp.h"
151ac35ded4733883037316d556af596524e5e02535Marek Olšák
1523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#define IND (SS_OFFSET_BIT)
1533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#define TAG(x) x##_offset
1543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#include "ss_tritmp.h"
1553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#define IND (SS_TWOSIDE_BIT)
1573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#define TAG(x) x##_twoside
1583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#include "ss_tritmp.h"
159fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse
16018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet#define IND (SS_OFFSET_BIT|SS_TWOSIDE_BIT)
16118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet#define TAG(x) x##_offset_twoside
16218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet#include "ss_tritmp.h"
16318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
16418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet#define IND (SS_UNFILLED_BIT)
16518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet#define TAG(x) x##_unfilled
1668698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák#include "ss_tritmp.h"
16718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
16818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet#define IND (SS_OFFSET_BIT|SS_UNFILLED_BIT)
16918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet#define TAG(x) x##_offset_unfilled
17018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet#include "ss_tritmp.h"
17118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
17218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet#define IND (SS_TWOSIDE_BIT|SS_UNFILLED_BIT)
17318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet#define TAG(x) x##_twoside_unfilled
17418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet#include "ss_tritmp.h"
17518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
17618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet#define IND (SS_OFFSET_BIT|SS_TWOSIDE_BIT|SS_UNFILLED_BIT)
1778698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák#define TAG(x) x##_offset_twoside_unfilled
17896ed6c90eff58ce030c39c2b4db6daf512586b34Marek Olšák#include "ss_tritmp.h"
1798698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák
180c2e9dd0276464ed61d48d3d80b9be8228767dfe2Marek Olšák#define IND (0|SS_RGBA_BIT)
181c2e9dd0276464ed61d48d3d80b9be8228767dfe2Marek Olšák#define TAG(x) x##_rgba
182d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák#include "ss_tritmp.h"
183c2e9dd0276464ed61d48d3d80b9be8228767dfe2Marek Olšák
1848698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák#define IND (SS_OFFSET_BIT|SS_RGBA_BIT)
1858698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák#define TAG(x) x##_offset_rgba
186df5e2c058f73b72909fa99a2a189f5877525e3bfMarek Olšák#include "ss_tritmp.h"
187fc887d687b0598e09de76be885652d96e20ae07eMarek Olšák
188fc887d687b0598e09de76be885652d96e20ae07eMarek Olšák#define IND (SS_TWOSIDE_BIT|SS_RGBA_BIT)
189df5e2c058f73b72909fa99a2a189f5877525e3bfMarek Olšák#define TAG(x) x##_twoside_rgba
190df5e2c058f73b72909fa99a2a189f5877525e3bfMarek Olšák#include "ss_tritmp.h"
1918698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák
1928698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák#define IND (SS_OFFSET_BIT|SS_TWOSIDE_BIT|SS_RGBA_BIT)
1938698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák#define TAG(x) x##_offset_twoside_rgba
1948698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák#include "ss_tritmp.h"
1958698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák
1968698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák#define IND (SS_UNFILLED_BIT|SS_RGBA_BIT)
1978698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák#define TAG(x) x##_unfilled_rgba
1988698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák#include "ss_tritmp.h"
1998698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák
20018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet#define IND (SS_OFFSET_BIT|SS_UNFILLED_BIT|SS_RGBA_BIT)
2016a250877eaea932e2bddd35ba694e4dc38cc57ccMarek Olšák#define TAG(x) x##_offset_unfilled_rgba
2026a250877eaea932e2bddd35ba694e4dc38cc57ccMarek Olšák#include "ss_tritmp.h"
2036a250877eaea932e2bddd35ba694e4dc38cc57ccMarek Olšák
2046a250877eaea932e2bddd35ba694e4dc38cc57ccMarek Olšák#define IND (SS_TWOSIDE_BIT|SS_UNFILLED_BIT|SS_RGBA_BIT)
2056a250877eaea932e2bddd35ba694e4dc38cc57ccMarek Olšák#define TAG(x) x##_twoside_unfilled_rgba
2066a250877eaea932e2bddd35ba694e4dc38cc57ccMarek Olšák#include "ss_tritmp.h"
2076a250877eaea932e2bddd35ba694e4dc38cc57ccMarek Olšák
2086a250877eaea932e2bddd35ba694e4dc38cc57ccMarek Olšák#define IND (SS_OFFSET_BIT|SS_TWOSIDE_BIT|SS_UNFILLED_BIT|SS_RGBA_BIT)
20918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet#define TAG(x) x##_offset_twoside_unfilled_rgba
21018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet#include "ss_tritmp.h"
21118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
21218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
21318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeetvoid _swsetup_trifuncs_init( GLcontext *ctx )
214770719eb821f96688c7efa12dc42805590f984efMarek Olšák{
215770719eb821f96688c7efa12dc42805590f984efMarek Olšák   (void) ctx;
216ac35ded4733883037316d556af596524e5e02535Marek Olšák
21718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet   init();
21818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet   init_offset();
21918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet   init_twoside();
22018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet   init_offset_twoside();
22118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet   init_unfilled();
222770719eb821f96688c7efa12dc42805590f984efMarek Olšák   init_offset_unfilled();
223770719eb821f96688c7efa12dc42805590f984efMarek Olšák   init_twoside_unfilled();
224770719eb821f96688c7efa12dc42805590f984efMarek Olšák   init_offset_twoside_unfilled();
22518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
22618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet   init_rgba();
22718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet   init_offset_rgba();
22818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet   init_twoside_rgba();
22918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet   init_offset_twoside_rgba();
23018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet   init_unfilled_rgba();
23118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet   init_offset_unfilled_rgba();
23218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet   init_twoside_unfilled_rgba();
23318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet   init_offset_twoside_unfilled_rgba();
23418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet}
23518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
23618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
23718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeetstatic void swsetup_points( GLcontext *ctx, GLuint first, GLuint last )
23818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet{
23918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
24018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet   SWvertex *verts = SWSETUP_CONTEXT(ctx)->verts;
24118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet   GLuint i;
24218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
24318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet   if (VB->Elts) {
24418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet      for (i = first; i < last; i++)
245ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák	 if (VB->ClipMask[VB->Elts[i]] == 0)
2460b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse	    _swrast_Point( ctx, &verts[VB->Elts[i]] );
247d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák   }
248ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák   else {
249ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák      for (i = first; i < last; i++)
250ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák	 if (VB->ClipMask[i] == 0)
251ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák	    _swrast_Point( ctx, &verts[i] );
252ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák   }
253ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák}
254ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák
255ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšákstatic void swsetup_line( GLcontext *ctx, GLuint v0, GLuint v1 )
256ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák{
257ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák   SWvertex *verts = SWSETUP_CONTEXT(ctx)->verts;
258ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák   _swrast_Line( ctx, &verts[v0], &verts[v1] );
259ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák}
260ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák
2610b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse
262ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák
263ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšákvoid _swsetup_choose_trifuncs( GLcontext *ctx )
264d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák{
265d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák   TNLcontext *tnl = TNL_CONTEXT(ctx);
266d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák   GLuint ind = 0;
267d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák
2680b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse   if (ctx->Polygon._OffsetAny)
2690b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse      ind |= SS_OFFSET_BIT;
270faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák
271faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák   if (ctx->Light.Enabled && ctx->Light.Model.TwoSide)
272faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák      ind |= SS_TWOSIDE_BIT;
273faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák
274faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák   if (ctx->_TriangleCaps & DD_TRI_UNFILLED)
275faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák      ind |= SS_UNFILLED_BIT;
276faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák
277faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák   if (ctx->Visual.rgbMode)
278faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák      ind |= SS_RGBA_BIT;
279faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák
280faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák   tnl->Driver.Render.Triangle = tri_tab[ind];
281faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák   tnl->Driver.Render.Quad = quad_tab[ind];
282faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák   tnl->Driver.Render.Line = swsetup_line;
283faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák   tnl->Driver.Render.Points = swsetup_points;
284faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák}
285faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák