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