1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  6.3
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2005  Brian Paul   All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors:
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    Keith Whitwell <keith@tungstengraphics.com>
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mtypes.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/api_arrayelt.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/bufferobj.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "math/m_eval.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vbo.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vbo_context.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NR_MAT_ATTRIBS 12
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint check_size( const GLfloat *attr )
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (attr[3] != 1.0) return 4;
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (attr[2] != 0.0) return 3;
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (attr[1] != 0.0) return 2;
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 1;
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void init_legacy_currval(struct gl_context *ctx)
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = vbo_context(ctx);
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_client_array *arrays = &vbo->currval[VBO_ATTRIB_POS];
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(arrays, 0, sizeof(*arrays) * VERT_ATTRIB_FF_MAX);
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Set up a constant (StrideB == 0) array for each current
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * attribute:
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < VERT_ATTRIB_FF_MAX; i++) {
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_client_array *cl = &arrays[i];
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Size will have to be determined at runtime:
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->Size = check_size(ctx->Current.Attrib[i]);
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->Stride = 0;
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->StrideB = 0;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->Enabled = 1;
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->Type = GL_FLOAT;
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->Format = GL_RGBA;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->Ptr = (const void *)ctx->Current.Attrib[i];
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->_ElementSize = cl->Size * sizeof(GLfloat);
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_reference_buffer_object(ctx, &cl->BufferObj,
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    ctx->Shared->NullBufferObj);
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void init_generic_currval(struct gl_context *ctx)
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = vbo_context(ctx);
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_client_array *arrays = &vbo->currval[VBO_ATTRIB_GENERIC0];
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(arrays, 0, sizeof(*arrays) * VERT_ATTRIB_GENERIC_MAX);
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < VERT_ATTRIB_GENERIC_MAX; i++) {
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_client_array *cl = &arrays[i];
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* This will have to be determined at runtime:
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->Size = 1;
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->Type = GL_FLOAT;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->Format = GL_RGBA;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->Ptr = (const void *)ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + i];
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->Stride = 0;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->StrideB = 0;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->Enabled = 1;
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->_ElementSize = cl->Size * sizeof(GLfloat);
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_reference_buffer_object(ctx, &cl->BufferObj,
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    ctx->Shared->NullBufferObj);
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void init_mat_currval(struct gl_context *ctx)
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = vbo_context(ctx);
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_client_array *arrays =
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      &vbo->currval[VBO_ATTRIB_MAT_FRONT_AMBIENT];
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(NR_MAT_ATTRIBS == MAT_ATTRIB_MAX);
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(arrays, 0, sizeof(*arrays) * NR_MAT_ATTRIBS);
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Set up a constant (StrideB == 0) array for each current
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * attribute:
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < NR_MAT_ATTRIBS; i++) {
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_client_array *cl = &arrays[i];
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Size is fixed for the material attributes, for others will
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * be determined at runtime:
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (i - VERT_ATTRIB_GENERIC0) {
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case MAT_ATTRIB_FRONT_SHININESS:
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case MAT_ATTRIB_BACK_SHININESS:
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 cl->Size = 1;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case MAT_ATTRIB_FRONT_INDEXES:
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case MAT_ATTRIB_BACK_INDEXES:
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 cl->Size = 3;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 cl->Size = 4;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->Ptr = (const void *)ctx->Light.Material.Attrib[i];
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->Type = GL_FLOAT;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->Format = GL_RGBA;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->Stride = 0;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->StrideB = 0;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->Enabled = 1;
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cl->_ElementSize = cl->Size * sizeof(GLfloat);
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_reference_buffer_object(ctx, &cl->BufferObj,
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    ctx->Shared->NullBufferObj);
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean _vbo_CreateContext( struct gl_context *ctx )
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = CALLOC_STRUCT(vbo_context);
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->swtnl_im = (void *)vbo;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Initialize the arrayelt helper
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->aelt_context &&
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !_ae_create_context( ctx )) {
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   init_legacy_currval( ctx );
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   init_generic_currval( ctx );
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   init_mat_currval( ctx );
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Build mappings from VERT_ATTRIB -> VBO_ATTRIB depending on type
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * of vertex program active.
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* identity mapping */
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < Elements(vbo->map_vp_none); i++)
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 vbo->map_vp_none[i] = i;
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* map material attribs to generic slots */
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < NR_MAT_ATTRIBS; i++)
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 vbo->map_vp_none[VERT_ATTRIB_GENERIC(i)]
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            = VBO_ATTRIB_MAT_FRONT_AMBIENT + i;
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < Elements(vbo->map_vp_arb); i++)
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 vbo->map_vp_arb[i] = i;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Hook our functions into exec and compile dispatch tables.  These
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * will pretty much be permanently installed, which means that the
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * vtxfmt mechanism can be removed now.
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_init( ctx );
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->API == API_OPENGL)
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbo_save_init( ctx );
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _math_init_eval();
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid _vbo_InvalidateState( struct gl_context *ctx, GLuint new_state )
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_invalidate_state(ctx, new_state);
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid _vbo_DestroyContext( struct gl_context *ctx )
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = vbo_context(ctx);
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->aelt_context) {
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _ae_destroy_context( ctx );
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->aelt_context = NULL;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (vbo) {
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < VBO_ATTRIB_MAX; i++) {
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_reference_buffer_object(ctx, &vbo->currval[i].BufferObj, NULL);
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbo_exec_destroy(ctx);
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->API == API_OPENGL)
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         vbo_save_destroy(ctx);
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FREE(vbo);
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->swtnl_im = NULL;
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vbo_set_draw_func(struct gl_context *ctx, vbo_draw_func func)
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = vbo_context(ctx);
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo->draw_prims = func;
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
238