15df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* 25df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Mesa 3-D graphics library 3a1a6ac4af4ba5b1da7c768d892b84cb1204c4c7fBrian Paul * Version: 6.5.1 45df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 5a1a6ac4af4ba5b1da7c768d892b84cb1204c4c7fBrian Paul * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 65df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 75df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a 85df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * copy of this software and associated documentation files (the "Software"), 95df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * to deal in the Software without restriction, including without limitation 105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense, 115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * and/or sell copies of the Software, and to permit persons to whom the 125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Software is furnished to do so, subject to the following conditions: 135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * The above copyright notice and this permission notice shall be included 155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * in all copies or substantial portions of the Software. 165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Authors: 255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Keith Whitwell <keith@tungstengraphics.com> 265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 29a1a6ac4af4ba5b1da7c768d892b84cb1204c4c7fBrian Paul/** 30a1a6ac4af4ba5b1da7c768d892b84cb1204c4c7fBrian Paul * \file t_dd_dmatmp2.h 31a1a6ac4af4ba5b1da7c768d892b84cb1204c4c7fBrian Paul * Template for render stages which build and emit vertices directly 325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * to fixed-size dma buffers. Useful for rendering strips and other 335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * native primitives where clipping and per-vertex tweaks such as 345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * those in t_dd_tritmp.h are not required. 355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if !HAVE_TRIANGLES || !HAVE_POINTS || !HAVE_LINES 395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#error "must have points, lines & triangles to use render template" 405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif 415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if !HAVE_TRI_STRIPS || !HAVE_TRI_FANS 435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#error "must have tri strip and fans to use render template" 445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif 455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if !HAVE_LINE_STRIPS 475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#error "must have line strips to use render template" 485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif 495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if !HAVE_POLYGONS 515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#error "must have polygons to use render template" 525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif 535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if !HAVE_ELTS 555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#error "must have elts to use render template" 565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif 575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#ifndef EMIT_TWO_ELTS 605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define EMIT_TWO_ELTS( dest, offset, elt0, elt1 ) \ 615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Pauldo { \ 625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (dest)[offset] = (elt0); \ 635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (dest)[offset+1] = (elt1); \ 645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} while (0) 655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif 665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/ 695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Render whole begin/end objects */ 705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/ 715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 73f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic ELT_TYPE *TAG(emit_elts)( struct gl_context *ctx, 745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest, 755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint *elts, GLuint nr ) 765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint i; 785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( i = 0 ; i+1 < nr ; i+=2, elts += 2 ) { 815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_TWO_ELTS( dest, 0, elts[0], elts[1] ); 825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest += 2; 835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (i < nr) { 855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_ELT( dest, 0, elts[0] ); 865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest += 1; 875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return dest; 905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 92f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic ELT_TYPE *TAG(emit_consecutive_elts)( struct gl_context *ctx, 935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest, 945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, GLuint nr ) 955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint i; 975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( i = 0 ; i+1 < nr ; i+=2, start += 2 ) { 1005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_TWO_ELTS( dest, 0, start, start+1 ); 1015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest += 2; 1025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (i < nr) { 1045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_ELT( dest, 0, start ); 1055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest += 1; 1065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return dest; 1095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 1105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*********************************************************************** 1125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Render non-indexed primitives. 1135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/ 1145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 117f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_points_verts)( struct gl_context *ctx, 1185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 1195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 1205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 1215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 1225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start < count) { 1235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 1245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (0) fprintf(stderr, "%s\n", __FUNCTION__); 1255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_PRIM( ctx, GL_POINTS, HW_POINTS, start, count ); 1265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 1285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 129f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_lines_verts)( struct gl_context *ctx, 1305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 1315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 1325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 1335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 1345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 1355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (0) fprintf(stderr, "%s\n", __FUNCTION__); 1365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul count -= (count-start) & 1; 1375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start+1 >= count) 1395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 1405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ((flags & PRIM_BEGIN) && ctx->Line.StippleFlag) { 1425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RESET_STIPPLE(); 1435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul AUTO_STIPPLE( GL_TRUE ); 1445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_PRIM( ctx, GL_LINES, HW_LINES, start, count ); 1475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ((flags & PRIM_END) && ctx->Line.StippleFlag) 1495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul AUTO_STIPPLE( GL_FALSE ); 1505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 1515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 153f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_line_strip_verts)( struct gl_context *ctx, 1545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 1555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 1565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 1575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 1585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 1595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (0) fprintf(stderr, "%s\n", __FUNCTION__); 1605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start+1 >= count) 1625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 1635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ((flags & PRIM_BEGIN) && ctx->Line.StippleFlag) 1655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RESET_STIPPLE(); 1665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (PREFER_DISCRETE_ELT_PRIM( count-start, HW_LINES )) 1695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 1705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int dmasz = GET_MAX_HW_ELTS(); 1715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint j, nr; 1725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_INIT( GL_LINES, HW_LINES ); 1745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Emit whole number of lines in each full buffer. 1765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 1775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dmasz = dmasz/2; 1785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (j = start; j + 1 < count; j += nr - 1 ) { 1815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest; 1825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint i; 1835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul nr = MIN2( dmasz, count - j ); 1855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = ALLOC_ELTS( (nr-1)*2 ); 1865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( i = j ; i+1 < j+nr ; i+=1 ) { 1885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_TWO_ELTS( dest, 0, (i+0), (i+1) ); 1895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest += 2; 1905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLOSE_ELTS(); 1935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 1965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_PRIM( ctx, GL_LINE_STRIP, HW_LINE_STRIP, start, count ); 1975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 1985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 200f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_line_loop_verts)( struct gl_context *ctx, 2015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 2025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 2035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 2045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 2055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 2065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint j, nr; 2075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (0) fprintf(stderr, "%s\n", __FUNCTION__); 2085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (flags & PRIM_BEGIN) { 2105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul j = start; 2115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ctx->Line.StippleFlag) 2125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RESET_STIPPLE( ); 2135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 2155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul j = start + 1; 2165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (flags & PRIM_END) { 2185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start+1 >= count) 2205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (PREFER_DISCRETE_ELT_PRIM( count-start, HW_LINES )) { 2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int dmasz = GET_MAX_HW_ELTS(); 2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_INIT( GL_LINES, HW_LINES ); 2265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Emit whole number of lines in each full buffer. 2285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dmasz = dmasz/2; 2305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Ensure last vertex doesn't wrap: 2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dmasz--; 2345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (; j + 1 < count; ) { 2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint i; 2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest; 2385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul nr = MIN2( dmasz, count - j ); 2405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = ALLOC_ELTS( nr*2 ); /* allocs room for 1 more line */ 2415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( i = 0 ; i < nr - 1 ; i+=1 ) { 2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_TWO_ELTS( dest, 0, (j+i), (j+i+1) ); 2445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest += 2; 2455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul j += nr - 1; 2485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Emit 1 more line into space alloced above */ 2505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (j + 1 >= count) { 2515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_TWO_ELTS( dest, 0, (j), (start) ); 2525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest += 2; 2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLOSE_ELTS(); 2565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 2595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 2605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int dmasz = GET_MAX_HW_ELTS() - 1; 2615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_INIT( GL_LINE_STRIP, HW_LINE_STRIP ); 2635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( ; j + 1 < count; ) { 2655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul nr = MIN2( dmasz, count - j ); 2665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (j + nr < count) { 2675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest = ALLOC_ELTS( nr ); 2685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = TAG(emit_consecutive_elts)( ctx, dest, j, nr ); 2697ea452dd35ba8ae063c70cc7fc916975c823ecd6Vinson Lee (void) dest; 2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul j += nr - 1; 2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLOSE_ELTS(); 2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else if (nr) { 2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest = ALLOC_ELTS( nr + 1 ); 2755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = TAG(emit_consecutive_elts)( ctx, dest, j, nr ); 2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = TAG(emit_consecutive_elts)( ctx, dest, start, 1 ); 2777ea452dd35ba8ae063c70cc7fc916975c823ecd6Vinson Lee (void) dest; 2785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul j += nr; 2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLOSE_ELTS(); 2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 2845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_line_strip_verts)( ctx, j, count, flags ); 2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 289f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_triangles_verts)( struct gl_context *ctx, 2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 2935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (0) fprintf(stderr, "%s\n", __FUNCTION__); 2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul count -= (count-start)%3; 2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start+2 >= count) { 3005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 3015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* need a PREFER_DISCRETE_ELT_PRIM here too.. 3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 3055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_PRIM( ctx, GL_TRIANGLES, HW_TRIANGLES, start, count ); 3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 310f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_tri_strip_verts)( struct gl_context *ctx, 3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 3125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 3135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 3145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 3155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 3165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (0) fprintf(stderr, "%s\n", __FUNCTION__); 3175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start + 2 >= count) 3195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 3205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (PREFER_DISCRETE_ELT_PRIM( count-start, HW_TRIANGLES )) 3225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 3235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int dmasz = GET_MAX_HW_ELTS(); 3245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int parity = 0; 3255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint j, nr; 3265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_INIT( GL_TRIANGLES, HW_TRIANGLES ); 3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Emit even number of tris in each full buffer. 3305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 3315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dmasz = dmasz/3; 3325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dmasz -= dmasz & 1; 3335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (j = start; j + 2 < count; j += nr - 2 ) { 3355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest; 3365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint i; 3375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul nr = MIN2( dmasz, count - j ); 3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = ALLOC_ELTS( (nr-2)*3 ); 3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( i = j ; i+2 < j+nr ; i++, parity^=1 ) { 3425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_ELT( dest, 0, (i+0+parity) ); 3435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_ELT( dest, 1, (i+1-parity) ); 3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_ELT( dest, 2, (i+2) ); 3455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest += 3; 3465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLOSE_ELTS(); 3495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 35147909141985a5aa38a49ea45b3aea795f1922dfbKeith Whitwell else 35247909141985a5aa38a49ea45b3aea795f1922dfbKeith Whitwell EMIT_PRIM( ctx, GL_TRIANGLE_STRIP, HW_TRIANGLE_STRIP_0, start, count ); 3535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 3545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 355f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_tri_fan_verts)( struct gl_context *ctx, 3565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 3575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 3585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 3595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 3605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 3615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (0) fprintf(stderr, "%s\n", __FUNCTION__); 3625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start+2 >= count) 3645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 3655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (PREFER_DISCRETE_ELT_PRIM( count-start, HW_TRIANGLES )) 3675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 3685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int dmasz = GET_MAX_HW_ELTS(); 3695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint j, nr; 3705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_INIT( GL_TRIANGLES, HW_TRIANGLES ); 3725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dmasz = dmasz/3; 3745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (j = start + 1; j + 1 < count; j += nr - 1 ) { 3765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest; 3775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint i; 3785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul nr = MIN2( dmasz, count - j ); 3805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = ALLOC_ELTS( (nr-1)*3 ); 3815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( i = j ; i+1 < j+nr ; i++ ) { 3835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_ELT( dest, 0, (start) ); 3845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_ELT( dest, 1, (i) ); 3855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_ELT( dest, 2, (i+1) ); 3865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest += 3; 3875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLOSE_ELTS(); 3905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_PRIM( ctx, GL_TRIANGLE_FAN, HW_TRIANGLE_FAN, start, count ); 3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 3965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 398f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_poly_verts)( struct gl_context *ctx, 3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 4005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 4015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 4025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 4035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 4045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (0) fprintf(stderr, "%s\n", __FUNCTION__); 4055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start+2 >= count) 4075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 4085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_PRIM( ctx, GL_POLYGON, HW_POLYGON, start, count ); 4105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 412f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_quad_strip_verts)( struct gl_context *ctx, 4135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 4145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 4155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 4165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 4175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 4185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (0) fprintf(stderr, "%s\n", __FUNCTION__); 4195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul count -= (count-start) & 1; 4215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start+3 >= count) 4235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 4245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (HAVE_QUAD_STRIPS) { 4265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_PRIM( ctx, GL_QUAD_STRIP, HW_QUAD_STRIP, start, count ); 4275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 428a1a6ac4af4ba5b1da7c768d892b84cb1204c4c7fBrian Paul else if (ctx->Light.ShadeModel == GL_FLAT) { 4295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 4305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int dmasz = GET_MAX_HW_ELTS(); 4315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint j, nr; 4325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_INIT( GL_TRIANGLES, HW_TRIANGLES ); 4345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Emit whole number of quads in total, and in each buffer. 4365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 4375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dmasz = (dmasz/6)*2; 4385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (j = start; j + 3 < count; j += nr - 2 ) { 4405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest; 4415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint quads, i; 4425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul nr = MIN2( dmasz, count - j ); 4445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul quads = (nr/2)-1; 4455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = ALLOC_ELTS( quads*6 ); 4465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( i = j ; i < j+quads*2 ; i+=2 ) { 4485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_TWO_ELTS( dest, 0, (i+0), (i+1) ); 4495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_TWO_ELTS( dest, 2, (i+2), (i+1) ); 4505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_TWO_ELTS( dest, 4, (i+3), (i+2) ); 4515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest += 6; 4525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLOSE_ELTS(); 4555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 4585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_PRIM( ctx, GL_TRIANGLE_STRIP, HW_TRIANGLE_STRIP_0, start, count ); 4595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 463f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_quads_verts)( struct gl_context *ctx, 4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 4655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 4665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 4675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 4685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 4695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (0) fprintf(stderr, "%s\n", __FUNCTION__); 4705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul count -= (count-start)%4; 4715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start+3 >= count) 4735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 4745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (HAVE_QUADS) { 4764d17d00bfc8ad5cb331e2fca235df60d84310b32Adam Jackson EMIT_PRIM( ctx, GL_QUADS, HW_QUADS, start, count ); 4775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 4795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Hardware doesn't have a quad primitive type -- simulate it 4805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * using indexed vertices and the triangle primitive: 4815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 4825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 4835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int dmasz = GET_MAX_HW_ELTS(); 4845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint j, nr; 4855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_INIT( GL_TRIANGLES, HW_TRIANGLES ); 4875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Adjust for rendering as triangles: 4895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 4905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dmasz = (dmasz/6)*4; 4915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (j = start; j < count; j += nr ) { 4935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest; 4945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint quads, i; 4955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul nr = MIN2( dmasz, count - j ); 4975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul quads = nr/4; 4985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = ALLOC_ELTS( quads*6 ); 4995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( i = j ; i < j+quads*4 ; i+=4 ) { 5015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_TWO_ELTS( dest, 0, (i+0), (i+1) ); 5025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_TWO_ELTS( dest, 2, (i+3), (i+1) ); 5035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_TWO_ELTS( dest, 4, (i+2), (i+3) ); 5045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest += 6; 5055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLOSE_ELTS(); 5085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 5115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 512f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_noop)( struct gl_context *ctx, 5135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 5145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 5155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 5165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 5185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5223d38361b718d490e1e7fda64519952ec887cd149Keith Whitwellstatic tnl_render_func TAG(render_tab_verts)[GL_POLYGON+2] = 5235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_points_verts), 5255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_lines_verts), 5265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_line_loop_verts), 5275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_line_strip_verts), 5285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_triangles_verts), 5295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_tri_strip_verts), 5305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_tri_fan_verts), 5315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_quads_verts), 5325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_quad_strip_verts), 5335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_poly_verts), 5345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_noop), 5355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}; 5365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**************************************************************************** 5395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Render elts using hardware indexed verts * 5405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ****************************************************************************/ 5415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 542f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_points_elts)( struct gl_context *ctx, 5435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 5445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 5455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 5465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 5485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int dmasz = GET_MAX_HW_ELTS(); 5495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint *elts = GET_MESA_ELTS(); 5505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint j, nr; 5515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest; 5525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_INIT( GL_POINTS, HW_POINTS ); 5545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (j = start; j < count; j += nr ) { 5565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul nr = MIN2( dmasz, count - j ); 5575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = ALLOC_ELTS( nr ); 5585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = TAG(emit_elts)( ctx, dest, elts+j, nr ); 5597ea452dd35ba8ae063c70cc7fc916975c823ecd6Vinson Lee (void) dest; 5605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLOSE_ELTS(); 5615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 5635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 566f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_lines_elts)( struct gl_context *ctx, 5675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 5685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 5695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 5705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 5725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int dmasz = GET_MAX_HW_ELTS(); 5735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint *elts = GET_MESA_ELTS(); 5745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint j, nr; 5755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest; 5765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start+1 >= count) 5785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 5795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ((flags & PRIM_BEGIN) && ctx->Line.StippleFlag) { 5815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RESET_STIPPLE(); 5825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul AUTO_STIPPLE( GL_TRUE ); 5835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_INIT( GL_LINES, HW_LINES ); 5865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Emit whole number of lines in total and in each buffer: 5885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 5895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul count -= (count-start) & 1; 5905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dmasz -= dmasz & 1; 5915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (j = start; j < count; j += nr ) { 5935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul nr = MIN2( dmasz, count - j ); 5945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = ALLOC_ELTS( nr ); 5955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = TAG(emit_elts)( ctx, dest, elts+j, nr ); 5967ea452dd35ba8ae063c70cc7fc916975c823ecd6Vinson Lee (void) dest; 5975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLOSE_ELTS(); 5985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ((flags & PRIM_END) && ctx->Line.StippleFlag) 6015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul AUTO_STIPPLE( GL_FALSE ); 6025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 605f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_line_strip_elts)( struct gl_context *ctx, 6065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 6075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 6085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 6095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 6115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int dmasz = GET_MAX_HW_ELTS(); 6125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint *elts = GET_MESA_ELTS(); 6135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint j, nr; 6145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest; 6155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start+1 >= count) 6175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 6185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_INIT( GL_LINE_STRIP, HW_LINE_STRIP ); 6205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ((flags & PRIM_BEGIN) && ctx->Line.StippleFlag) 6225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RESET_STIPPLE(); 6235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (j = start; j + 1 < count; j += nr - 1 ) { 6255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul nr = MIN2( dmasz, count - j ); 6265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = ALLOC_ELTS( nr ); 6275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = TAG(emit_elts)( ctx, dest, elts+j, nr ); 6287ea452dd35ba8ae063c70cc7fc916975c823ecd6Vinson Lee (void) dest; 6295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLOSE_ELTS(); 6305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 634f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_line_loop_elts)( struct gl_context *ctx, 6355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 6365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 6375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 6385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 6405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int dmasz = GET_MAX_HW_ELTS(); 6415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint *elts = GET_MESA_ELTS(); 6425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint j, nr; 6435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest; 6445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (0) fprintf(stderr, "%s\n", __FUNCTION__); 6465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (flags & PRIM_BEGIN) 6485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul j = start; 6495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 6505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul j = start + 1; 6515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (flags & PRIM_END) { 6545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start+1 >= count) 6555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 6565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 6585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (j+1 >= count) 6595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 6605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_INIT( GL_LINE_STRIP, HW_LINE_STRIP ); 6635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ((flags & PRIM_BEGIN) && ctx->Line.StippleFlag) 6655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RESET_STIPPLE(); 6665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Ensure last vertex doesn't wrap: 6695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 6705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dmasz--; 6715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( ; j + 1 < count; ) { 6735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul nr = MIN2( dmasz, count - j ); 6745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = ALLOC_ELTS( nr+1 ); /* Reserve possible space for last elt */ 6755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = TAG(emit_elts)( ctx, dest, elts+j, nr ); 6765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul j += nr - 1; 6775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (j + 1 >= count && (flags & PRIM_END)) { 6785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = TAG(emit_elts)( ctx, dest, elts+start, 1 ); 6797ea452dd35ba8ae063c70cc7fc916975c823ecd6Vinson Lee (void) dest; 6805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLOSE_ELTS(); 6825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 686f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_triangles_elts)( struct gl_context *ctx, 6875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 6885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 6895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 6905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint *elts = GET_MESA_ELTS(); 6935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int dmasz = GET_MAX_HW_ELTS()/3*3; 6945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint j, nr; 6955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest; 6965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start+2 >= count) 6985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 6995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_INIT( GL_TRIANGLES, HW_TRIANGLES ); 7015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Emit whole number of tris in total. dmasz is already a multiple 7045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * of 3. 7055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 7065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul count -= (count-start)%3; 7075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (j = start; j < count; j += nr) { 7095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul nr = MIN2( dmasz, count - j ); 7105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = ALLOC_ELTS( nr ); 7115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = TAG(emit_elts)( ctx, dest, elts+j, nr ); 7127ea452dd35ba8ae063c70cc7fc916975c823ecd6Vinson Lee (void) dest; 7135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLOSE_ELTS(); 7145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 719f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_tri_strip_elts)( struct gl_context *ctx, 7205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 7215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 7225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 7235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 7245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 7255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint j, nr; 7265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint *elts = GET_MESA_ELTS(); 7275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int dmasz = GET_MAX_HW_ELTS(); 7285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest; 7295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start+2 >= count) 7315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 7325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_INIT( GL_TRIANGLE_STRIP, HW_TRIANGLE_STRIP_0 ); 7345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Keep the same winding over multiple buffers: 7365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 7375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dmasz -= (dmasz & 1); 7385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (j = start ; j + 2 < count; j += nr - 2 ) { 7405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul nr = MIN2( dmasz, count - j ); 7415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 742ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell dest = ALLOC_ELTS( nr ); 743ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell dest = TAG(emit_elts)( ctx, dest, elts+j, nr ); 7447ea452dd35ba8ae063c70cc7fc916975c823ecd6Vinson Lee (void) dest; 745ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell CLOSE_ELTS(); 7465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 749f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_tri_fan_elts)( struct gl_context *ctx, 7505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 7515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 7525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 7535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 7545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 7555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint *elts = GET_MESA_ELTS(); 7565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint j, nr; 7575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int dmasz = GET_MAX_HW_ELTS(); 7585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest; 7595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start+2 >= count) 7615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 7625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_INIT( GL_TRIANGLE_FAN, HW_TRIANGLE_FAN ); 7645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (j = start + 1 ; j + 1 < count; j += nr - 1 ) { 7665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul nr = MIN2( dmasz, count - j + 1 ); 7675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = ALLOC_ELTS( nr ); 7685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = TAG(emit_elts)( ctx, dest, elts+start, 1 ); 7695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = TAG(emit_elts)( ctx, dest, elts+j, nr - 1 ); 7707ea452dd35ba8ae063c70cc7fc916975c823ecd6Vinson Lee (void) dest; 7715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLOSE_ELTS(); 7725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 776f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_poly_elts)( struct gl_context *ctx, 7775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 7785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 7795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 7805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 7815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 7825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint *elts = GET_MESA_ELTS(); 7835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint j, nr; 7845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int dmasz = GET_MAX_HW_ELTS(); 7855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest; 7865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start+2 >= count) 7885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 7895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_INIT( GL_POLYGON, HW_POLYGON ); 7915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (j = start + 1 ; j + 1 < count ; j += nr - 1 ) { 7935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul nr = MIN2( dmasz, count - j + 1 ); 7945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = ALLOC_ELTS( nr ); 7955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = TAG(emit_elts)( ctx, dest, elts+start, 1 ); 7965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = TAG(emit_elts)( ctx, dest, elts+j, nr - 1 ); 7977ea452dd35ba8ae063c70cc7fc916975c823ecd6Vinson Lee (void) dest; 7985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLOSE_ELTS(); 7995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 8015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 802f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_quad_strip_elts)( struct gl_context *ctx, 8035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 8045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 8055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 8065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 8075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start+3 >= count) 8085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 8095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (HAVE_QUAD_STRIPS && 0) { 8115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 8135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 8145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint *elts = GET_MESA_ELTS(); 8155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int dmasz = GET_MAX_HW_ELTS(); 8165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint j, nr; 8175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest; 8185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Emit whole number of quads in total, and in each buffer. 8205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 8215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dmasz -= dmasz & 1; 8225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul count -= (count-start) & 1; 8235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 824a1a6ac4af4ba5b1da7c768d892b84cb1204c4c7fBrian Paul if (ctx->Light.ShadeModel == GL_FLAT) { 8255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_INIT( GL_TRIANGLES, HW_TRIANGLES ); 8265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dmasz = dmasz/6*2; 8285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (j = start; j + 3 < count; j += nr - 2 ) { 8305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul nr = MIN2( dmasz, count - j ); 8315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (nr >= 4) 8335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 8345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint quads = (nr/2)-1; 8355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest = ALLOC_ELTS( quads*6 ); 8365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint i; 8375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( i = j-start ; i < j-start+quads ; i++, elts += 2 ) { 8395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_TWO_ELTS( dest, 0, elts[0], elts[1] ); 8405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_TWO_ELTS( dest, 2, elts[2], elts[1] ); 8415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_TWO_ELTS( dest, 4, elts[3], elts[2] ); 8425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest += 6; 8435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLOSE_ELTS(); 8465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 8505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_INIT( GL_TRIANGLE_STRIP, HW_TRIANGLE_STRIP_0 ); 8515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (j = start; j + 3 < count; j += nr - 2 ) { 8535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul nr = MIN2( dmasz, count - j ); 8545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = ALLOC_ELTS( nr ); 8555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest = TAG(emit_elts)( ctx, dest, elts+j, nr ); 8567ea452dd35ba8ae063c70cc7fc916975c823ecd6Vinson Lee (void) dest; 8575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLOSE_ELTS(); 8585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 8625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 864f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(render_quads_elts)( struct gl_context *ctx, 8655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint start, 8665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint count, 8675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags ) 8685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 8695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (start+3 >= count) 8705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 8715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (HAVE_QUADS && 0) { 8735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 8745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul LOCAL_VARS; 8755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint *elts = GET_MESA_ELTS(); 8765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int dmasz = GET_MAX_HW_ELTS(); 8775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint j, nr; 8785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_INIT( GL_TRIANGLES, HW_TRIANGLES ); 8805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Emit whole number of quads in total, and in each buffer. 8825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 8835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dmasz -= dmasz & 3; 8845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul count -= (count-start) & 3; 8855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Adjust for rendering as triangles: 8875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 8885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dmasz = dmasz/6*4; 8895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for (j = start; j + 3 < count; j += nr ) { 8915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul nr = MIN2( dmasz, count - j ); 8925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 8945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint quads = nr/4; 8955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ELT_TYPE *dest = ALLOC_ELTS( quads * 6 ); 8965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint i; 8975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( i = j-start ; i < j-start+quads ; i++, elts += 4 ) { 8995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_TWO_ELTS( dest, 0, elts[0], elts[1] ); 9005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_TWO_ELTS( dest, 2, elts[3], elts[1] ); 9015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul EMIT_TWO_ELTS( dest, 4, elts[2], elts[3] ); 9025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul dest += 6; 9035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CLOSE_ELTS(); 9065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 9095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 9105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 9133d38361b718d490e1e7fda64519952ec887cd149Keith Whitwellstatic tnl_render_func TAG(render_tab_elts)[GL_POLYGON+2] = 9145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 9155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_points_elts), 9165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_lines_elts), 9175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_line_loop_elts), 9185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_line_strip_elts), 9195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_triangles_elts), 9205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_tri_strip_elts), 9215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_tri_fan_elts), 9225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_quads_elts), 9235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_quad_strip_elts), 9245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_poly_elts), 9255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TAG(render_noop), 9265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}; 927