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