1fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* 2fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Mesa 3-D graphics library 3fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Version: 6.3 4fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 5fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Copyright (C) 1999-2005 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/imports.h" 29c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian#include "main/mtypes.h" 30c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian#include "main/api_arrayelt.h" 314f6b704f9796775d8d9937c3cf75a2901b99b896Brian Paul#include "main/bufferobj.h" 322218592d47b963791105f5b8fa1a0b3f3a07f674Brian Paul#include "math/m_eval.h" 3348f5deab94be832a782a440f55a7bc742d50a62fKeith Whitwell#include "vbo.h" 34fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "vbo_context.h" 35fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 3699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell#define NR_MAT_ATTRIBS 12 3799efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 3850f76b9d9b4b17940798b44233b9b5af2f932117Keith Whitwellstatic GLuint check_size( const GLfloat *attr ) 3950f76b9d9b4b17940798b44233b9b5af2f932117Keith Whitwell{ 4050f76b9d9b4b17940798b44233b9b5af2f932117Keith Whitwell if (attr[3] != 1.0) return 4; 4150f76b9d9b4b17940798b44233b9b5af2f932117Keith Whitwell if (attr[2] != 0.0) return 3; 4250f76b9d9b4b17940798b44233b9b5af2f932117Keith Whitwell if (attr[1] != 0.0) return 2; 4350f76b9d9b4b17940798b44233b9b5af2f932117Keith Whitwell return 1; 4450f76b9d9b4b17940798b44233b9b5af2f932117Keith Whitwell} 4550f76b9d9b4b17940798b44233b9b5af2f932117Keith Whitwell 46072aeb57bd20b5fc39cf9d46a693a1a9aa9de11eBrian Paul 47f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void init_legacy_currval(struct gl_context *ctx) 4899efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell{ 4999efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell struct vbo_context *vbo = vbo_context(ctx); 50fa48137f292bbf8cbcd65e9caf33633cddc96600Marek Olšák struct gl_client_array *arrays = &vbo->currval[VBO_ATTRIB_POS]; 5199efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell GLuint i; 5299efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 53ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich memset(arrays, 0, sizeof(*arrays) * VERT_ATTRIB_FF_MAX); 5499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 5599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell /* Set up a constant (StrideB == 0) array for each current 5699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell * attribute: 5799efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell */ 58ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich for (i = 0; i < VERT_ATTRIB_FF_MAX; i++) { 5999efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell struct gl_client_array *cl = &arrays[i]; 6099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 61fd2756006a0baf63f60548d8f509de5b9a143608Keith Whitwell /* Size will have to be determined at runtime: 6299efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell */ 6350f76b9d9b4b17940798b44233b9b5af2f932117Keith Whitwell cl->Size = check_size(ctx->Current.Attrib[i]); 6499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell cl->Stride = 0; 6599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell cl->StrideB = 0; 6699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell cl->Enabled = 1; 67fd2756006a0baf63f60548d8f509de5b9a143608Keith Whitwell cl->Type = GL_FLOAT; 68ded949ed06e02ef26b1168b101daba04be78155eBrian Paul cl->Format = GL_RGBA; 69fd2756006a0baf63f60548d8f509de5b9a143608Keith Whitwell cl->Ptr = (const void *)ctx->Current.Attrib[i]; 70204991bf5d29caa3fa54df9e4f6898faa73752cfBrian Paul cl->_ElementSize = cl->Size * sizeof(GLfloat); 714f6b704f9796775d8d9937c3cf75a2901b99b896Brian Paul _mesa_reference_buffer_object(ctx, &cl->BufferObj, 724f6b704f9796775d8d9937c3cf75a2901b99b896Brian Paul ctx->Shared->NullBufferObj); 7399efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell } 7499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell} 7599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 7699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 77f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void init_generic_currval(struct gl_context *ctx) 7899efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell{ 7999efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell struct vbo_context *vbo = vbo_context(ctx); 808c990de0d682bbedfd7e1988d4f8948ea99b0cc3Marek Olšák struct gl_client_array *arrays = &vbo->currval[VBO_ATTRIB_GENERIC0]; 8199efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell GLuint i; 8299efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 83ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich memset(arrays, 0, sizeof(*arrays) * VERT_ATTRIB_GENERIC_MAX); 8499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 85ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich for (i = 0; i < VERT_ATTRIB_GENERIC_MAX; i++) { 8699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell struct gl_client_array *cl = &arrays[i]; 8799efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 8899efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell /* This will have to be determined at runtime: 8999efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell */ 9099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell cl->Size = 1; 9199efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell cl->Type = GL_FLOAT; 92ded949ed06e02ef26b1168b101daba04be78155eBrian Paul cl->Format = GL_RGBA; 9399efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell cl->Ptr = (const void *)ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + i]; 9499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell cl->Stride = 0; 9599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell cl->StrideB = 0; 9699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell cl->Enabled = 1; 97204991bf5d29caa3fa54df9e4f6898faa73752cfBrian Paul cl->_ElementSize = cl->Size * sizeof(GLfloat); 984f6b704f9796775d8d9937c3cf75a2901b99b896Brian Paul _mesa_reference_buffer_object(ctx, &cl->BufferObj, 994f6b704f9796775d8d9937c3cf75a2901b99b896Brian Paul ctx->Shared->NullBufferObj); 10099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell } 10199efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell} 10299efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 10399efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 104f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void init_mat_currval(struct gl_context *ctx) 10599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell{ 10699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell struct vbo_context *vbo = vbo_context(ctx); 10797e2f625b8bcba96acde29dcd017031e036f4a24Marek Olšák struct gl_client_array *arrays = 10897e2f625b8bcba96acde29dcd017031e036f4a24Marek Olšák &vbo->currval[VBO_ATTRIB_MAT_FRONT_AMBIENT]; 10999efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell GLuint i; 11099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 111c3e6bfc9e27038172fff47f9cc5a8a53ff7038a3Brian ASSERT(NR_MAT_ATTRIBS == MAT_ATTRIB_MAX); 112c3e6bfc9e27038172fff47f9cc5a8a53ff7038a3Brian 113fd2756006a0baf63f60548d8f509de5b9a143608Keith Whitwell memset(arrays, 0, sizeof(*arrays) * NR_MAT_ATTRIBS); 11499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 11599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell /* Set up a constant (StrideB == 0) array for each current 11699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell * attribute: 11799efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell */ 118fd2756006a0baf63f60548d8f509de5b9a143608Keith Whitwell for (i = 0; i < NR_MAT_ATTRIBS; i++) { 11999efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell struct gl_client_array *cl = &arrays[i]; 12099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 12199efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell /* Size is fixed for the material attributes, for others will 12299efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell * be determined at runtime: 12399efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell */ 12499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell switch (i - VERT_ATTRIB_GENERIC0) { 12599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell case MAT_ATTRIB_FRONT_SHININESS: 12699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell case MAT_ATTRIB_BACK_SHININESS: 12799efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell cl->Size = 1; 12899efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell break; 12999efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell case MAT_ATTRIB_FRONT_INDEXES: 13099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell case MAT_ATTRIB_BACK_INDEXES: 13199efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell cl->Size = 3; 13299efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell break; 13399efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell default: 13499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell cl->Size = 4; 13599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell break; 13699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell } 13799efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 138c3e6bfc9e27038172fff47f9cc5a8a53ff7038a3Brian cl->Ptr = (const void *)ctx->Light.Material.Attrib[i]; 13999efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell cl->Type = GL_FLOAT; 140ded949ed06e02ef26b1168b101daba04be78155eBrian Paul cl->Format = GL_RGBA; 14199efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell cl->Stride = 0; 14299efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell cl->StrideB = 0; 14399efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell cl->Enabled = 1; 144584d1e23096ed103ae62c13685a435b220b482f2José Fonseca cl->_ElementSize = cl->Size * sizeof(GLfloat); 145d7ea9ddf5824556e47decac7ba200f37cf1e552fBrian Paul _mesa_reference_buffer_object(ctx, &cl->BufferObj, 146d7ea9ddf5824556e47decac7ba200f37cf1e552fBrian Paul ctx->Shared->NullBufferObj); 14799efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell } 14899efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell} 14999efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 15099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 151f9995b30756140724f41daf963fa06167912be7fKristian HøgsbergGLboolean _vbo_CreateContext( struct gl_context *ctx ) 152fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 153fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct vbo_context *vbo = CALLOC_STRUCT(vbo_context); 154fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 155fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ctx->swtnl_im = (void *)vbo; 156fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 157fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* Initialize the arrayelt helper 158fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 159fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (!ctx->aelt_context && 160fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell !_ae_create_context( ctx )) { 161fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return GL_FALSE; 162fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 163fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 16499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell init_legacy_currval( ctx ); 16599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell init_generic_currval( ctx ); 16699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell init_mat_currval( ctx ); 16799efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 16899efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell /* Build mappings from VERT_ATTRIB -> VBO_ATTRIB depending on type 16999efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell * of vertex program active. 17099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell */ 17199efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell { 17299efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell GLuint i; 17399efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 1740a7602b938893e1b04a01ca8680376cbeec053abBrian Paul /* identity mapping */ 1750a7602b938893e1b04a01ca8680376cbeec053abBrian Paul for (i = 0; i < Elements(vbo->map_vp_none); i++) 17699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell vbo->map_vp_none[i] = i; 1770a7602b938893e1b04a01ca8680376cbeec053abBrian Paul /* map material attribs to generic slots */ 178ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich for (i = 0; i < NR_MAT_ATTRIBS; i++) 179ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich vbo->map_vp_none[VERT_ATTRIB_GENERIC(i)] 180ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich = VBO_ATTRIB_MAT_FRONT_AMBIENT + i; 1810a7602b938893e1b04a01ca8680376cbeec053abBrian Paul 182d30163ad4201dcd5a594694ab87be9e59db47eddBrian Paul for (i = 0; i < Elements(vbo->map_vp_arb); i++) 18399efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell vbo->map_vp_arb[i] = i; 18499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell } 18599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 18699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 187fd2756006a0baf63f60548d8f509de5b9a143608Keith Whitwell /* Hook our functions into exec and compile dispatch tables. These 188fd2756006a0baf63f60548d8f509de5b9a143608Keith Whitwell * will pretty much be permanently installed, which means that the 189fd2756006a0baf63f60548d8f509de5b9a143608Keith Whitwell * vtxfmt mechanism can be removed now. 190fd2756006a0baf63f60548d8f509de5b9a143608Keith Whitwell */ 191fd2756006a0baf63f60548d8f509de5b9a143608Keith Whitwell vbo_exec_init( ctx ); 192208fdac73a9b7f8f511f0ec8eeb5c09d4577b3a4Kristian Høgsberg if (ctx->API == API_OPENGL) 193208fdac73a9b7f8f511f0ec8eeb5c09d4577b3a4Kristian Høgsberg vbo_save_init( ctx ); 194fd2756006a0baf63f60548d8f509de5b9a143608Keith Whitwell 1952218592d47b963791105f5b8fa1a0b3f3a07f674Brian Paul _math_init_eval(); 1962218592d47b963791105f5b8fa1a0b3f3a07f674Brian Paul 197fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return GL_TRUE; 198fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 199fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 200072aeb57bd20b5fc39cf9d46a693a1a9aa9de11eBrian Paul 201f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid _vbo_InvalidateState( struct gl_context *ctx, GLuint new_state ) 202fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 203e8abd098b36c30d76b4c396970fd793ae58e0702Keith Whitwell vbo_exec_invalidate_state(ctx, new_state); 204fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 205fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 206fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 207f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid _vbo_DestroyContext( struct gl_context *ctx ) 208fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 20901d7e3d5a25a7cc49b38f5561d00c2ff22c43e93Michal Krol struct vbo_context *vbo = vbo_context(ctx); 21001d7e3d5a25a7cc49b38f5561d00c2ff22c43e93Michal Krol 211fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (ctx->aelt_context) { 212fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _ae_destroy_context( ctx ); 213fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ctx->aelt_context = NULL; 214fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 215fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 21601d7e3d5a25a7cc49b38f5561d00c2ff22c43e93Michal Krol if (vbo) { 21701d7e3d5a25a7cc49b38f5561d00c2ff22c43e93Michal Krol GLuint i; 21801d7e3d5a25a7cc49b38f5561d00c2ff22c43e93Michal Krol 21901d7e3d5a25a7cc49b38f5561d00c2ff22c43e93Michal Krol for (i = 0; i < VBO_ATTRIB_MAX; i++) { 22001d7e3d5a25a7cc49b38f5561d00c2ff22c43e93Michal Krol _mesa_reference_buffer_object(ctx, &vbo->currval[i].BufferObj, NULL); 22101d7e3d5a25a7cc49b38f5561d00c2ff22c43e93Michal Krol } 22201d7e3d5a25a7cc49b38f5561d00c2ff22c43e93Michal Krol 2234992806ae54d7d1db86eed9c6524aa05f4a2fbd6Brian Paul vbo_exec_destroy(ctx); 224208fdac73a9b7f8f511f0ec8eeb5c09d4577b3a4Kristian Høgsberg if (ctx->API == API_OPENGL) 225208fdac73a9b7f8f511f0ec8eeb5c09d4577b3a4Kristian Høgsberg vbo_save_destroy(ctx); 22601d7e3d5a25a7cc49b38f5561d00c2ff22c43e93Michal Krol FREE(vbo); 2274992806ae54d7d1db86eed9c6524aa05f4a2fbd6Brian Paul ctx->swtnl_im = NULL; 2284992806ae54d7d1db86eed9c6524aa05f4a2fbd6Brian Paul } 229fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 230c885775cae8feabe5431ba7867fac99332f5ee8eBrian 231c885775cae8feabe5431ba7867fac99332f5ee8eBrian 232f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid vbo_set_draw_func(struct gl_context *ctx, vbo_draw_func func) 233c885775cae8feabe5431ba7867fac99332f5ee8eBrian{ 234c885775cae8feabe5431ba7867fac99332f5ee8eBrian struct vbo_context *vbo = vbo_context(ctx); 235c885775cae8feabe5431ba7867fac99332f5ee8eBrian vbo->draw_prims = func; 236fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 237c885775cae8feabe5431ba7867fac99332f5ee8eBrian 238