193d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell/* 293d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * Mesa 3-D graphics library 393d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * Version: 7.1 493d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * 593d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. 693d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * 793d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 893d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * copy of this software and associated documentation files (the "Software"), 993d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * to deal in the Software without restriction, including without limitation 1093d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1193d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * and/or sell copies of the Software, and to permit persons to whom the 1293d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * Software is furnished to do so, subject to the following conditions: 1393d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * 1493d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * The above copyright notice and this permission notice shall be included 1593d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * in all copies or substantial portions of the Software. 1693d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * 1793d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1893d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1993d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2093d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2193d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 2293d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2393d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * 2493d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * Authors: 2593d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * Keith Whitwell <keith@tungstengraphics.com> 2693d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell */ 2793d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell 2893d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell 2993d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell/** 3093d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * This is where we handle assigning vertex colors based on front/back 3193d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell * facing, compute polygon offset and handle glPolygonMode(). 3293d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell */ 3393d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwellstatic void TAG(triangle)(struct gl_context *ctx, GLuint e0, GLuint e1, GLuint e2 ) 34d42b7d5f8d5eef73c89c2362beab94647ce12281Vinson Lee{ 356acd63a4980951727939c0dd545a0324965b3834José Fonseca struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 3693d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell SScontext *swsetup = SWSETUP_CONTEXT(ctx); 3793d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell SWvertex *verts = SWSETUP_CONTEXT(ctx)->verts; 38cae640eae63544211710a2848e23f6d1d74f827fBrian SWvertex *v[3]; 392b2f761e2b0dc160793be2f48e811d2d455e1e22Brian GLfloat z[3]; 4080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell GLfloat offset, oz0, oz1, oz2; 410a14e9f09fc1cf9d5c277bb239f349203d3bed79Brian Paul GLenum mode = GL_FILL; 4293d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell GLuint facing = 0; 432b2f761e2b0dc160793be2f48e811d2d455e1e22Brian GLchan saved_color[3][4] = { { 0 } }; 4493d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell GLfloat saved_col0[3][4] = { { 0 } }; 4593d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell GLfloat saved_spec[3][4] = { { 0 } }; 467e02303497237cde958c28608477d0c355a8038bMarek Olšák 474abe1eb980ed76d2b2d3383eaab520d0aa2ae6f4Michel Dänzer v[0] = &verts[e0]; 4893d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell v[1] = &verts[e1]; 492b2f761e2b0dc160793be2f48e811d2d455e1e22Brian v[2] = &verts[e2]; 502b2f761e2b0dc160793be2f48e811d2d455e1e22Brian 512b2f761e2b0dc160793be2f48e811d2d455e1e22Brian if (IND & (SS_TWOSIDE_BIT | SS_OFFSET_BIT | SS_UNFILLED_BIT)) 525e345a653b0adc59487d786050abd01d4cb8b4caBrian { 535e345a653b0adc59487d786050abd01d4cb8b4caBrian GLfloat ex = v[0]->attrib[FRAG_ATTRIB_WPOS][0] - v[2]->attrib[FRAG_ATTRIB_WPOS][0]; 547e02303497237cde958c28608477d0c355a8038bMarek Olšák GLfloat ey = v[0]->attrib[FRAG_ATTRIB_WPOS][1] - v[2]->attrib[FRAG_ATTRIB_WPOS][1]; 55d6c3e6d8f34fc39dcbe9395c3a5953af726443f1Brian Paul GLfloat fx = v[1]->attrib[FRAG_ATTRIB_WPOS][0] - v[2]->attrib[FRAG_ATTRIB_WPOS][0]; 56d6c3e6d8f34fc39dcbe9395c3a5953af726443f1Brian Paul GLfloat fy = v[1]->attrib[FRAG_ATTRIB_WPOS][1] - v[2]->attrib[FRAG_ATTRIB_WPOS][1]; 5799695f58fde6d364f2310d97303768782a1e537dBrian Paul GLfloat cc = ex*fy - ey*fx; 58d6c3e6d8f34fc39dcbe9395c3a5953af726443f1Brian Paul 59d6c3e6d8f34fc39dcbe9395c3a5953af726443f1Brian Paul if (IND & (SS_TWOSIDE_BIT | SS_UNFILLED_BIT)) 60d6c3e6d8f34fc39dcbe9395c3a5953af726443f1Brian Paul { 6153bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin facing = (cc < 0.0) ^ ctx->Polygon._FrontBit; 62c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell 632b2f761e2b0dc160793be2f48e811d2d455e1e22Brian if (IND & SS_UNFILLED_BIT) 647e02303497237cde958c28608477d0c355a8038bMarek Olšák mode = facing ? ctx->Polygon.BackMode : ctx->Polygon.FrontMode; 657e02303497237cde958c28608477d0c355a8038bMarek Olšák 667e02303497237cde958c28608477d0c355a8038bMarek Olšák if (facing == 1) { 677e02303497237cde958c28608477d0c355a8038bMarek Olšák if (IND & SS_TWOSIDE_BIT) { 687e02303497237cde958c28608477d0c355a8038bMarek Olšák if (VB->BackfaceColorPtr) { 697e02303497237cde958c28608477d0c355a8038bMarek Olšák GLfloat (*vbcolor)[4] = VB->BackfaceColorPtr->data; 707e02303497237cde958c28608477d0c355a8038bMarek Olšák 717e02303497237cde958c28608477d0c355a8038bMarek Olšák if (swsetup->intColors) { 727e02303497237cde958c28608477d0c355a8038bMarek Olšák COPY_CHAN4(saved_color[0], v[0]->color); 737e02303497237cde958c28608477d0c355a8038bMarek Olšák COPY_CHAN4(saved_color[1], v[1]->color); 747e02303497237cde958c28608477d0c355a8038bMarek Olšák COPY_CHAN4(saved_color[2], v[2]->color); 757e02303497237cde958c28608477d0c355a8038bMarek Olšák } 767e02303497237cde958c28608477d0c355a8038bMarek Olšák else { 777e02303497237cde958c28608477d0c355a8038bMarek Olšák COPY_4V(saved_col0[0], v[0]->attrib[FRAG_ATTRIB_COL0]); 787e02303497237cde958c28608477d0c355a8038bMarek Olšák COPY_4V(saved_col0[1], v[1]->attrib[FRAG_ATTRIB_COL0]); 797e02303497237cde958c28608477d0c355a8038bMarek Olšák COPY_4V(saved_col0[2], v[2]->attrib[FRAG_ATTRIB_COL0]); 807e02303497237cde958c28608477d0c355a8038bMarek Olšák } 817e02303497237cde958c28608477d0c355a8038bMarek Olšák 827e02303497237cde958c28608477d0c355a8038bMarek Olšák if (VB->BackfaceColorPtr->stride) { 837e02303497237cde958c28608477d0c355a8038bMarek Olšák if (swsetup->intColors) { 847e02303497237cde958c28608477d0c355a8038bMarek Olšák SS_COLOR(v[0]->color, vbcolor[e0]); 854abe1eb980ed76d2b2d3383eaab520d0aa2ae6f4Michel Dänzer SS_COLOR(v[1]->color, vbcolor[e1]); 86d671cf460f99693ded1eccc6b32816d430098725José Fonseca SS_COLOR(v[2]->color, vbcolor[e2]); 87d671cf460f99693ded1eccc6b32816d430098725José Fonseca } 88d671cf460f99693ded1eccc6b32816d430098725José Fonseca else { 89d671cf460f99693ded1eccc6b32816d430098725José Fonseca COPY_4V(v[0]->attrib[FRAG_ATTRIB_COL0], vbcolor[e0]); 90d671cf460f99693ded1eccc6b32816d430098725José Fonseca COPY_4V(v[1]->attrib[FRAG_ATTRIB_COL0], vbcolor[e1]); 91d671cf460f99693ded1eccc6b32816d430098725José Fonseca COPY_4V(v[2]->attrib[FRAG_ATTRIB_COL0], vbcolor[e2]); 92b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell } 93d671cf460f99693ded1eccc6b32816d430098725José Fonseca } 94b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell else { 95d671cf460f99693ded1eccc6b32816d430098725José Fonseca /* flat shade */ 96d671cf460f99693ded1eccc6b32816d430098725José Fonseca if (swsetup->intColors) { 97d671cf460f99693ded1eccc6b32816d430098725José Fonseca SS_COLOR(v[0]->color, vbcolor[0]); 98bddf275db44695e3850c4b62b8f4b77d93299ae9Marek Olšák SS_COLOR(v[1]->color, vbcolor[0]); 994abe1eb980ed76d2b2d3383eaab520d0aa2ae6f4Michel Dänzer SS_COLOR(v[2]->color, vbcolor[0]); 100bddf275db44695e3850c4b62b8f4b77d93299ae9Marek Olšák } 10193d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell else { 10293d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell COPY_4V(v[0]->attrib[FRAG_ATTRIB_COL0], vbcolor[0]); 1037e02303497237cde958c28608477d0c355a8038bMarek Olšák COPY_4V(v[1]->attrib[FRAG_ATTRIB_COL0], vbcolor[0]); 1047e02303497237cde958c28608477d0c355a8038bMarek Olšák COPY_4V(v[2]->attrib[FRAG_ATTRIB_COL0], vbcolor[0]); 1057e02303497237cde958c28608477d0c355a8038bMarek Olšák } 1067e02303497237cde958c28608477d0c355a8038bMarek Olšák } 1077e02303497237cde958c28608477d0c355a8038bMarek Olšák } 1087e02303497237cde958c28608477d0c355a8038bMarek Olšák 1097e02303497237cde958c28608477d0c355a8038bMarek Olšák if (VB->BackfaceSecondaryColorPtr) { 11053e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca GLfloat (*vbspec)[4] = VB->BackfaceSecondaryColorPtr->data; 11153e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca 11253e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca COPY_4V(saved_spec[0], v[0]->attrib[FRAG_ATTRIB_COL1]); 11353e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca COPY_4V(saved_spec[1], v[1]->attrib[FRAG_ATTRIB_COL1]); 11453e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca COPY_4V(saved_spec[2], v[2]->attrib[FRAG_ATTRIB_COL1]); 11553e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca 11653e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca if (VB->BackfaceSecondaryColorPtr->stride) { 11753e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca SS_SPEC(v[0]->attrib[FRAG_ATTRIB_COL1], vbspec[e0]); 11853e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca SS_SPEC(v[1]->attrib[FRAG_ATTRIB_COL1], vbspec[e1]); 11953e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca SS_SPEC(v[2]->attrib[FRAG_ATTRIB_COL1], vbspec[e2]); 12053e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca } 12153e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca else { 12253e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca SS_SPEC(v[0]->attrib[FRAG_ATTRIB_COL1], vbspec[0]); 1234c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger SS_SPEC(v[1]->attrib[FRAG_ATTRIB_COL1], vbspec[0]); 12453e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca SS_SPEC(v[2]->attrib[FRAG_ATTRIB_COL1], vbspec[0]); 12553e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca } 12653e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca } 12753e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca } 12853e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca } 12953e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca } 13053e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca 13125485f4b69447514ab8b595aced90c75606a99bdMarek Olšák if (IND & SS_OFFSET_BIT) { 13253e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca const GLfloat max = ctx->DrawBuffer->_DepthMaxF; 13325485f4b69447514ab8b595aced90c75606a99bdMarek Olšák /* save original Z values (restored later) */ 13425485f4b69447514ab8b595aced90c75606a99bdMarek Olšák z[0] = v[0]->attrib[FRAG_ATTRIB_WPOS][2]; 13553e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca z[1] = v[1]->attrib[FRAG_ATTRIB_WPOS][2]; 13653e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca z[2] = v[2]->attrib[FRAG_ATTRIB_WPOS][2]; 13753e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca /* Note that Z values are already scaled to [0,65535] (for example) 13853e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca * so no MRD value is used here. 13953e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca */ 14053e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca offset = ctx->Polygon.OffsetUnits; 14125485f4b69447514ab8b595aced90c75606a99bdMarek Olšák if (cc * cc > 1e-16) { 1427e02303497237cde958c28608477d0c355a8038bMarek Olšák const GLfloat ez = z[0] - z[2]; 14353e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca const GLfloat fz = z[1] - z[2]; 14453e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca const GLfloat oneOverArea = 1.0F / cc; 14553e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca const GLfloat dzdx = FABSF((ey * fz - ez * fy) * oneOverArea); 14653e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca const GLfloat dzdy = FABSF((ez * fx - ex * fz) * oneOverArea); 14753e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca offset += MAX2(dzdx, dzdy) * ctx->Polygon.OffsetFactor; 14853e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca } 14953e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca /* new Z values */ 15053e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca oz0 = CLAMP(v[0]->attrib[FRAG_ATTRIB_WPOS][2] + offset, 0.0F, max); 15153e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca oz1 = CLAMP(v[1]->attrib[FRAG_ATTRIB_WPOS][2] + offset, 0.0F, max); 15253e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca oz2 = CLAMP(v[2]->attrib[FRAG_ATTRIB_WPOS][2] + offset, 0.0F, max); 15353e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca } 1547e02303497237cde958c28608477d0c355a8038bMarek Olšák } 15553e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca 15653e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca if (mode == GL_POINT) { 15753e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetPoint) { 15853e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca v[0]->attrib[FRAG_ATTRIB_WPOS][2] = oz0; 15953e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca v[1]->attrib[FRAG_ATTRIB_WPOS][2] = oz1; 16053e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca v[2]->attrib[FRAG_ATTRIB_WPOS][2] = oz2; 161bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšák } 162b39bccbd4ed71e9585da4cf5acf7b887b2e90899Marek Olšák _swsetup_render_tri(ctx, e0, e1, e2, facing, _swsetup_edge_render_point_tri); 16353e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca } else if (mode == GL_LINE) { 16453e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetLine) { 16553e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca v[0]->attrib[FRAG_ATTRIB_WPOS][2] = oz0; 16653e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca v[1]->attrib[FRAG_ATTRIB_WPOS][2] = oz1; 16753e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca v[2]->attrib[FRAG_ATTRIB_WPOS][2] = oz2; 16853e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca } 16953e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca _swsetup_render_tri(ctx, e0, e1, e2, facing, _swsetup_edge_render_line_tri); 1707e02303497237cde958c28608477d0c355a8038bMarek Olšák } else { 17153e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetFill) { 17253e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca v[0]->attrib[FRAG_ATTRIB_WPOS][2] = oz0; 17353e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca v[1]->attrib[FRAG_ATTRIB_WPOS][2] = oz1; 17453e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca v[2]->attrib[FRAG_ATTRIB_WPOS][2] = oz2; 17553e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca } 176 _swrast_Triangle( ctx, v[0], v[1], v[2] ); 177 } 178 179 /* 180 * Restore original vertex colors, etc. 181 */ 182 if (IND & SS_OFFSET_BIT) { 183 v[0]->attrib[FRAG_ATTRIB_WPOS][2] = z[0]; 184 v[1]->attrib[FRAG_ATTRIB_WPOS][2] = z[1]; 185 v[2]->attrib[FRAG_ATTRIB_WPOS][2] = z[2]; 186 } 187 188 if (IND & SS_TWOSIDE_BIT) { 189 if (facing == 1) { 190 if (VB->BackfaceColorPtr) { 191 if (swsetup->intColors) { 192 COPY_CHAN4(v[0]->color, saved_color[0]); 193 COPY_CHAN4(v[1]->color, saved_color[1]); 194 COPY_CHAN4(v[2]->color, saved_color[2]); 195 } 196 else { 197 COPY_4V(v[0]->attrib[FRAG_ATTRIB_COL0], saved_col0[0]); 198 COPY_4V(v[1]->attrib[FRAG_ATTRIB_COL0], saved_col0[1]); 199 COPY_4V(v[2]->attrib[FRAG_ATTRIB_COL0], saved_col0[2]); 200 } 201 } 202 203 if (VB->BackfaceSecondaryColorPtr) { 204 COPY_4V(v[0]->attrib[FRAG_ATTRIB_COL1], saved_spec[0]); 205 COPY_4V(v[1]->attrib[FRAG_ATTRIB_COL1], saved_spec[1]); 206 COPY_4V(v[2]->attrib[FRAG_ATTRIB_COL1], saved_spec[2]); 207 } 208 } 209 } 210} 211 212 213 214/* Need to fixup edgeflags when decomposing to triangles: 215 */ 216static void TAG(quadfunc)( struct gl_context *ctx, GLuint v0, 217 GLuint v1, GLuint v2, GLuint v3 ) 218{ 219 if (IND & SS_UNFILLED_BIT) { 220 struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 221 if (VB->EdgeFlag) { /* XXX this test shouldn't be needed (bug 12614) */ 222 GLubyte ef1 = VB->EdgeFlag[v1]; 223 GLubyte ef3 = VB->EdgeFlag[v3]; 224 VB->EdgeFlag[v1] = 0; 225 TAG(triangle)( ctx, v0, v1, v3 ); 226 VB->EdgeFlag[v1] = ef1; 227 VB->EdgeFlag[v3] = 0; 228 TAG(triangle)( ctx, v1, v2, v3 ); 229 VB->EdgeFlag[v3] = ef3; 230 } 231 } else { 232 TAG(triangle)( ctx, v0, v1, v3 ); 233 TAG(triangle)( ctx, v1, v2, v3 ); 234 } 235} 236 237 238 239 240static void TAG(init)( void ) 241{ 242 tri_tab[IND] = TAG(triangle); 243 quad_tab[IND] = TAG(quadfunc); 244} 245 246 247#undef IND 248#undef TAG 249