ss_tritmp.h revision 0aef54ba627c748a43f601228c725f5ba79be002
17c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell/* 27c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * Mesa 3-D graphics library 3a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul * Version: 7.1 422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 5a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. 622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 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: 1322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 147c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * The above copyright notice and this permission notice shall be included 157c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell * in all copies or substantial portions of the Software. 1622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 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 287c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell 29a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul/** 30a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul * This is where we handle assigning vertex colors based on front/back 31a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul * facing, compute polygon offset and handle glPolygonMode(). 32a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul */ 3358e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwellstatic void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) 347c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell{ 35cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 36a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul SScontext *swsetup = SWSETUP_CONTEXT(ctx); 37cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell SWvertex *verts = SWSETUP_CONTEXT(ctx)->verts; 387c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell SWvertex *v[3]; 397c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell GLfloat z[3]; 40b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul GLfloat offset, oz0, oz1, oz2; 417c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell GLenum mode = GL_FILL; 4221709b354b45ad6aa4669d9ef028df9c902d3552Brian Paul GLuint facing = 0; 43326bc7150d31e052f018bb40f23cf9f60cb9c35dKeith Whitwell GLchan saved_color[3][4]; 440aef54ba627c748a43f601228c725f5ba79be002Vinson Lee GLfloat saved_col0[3][4] = { { 0 } }; 450aef54ba627c748a43f601228c725f5ba79be002Vinson Lee GLfloat saved_spec[3][4] = { { 0 } }; 460aef54ba627c748a43f601228c725f5ba79be002Vinson Lee GLfloat saved_index[3] = { 0 }; 477c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell 487c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell v[0] = &verts[e0]; 497c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell v[1] = &verts[e1]; 507c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell v[2] = &verts[e2]; 517c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell 527c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell if (IND & (SS_TWOSIDE_BIT | SS_OFFSET_BIT | SS_UNFILLED_BIT)) 537c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell { 549e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul GLfloat ex = v[0]->attrib[FRAG_ATTRIB_WPOS][0] - v[2]->attrib[FRAG_ATTRIB_WPOS][0]; 559e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul GLfloat ey = v[0]->attrib[FRAG_ATTRIB_WPOS][1] - v[2]->attrib[FRAG_ATTRIB_WPOS][1]; 569e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul GLfloat fx = v[1]->attrib[FRAG_ATTRIB_WPOS][0] - v[2]->attrib[FRAG_ATTRIB_WPOS][0]; 579e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul GLfloat fy = v[1]->attrib[FRAG_ATTRIB_WPOS][1] - v[2]->attrib[FRAG_ATTRIB_WPOS][1]; 587c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell GLfloat cc = ex*fy - ey*fx; 597c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell 607c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell if (IND & (SS_TWOSIDE_BIT | SS_UNFILLED_BIT)) 617c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell { 6258e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell facing = (cc < 0.0) ^ ctx->Polygon._FrontBit; 6322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 647c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell if (IND & SS_UNFILLED_BIT) 657c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell mode = facing ? ctx->Polygon.BackMode : ctx->Polygon.FrontMode; 6622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 6758e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell if (facing == 1) { 6858e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell if (IND & SS_TWOSIDE_BIT) { 69cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (IND & SS_RGBA_BIT) { 70565cd49b5fc7a5bd1e533542888bf322b83b8e56Xiang, Haihao if (VB->ColorPtr[1]) { 71565cd49b5fc7a5bd1e533542888bf322b83b8e56Xiang, Haihao GLfloat (*vbcolor)[4] = VB->ColorPtr[1]->data; 72565cd49b5fc7a5bd1e533542888bf322b83b8e56Xiang, Haihao 73a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul if (swsetup->intColors) { 74a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul COPY_CHAN4(saved_color[0], v[0]->color); 75a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul COPY_CHAN4(saved_color[1], v[1]->color); 76a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul COPY_CHAN4(saved_color[2], v[2]->color); 77a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul } 78a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul else { 79a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul COPY_4V(saved_col0[0], v[0]->attrib[FRAG_ATTRIB_COL0]); 80a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul COPY_4V(saved_col0[1], v[1]->attrib[FRAG_ATTRIB_COL0]); 81a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul COPY_4V(saved_col0[2], v[2]->attrib[FRAG_ATTRIB_COL0]); 82a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul } 83565cd49b5fc7a5bd1e533542888bf322b83b8e56Xiang, Haihao 84565cd49b5fc7a5bd1e533542888bf322b83b8e56Xiang, Haihao if (VB->ColorPtr[1]->stride) { 85a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul if (swsetup->intColors) { 86a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul SS_COLOR(v[0]->color, vbcolor[e0]); 87a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul SS_COLOR(v[1]->color, vbcolor[e1]); 88a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul SS_COLOR(v[2]->color, vbcolor[e2]); 89a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul } 90a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul else { 91a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul COPY_4V(v[0]->attrib[FRAG_ATTRIB_COL0], vbcolor[e0]); 92a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul COPY_4V(v[1]->attrib[FRAG_ATTRIB_COL0], vbcolor[e1]); 93a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul COPY_4V(v[2]->attrib[FRAG_ATTRIB_COL0], vbcolor[e2]); 94a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul } 95565cd49b5fc7a5bd1e533542888bf322b83b8e56Xiang, Haihao } 96565cd49b5fc7a5bd1e533542888bf322b83b8e56Xiang, Haihao else { 97a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul /* flat shade */ 98a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul if (swsetup->intColors) { 99a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul SS_COLOR(v[0]->color, vbcolor[0]); 100a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul SS_COLOR(v[1]->color, vbcolor[0]); 101a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul SS_COLOR(v[2]->color, vbcolor[0]); 102a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul } 103a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul else { 104a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul COPY_4V(v[0]->attrib[FRAG_ATTRIB_COL0], vbcolor[0]); 105a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul COPY_4V(v[1]->attrib[FRAG_ATTRIB_COL0], vbcolor[0]); 106a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul COPY_4V(v[2]->attrib[FRAG_ATTRIB_COL0], vbcolor[0]); 107a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul } 108565cd49b5fc7a5bd1e533542888bf322b83b8e56Xiang, Haihao } 109565cd49b5fc7a5bd1e533542888bf322b83b8e56Xiang, Haihao } 110326bc7150d31e052f018bb40f23cf9f60cb9c35dKeith Whitwell 1111182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell if (VB->SecondaryColorPtr[1]) { 112ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat (*vbspec)[4] = VB->SecondaryColorPtr[1]->data; 113326bc7150d31e052f018bb40f23cf9f60cb9c35dKeith Whitwell 1149e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul COPY_4V(saved_spec[0], v[0]->attrib[FRAG_ATTRIB_COL1]); 1159e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul COPY_4V(saved_spec[1], v[1]->attrib[FRAG_ATTRIB_COL1]); 1169e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul COPY_4V(saved_spec[2], v[2]->attrib[FRAG_ATTRIB_COL1]); 117326bc7150d31e052f018bb40f23cf9f60cb9c35dKeith Whitwell 118a5820159056fb9c3f5da6b3ae4570cd97b95835dKeith Whitwell if (VB->SecondaryColorPtr[1]->stride) { 1199e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul SS_SPEC(v[0]->attrib[FRAG_ATTRIB_COL1], vbspec[e0]); 1209e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul SS_SPEC(v[1]->attrib[FRAG_ATTRIB_COL1], vbspec[e1]); 1219e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul SS_SPEC(v[2]->attrib[FRAG_ATTRIB_COL1], vbspec[e2]); 122a5820159056fb9c3f5da6b3ae4570cd97b95835dKeith Whitwell } 123a5820159056fb9c3f5da6b3ae4570cd97b95835dKeith Whitwell else { 1249e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul SS_SPEC(v[0]->attrib[FRAG_ATTRIB_COL1], vbspec[0]); 1259e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul SS_SPEC(v[1]->attrib[FRAG_ATTRIB_COL1], vbspec[0]); 1269e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul SS_SPEC(v[2]->attrib[FRAG_ATTRIB_COL1], vbspec[0]); 127a5820159056fb9c3f5da6b3ae4570cd97b95835dKeith Whitwell } 1281182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell } 129cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } else { 130ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat *vbindex = (GLfloat *)VB->IndexPtr[1]->data; 1319e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul saved_index[0] = v[0]->attrib[FRAG_ATTRIB_CI][0]; 1329e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul saved_index[1] = v[1]->attrib[FRAG_ATTRIB_CI][0]; 1339e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul saved_index[2] = v[2]->attrib[FRAG_ATTRIB_CI][0]; 134326bc7150d31e052f018bb40f23cf9f60cb9c35dKeith Whitwell 1359e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul SS_IND(v[0]->attrib[FRAG_ATTRIB_CI][0], (GLuint) vbindex[e0]); 1369e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul SS_IND(v[1]->attrib[FRAG_ATTRIB_CI][0], (GLuint) vbindex[e1]); 1379e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul SS_IND(v[2]->attrib[FRAG_ATTRIB_CI][0], (GLuint) vbindex[e2]); 1381e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell } 1397c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell } 14022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes } 1417c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell } 1427c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell 143b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul if (IND & SS_OFFSET_BIT) { 144b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul const GLfloat max = ctx->DrawBuffer->_DepthMaxF; 145b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul /* save original Z values (restored later) */ 1469e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul z[0] = v[0]->attrib[FRAG_ATTRIB_WPOS][2]; 1479e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul z[1] = v[1]->attrib[FRAG_ATTRIB_WPOS][2]; 1489e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul z[2] = v[2]->attrib[FRAG_ATTRIB_WPOS][2]; 149b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul /* Note that Z values are already scaled to [0,65535] (for example) 150b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul * so no MRD value is used here. 151b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul */ 152b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul offset = ctx->Polygon.OffsetUnits; 1537c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell if (cc * cc > 1e-16) { 1547c6a04f6d8ef3c8a47a708a76bb4f4ac65c6b20fBrian Paul const GLfloat ez = z[0] - z[2]; 1557c6a04f6d8ef3c8a47a708a76bb4f4ac65c6b20fBrian Paul const GLfloat fz = z[1] - z[2]; 1567c6a04f6d8ef3c8a47a708a76bb4f4ac65c6b20fBrian Paul const GLfloat oneOverArea = 1.0F / cc; 1577c6a04f6d8ef3c8a47a708a76bb4f4ac65c6b20fBrian Paul const GLfloat dzdx = FABSF((ey * fz - ez * fy) * oneOverArea); 1587c6a04f6d8ef3c8a47a708a76bb4f4ac65c6b20fBrian Paul const GLfloat dzdy = FABSF((ez * fx - ex * fz) * oneOverArea); 1597c6a04f6d8ef3c8a47a708a76bb4f4ac65c6b20fBrian Paul offset += MAX2(dzdx, dzdy) * ctx->Polygon.OffsetFactor; 1607c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell } 161b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul /* new Z values */ 162b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul oz0 = CLAMP(v[0]->attrib[FRAG_ATTRIB_WPOS][2] + offset, 0.0, max); 163b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul oz1 = CLAMP(v[1]->attrib[FRAG_ATTRIB_WPOS][2] + offset, 0.0, max); 164b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul oz2 = CLAMP(v[2]->attrib[FRAG_ATTRIB_WPOS][2] + offset, 0.0, max); 1657c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell } 1667c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell } 1677c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell 1687c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell if (mode == GL_POINT) { 1697c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetPoint) { 170b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul v[0]->attrib[FRAG_ATTRIB_WPOS][2] = oz0; 171b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul v[1]->attrib[FRAG_ATTRIB_WPOS][2] = oz1; 172b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul v[2]->attrib[FRAG_ATTRIB_WPOS][2] = oz2; 1737c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell } 174355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol _swsetup_render_tri(ctx, e0, e1, e2, facing, _swsetup_edge_render_point_tri); 1757c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell } else if (mode == GL_LINE) { 1767c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetLine) { 177b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul v[0]->attrib[FRAG_ATTRIB_WPOS][2] = oz0; 178b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul v[1]->attrib[FRAG_ATTRIB_WPOS][2] = oz1; 179b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul v[2]->attrib[FRAG_ATTRIB_WPOS][2] = oz2; 1807c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell } 181355e9bb45c4f56f228c73e2886d907a75968209bMichal Krol _swsetup_render_tri(ctx, e0, e1, e2, facing, _swsetup_edge_render_line_tri); 1827c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell } else { 1837c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetFill) { 184b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul v[0]->attrib[FRAG_ATTRIB_WPOS][2] = oz0; 185b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul v[1]->attrib[FRAG_ATTRIB_WPOS][2] = oz1; 186b755a2d9de5b7977c410a904a8adb7c07c88f82aBrian Paul v[2]->attrib[FRAG_ATTRIB_WPOS][2] = oz2; 1877c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell } 18822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes _swrast_Triangle( ctx, v[0], v[1], v[2] ); 1897c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell } 1907c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell 191a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul /* 192a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul * Restore original vertex colors, etc. 193a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul */ 1947c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell if (IND & SS_OFFSET_BIT) { 1959e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul v[0]->attrib[FRAG_ATTRIB_WPOS][2] = z[0]; 1969e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul v[1]->attrib[FRAG_ATTRIB_WPOS][2] = z[1]; 1979e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul v[2]->attrib[FRAG_ATTRIB_WPOS][2] = z[2]; 1987c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell } 1997c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell 20022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes if (IND & SS_TWOSIDE_BIT) { 20158e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell if (facing == 1) { 20258e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell if (IND & SS_RGBA_BIT) { 203565cd49b5fc7a5bd1e533542888bf322b83b8e56Xiang, Haihao if (VB->ColorPtr[1]) { 204a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul if (swsetup->intColors) { 205a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul COPY_CHAN4(v[0]->color, saved_color[0]); 206a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul COPY_CHAN4(v[1]->color, saved_color[1]); 207a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul COPY_CHAN4(v[2]->color, saved_color[2]); 208a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul } 209a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul else { 210a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul COPY_4V(v[0]->attrib[FRAG_ATTRIB_COL0], saved_col0[0]); 211a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul COPY_4V(v[1]->attrib[FRAG_ATTRIB_COL0], saved_col0[1]); 212a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul COPY_4V(v[2]->attrib[FRAG_ATTRIB_COL0], saved_col0[2]); 213a7008322146f589ed5cb7a563365ff5e31844c62Brian Paul } 214565cd49b5fc7a5bd1e533542888bf322b83b8e56Xiang, Haihao } 215565cd49b5fc7a5bd1e533542888bf322b83b8e56Xiang, Haihao 216326bc7150d31e052f018bb40f23cf9f60cb9c35dKeith Whitwell if (VB->SecondaryColorPtr[1]) { 2179e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul COPY_4V(v[0]->attrib[FRAG_ATTRIB_COL1], saved_spec[0]); 2189e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul COPY_4V(v[1]->attrib[FRAG_ATTRIB_COL1], saved_spec[1]); 2199e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul COPY_4V(v[2]->attrib[FRAG_ATTRIB_COL1], saved_spec[2]); 2201182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell } 22158e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell } else { 2229e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul v[0]->attrib[FRAG_ATTRIB_CI][0] = saved_index[0]; 2239e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul v[1]->attrib[FRAG_ATTRIB_CI][0] = saved_index[1]; 2249e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian Paul v[2]->attrib[FRAG_ATTRIB_CI][0] = saved_index[2]; 2251e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell } 2261e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell } 22722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes } 2287c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell} 2297c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell 2307c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell 2317c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell 232709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell/* Need to fixup edgeflags when decomposing to triangles: 2337c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell */ 2346f3178a3bed43b49407f0bde92c2e6d85c40d190Sven M. Hallbergstatic void TAG(quadfunc)( GLcontext *ctx, GLuint v0, 23558e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell GLuint v1, GLuint v2, GLuint v3 ) 2367c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell{ 237cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (IND & SS_UNFILLED_BIT) { 238cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 239c9ce3e8fd2a8db93c833bfd9a06d31843145657bBrian Paul if (VB->EdgeFlag) { /* XXX this test shouldn't be needed (bug 12614) */ 240c9ce3e8fd2a8db93c833bfd9a06d31843145657bBrian Paul GLubyte ef1 = VB->EdgeFlag[v1]; 241c9ce3e8fd2a8db93c833bfd9a06d31843145657bBrian Paul GLubyte ef3 = VB->EdgeFlag[v3]; 242c9ce3e8fd2a8db93c833bfd9a06d31843145657bBrian Paul VB->EdgeFlag[v1] = 0; 243c9ce3e8fd2a8db93c833bfd9a06d31843145657bBrian Paul TAG(triangle)( ctx, v0, v1, v3 ); 244c9ce3e8fd2a8db93c833bfd9a06d31843145657bBrian Paul VB->EdgeFlag[v1] = ef1; 245c9ce3e8fd2a8db93c833bfd9a06d31843145657bBrian Paul VB->EdgeFlag[v3] = 0; 246c9ce3e8fd2a8db93c833bfd9a06d31843145657bBrian Paul TAG(triangle)( ctx, v1, v2, v3 ); 247c9ce3e8fd2a8db93c833bfd9a06d31843145657bBrian Paul VB->EdgeFlag[v3] = ef3; 248c9ce3e8fd2a8db93c833bfd9a06d31843145657bBrian Paul } 249cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } else { 25058e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell TAG(triangle)( ctx, v0, v1, v3 ); 25158e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell TAG(triangle)( ctx, v1, v2, v3 ); 252cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 2537c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell} 2547c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell 2557c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell 2567c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell 2577c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell 2587c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwellstatic void TAG(init)( void ) 2597c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell{ 2607c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell tri_tab[IND] = TAG(triangle); 2616f3178a3bed43b49407f0bde92c2e6d85c40d190Sven M. Hallberg quad_tab[IND] = TAG(quadfunc); 2627c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell} 2637c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell 2647c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell 2657c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell#undef IND 2667c20642b1091df1aab7d9076a3fe2fb11c6f011cKeith Whitwell#undef TAG 267