1fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* 2fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Mesa 3-D graphics library 337c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul * Version: 7.2 4fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 537c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul * Copyright (C) 1999-2008 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 28c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian#include "main/glheader.h" 2937c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul#include "main/bufferobj.h" 309846b0627149e221c9fbd7c3379e33fb68e68511Vinson Lee#include "main/compiler.h" 3197dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul#include "main/context.h" 32c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian#include "main/enums.h" 3314b36cd568b7f3ae963430248fcd7ef0b7a165f6Vinson Lee#include "main/mfeatures.h" 34c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian#include "main/state.h" 3597dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul#include "main/vtxfmt.h" 36fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 37fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "vbo_context.h" 3897dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul#include "vbo_noop.h" 39fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 40fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 41cef97267d696d37f4dccb22951499ca25d5d87adChia-I Wu#if FEATURE_beginend 42cef97267d696d37f4dccb22951499ca25d5d87adChia-I Wu 43cef97267d696d37f4dccb22951499ca25d5d87adChia-I Wu 444b55e3695279daef221669ff063631cf3675da0cBrian Paulstatic void 454b55e3695279daef221669ff063631cf3675da0cBrian Paulvbo_exec_debug_verts( struct vbo_exec_context *exec ) 46fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 47fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint count = exec->vtx.vert_count; 48fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint i; 49fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 50298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("%s: %u vertices %d primitives, %d vertsize\n", 51298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg __FUNCTION__, 52298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg count, 53298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg exec->vtx.prim_count, 54298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg exec->vtx.vertex_size); 55fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 56fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0 ; i < exec->vtx.prim_count ; i++) { 57fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct _mesa_prim *prim = &exec->vtx.prim[i]; 58298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(" prim %d: %s%s %d..%d %s %s\n", 59298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg i, 60298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_lookup_prim_by_nr(prim->mode), 61298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg prim->weak ? " (weak)" : "", 62298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg prim->start, 63298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg prim->start + prim->count, 64298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg prim->begin ? "BEGIN" : "(wrap)", 65298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg prim->end ? "END" : "(wrap)"); 66fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 67fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 68fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 69fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 70fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* 71fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * NOTE: Need to have calculated primitives by this point -- do it on the fly. 72fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * NOTE: Old 'parity' issue is gone. 73fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 744b55e3695279daef221669ff063631cf3675da0cBrian Paulstatic GLuint 754b55e3695279daef221669ff063631cf3675da0cBrian Paulvbo_copy_vertices( struct vbo_exec_context *exec ) 76fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 77fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint nr = exec->vtx.prim[exec->vtx.prim_count-1].count; 78fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint ovf, i; 79fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint sz = exec->vtx.vertex_size; 80fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLfloat *dst = exec->vtx.copied.buffer; 814b55e3695279daef221669ff063631cf3675da0cBrian Paul const GLfloat *src = (exec->vtx.buffer_map + 824b55e3695279daef221669ff063631cf3675da0cBrian Paul exec->vtx.prim[exec->vtx.prim_count-1].start * 834b55e3695279daef221669ff063631cf3675da0cBrian Paul exec->vtx.vertex_size); 84fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 85fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 864b55e3695279daef221669ff063631cf3675da0cBrian Paul switch (exec->ctx->Driver.CurrentExecPrimitive) { 87fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_POINTS: 88fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return 0; 89fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_LINES: 90fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ovf = nr&1; 91fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0 ; i < ovf ; i++) 92c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy( dst+i*sz, src+(nr-ovf+i)*sz, sz * sizeof(GLfloat) ); 93fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return i; 94fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_TRIANGLES: 95fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ovf = nr%3; 96fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0 ; i < ovf ; i++) 97c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy( dst+i*sz, src+(nr-ovf+i)*sz, sz * sizeof(GLfloat) ); 98fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return i; 99fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_QUADS: 100fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ovf = nr&3; 101fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0 ; i < ovf ; i++) 102c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy( dst+i*sz, src+(nr-ovf+i)*sz, sz * sizeof(GLfloat) ); 103fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return i; 104fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_LINE_STRIP: 1054b55e3695279daef221669ff063631cf3675da0cBrian Paul if (nr == 0) { 106fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return 0; 1074b55e3695279daef221669ff063631cf3675da0cBrian Paul } 108fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell else { 109c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy( dst, src+(nr-1)*sz, sz * sizeof(GLfloat) ); 110fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return 1; 111fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 112fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_LINE_LOOP: 113fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_TRIANGLE_FAN: 114fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_POLYGON: 1154b55e3695279daef221669ff063631cf3675da0cBrian Paul if (nr == 0) { 116fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return 0; 1174b55e3695279daef221669ff063631cf3675da0cBrian Paul } 118fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell else if (nr == 1) { 119c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy( dst, src+0, sz * sizeof(GLfloat) ); 120fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return 1; 1214b55e3695279daef221669ff063631cf3675da0cBrian Paul } 1224b55e3695279daef221669ff063631cf3675da0cBrian Paul else { 123c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy( dst, src+0, sz * sizeof(GLfloat) ); 124c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy( dst+sz, src+(nr-1)*sz, sz * sizeof(GLfloat) ); 125fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return 2; 126fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 127fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_TRIANGLE_STRIP: 1285970400476c5c0a1223a49e9ec2eb511ae94b246Roland Scheidegger /* no parity issue, but need to make sure the tri is not drawn twice */ 1295970400476c5c0a1223a49e9ec2eb511ae94b246Roland Scheidegger if (nr & 1) { 1305970400476c5c0a1223a49e9ec2eb511ae94b246Roland Scheidegger exec->vtx.prim[exec->vtx.prim_count-1].count--; 1315970400476c5c0a1223a49e9ec2eb511ae94b246Roland Scheidegger } 1325970400476c5c0a1223a49e9ec2eb511ae94b246Roland Scheidegger /* fallthrough */ 133fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_QUAD_STRIP: 134fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell switch (nr) { 1354b55e3695279daef221669ff063631cf3675da0cBrian Paul case 0: 1364b55e3695279daef221669ff063631cf3675da0cBrian Paul ovf = 0; 1374b55e3695279daef221669ff063631cf3675da0cBrian Paul break; 1384b55e3695279daef221669ff063631cf3675da0cBrian Paul case 1: 1394b55e3695279daef221669ff063631cf3675da0cBrian Paul ovf = 1; 1404b55e3695279daef221669ff063631cf3675da0cBrian Paul break; 1414b55e3695279daef221669ff063631cf3675da0cBrian Paul default: 1424b55e3695279daef221669ff063631cf3675da0cBrian Paul ovf = 2 + (nr & 1); 1434b55e3695279daef221669ff063631cf3675da0cBrian Paul break; 144fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 145fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0 ; i < ovf ; i++) 146c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy( dst+i*sz, src+(nr-ovf+i)*sz, sz * sizeof(GLfloat) ); 147fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return i; 1489acf207277b4de91b917b37a92f6b612f4710c80Brian Paul case PRIM_OUTSIDE_BEGIN_END: 149fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return 0; 150fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell default: 151fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell assert(0); 152fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return 0; 153fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 154fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 155fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 156fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 15799efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 158fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* TODO: populate these as the vertex is defined: 159fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 1604b55e3695279daef221669ff063631cf3675da0cBrian Paulstatic void 161f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvbo_exec_bind_arrays( struct gl_context *ctx ) 162fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 16399efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell struct vbo_context *vbo = vbo_context(ctx); 16499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell struct vbo_exec_context *exec = &vbo->exec; 165fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct gl_client_array *arrays = exec->vtx.arrays; 1664b55e3695279daef221669ff063631cf3675da0cBrian Paul const GLuint count = exec->vtx.vert_count; 16799efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell const GLuint *map; 168fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint attr; 169dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich GLbitfield64 varying_inputs = 0x0; 170fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 17199efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell /* Install the default (ie Current) attributes first, then overlay 17299efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell * all active ones. 17399efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell */ 17499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell switch (get_program_mode(exec->ctx)) { 17599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell case VP_NONE: 176ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich for (attr = 0; attr < VERT_ATTRIB_FF_MAX; attr++) { 177fa48137f292bbf8cbcd65e9caf33633cddc96600Marek Olšák exec->vtx.inputs[attr] = &vbo->currval[VBO_ATTRIB_POS+attr]; 17837c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul } 17937c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul for (attr = 0; attr < MAT_ATTRIB_MAX; attr++) { 180ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich ASSERT(VERT_ATTRIB_GENERIC(attr) < Elements(exec->vtx.inputs)); 18197e2f625b8bcba96acde29dcd017031e036f4a24Marek Olšák exec->vtx.inputs[VERT_ATTRIB_GENERIC(attr)] = 18297e2f625b8bcba96acde29dcd017031e036f4a24Marek Olšák &vbo->currval[VBO_ATTRIB_MAT_FRONT_AMBIENT+attr]; 18337c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul } 18499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell map = vbo->map_vp_none; 18599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell break; 18699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell case VP_NV: 18799efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell case VP_ARB: 18899efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell /* The aliasing of attributes for NV vertex programs has already 18999efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell * occurred. NV vertex programs cannot access material values, 19099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell * nor attributes greater than VERT_ATTRIB_TEX7. 19199efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell */ 192ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich for (attr = 0; attr < VERT_ATTRIB_FF_MAX; attr++) { 193fa48137f292bbf8cbcd65e9caf33633cddc96600Marek Olšák exec->vtx.inputs[attr] = &vbo->currval[VBO_ATTRIB_POS+attr]; 194ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich } 195ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich for (attr = 0; attr < VERT_ATTRIB_GENERIC_MAX; attr++) { 196ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich ASSERT(VERT_ATTRIB_GENERIC(attr) < Elements(exec->vtx.inputs)); 1978c990de0d682bbedfd7e1988d4f8948ea99b0cc3Marek Olšák exec->vtx.inputs[VERT_ATTRIB_GENERIC(attr)] = 1988c990de0d682bbedfd7e1988d4f8948ea99b0cc3Marek Olšák &vbo->currval[VBO_ATTRIB_GENERIC0+attr]; 19937c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul } 20099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell map = vbo->map_vp_arb; 201dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul 202dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul /* check if VERT_ATTRIB_POS is not read but VERT_BIT_GENERIC0 is read. 203dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul * In that case we effectively need to route the data from 204dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul * glVertexAttrib(0, val) calls to feed into the GENERIC0 input. 205dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul */ 206dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul if ((ctx->VertexProgram._Current->Base.InputsRead & VERT_BIT_POS) == 0 && 207dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul (ctx->VertexProgram._Current->Base.InputsRead & VERT_BIT_GENERIC0)) { 208ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich exec->vtx.inputs[VERT_ATTRIB_GENERIC0] = exec->vtx.inputs[0]; 209ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich exec->vtx.attrsz[VERT_ATTRIB_GENERIC0] = exec->vtx.attrsz[0]; 210ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich exec->vtx.attrptr[VERT_ATTRIB_GENERIC0] = exec->vtx.attrptr[0]; 211dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul exec->vtx.attrsz[0] = 0; 212dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul } 21399efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell break; 214dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul default: 215dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul assert(0); 21699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell } 217fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 21899efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell for (attr = 0; attr < VERT_ATTRIB_MAX ; attr++) { 2196f765fbde42a4f729780aa39d2b0ed9d736dd5a8Brian const GLuint src = map[attr]; 22099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 22199efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell if (exec->vtx.attrsz[src]) { 2222e64c2209e7f9d5acbcc9d70bf315732f3c403b3Francisco Jerez GLsizeiptr offset = (GLbyte *)exec->vtx.attrptr[src] - 2232e64c2209e7f9d5acbcc9d70bf315732f3c403b3Francisco Jerez (GLbyte *)exec->vtx.vertex; 2242e64c2209e7f9d5acbcc9d70bf315732f3c403b3Francisco Jerez 22537c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul /* override the default array set above */ 2261c3f7ab74ce492d6c92f2e3a0f29957fa9a71d96Brian Paul ASSERT(attr < Elements(exec->vtx.inputs)); 2271c3f7ab74ce492d6c92f2e3a0f29957fa9a71d96Brian Paul ASSERT(attr < Elements(exec->vtx.arrays)); /* arrays[] */ 22837c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul exec->vtx.inputs[attr] = &arrays[attr]; 22937c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul 230bd4c6a2e503db43e81ef41f77d876308badd93ebBrian Paul if (_mesa_is_bufferobj(exec->vtx.bufferobj)) { 2316f765fbde42a4f729780aa39d2b0ed9d736dd5a8Brian /* a real buffer obj: Ptr is an offset, not a pointer*/ 2326f765fbde42a4f729780aa39d2b0ed9d736dd5a8Brian assert(exec->vtx.bufferobj->Pointer); /* buf should be mapped */ 2336f765fbde42a4f729780aa39d2b0ed9d736dd5a8Brian assert(offset >= 0); 2342e64c2209e7f9d5acbcc9d70bf315732f3c403b3Francisco Jerez arrays[attr].Ptr = (GLubyte *)exec->vtx.bufferobj->Offset + offset; 2356f765fbde42a4f729780aa39d2b0ed9d736dd5a8Brian } 2366f765fbde42a4f729780aa39d2b0ed9d736dd5a8Brian else { 2376f765fbde42a4f729780aa39d2b0ed9d736dd5a8Brian /* Ptr into ordinary app memory */ 2382e64c2209e7f9d5acbcc9d70bf315732f3c403b3Francisco Jerez arrays[attr].Ptr = (GLubyte *)exec->vtx.buffer_map + offset; 2396f765fbde42a4f729780aa39d2b0ed9d736dd5a8Brian } 24099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell arrays[attr].Size = exec->vtx.attrsz[src]; 241fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell arrays[attr].StrideB = exec->vtx.vertex_size * sizeof(GLfloat); 242fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell arrays[attr].Stride = exec->vtx.vertex_size * sizeof(GLfloat); 243492b69f3be3e355064c67bc6f4a30d40e997ce9dMarek Olšák arrays[attr].Type = exec->vtx.attrtype[src]; 244492b69f3be3e355064c67bc6f4a30d40e997ce9dMarek Olšák arrays[attr].Integer = 245492b69f3be3e355064c67bc6f4a30d40e997ce9dMarek Olšák vbo_attrtype_to_integer_flag(exec->vtx.attrtype[src]); 246ded949ed06e02ef26b1168b101daba04be78155eBrian Paul arrays[attr].Format = GL_RGBA; 247fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell arrays[attr].Enabled = 1; 248204991bf5d29caa3fa54df9e4f6898faa73752cfBrian Paul arrays[attr]._ElementSize = arrays[attr].Size * sizeof(GLfloat); 24937c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul _mesa_reference_buffer_object(ctx, 25037c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul &arrays[attr].BufferObj, 25137c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul exec->vtx.bufferobj); 252fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell arrays[attr]._MaxElement = count; /* ??? */ 253fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 254ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich varying_inputs |= VERT_BIT(attr); 255fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 256fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 2571680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell 2581680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell _mesa_set_varying_vp_inputs( ctx, varying_inputs ); 259c5e473fbe25b20cb27aac44ff6e269701abd33a8Marek Olšák ctx->NewDriverState |= ctx->DriverFlags.NewArray; 260fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 261fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 262fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 263f0c8e7c32766cb78756de24a9ca5e8c28017a682Brian Paul/** 264f0c8e7c32766cb78756de24a9ca5e8c28017a682Brian Paul * Unmap the VBO. This is called before drawing. 265f0c8e7c32766cb78756de24a9ca5e8c28017a682Brian Paul */ 2664b55e3695279daef221669ff063631cf3675da0cBrian Paulstatic void 2674b55e3695279daef221669ff063631cf3675da0cBrian Paulvbo_exec_vtx_unmap( struct vbo_exec_context *exec ) 268c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell{ 269bd4c6a2e503db43e81ef41f77d876308badd93ebBrian Paul if (_mesa_is_bufferobj(exec->vtx.bufferobj)) { 270f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx = exec->ctx; 271cfd5298f240612ef69ae321aebbc425710a8d731José Fonseca 2724b55e3695279daef221669ff063631cf3675da0cBrian Paul if (ctx->Driver.FlushMappedBufferRange) { 2738ad65a23d14f82461c00b1d8dcc1393167f36ab0José Fonseca GLintptr offset = exec->vtx.buffer_used - exec->vtx.bufferobj->Offset; 2748ad65a23d14f82461c00b1d8dcc1393167f36ab0José Fonseca GLsizeiptr length = (exec->vtx.buffer_ptr - exec->vtx.buffer_map) * sizeof(float); 2758ad65a23d14f82461c00b1d8dcc1393167f36ab0José Fonseca 2764b55e3695279daef221669ff063631cf3675da0cBrian Paul if (length) 2776183edc070e2d3dce36ab5ee7aee72b0c38775a7Ian Romanick ctx->Driver.FlushMappedBufferRange(ctx, offset, length, 2788ad65a23d14f82461c00b1d8dcc1393167f36ab0José Fonseca exec->vtx.bufferobj); 2798ad65a23d14f82461c00b1d8dcc1393167f36ab0José Fonseca } 280c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 281c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell exec->vtx.buffer_used += (exec->vtx.buffer_ptr - 282c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell exec->vtx.buffer_map) * sizeof(float); 283368ca83a3fdfbe8dfe591ab73d29c500d1a91c0aKeith Whitwell 284368ca83a3fdfbe8dfe591ab73d29c500d1a91c0aKeith Whitwell assert(exec->vtx.buffer_used <= VBO_VERT_BUFFER_SIZE); 285368ca83a3fdfbe8dfe591ab73d29c500d1a91c0aKeith Whitwell assert(exec->vtx.buffer_ptr != NULL); 286368ca83a3fdfbe8dfe591ab73d29c500d1a91c0aKeith Whitwell 28756f0c00f125ee75caeadc1c9e8cab8a488635e5eIan Romanick ctx->Driver.UnmapBuffer(ctx, exec->vtx.bufferobj); 288c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell exec->vtx.buffer_map = NULL; 289c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell exec->vtx.buffer_ptr = NULL; 290c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell exec->vtx.max_vert = 0; 291c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell } 292c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell} 293c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 2944b55e3695279daef221669ff063631cf3675da0cBrian Paul 295f0c8e7c32766cb78756de24a9ca5e8c28017a682Brian Paul/** 296f0c8e7c32766cb78756de24a9ca5e8c28017a682Brian Paul * Map the vertex buffer to begin storing glVertex, glColor, etc data. 297f0c8e7c32766cb78756de24a9ca5e8c28017a682Brian Paul */ 2984b55e3695279daef221669ff063631cf3675da0cBrian Paulvoid 2994b55e3695279daef221669ff063631cf3675da0cBrian Paulvbo_exec_vtx_map( struct vbo_exec_context *exec ) 300c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell{ 301f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx = exec->ctx; 3026e09c1fd085361212c5bfccf6b2810f3f8052231José Fonseca const GLenum accessRange = GL_MAP_WRITE_BIT | /* for MapBufferRange */ 3036e09c1fd085361212c5bfccf6b2810f3f8052231José Fonseca GL_MAP_INVALIDATE_RANGE_BIT | 3046e09c1fd085361212c5bfccf6b2810f3f8052231José Fonseca GL_MAP_UNSYNCHRONIZED_BIT | 3056e09c1fd085361212c5bfccf6b2810f3f8052231José Fonseca GL_MAP_FLUSH_EXPLICIT_BIT | 3066e09c1fd085361212c5bfccf6b2810f3f8052231José Fonseca MESA_MAP_NOWAIT_BIT; 3076e09c1fd085361212c5bfccf6b2810f3f8052231José Fonseca const GLenum usage = GL_STREAM_DRAW_ARB; 308c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 309bd4c6a2e503db43e81ef41f77d876308badd93ebBrian Paul if (!_mesa_is_bufferobj(exec->vtx.bufferobj)) 310c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell return; 311c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 3120ba2810e47d68ec24a93c5fc74cf99afe50e8c9bBrian Paul assert(!exec->vtx.buffer_map); 3130ba2810e47d68ec24a93c5fc74cf99afe50e8c9bBrian Paul assert(!exec->vtx.buffer_ptr); 314c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 31528249bd260f4c52badf3eb61ade2744604b21bcaIan Romanick if (VBO_VERT_BUFFER_SIZE > exec->vtx.buffer_used + 1024) { 316f0c8e7c32766cb78756de24a9ca5e8c28017a682Brian Paul /* The VBO exists and there's room for more */ 31797dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul if (exec->vtx.bufferobj->Size > 0) { 31897dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul exec->vtx.buffer_map = 31997dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul (GLfloat *)ctx->Driver.MapBufferRange(ctx, 32097dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul exec->vtx.buffer_used, 32197dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul (VBO_VERT_BUFFER_SIZE - 32297dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul exec->vtx.buffer_used), 32397dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul accessRange, 32497dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul exec->vtx.bufferobj); 32597dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul exec->vtx.buffer_ptr = exec->vtx.buffer_map; 32697dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul } 32797dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul else { 32897dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul exec->vtx.buffer_ptr = exec->vtx.buffer_map = NULL; 32997dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul } 330c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell } 331004d8f11882c6c149a395cf2e86d5d5fb3fa114bJosé Fonseca 332004d8f11882c6c149a395cf2e86d5d5fb3fa114bJosé Fonseca if (!exec->vtx.buffer_map) { 333f0c8e7c32766cb78756de24a9ca5e8c28017a682Brian Paul /* Need to allocate a new VBO */ 334c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell exec->vtx.buffer_used = 0; 335c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 33697dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul if (ctx->Driver.BufferData(ctx, GL_ARRAY_BUFFER_ARB, 33797dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul VBO_VERT_BUFFER_SIZE, 33897dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul NULL, usage, exec->vtx.bufferobj)) { 33997dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul /* buffer allocation worked, now map the buffer */ 34097dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul exec->vtx.buffer_map = 34197dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul (GLfloat *)ctx->Driver.MapBufferRange(ctx, 34297dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul 0, VBO_VERT_BUFFER_SIZE, 34397dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul accessRange, 34497dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul exec->vtx.bufferobj); 34597dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul } 34697dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul else { 34797dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "VBO allocation"); 34897dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul exec->vtx.buffer_map = NULL; 34997dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul } 35097dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul } 351c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 35297dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul exec->vtx.buffer_ptr = exec->vtx.buffer_map; 3536e09c1fd085361212c5bfccf6b2810f3f8052231José Fonseca 35497dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul if (!exec->vtx.buffer_map) { 35597dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul /* out of memory */ 35697dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul _mesa_install_exec_vtxfmt( ctx, &exec->vtxfmt_noop ); 35797dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul } 35897dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul else { 35997dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul if (_mesa_using_noop_vtxfmt(ctx->Exec)) { 36097dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul /* The no-op functions are installed so switch back to regular 36197dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul * functions. We do this test just to avoid frequent and needless 36297dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul * calls to _mesa_install_exec_vtxfmt(). 36397dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul */ 36497dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul _mesa_install_exec_vtxfmt(ctx, &exec->vtxfmt); 36597dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul } 366c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell } 367c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 3684b55e3695279daef221669ff063631cf3675da0cBrian Paul if (0) 369298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("map %d..\n", exec->vtx.buffer_used); 370c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell} 371c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 372c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 373c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 374fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/** 375fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Execute the buffer and save copied verts. 3767cba2df4a6f3b4435fe4be277db4a87b2a0f89e3Brian Paul * \param keep_unmapped if true, leave the VBO unmapped when we're done. 377fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 3784b55e3695279daef221669ff063631cf3675da0cBrian Paulvoid 3797cba2df4a6f3b4435fe4be277db4a87b2a0f89e3Brian Paulvbo_exec_vtx_flush(struct vbo_exec_context *exec, GLboolean keepUnmapped) 380fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 381fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (0) 382fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell vbo_exec_debug_verts( exec ); 383fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 384fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (exec->vtx.prim_count && 385fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtx.vert_count) { 386fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 387fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtx.copied.nr = vbo_copy_vertices( exec ); 388fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 389fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (exec->vtx.copied.nr != exec->vtx.vert_count) { 390f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx = exec->ctx; 39133fef8be825ee8ec6abc0c2ffd9a3a967d84df88Keith Whitwell 392576c8c592a4be7047a00b0c8fe3851b09f10d8d4Marek Olšák /* Before the update_state() as this may raise _NEW_VARYING_VP_INPUTS 393c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell * from _mesa_set_varying_vp_inputs(). 39433fef8be825ee8ec6abc0c2ffd9a3a967d84df88Keith Whitwell */ 39599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell vbo_exec_bind_arrays( ctx ); 396fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 3971680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell if (ctx->NewState) 3981680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell _mesa_update_state( ctx ); 3991680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell 400bd4c6a2e503db43e81ef41f77d876308badd93ebBrian Paul if (_mesa_is_bufferobj(exec->vtx.bufferobj)) { 401c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell vbo_exec_vtx_unmap( exec ); 4026222eb3fcd12147ea2e7ccc20a71a921cebbb0d2Brian Paul } 40333fef8be825ee8ec6abc0c2ffd9a3a967d84df88Keith Whitwell 4044b55e3695279daef221669ff063631cf3675da0cBrian Paul if (0) 405298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("%s %d %d\n", __FUNCTION__, exec->vtx.prim_count, 406298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg exec->vtx.vert_count); 4079d4ab42f4be3a26f702729cc79ef67f8afc2eca5Keith Whitwell 408fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell vbo_context(ctx)->draw_prims( ctx, 40950f7e75f9e945cfbb2ae868cc961a2205a0b6e73Marek Olšák exec->vtx.prim, 410fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtx.prim_count, 411fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell NULL, 4122708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt GL_TRUE, 413fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 0, 41414bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák exec->vtx.vert_count - 1, 41514bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák NULL); 41633fef8be825ee8ec6abc0c2ffd9a3a967d84df88Keith Whitwell 417c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell /* If using a real VBO, get new storage -- unless asked not to. 418c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell */ 4197cba2df4a6f3b4435fe4be277db4a87b2a0f89e3Brian Paul if (_mesa_is_bufferobj(exec->vtx.bufferobj) && !keepUnmapped) { 420c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell vbo_exec_vtx_map( exec ); 4214b55e3695279daef221669ff063631cf3675da0cBrian Paul } 422fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 423fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 424fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 425c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell /* May have to unmap explicitly if we didn't draw: 426c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell */ 4277cba2df4a6f3b4435fe4be277db4a87b2a0f89e3Brian Paul if (keepUnmapped && 428bd4c6a2e503db43e81ef41f77d876308badd93ebBrian Paul _mesa_is_bufferobj(exec->vtx.bufferobj) && 429c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell exec->vtx.buffer_map) { 430c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell vbo_exec_vtx_unmap( exec ); 431c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell } 432c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 4337cba2df4a6f3b4435fe4be277db4a87b2a0f89e3Brian Paul if (keepUnmapped || exec->vtx.vertex_size == 0) 434c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell exec->vtx.max_vert = 0; 435c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell else 436c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell exec->vtx.max_vert = ((VBO_VERT_BUFFER_SIZE - exec->vtx.buffer_used) / 437c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell (exec->vtx.vertex_size * sizeof(GLfloat))); 438c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 439c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell exec->vtx.buffer_ptr = exec->vtx.buffer_map; 440fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtx.prim_count = 0; 441fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtx.vert_count = 0; 442fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 443cef97267d696d37f4dccb22951499ca25d5d87adChia-I Wu 444cef97267d696d37f4dccb22951499ca25d5d87adChia-I Wu 445cef97267d696d37f4dccb22951499ca25d5d87adChia-I Wu#endif /* FEATURE_beginend */ 446