vbo_exec_draw.c revision 99efde461d3b8615863bdb7308e05289e0db0422
1fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* 2fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Mesa 3-D graphics library 3fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Version: 5.1 4fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 5fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Copyright (C) 1999-2003 Brian Paul All Rights Reserved. 6fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 7fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 8fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * copy of this software and associated documentation files (the "Software"), 9fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * to deal in the Software without restriction, including without limitation 10fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * and/or sell copies of the Software, and to permit persons to whom the 12fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Software is furnished to do so, subject to the following conditions: 13fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 14fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * The above copyright notice and this permission notice shall be included 15fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * in all copies or substantial portions of the Software. 16fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 17fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 24fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Authors: 25fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Keith Whitwell <keith@tungstengraphics.com> 26fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 27fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 28fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "glheader.h" 29fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "context.h" 30fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "enums.h" 31fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "state.h" 32fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "macros.h" 33fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 34fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "vbo_context.h" 35fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 36fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 37fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstatic void vbo_exec_debug_verts( struct vbo_exec_context *exec ) 38fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 39fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint count = exec->vtx.vert_count; 40fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint i; 41fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 42fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _mesa_printf("%s: %u vertices %d primitives, %d vertsize\n", 43fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell __FUNCTION__, 44fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell count, 45fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtx.prim_count, 46fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtx.vertex_size); 47fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 48fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0 ; i < exec->vtx.prim_count ; i++) { 49fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct _mesa_prim *prim = &exec->vtx.prim[i]; 50fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _mesa_printf(" prim %d: %s%s %d..%d %s %s\n", 51fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell i, 52fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _mesa_lookup_enum_by_nr(prim->mode), 53fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim->weak ? " (weak)" : "", 54fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim->start, 55fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim->start + prim->count, 56fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim->begin ? "BEGIN" : "(wrap)", 57fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim->end ? "END" : "(wrap)"); 58fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 59fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 60fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 61fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 62fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* 63fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * NOTE: Need to have calculated primitives by this point -- do it on the fly. 64fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * NOTE: Old 'parity' issue is gone. 65fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 66fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstatic GLuint vbo_copy_vertices( struct vbo_exec_context *exec ) 67fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 68fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint nr = exec->vtx.prim[exec->vtx.prim_count-1].count; 69fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint ovf, i; 70fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint sz = exec->vtx.vertex_size; 71fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLfloat *dst = exec->vtx.copied.buffer; 72fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLfloat *src = ((GLfloat *)exec->vtx.buffer_map + 73fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtx.prim[exec->vtx.prim_count-1].start * 74fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtx.vertex_size); 75fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 76fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 77fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell switch( exec->ctx->Driver.CurrentExecPrimitive ) 78fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell { 79fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_POINTS: 80fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return 0; 81fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_LINES: 82fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ovf = nr&1; 83fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0 ; i < ovf ; i++) 84fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _mesa_memcpy( dst+i*sz, src+(nr-ovf+i)*sz, sz * sizeof(GLfloat) ); 85fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return i; 86fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_TRIANGLES: 87fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ovf = nr%3; 88fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0 ; i < ovf ; i++) 89fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _mesa_memcpy( dst+i*sz, src+(nr-ovf+i)*sz, sz * sizeof(GLfloat) ); 90fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return i; 91fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_QUADS: 92fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ovf = nr&3; 93fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0 ; i < ovf ; i++) 94fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _mesa_memcpy( dst+i*sz, src+(nr-ovf+i)*sz, sz * sizeof(GLfloat) ); 95fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return i; 96fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_LINE_STRIP: 97fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (nr == 0) 98fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return 0; 99fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell else { 100fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _mesa_memcpy( dst, src+(nr-1)*sz, sz * sizeof(GLfloat) ); 101fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return 1; 102fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 103fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_LINE_LOOP: 104fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_TRIANGLE_FAN: 105fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_POLYGON: 106fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (nr == 0) 107fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return 0; 108fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell else if (nr == 1) { 109fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _mesa_memcpy( dst, src+0, sz * sizeof(GLfloat) ); 110fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return 1; 111fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } else { 112fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _mesa_memcpy( dst, src+0, sz * sizeof(GLfloat) ); 113fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _mesa_memcpy( dst+sz, src+(nr-1)*sz, sz * sizeof(GLfloat) ); 114fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return 2; 115fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 116fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_TRIANGLE_STRIP: 117fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_QUAD_STRIP: 118fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell switch (nr) { 119fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case 0: ovf = 0; break; 120fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case 1: ovf = 1; break; 121fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell default: ovf = 2 + (nr&1); break; 122fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 123fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0 ; i < ovf ; i++) 124fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _mesa_memcpy( dst+i*sz, src+(nr-ovf+i)*sz, sz * sizeof(GLfloat) ); 125fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return i; 126fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_POLYGON+1: 127fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return 0; 128fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell default: 129fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell assert(0); 130fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return 0; 131fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 132fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 133fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 134fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 13599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 136fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* TODO: populate these as the vertex is defined: 137fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 13899efde461d3b8615863bdb7308e05289e0db0422Keith Whitwellstatic void vbo_exec_bind_arrays( GLcontext *ctx ) 139fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 14099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell struct vbo_context *vbo = vbo_context(ctx); 14199efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell struct vbo_exec_context *exec = &vbo->exec; 142fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct gl_client_array *arrays = exec->vtx.arrays; 143fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint count = exec->vtx.vert_count; 144fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLubyte *data = exec->vtx.buffer_map; 14599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell const GLuint *map; 146fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint attr; 147fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 14899efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell /* Install the default (ie Current) attributes first, then overlay 14999efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell * all active ones. 15099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell */ 15199efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell switch (get_program_mode(exec->ctx)) { 15299efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell case VP_NONE: 15399efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell memcpy(arrays, vbo->legacy_currval, 16 * sizeof(arrays[0])); 15499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell memcpy(arrays + 16, vbo->mat_currval, 16 * sizeof(arrays[0])); 15599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell map = vbo->map_vp_none; 15699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell break; 15799efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell case VP_NV: 15899efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell case VP_ARB: 15999efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell /* The aliasing of attributes for NV vertex programs has already 16099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell * occurred. NV vertex programs cannot access material values, 16199efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell * nor attributes greater than VERT_ATTRIB_TEX7. 16299efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell */ 16399efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell memcpy(arrays, vbo->legacy_currval, 16 * sizeof(arrays[0])); 16499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell memcpy(arrays + 16, vbo->generic_currval, 16 * sizeof(arrays[0])); 16599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell map = vbo->map_vp_arb; 16699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell break; 16799efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell } 168fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 169fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* Make all active attributes (including edgeflag) available as 170fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * arrays of floats. 171fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 17299efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell for (attr = 0; attr < VERT_ATTRIB_MAX ; attr++) { 17399efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell GLuint src = map[attr]; 17499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 17599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell if (exec->vtx.attrsz[src]) { 176fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell arrays[attr].Ptr = (void *)data; 17799efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell arrays[attr].Size = exec->vtx.attrsz[src]; 178fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell arrays[attr].StrideB = exec->vtx.vertex_size * sizeof(GLfloat); 179fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell arrays[attr].Stride = exec->vtx.vertex_size * sizeof(GLfloat); 180fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell arrays[attr].Type = GL_FLOAT; 181fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell arrays[attr].Enabled = 1; 182fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell arrays[attr].BufferObj = exec->vtx.bufferobj; /* NullBufferObj */ 183fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell arrays[attr]._MaxElement = count; /* ??? */ 184fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 185fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell data += exec->vtx.attrsz[attr] * sizeof(GLfloat); 186fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 187fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 188fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 189fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 190fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 191fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/** 192fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Execute the buffer and save copied verts. 193fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 194fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellvoid vbo_exec_vtx_flush( struct vbo_exec_context *exec ) 195fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 196fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (0) 197fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell vbo_exec_debug_verts( exec ); 198fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 199fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 200fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (exec->vtx.prim_count && 201fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtx.vert_count) { 202fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 203fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtx.copied.nr = vbo_copy_vertices( exec ); 204fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 205fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (exec->vtx.copied.nr != exec->vtx.vert_count) { 206fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLcontext *ctx = exec->ctx; 207fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 20899efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell vbo_exec_bind_arrays( ctx ); 209fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 210fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell vbo_context(ctx)->draw_prims( ctx, 211fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtx.inputs, 212fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtx.prim, 213fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtx.prim_count, 214fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell NULL, 215fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 0, 216fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtx.vert_count ); 217fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 218fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 219fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 220fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtx.prim_count = 0; 221fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtx.vert_count = 0; 222fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtx.vbptr = (GLfloat *)exec->vtx.buffer_map; 223fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 224