1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 6.5.1 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors: 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Keith Whitwell <keith@tungstengraphics.com> 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file t_dd_dmatmp.h 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Template for render stages which build and emit vertices directly 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to fixed-size dma buffers. Useful for rendering strips and other 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * native primitives where clipping and per-vertex tweaks such as 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * those in t_dd_tritmp.h are not required. 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Produces code for both inline triangles and indexed triangles. 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Where various primitive types are unaccelerated by hardware, the 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * code attempts to fallback to other primitive types (quadstrips to 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * tristrips, lineloops to linestrips), or to indexed vertices. 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if !defined(HAVE_TRIANGLES) 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#error "must have at least triangles to use render template" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if !HAVE_ELTS 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ELTS_VARS(buf) 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ALLOC_ELTS(nr) 0 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EMIT_ELT( offset, elt ) 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EMIT_TWO_ELTS( offset, elt0, elt1 ) 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INCR_ELTS( nr ) 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ELT_INIT(prim) 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_CURRENT_VB_MAX_ELTS() 0 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_SUBSEQUENT_VB_MAX_ELTS() 0 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RELEASE_ELT_VERTS() 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EMIT_INDEXED_VERTS( ctx, start, count ) 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef EMIT_TWO_ELTS 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EMIT_TWO_ELTS( offset, elt0, elt1 ) \ 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_ELT( offset, elt0 ); \ 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_ELT( offset+1, elt1 ); \ 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Render whole begin/end objects */ 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if (HAVE_ELTS) 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *TAG(emit_elts)( struct gl_context *ctx, GLuint *elts, GLuint nr, 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *buf) 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELTS_VARS(buf); 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for ( i = 0 ; i+1 < nr ; i+=2, elts += 2 ) { 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_TWO_ELTS( 0, elts[0], elts[1] ); 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INCR_ELTS( 2 ); 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i < nr) { 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_ELT( 0, elts[0] ); 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INCR_ELTS( 1 ); 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (void *)ELTPTR; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic __inline void *TAG(emit_verts)( struct gl_context *ctx, GLuint start, 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, void *buf ) 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EMIT_VERTS(ctx, start, count, buf); 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************** 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Render non-indexed primitives. 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***********************************************************************/ 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_points_verts)( struct gl_context *ctx, 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_POINTS) { 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INIT( GL_POINTS ); 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_VERTS(); 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start; j < count; j += nr ) { 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) ); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__); 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_lines_verts)( struct gl_context *ctx, 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_LINES) { 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INIT( GL_LINES ); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emit whole number of lines in total and in each buffer: 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= (count-start) & 1; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_VERTS(); 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz -= currentsz & 1; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dmasz -= dmasz & 1; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start; j < count; j += nr ) { 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) ); 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__); 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_line_strip_verts)( struct gl_context *ctx, 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_LINE_STRIPS) { 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INIT( GL_LINE_STRIP ); 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_VERTS(); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start; j + 1 < count; j += nr - 1 ) { 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) ); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__); 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_line_loop_verts)( struct gl_context *ctx, 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_LINE_STRIPS) { 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INIT( GL_LINE_STRIP ); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (flags & PRIM_BEGIN) 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org j = start; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org j = start + 1; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Ensure last vertex won't wrap buffers: 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_VERTS(); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz--; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dmasz--; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) { 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (j + 1 < count) { 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for ( ; j + 1 < count; j += nr - 1 ) { 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (j + nr >= count && 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org start < count - 1 && 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (flags & PRIM_END)) 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *tmp; 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = ALLOC_VERTS(nr+1); 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = TAG(emit_verts)( ctx, j, nr, tmp ); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = TAG(emit_verts)( ctx, start, 1, tmp ); 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) tmp; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) ); 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (start + 1 < count && (flags & PRIM_END)) { 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *tmp; 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = ALLOC_VERTS(2); 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = TAG(emit_verts)( ctx, start+1, 1, tmp ); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = TAG(emit_verts)( ctx, start, 1, tmp ); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) tmp; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__); 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_triangles_verts)( struct gl_context *ctx, 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = (GET_SUBSEQUENT_VB_MAX_VERTS()/3) * 3; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INIT(GL_TRIANGLES); 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = (GET_CURRENT_VB_MAX_VERTS()/3) * 3; 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emit whole number of tris in total. dmasz is already a multiple 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of 3. 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= (count-start)%3; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start; j < count; j += nr) { 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) ); 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_tri_strip_verts)( struct gl_context *ctx, 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_TRI_STRIPS) { 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INIT(GL_TRIANGLE_STRIP); 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_VERTS(); 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) { 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* From here on emit even numbers of tris when wrapping over buffers: 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dmasz -= (dmasz & 1); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz -= (currentsz & 1); 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start ; j + 2 < count; j += nr - 2 ) { 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) ); 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__); 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_tri_fan_verts)( struct gl_context *ctx, 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_TRI_FANS) { 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INIT(GL_TRIANGLE_FAN); 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_VERTS(); 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) { 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start + 1 ; j + 1 < count; j += nr - 2 ) { 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *tmp; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j + 1 ); 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = ALLOC_VERTS( nr ); 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = TAG(emit_verts)( ctx, start, 1, tmp ); 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = TAG(emit_verts)( ctx, j, nr - 1, tmp ); 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) tmp; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Could write code to emit these as indexed vertices (for the 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * g400, for instance). 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__); 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_poly_verts)( struct gl_context *ctx, 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_POLYGONS) { 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INIT(GL_POLYGON); 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_VERTS(); 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) { 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start + 1 ; j + 1 < count ; j += nr - 2 ) { 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *tmp; 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j + 1 ); 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = ALLOC_VERTS( nr ); 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = TAG(emit_verts)( ctx, start, 1, tmp ); 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = TAG(emit_verts)( ctx, j, nr - 1, tmp ); 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) tmp; 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (HAVE_TRI_FANS && ctx->Light.ShadeModel == GL_SMOOTH) { 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_tri_fan_verts)( ctx, start, count, flags ); 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__); 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_quad_strip_verts)( struct gl_context *ctx, 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_QUAD_STRIPS) { 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INIT(GL_QUAD_STRIP); 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_VERTS(); 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) { 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dmasz -= (dmasz & 2); 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz -= (currentsz & 2); 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start ; j + 3 < count; j += nr - 2 ) { 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) ); 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (HAVE_TRI_STRIPS && 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Light.ShadeModel == GL_FLAT && 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNL_CONTEXT(ctx)->vb.AttribPtr[_TNL_ATTRIB_COLOR0]->stride) { 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_ELTS) { 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_INDEXED_VERTS( ctx, start, count ); 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Simulate flat-shaded quadstrips using indexed vertices: 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELT_INIT( GL_TRIANGLES ); 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_ELTS(); 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emit whole number of quads in total, and in each buffer. 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dmasz -= dmasz & 1; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= (count-start) & 1; 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz -= currentsz & 1; 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 12) 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = currentsz/6*2; 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dmasz = dmasz/6*2; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start; j + 3 < count; j += nr - 2 ) { 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nr >= 4) { 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint quads = (nr/2)-1; 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELTS_VARS( ALLOC_ELTS( quads*6 ) ); 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for ( i = j-start ; i < j-start+quads*2 ; i+=2 ) { 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_TWO_ELTS( 0, (i+0), (i+1) ); 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_TWO_ELTS( 2, (i+2), (i+1) ); 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_TWO_ELTS( 4, (i+3), (i+2) ); 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INCR_ELTS( 6 ); 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RELEASE_ELT_VERTS(); 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Vertices won't fit in a single buffer or elts not 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * available - should never happen. 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__); 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (HAVE_TRI_STRIPS) { 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emit smooth-shaded quadstrips as tristrips: 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INIT( GL_TRIANGLE_STRIP ); 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emit whole number of quads in total, and in each buffer. 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dmasz -= dmasz & 1; 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_VERTS(); 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz -= currentsz & 1; 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= (count-start) & 1; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) { 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start; j + 3 < count; j += nr - 2 ) { 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) ); 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__); 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_quads_verts)( struct gl_context *ctx, 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_QUADS) { 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = (GET_SUBSEQUENT_VB_MAX_VERTS()/4) * 4; 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INIT(GL_QUADS); 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emit whole number of quads in total. dmasz is already a multiple 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of 4. 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= (count-start)%4; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = (GET_CURRENT_VB_MAX_VERTS()/4) * 4; 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start; j < count; j += nr) { 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) ); 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (HAVE_ELTS) { 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Hardware doesn't have a quad primitive type -- try to 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * simulate it using indexed vertices and the triangle 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * primitive: 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_INDEXED_VERTS( ctx, start, count ); 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELT_INIT( GL_TRIANGLES ); 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_ELTS(); 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emit whole number of quads in total, and in each buffer. 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dmasz -= dmasz & 3; 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= (count-start) & 3; 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz -= currentsz & 3; 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Adjust for rendering as triangles: 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = currentsz/6*4; 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dmasz = dmasz/6*4; 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start; j < count; j += nr ) { 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nr >= 4) { 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint quads = nr/4; 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELTS_VARS( ALLOC_ELTS( quads*6 ) ); 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for ( i = j-start ; i < j-start+quads*4 ; i+=4 ) { 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_TWO_ELTS( 0, (i+0), (i+1) ); 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_TWO_ELTS( 2, (i+3), (i+1) ); 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_TWO_ELTS( 4, (i+2), (i+3) ); 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INCR_ELTS( 6 ); 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RELEASE_ELT_VERTS(); 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (HAVE_TRIANGLES) { 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Hardware doesn't have a quad primitive type -- try to 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * simulate it using triangle primitive. This is a win for 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * gears, but is it useful in the broader world? 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j; 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INIT(GL_TRIANGLES); 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start; j < count-3; j += 4) { 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *tmp = ALLOC_VERTS( 6 ); 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Send v0, v1, v3 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = EMIT_VERTS(ctx, j, 2, tmp); 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = EMIT_VERTS(ctx, j + 3, 1, tmp); 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Send v1, v2, v3 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = EMIT_VERTS(ctx, j + 1, 3, tmp); 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) tmp; 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Vertices won't fit in a single buffer, should never happen. 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__); 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_noop)( struct gl_context *ctx, 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic tnl_render_func TAG(render_tab_verts)[GL_POLYGON+2] = 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_points_verts), 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_lines_verts), 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_line_loop_verts), 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_line_strip_verts), 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_triangles_verts), 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_tri_strip_verts), 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_tri_fan_verts), 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_quads_verts), 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_quad_strip_verts), 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_poly_verts), 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_noop), 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************** 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Render elts using hardware indexed verts * 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ****************************************************************************/ 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if (HAVE_ELTS) 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_points_elts)( struct gl_context *ctx, 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_POINTS) { 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELT_INIT( GL_POINTS ); 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_ELTS(); 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start; j < count; j += nr ) { 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) ); 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__); 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_lines_elts)( struct gl_context *ctx, 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_LINES) { 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELT_INIT( GL_LINES ); 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emit whole number of lines in total and in each buffer: 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= (count-start) & 1; 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz -= currentsz & 1; 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dmasz -= dmasz & 1; 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_ELTS(); 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start; j < count; j += nr ) { 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) ); 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__); 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_line_strip_elts)( struct gl_context *ctx, 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_LINE_STRIPS) { 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); /* always a new primitive */ 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELT_INIT( GL_LINE_STRIP ); 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_ELTS(); 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start; j + 1 < count; j += nr - 1 ) { 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) ); 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO: Try to emit as indexed lines. 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__); 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_line_loop_elts)( struct gl_context *ctx, 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_LINE_STRIPS) { 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELT_INIT( GL_LINE_STRIP ); 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (flags & PRIM_BEGIN) 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org j = start; 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org j = start + 1; 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_ELTS(); 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) { 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Ensure last vertex doesn't wrap: 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz--; 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dmasz--; 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (j + 1 < count) { 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for ( ; j + 1 < count; j += nr - 1 ) { 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (j + nr >= count && 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org start < count - 1 && 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (flags & PRIM_END)) 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *tmp; 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = ALLOC_ELTS(nr+1); 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = TAG(emit_elts)( ctx, elts+j, nr, tmp ); 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = TAG(emit_elts)( ctx, elts+start, 1, tmp ); 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) tmp; 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) ); 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (start + 1 < count && (flags & PRIM_END)) { 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *tmp; 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = ALLOC_ELTS(2); 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = TAG(emit_elts)( ctx, elts+start+1, 1, tmp ); 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = TAG(emit_elts)( ctx, elts+start, 1, tmp ); 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) tmp; 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO: Try to emit as indexed lines */ 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__); 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* For verts, we still eliminate the copy from main memory to dma 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * buffers. For elts, this is probably no better (worse?) than the 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * standard path. 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_triangles_elts)( struct gl_context *ctx, 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS()/3*3; 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELT_INIT( GL_TRIANGLES ); 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_ELTS(); 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emit whole number of tris in total. dmasz is already a multiple 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of 3. 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= (count-start)%3; 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz -= currentsz%3; 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start; j < count; j += nr) { 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) ); 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_tri_strip_elts)( struct gl_context *ctx, 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_TRI_STRIPS) { 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELT_INIT( GL_TRIANGLE_STRIP ); 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_ELTS(); 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) { 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Keep the same winding over multiple buffers: 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dmasz -= (dmasz & 1); 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz -= (currentsz & 1); 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start ; j + 2 < count; j += nr - 2 ) { 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) ); 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO: try to emit as indexed triangles */ 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__); 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_tri_fan_elts)( struct gl_context *ctx, 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_TRI_FANS) { 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELT_INIT( GL_TRIANGLE_FAN ); 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_ELTS(); 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) { 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start + 1 ; j + 1 < count; j += nr - 2 ) { 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *tmp; 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j + 1 ); 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = ALLOC_ELTS( nr ); 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = TAG(emit_elts)( ctx, elts+start, 1, tmp ); 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = TAG(emit_elts)( ctx, elts+j, nr - 1, tmp ); 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) tmp; 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO: try to emit as indexed triangles */ 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__); 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_poly_elts)( struct gl_context *ctx, 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_POLYGONS) { 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELT_INIT( GL_POLYGON ); 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_ELTS(); 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) { 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start + 1 ; j + 1 < count; j += nr - 2 ) { 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *tmp; 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j + 1 ); 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = ALLOC_ELTS( nr ); 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = TAG(emit_elts)( ctx, elts+start, 1, tmp ); 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = TAG(emit_elts)( ctx, elts+j, nr - 1, tmp ); 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) tmp; 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (HAVE_TRI_FANS && ctx->Light.ShadeModel == GL_SMOOTH) { 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_tri_fan_verts)( ctx, start, count, flags ); 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__); 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_quad_strip_elts)( struct gl_context *ctx, 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_QUAD_STRIPS && 0) { 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (HAVE_TRI_STRIPS) { 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_ELTS(); 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emit whole number of quads in total, and in each buffer. 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dmasz -= dmasz & 1; 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= (count-start) & 1; 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz -= currentsz & 1; 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 12) 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Light.ShadeModel == GL_FLAT) { 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELT_INIT( GL_TRIANGLES ); 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = currentsz/6*2; 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dmasz = dmasz/6*2; 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start; j + 3 < count; j += nr - 2 ) { 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nr >= 4) 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint quads = (nr/2)-1; 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELTS_VARS( ALLOC_ELTS( quads*6 ) ); 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for ( i = j-start ; i < j-start+quads ; i++, elts += 2 ) { 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_TWO_ELTS( 0, elts[0], elts[1] ); 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_TWO_ELTS( 2, elts[2], elts[1] ); 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_TWO_ELTS( 4, elts[3], elts[2] ); 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INCR_ELTS( 6 ); 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELT_INIT( GL_TRIANGLE_STRIP ); 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start; j + 3 < count; j += nr - 2 ) { 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) ); 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_quads_elts)( struct gl_context *ctx, 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint start, 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count, 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags ) 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_QUADS) { 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS()/4*4; 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELT_INIT( GL_TRIANGLES ); 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_ELTS()/4*4; 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= (count-start)%4; 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start; j < count; j += nr) { 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) ); 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOCAL_VARS; 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int currentsz; 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, nr; 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELT_INIT( GL_TRIANGLES ); 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = GET_CURRENT_VB_MAX_ELTS(); 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emit whole number of quads in total, and in each buffer. 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dmasz -= dmasz & 3; 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= (count-start) & 3; 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz -= currentsz & 3; 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Adjust for rendering as triangles: 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = currentsz/6*4; 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dmasz = dmasz/6*4; 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (currentsz < 8) 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = start; j + 3 < count; j += nr - 2 ) { 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2( currentsz, count - j ); 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nr >= 4) 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint quads = nr/4; 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELTS_VARS( ALLOC_ELTS( quads * 6 ) ); 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for ( i = j-start ; i < j-start+quads ; i++, elts += 4 ) { 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_TWO_ELTS( 0, elts[0], elts[1] ); 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_TWO_ELTS( 2, elts[3], elts[1] ); 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_TWO_ELTS( 4, elts[2], elts[3] ); 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INCR_ELTS( 6 ); 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH(); 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org currentsz = dmasz; 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic tnl_render_func TAG(render_tab_elts)[GL_POLYGON+2] = 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_points_elts), 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_lines_elts), 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_line_loop_elts), 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_line_strip_elts), 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_triangles_elts), 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_tri_strip_elts), 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_tri_fan_elts), 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_quads_elts), 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_quad_strip_elts), 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_poly_elts), 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TAG(render_noop), 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Pre-check the primitives in the VB to prevent the need for 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fallbacks later on. 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean TAG(validate_render)( struct gl_context *ctx, 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex_buffer *VB ) 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (VB->ClipOrMask & ~CLIP_CULL_BIT) 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (VB->Elts && !HAVE_ELTS) 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0 ; i < VB->PrimitiveCount ; i++) { 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint prim = VB->Primitive[i].mode; 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count = VB->Primitive[i].count; 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean ok = GL_FALSE; 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!count) 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (prim & PRIM_MODE_MASK) { 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_POINTS: 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ok = HAVE_POINTS; 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LINES: 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ok = HAVE_LINES && !ctx->Line.StippleFlag; 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LINE_STRIP: 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ok = HAVE_LINE_STRIPS && !ctx->Line.StippleFlag; 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LINE_LOOP: 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ok = HAVE_LINE_STRIPS && !ctx->Line.StippleFlag; 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TRIANGLES: 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ok = HAVE_TRIANGLES; 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TRIANGLE_STRIP: 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ok = HAVE_TRI_STRIPS; 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TRIANGLE_FAN: 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ok = HAVE_TRI_FANS; 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_POLYGON: 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_POLYGONS) { 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ok = GL_TRUE; 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ok = (HAVE_TRI_FANS && ctx->Light.ShadeModel == GL_SMOOTH); 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_QUAD_STRIP: 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (VB->Elts) { 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ok = HAVE_TRI_STRIPS; 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (HAVE_QUAD_STRIPS) { 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ok = GL_TRUE; 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (HAVE_TRI_STRIPS && 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Light.ShadeModel == GL_FLAT && 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride != 0) { 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_ELTS) { 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ok = (GLint) count < GET_SUBSEQUENT_VB_MAX_ELTS(); 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ok = GL_FALSE; 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ok = HAVE_TRI_STRIPS; 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_QUADS: 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (HAVE_QUADS) { 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ok = GL_TRUE; 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (HAVE_ELTS) { 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ok = (GLint) count < GET_SUBSEQUENT_VB_MAX_ELTS(); 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ok = HAVE_TRIANGLES; /* flatshading is ok. */ 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ok) { 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* fprintf(stderr, "not ok %s\n", _mesa_lookup_enum_by_nr(prim & PRIM_MODE_MASK)); */ 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1267