1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCopyright 2002-2008 Tungsten Graphics Inc., Cedar Park, Texas.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgAll Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPermission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcopy of this software and associated documentation files (the "Software"),
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgto deal in the Software without restriction, including without limitation
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgon the rights to use, copy, modify, merge, publish, distribute, sub
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglicense, and/or sell copies of the Software, and to permit persons to whom
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgthe Software is furnished to do so, subject to the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThe above copyright notice and this permission notice (including the next
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparagraph) shall be included in all copies or substantial portions of the
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSoftware.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTUNGSTEN GRAPHICS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgUSE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org**************************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors:
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   Keith Whitwell <keith@tungstengraphics.com>
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/bufferobj.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mfeatures.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/vtxfmt.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/dlist.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/eval.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/state.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/light.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/api_arrayelt.h"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/api_validate.h"
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/dispatch.h"
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vbo_context.h"
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vbo_noop.h"
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef ERROR
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef ERROR
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** ID/name for immediate-mode VBO */
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IMM_BUFFER_NAME 0xaabbccdd
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void reset_attrfv( struct vbo_exec_context *exec );
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Close off the last primitive, execute the buffer, restart the
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * primitive.
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void vbo_exec_wrap_buffers( struct vbo_exec_context *exec )
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (exec->vtx.prim_count == 0) {
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.copied.nr = 0;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.vert_count = 0;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.buffer_ptr = exec->vtx.buffer_map;
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint last_begin = exec->vtx.prim[exec->vtx.prim_count-1].begin;
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint last_count;
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (exec->ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) {
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLint i = exec->vtx.prim_count - 1;
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 assert(i >= 0);
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 exec->vtx.prim[i].count = (exec->vtx.vert_count -
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    exec->vtx.prim[i].start);
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      last_count = exec->vtx.prim[exec->vtx.prim_count-1].count;
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Execute the buffer and save copied vertices.
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (exec->vtx.vert_count)
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 vbo_exec_vtx_flush( exec, GL_FALSE );
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 exec->vtx.prim_count = 0;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 exec->vtx.copied.nr = 0;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Emit a glBegin to start the new list.
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(exec->vtx.prim_count == 0);
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (exec->ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) {
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 exec->vtx.prim[0].mode = exec->ctx->Driver.CurrentExecPrimitive;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 exec->vtx.prim[0].start = 0;
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 exec->vtx.prim[0].count = 0;
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 exec->vtx.prim_count++;
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (exec->vtx.copied.nr == last_count)
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    exec->vtx.prim[0].begin = last_begin;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Deal with buffer wrapping where provoked by the vertex buffer
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * filling up, as opposed to upgrade_vertex().
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vbo_exec_vtx_wrap( struct vbo_exec_context *exec )
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat *data = exec->vtx.copied.buffer;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Run pipeline on current vertices, copy wrapped vertices
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * to exec->vtx.copied.
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_wrap_buffers( exec );
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!exec->vtx.buffer_ptr) {
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* probably ran out of memory earlier when allocating the VBO */
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Copy stored stored vertices to start of new list.
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(exec->vtx.max_vert - exec->vtx.vert_count > exec->vtx.copied.nr);
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0 ; i < exec->vtx.copied.nr ; i++) {
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy( exec->vtx.buffer_ptr, data,
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      exec->vtx.vertex_size * sizeof(GLfloat));
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.buffer_ptr += exec->vtx.vertex_size;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      data += exec->vtx.vertex_size;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.vert_count++;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtx.copied.nr = 0;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copy the active vertex's values to the ctx->Current fields.
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void vbo_exec_copy_to_current( struct vbo_exec_context *exec )
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = exec->ctx;
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = vbo_context(ctx);
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = VBO_ATTRIB_POS+1 ; i < VBO_ATTRIB_MAX ; i++) {
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (exec->vtx.attrsz[i]) {
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* Note: the exec->vtx.current[i] pointers point into the
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * ctx->Current.Attrib and ctx->Light.Material.Attrib arrays.
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          */
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLfloat *current = (GLfloat *)vbo->currval[i].Ptr;
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLfloat tmp[4];
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         COPY_CLEAN_4V_TYPE_AS_FLOAT(tmp,
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     exec->vtx.attrsz[i],
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     exec->vtx.attrptr[i],
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     exec->vtx.attrtype[i]);
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (exec->vtx.attrtype[i] != vbo->currval[i].Type ||
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             memcmp(current, tmp, sizeof(tmp)) != 0) {
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            memcpy(current, tmp, sizeof(tmp));
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* Given that we explicitly state size here, there is no need
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             * for the COPY_CLEAN above, could just copy 16 bytes and be
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             * done.  The only problem is when Mesa accesses ctx->Current
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             * directly.
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             */
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            vbo->currval[i].Size = exec->vtx.attrsz[i];
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            vbo->currval[i]._ElementSize = vbo->currval[i].Size * sizeof(GLfloat);
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            vbo->currval[i].Type = exec->vtx.attrtype[i];
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            vbo->currval[i].Integer =
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  vbo_attrtype_to_integer_flag(exec->vtx.attrtype[i]);
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* This triggers rather too much recalculation of Mesa state
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             * that doesn't get used (eg light positions).
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             */
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (i >= VBO_ATTRIB_MAT_FRONT_AMBIENT &&
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                i <= VBO_ATTRIB_MAT_BACK_INDEXES)
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               ctx->NewState |= _NEW_LIGHT;
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ctx->NewState |= _NEW_CURRENT_ATTRIB;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Colormaterial -- this kindof sucks.
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Light.ColorMaterialEnabled &&
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       exec->vtx.attrsz[VBO_ATTRIB_COLOR0]) {
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_update_color_material(ctx,
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  ctx->Current.Attrib[VBO_ATTRIB_COLOR0]);
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copy current vertex attribute values into the current vertex.
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_copy_from_current(struct vbo_exec_context *exec)
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = exec->ctx;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = vbo_context(ctx);
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint i;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = VBO_ATTRIB_POS + 1; i < VBO_ATTRIB_MAX; i++) {
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *current = (GLfloat *) vbo->currval[i].Ptr;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (exec->vtx.attrsz[i]) {
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 4: exec->vtx.attrptr[i][3] = current[3];
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 3: exec->vtx.attrptr[i][2] = current[2];
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 2: exec->vtx.attrptr[i][1] = current[1];
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 1: exec->vtx.attrptr[i][0] = current[0];
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Flush existing data, set new attrib size, replay copied vertices.
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is called when we transition from a small vertex attribute size
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to a larger one.  Ex: glTexCoord2f -> glTexCoord4f.
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We need to go back over the previous 2-component texcoords and insert
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * zero and one values.
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_wrap_upgrade_vertex(struct vbo_exec_context *exec,
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             GLuint attr, GLuint newSize )
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = exec->ctx;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = vbo_context(ctx);
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint lastcount = exec->vtx.vert_count;
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat *old_attrptr[VBO_ATTRIB_MAX];
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint old_vtx_size = exec->vtx.vertex_size; /* floats per vertex */
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint oldSize = exec->vtx.attrsz[attr];
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Run pipeline on current vertices, copy wrapped vertices
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * to exec->vtx.copied.
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_wrap_buffers( exec );
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (unlikely(exec->vtx.copied.nr)) {
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* We're in the middle of a primitive, keep the old vertex
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * format around to be able to translate the copied vertices to
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * the new format.
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy(old_attrptr, exec->vtx.attrptr, sizeof(old_attrptr));
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (unlikely(oldSize)) {
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Do a COPY_TO_CURRENT to ensure back-copying works for the
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * case when the attribute already exists in the vertex and is
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * having its size increased.
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbo_exec_copy_to_current( exec );
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Heuristic: Attempt to isolate attributes received outside
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * begin/end so that they don't bloat the vertices.
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Driver.CurrentExecPrimitive == PRIM_OUTSIDE_BEGIN_END &&
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !oldSize && lastcount > 8 && exec->vtx.vertex_size) {
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbo_exec_copy_to_current( exec );
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      reset_attrfv( exec );
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Fix up sizes:
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtx.attrsz[attr] = newSize;
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtx.vertex_size += newSize - oldSize;
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtx.max_vert = ((VBO_VERT_BUFFER_SIZE - exec->vtx.buffer_used) /
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         (exec->vtx.vertex_size * sizeof(GLfloat)));
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtx.vert_count = 0;
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtx.buffer_ptr = exec->vtx.buffer_map;
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (unlikely(oldSize)) {
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Size changed, recalculate all the attrptr[] values
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat *tmp = exec->vtx.vertex;
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0 ; i < VBO_ATTRIB_MAX ; i++) {
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (exec->vtx.attrsz[i]) {
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    exec->vtx.attrptr[i] = tmp;
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    tmp += exec->vtx.attrsz[i];
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    exec->vtx.attrptr[i] = NULL; /* will not be dereferenced */
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Copy from current to repopulate the vertex with correct
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * values.
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbo_exec_copy_from_current( exec );
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Just have to append the new attribute at the end */
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.attrptr[attr] = exec->vtx.vertex +
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 exec->vtx.vertex_size - newSize;
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Replay stored vertices to translate them
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * to new format here.
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * -- No need to replay - just copy piecewise
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (unlikely(exec->vtx.copied.nr)) {
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat *data = exec->vtx.copied.buffer;
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat *dest = exec->vtx.buffer_ptr;
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j;
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(exec->vtx.buffer_ptr == exec->vtx.buffer_map);
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0 ; i < exec->vtx.copied.nr ; i++) {
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (j = 0 ; j < VBO_ATTRIB_MAX ; j++) {
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    GLuint sz = exec->vtx.attrsz[j];
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (sz) {
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       GLint old_offset = old_attrptr[j] - exec->vtx.vertex;
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       GLint new_offset = exec->vtx.attrptr[j] - exec->vtx.vertex;
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       if (j == attr) {
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  if (oldSize) {
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     GLfloat tmp[4];
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     COPY_CLEAN_4V_TYPE_AS_FLOAT(tmp, oldSize,
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 data + old_offset,
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 exec->vtx.attrtype[j]);
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     COPY_SZ_4V(dest + new_offset, newSize, tmp);
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  } else {
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     GLfloat *current = (GLfloat *)vbo->currval[j].Ptr;
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     COPY_SZ_4V(dest + new_offset, sz, current);
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  }
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       }
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       else {
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  COPY_SZ_4V(dest + new_offset, sz, data + old_offset);
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       }
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 data += old_vtx_size;
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dest += exec->vtx.vertex_size;
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.buffer_ptr = dest;
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.vert_count += exec->vtx.copied.nr;
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.copied.nr = 0;
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is when a vertex attribute transitions to a different size.
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For example, we saw a bunch of glTexCoord2f() calls and now we got a
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glTexCoord4f() call.  We promote the array from size=2 to size=4.
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_fixup_vertex(struct gl_context *ctx, GLuint attr, GLuint newSize)
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (newSize > exec->vtx.attrsz[attr]) {
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* New size is larger.  Need to flush existing vertices and get
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * an enlarged vertex format.
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbo_exec_wrap_upgrade_vertex( exec, attr, newSize );
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (newSize < exec->vtx.active_sz[attr]) {
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *id =
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            vbo_get_default_vals_as_float(exec->vtx.attrtype[attr]);
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* New size is smaller - just need to fill in some
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * zeros.  Don't need to flush or wrap.
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = newSize; i <= exec->vtx.attrsz[attr]; i++)
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 exec->vtx.attrptr[attr][i-1] = id[i-1];
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtx.active_sz[attr] = newSize;
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Does setting NeedFlush belong here?  Necessitates resetting
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * vtxfmt on each flush (otherwise flags won't get reset
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * afterwards).
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (attr == 0)
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES;
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This macro is used to implement all the glVertex, glColor, glTexCoord,
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glVertexAttrib, etc functions.
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ATTR( A, N, T, V0, V1, V2, V3 )					\
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo {									\
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_exec_context *exec = &vbo_context(ctx)->exec;		\
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org									\
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (unlikely(!(ctx->Driver.NeedFlush & FLUSH_UPDATE_CURRENT)))	\
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.BeginVertices( ctx );					\
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   									\
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (unlikely(exec->vtx.active_sz[A] != N))				\
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbo_exec_fixup_vertex(ctx, A, N);					\
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   									\
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {									\
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat *dest = exec->vtx.attrptr[A];				\
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (N>0) dest[0] = V0;						\
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (N>1) dest[1] = V1;						\
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (N>2) dest[2] = V2;						\
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (N>3) dest[3] = V3;						\
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.attrtype[A] = T;                                        \
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }									\
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org									\
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((A) == 0) {							\
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* This is a glVertex call */					\
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;								\
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org									\
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < exec->vtx.vertex_size; i++)			\
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 exec->vtx.buffer_ptr[i] = exec->vtx.vertex[i];			\
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org									\
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.buffer_ptr += exec->vtx.vertex_size;			\
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org									\
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Set FLUSH_STORED_VERTICES to indicate that there's now */	\
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* something to draw (not just updating a color or texcoord).*/	\
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES;			\
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org									\
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (++exec->vtx.vert_count >= exec->vtx.max_vert)			\
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 vbo_exec_vtx_wrap( exec );					\
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }									\
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ERROR(err) _mesa_error( ctx, err, __FUNCTION__ )
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) vbo_##x
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vbo_attrib_tmp.h"
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Execute a glMaterial call.  Note that if GL_COLOR_MATERIAL is enabled,
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * this may be a (partial) no-op.
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_Materialfv(GLenum face, GLenum pname, const GLfloat *params)
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbitfield updateMats;
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* This function should be a no-op when it tries to update material
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * attributes which are currently tracking glColor via glColorMaterial.
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * The updateMats var will be a mask of the MAT_BIT_FRONT/BACK_x bits
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * indicating which material attributes can actually be updated below.
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Light.ColorMaterialEnabled) {
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      updateMats = ~ctx->Light._ColorMaterialBitmask;
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* GL_COLOR_MATERIAL is disabled so don't skip any material updates */
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      updateMats = ALL_MATERIAL_BITS;
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->API == API_OPENGL && face == GL_FRONT) {
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      updateMats &= FRONT_MATERIAL_BITS;
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (ctx->API == API_OPENGL && face == GL_BACK) {
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      updateMats &= BACK_MATERIAL_BITS;
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (face != GL_FRONT_AND_BACK) {
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glMaterial(invalid face)");
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (pname) {
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_EMISSION:
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (updateMats & MAT_BIT_FRONT_EMISSION)
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         MAT_ATTR(VBO_ATTRIB_MAT_FRONT_EMISSION, 4, params);
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (updateMats & MAT_BIT_BACK_EMISSION)
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         MAT_ATTR(VBO_ATTRIB_MAT_BACK_EMISSION, 4, params);
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_AMBIENT:
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (updateMats & MAT_BIT_FRONT_AMBIENT)
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         MAT_ATTR(VBO_ATTRIB_MAT_FRONT_AMBIENT, 4, params);
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (updateMats & MAT_BIT_BACK_AMBIENT)
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         MAT_ATTR(VBO_ATTRIB_MAT_BACK_AMBIENT, 4, params);
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DIFFUSE:
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (updateMats & MAT_BIT_FRONT_DIFFUSE)
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         MAT_ATTR(VBO_ATTRIB_MAT_FRONT_DIFFUSE, 4, params);
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (updateMats & MAT_BIT_BACK_DIFFUSE)
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         MAT_ATTR(VBO_ATTRIB_MAT_BACK_DIFFUSE, 4, params);
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SPECULAR:
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (updateMats & MAT_BIT_FRONT_SPECULAR)
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         MAT_ATTR(VBO_ATTRIB_MAT_FRONT_SPECULAR, 4, params);
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (updateMats & MAT_BIT_BACK_SPECULAR)
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         MAT_ATTR(VBO_ATTRIB_MAT_BACK_SPECULAR, 4, params);
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SHININESS:
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (*params < 0 || *params > ctx->Const.MaxShininess) {
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE,
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glMaterial(invalid shininess: %f out range [0, %f])",
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     *params, ctx->Const.MaxShininess);
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (updateMats & MAT_BIT_FRONT_SHININESS)
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         MAT_ATTR(VBO_ATTRIB_MAT_FRONT_SHININESS, 1, params);
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (updateMats & MAT_BIT_BACK_SHININESS)
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         MAT_ATTR(VBO_ATTRIB_MAT_BACK_SHININESS, 1, params);
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COLOR_INDEXES:
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->API != API_OPENGL) {
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_ENUM, "glMaterialfv(pname)");
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (updateMats & MAT_BIT_FRONT_INDEXES)
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         MAT_ATTR(VBO_ATTRIB_MAT_FRONT_INDEXES, 3, params);
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (updateMats & MAT_BIT_BACK_INDEXES)
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         MAT_ATTR(VBO_ATTRIB_MAT_BACK_INDEXES, 3, params);
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_AMBIENT_AND_DIFFUSE:
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (updateMats & MAT_BIT_FRONT_AMBIENT)
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         MAT_ATTR(VBO_ATTRIB_MAT_FRONT_AMBIENT, 4, params);
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (updateMats & MAT_BIT_FRONT_DIFFUSE)
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         MAT_ATTR(VBO_ATTRIB_MAT_FRONT_DIFFUSE, 4, params);
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (updateMats & MAT_BIT_BACK_AMBIENT)
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         MAT_ATTR(VBO_ATTRIB_MAT_BACK_AMBIENT, 4, params);
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (updateMats & MAT_BIT_BACK_DIFFUSE)
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         MAT_ATTR(VBO_ATTRIB_MAT_BACK_DIFFUSE, 4, params);
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glMaterialfv(pname)");
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Flush (draw) vertices.
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param  unmap - leave VBO unmapped after flushing?
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_FlushVertices_internal(struct vbo_exec_context *exec, GLboolean unmap)
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (exec->vtx.vert_count || unmap) {
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbo_exec_vtx_flush( exec, unmap );
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (exec->vtx.vertex_size) {
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbo_exec_copy_to_current( exec );
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      reset_attrfv( exec );
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_beginend
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_evaluators
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY vbo_exec_EvalCoord1f( GLfloat u )
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT( ctx );
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint i;
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (exec->eval.recalculate_maps)
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 vbo_exec_eval_update( exec );
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i <= VBO_ATTRIB_TEX7; i++) {
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (exec->eval.map1[i].map)
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (exec->vtx.active_sz[i] != exec->eval.map1[i].sz)
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       vbo_exec_fixup_vertex( ctx, i, exec->eval.map1[i].sz );
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy( exec->vtx.copied.buffer, exec->vtx.vertex,
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           exec->vtx.vertex_size * sizeof(GLfloat));
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_do_EvalCoord1f( exec, u );
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy( exec->vtx.vertex, exec->vtx.copied.buffer,
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           exec->vtx.vertex_size * sizeof(GLfloat));
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY vbo_exec_EvalCoord2f( GLfloat u, GLfloat v )
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT( ctx );
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint i;
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (exec->eval.recalculate_maps)
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 vbo_exec_eval_update( exec );
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i <= VBO_ATTRIB_TEX7; i++) {
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (exec->eval.map2[i].map)
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (exec->vtx.active_sz[i] != exec->eval.map2[i].sz)
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       vbo_exec_fixup_vertex( ctx, i, exec->eval.map2[i].sz );
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Eval.AutoNormal)
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (exec->vtx.active_sz[VBO_ATTRIB_NORMAL] != 3)
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    vbo_exec_fixup_vertex( ctx, VBO_ATTRIB_NORMAL, 3 );
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy( exec->vtx.copied.buffer, exec->vtx.vertex,
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           exec->vtx.vertex_size * sizeof(GLfloat));
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_do_EvalCoord2f( exec, u, v );
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy( exec->vtx.vertex, exec->vtx.copied.buffer,
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           exec->vtx.vertex_size * sizeof(GLfloat));
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY vbo_exec_EvalCoord1fv( const GLfloat *u )
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_EvalCoord1f( u[0] );
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY vbo_exec_EvalCoord2fv( const GLfloat *u )
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_EvalCoord2f( u[0], u[1] );
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY vbo_exec_EvalPoint1( GLint i )
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT( ctx );
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat du = ((ctx->Eval.MapGrid1u2 - ctx->Eval.MapGrid1u1) /
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 (GLfloat) ctx->Eval.MapGrid1un);
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat u = i * du + ctx->Eval.MapGrid1u1;
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_EvalCoord1f( u );
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY vbo_exec_EvalPoint2( GLint i, GLint j )
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT( ctx );
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat du = ((ctx->Eval.MapGrid2u2 - ctx->Eval.MapGrid2u1) /
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 (GLfloat) ctx->Eval.MapGrid2un);
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat dv = ((ctx->Eval.MapGrid2v2 - ctx->Eval.MapGrid2v1) /
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 (GLfloat) ctx->Eval.MapGrid2vn);
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat u = i * du + ctx->Eval.MapGrid2u1;
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat v = j * dv + ctx->Eval.MapGrid2v1;
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_EvalCoord2f( u, v );
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_EvalMesh1(GLenum mode, GLint i1, GLint i2)
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint i;
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat u, du;
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum prim;
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (mode) {
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POINT:
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      prim = GL_POINTS;
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LINE:
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      prim = GL_LINE_STRIP;
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error( ctx, GL_INVALID_ENUM, "glEvalMesh1(mode)" );
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* No effect if vertex maps disabled.
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->Eval.Map1Vertex4 &&
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !ctx->Eval.Map1Vertex3 &&
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !(ctx->VertexProgram._Enabled && ctx->Eval.Map1Attrib[VERT_ATTRIB_POS]))
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   du = ctx->Eval.MapGrid1du;
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u = ctx->Eval.MapGrid1u1 + i1 * du;
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CALL_Begin(GET_DISPATCH(), (prim));
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i=i1;i<=i2;i++,u+=du) {
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      CALL_EvalCoord1f(GET_DISPATCH(), (u));
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CALL_End(GET_DISPATCH(), ());
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_EvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat u, du, v, dv, v1, u1;
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint i, j;
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (mode) {
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POINT:
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LINE:
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FILL:
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error( ctx, GL_INVALID_ENUM, "glEvalMesh2(mode)" );
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* No effect if vertex maps disabled.
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->Eval.Map2Vertex4 &&
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !ctx->Eval.Map2Vertex3 &&
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !(ctx->VertexProgram._Enabled && ctx->Eval.Map2Attrib[VERT_ATTRIB_POS]))
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   du = ctx->Eval.MapGrid2du;
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dv = ctx->Eval.MapGrid2dv;
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   v1 = ctx->Eval.MapGrid2v1 + j1 * dv;
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u1 = ctx->Eval.MapGrid2u1 + i1 * du;
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (mode) {
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POINT:
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      CALL_Begin(GET_DISPATCH(), (GL_POINTS));
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (v=v1,j=j1;j<=j2;j++,v+=dv) {
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (u=u1,i=i1;i<=i2;i++,u+=du) {
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    CALL_EvalCoord2f(GET_DISPATCH(), (u, v));
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      CALL_End(GET_DISPATCH(), ());
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LINE:
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (v=v1,j=j1;j<=j2;j++,v+=dv) {
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 CALL_Begin(GET_DISPATCH(), (GL_LINE_STRIP));
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (u=u1,i=i1;i<=i2;i++,u+=du) {
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    CALL_EvalCoord2f(GET_DISPATCH(), (u, v));
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 CALL_End(GET_DISPATCH(), ());
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (u=u1,i=i1;i<=i2;i++,u+=du) {
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 CALL_Begin(GET_DISPATCH(), (GL_LINE_STRIP));
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (v=v1,j=j1;j<=j2;j++,v+=dv) {
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    CALL_EvalCoord2f(GET_DISPATCH(), (u, v));
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 CALL_End(GET_DISPATCH(), ());
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FILL:
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (v=v1,j=j1;j<j2;j++,v+=dv) {
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 CALL_Begin(GET_DISPATCH(), (GL_TRIANGLE_STRIP));
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (u=u1,i=i1;i<=i2;i++,u+=du) {
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    CALL_EvalCoord2f(GET_DISPATCH(), (u, v));
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    CALL_EvalCoord2f(GET_DISPATCH(), (u, v+dv));
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 CALL_End(GET_DISPATCH(), ());
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* FEATURE_evaluators */
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Execute a glRectf() function.  This is not suitable for GL_COMPILE
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * modes (as the test for outside begin/end is not compiled),
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * but may be useful for drivers in circumstances which exclude
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * display list interactions.
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (None of the functions in this file are suitable for GL_COMPILE
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * modes).
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_Rectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CALL_Begin(GET_DISPATCH(), (GL_QUADS));
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CALL_Vertex2f(GET_DISPATCH(), (x1, y1));
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CALL_Vertex2f(GET_DISPATCH(), (x2, y1));
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CALL_Vertex2f(GET_DISPATCH(), (x2, y2));
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CALL_Vertex2f(GET_DISPATCH(), (x1, y2));
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CALL_End(GET_DISPATCH(), ());
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via glBegin.
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY vbo_exec_Begin( GLenum mode )
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT( ctx );
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Driver.CurrentExecPrimitive == PRIM_OUTSIDE_BEGIN_END) {
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int i;
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!_mesa_valid_prim_mode(ctx, mode, "glBegin")) {
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbo_draw_method(vbo_context(ctx), DRAW_BEGIN_END);
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Driver.PrepareExecBegin)
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ctx->Driver.PrepareExecBegin(ctx);
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->NewState) {
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _mesa_update_state( ctx );
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 CALL_Begin(ctx->Exec, (mode));
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return;
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!_mesa_valid_to_render(ctx, "glBegin")) {
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Heuristic: attempt to isolate attributes occuring outside
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * begin/end pairs.
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (exec->vtx.vertex_size && !exec->vtx.attrsz[0])
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 vbo_exec_FlushVertices_internal(exec, GL_FALSE);
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      i = exec->vtx.prim_count++;
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.prim[i].mode = mode;
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.prim[i].begin = 1;
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.prim[i].end = 0;
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.prim[i].indexed = 0;
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.prim[i].weak = 0;
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.prim[i].pad = 0;
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.prim[i].start = exec->vtx.vert_count;
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.prim[i].count = 0;
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.prim[i].num_instances = 1;
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.prim[i].base_instance = 0;
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.CurrentExecPrimitive = mode;
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error( ctx, GL_INVALID_OPERATION, "glBegin" );
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via glEnd.
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY vbo_exec_End( void )
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT( ctx );
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) {
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (exec->vtx.prim_count > 0) {
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* close off current primitive */
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         int idx = exec->vtx.vert_count;
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         int i = exec->vtx.prim_count - 1;
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         exec->vtx.prim[i].end = 1;
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         exec->vtx.prim[i].count = idx - exec->vtx.prim[i].start;
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.CurrentExecPrimitive = PRIM_OUTSIDE_BEGIN_END;
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (exec->vtx.prim_count == VBO_MAX_PRIM)
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 vbo_exec_vtx_flush( exec, GL_FALSE );
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error( ctx, GL_INVALID_OPERATION, "glEnd" );
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) {
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_flush(ctx);
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via glPrimitiveRestartNV()
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_PrimitiveRestartNV(void)
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum curPrim;
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT( ctx );
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   curPrim = ctx->Driver.CurrentExecPrimitive;
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (curPrim == PRIM_OUTSIDE_BEGIN_END) {
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error( ctx, GL_INVALID_OPERATION, "glPrimitiveRestartNV" );
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbo_exec_End();
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbo_exec_Begin(curPrim);
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void vbo_exec_vtxfmt_init( struct vbo_exec_context *exec )
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = exec->ctx;
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLvertexformat *vfmt = &exec->vtxfmt;
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _MESA_INIT_ARRAYELT_VTXFMT(vfmt, _ae_);
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->Begin = vbo_exec_Begin;
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->End = vbo_exec_End;
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->PrimitiveRestartNV = vbo_exec_PrimitiveRestartNV;
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _MESA_INIT_DLIST_VTXFMT(vfmt, _mesa_);
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _MESA_INIT_EVAL_VTXFMT(vfmt, vbo_exec_);
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->Rectf = vbo_exec_Rectf;
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* from attrib_tmp.h:
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->Color3f = vbo_Color3f;
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->Color3fv = vbo_Color3fv;
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->Color4f = vbo_Color4f;
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->Color4fv = vbo_Color4fv;
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->FogCoordfEXT = vbo_FogCoordfEXT;
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->FogCoordfvEXT = vbo_FogCoordfvEXT;
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->MultiTexCoord1fARB = vbo_MultiTexCoord1f;
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->MultiTexCoord1fvARB = vbo_MultiTexCoord1fv;
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->MultiTexCoord2fARB = vbo_MultiTexCoord2f;
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->MultiTexCoord2fvARB = vbo_MultiTexCoord2fv;
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->MultiTexCoord3fARB = vbo_MultiTexCoord3f;
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->MultiTexCoord3fvARB = vbo_MultiTexCoord3fv;
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->MultiTexCoord4fARB = vbo_MultiTexCoord4f;
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->MultiTexCoord4fvARB = vbo_MultiTexCoord4fv;
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->Normal3f = vbo_Normal3f;
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->Normal3fv = vbo_Normal3fv;
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->SecondaryColor3fEXT = vbo_SecondaryColor3fEXT;
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->SecondaryColor3fvEXT = vbo_SecondaryColor3fvEXT;
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->TexCoord1f = vbo_TexCoord1f;
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->TexCoord1fv = vbo_TexCoord1fv;
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->TexCoord2f = vbo_TexCoord2f;
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->TexCoord2fv = vbo_TexCoord2fv;
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->TexCoord3f = vbo_TexCoord3f;
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->TexCoord3fv = vbo_TexCoord3fv;
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->TexCoord4f = vbo_TexCoord4f;
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->TexCoord4fv = vbo_TexCoord4fv;
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->Vertex2f = vbo_Vertex2f;
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->Vertex2fv = vbo_Vertex2fv;
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->Vertex3f = vbo_Vertex3f;
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->Vertex3fv = vbo_Vertex3fv;
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->Vertex4f = vbo_Vertex4f;
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->Vertex4fv = vbo_Vertex4fv;
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->API == API_OPENGLES2) {
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vfmt->VertexAttrib1fARB = _es_VertexAttrib1f;
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vfmt->VertexAttrib1fvARB = _es_VertexAttrib1fv;
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vfmt->VertexAttrib2fARB = _es_VertexAttrib2f;
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vfmt->VertexAttrib2fvARB = _es_VertexAttrib2fv;
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vfmt->VertexAttrib3fARB = _es_VertexAttrib3f;
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vfmt->VertexAttrib3fvARB = _es_VertexAttrib3fv;
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vfmt->VertexAttrib4fARB = _es_VertexAttrib4f;
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vfmt->VertexAttrib4fvARB = _es_VertexAttrib4fv;
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vfmt->VertexAttrib1fARB = vbo_VertexAttrib1fARB;
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vfmt->VertexAttrib1fvARB = vbo_VertexAttrib1fvARB;
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vfmt->VertexAttrib2fARB = vbo_VertexAttrib2fARB;
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vfmt->VertexAttrib2fvARB = vbo_VertexAttrib2fvARB;
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vfmt->VertexAttrib3fARB = vbo_VertexAttrib3fARB;
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vfmt->VertexAttrib3fvARB = vbo_VertexAttrib3fvARB;
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vfmt->VertexAttrib4fARB = vbo_VertexAttrib4fARB;
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vfmt->VertexAttrib4fvARB = vbo_VertexAttrib4fvARB;
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttrib1fNV = vbo_VertexAttrib1fNV;
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttrib1fvNV = vbo_VertexAttrib1fvNV;
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttrib2fNV = vbo_VertexAttrib2fNV;
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttrib2fvNV = vbo_VertexAttrib2fvNV;
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttrib3fNV = vbo_VertexAttrib3fNV;
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttrib3fvNV = vbo_VertexAttrib3fvNV;
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttrib4fNV = vbo_VertexAttrib4fNV;
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttrib4fvNV = vbo_VertexAttrib4fvNV;
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* integer-valued */
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribI1i = vbo_VertexAttribI1i;
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribI2i = vbo_VertexAttribI2i;
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribI3i = vbo_VertexAttribI3i;
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribI4i = vbo_VertexAttribI4i;
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribI2iv = vbo_VertexAttribI2iv;
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribI3iv = vbo_VertexAttribI3iv;
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribI4iv = vbo_VertexAttribI4iv;
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* unsigned integer-valued */
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribI1ui = vbo_VertexAttribI1ui;
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribI2ui = vbo_VertexAttribI2ui;
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribI3ui = vbo_VertexAttribI3ui;
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribI4ui = vbo_VertexAttribI4ui;
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribI2uiv = vbo_VertexAttribI2uiv;
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribI3uiv = vbo_VertexAttribI3uiv;
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribI4uiv = vbo_VertexAttribI4uiv;
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->Materialfv = vbo_Materialfv;
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->EdgeFlag = vbo_EdgeFlag;
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->Indexf = vbo_Indexf;
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->Indexfv = vbo_Indexfv;
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* ARB_vertex_type_2_10_10_10_rev */
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexP2ui = vbo_VertexP2ui;
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexP2uiv = vbo_VertexP2uiv;
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexP3ui = vbo_VertexP3ui;
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexP3uiv = vbo_VertexP3uiv;
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexP4ui = vbo_VertexP4ui;
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexP4uiv = vbo_VertexP4uiv;
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->TexCoordP1ui = vbo_TexCoordP1ui;
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->TexCoordP1uiv = vbo_TexCoordP1uiv;
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->TexCoordP2ui = vbo_TexCoordP2ui;
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->TexCoordP2uiv = vbo_TexCoordP2uiv;
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->TexCoordP3ui = vbo_TexCoordP3ui;
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->TexCoordP3uiv = vbo_TexCoordP3uiv;
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->TexCoordP4ui = vbo_TexCoordP4ui;
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->TexCoordP4uiv = vbo_TexCoordP4uiv;
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->MultiTexCoordP1ui = vbo_MultiTexCoordP1ui;
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->MultiTexCoordP1uiv = vbo_MultiTexCoordP1uiv;
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->MultiTexCoordP2ui = vbo_MultiTexCoordP2ui;
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->MultiTexCoordP2uiv = vbo_MultiTexCoordP2uiv;
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->MultiTexCoordP3ui = vbo_MultiTexCoordP3ui;
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->MultiTexCoordP3uiv = vbo_MultiTexCoordP3uiv;
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->MultiTexCoordP4ui = vbo_MultiTexCoordP4ui;
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->MultiTexCoordP4uiv = vbo_MultiTexCoordP4uiv;
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->NormalP3ui = vbo_NormalP3ui;
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->NormalP3uiv = vbo_NormalP3uiv;
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->ColorP3ui = vbo_ColorP3ui;
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->ColorP3uiv = vbo_ColorP3uiv;
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->ColorP4ui = vbo_ColorP4ui;
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->ColorP4uiv = vbo_ColorP4uiv;
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->SecondaryColorP3ui = vbo_SecondaryColorP3ui;
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->SecondaryColorP3uiv = vbo_SecondaryColorP3uiv;
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribP1ui = vbo_VertexAttribP1ui;
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribP1uiv = vbo_VertexAttribP1uiv;
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribP2ui = vbo_VertexAttribP2ui;
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribP2uiv = vbo_VertexAttribP2uiv;
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribP3ui = vbo_VertexAttribP3ui;
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribP3uiv = vbo_VertexAttribP3uiv;
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribP4ui = vbo_VertexAttribP4ui;
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vfmt->VertexAttribP4uiv = vbo_VertexAttribP4uiv;
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else /* FEATURE_beginend */
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void vbo_exec_vtxfmt_init( struct vbo_exec_context *exec )
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* silence warnings */
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_Color3f;
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_Color3fv;
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_Color4f;
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_Color4fv;
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_FogCoordfEXT;
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_FogCoordfvEXT;
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_MultiTexCoord1f;
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_MultiTexCoord1fv;
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_MultiTexCoord2f;
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_MultiTexCoord2fv;
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_MultiTexCoord3f;
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_MultiTexCoord3fv;
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_MultiTexCoord4f;
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_MultiTexCoord4fv;
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_Normal3f;
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_Normal3fv;
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_SecondaryColor3fEXT;
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_SecondaryColor3fvEXT;
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_TexCoord1f;
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_TexCoord1fv;
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_TexCoord2f;
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_TexCoord2fv;
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_TexCoord3f;
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_TexCoord3fv;
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_TexCoord4f;
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_TexCoord4fv;
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_Vertex2f;
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_Vertex2fv;
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_Vertex3f;
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_Vertex3fv;
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_Vertex4f;
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_Vertex4fv;
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_VertexAttrib1fARB;
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_VertexAttrib1fvARB;
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_VertexAttrib2fARB;
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_VertexAttrib2fvARB;
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_VertexAttrib3fARB;
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_VertexAttrib3fvARB;
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_VertexAttrib4fARB;
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_VertexAttrib4fvARB;
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_VertexAttrib1fNV;
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_VertexAttrib1fvNV;
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_VertexAttrib2fNV;
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_VertexAttrib2fvNV;
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_VertexAttrib3fNV;
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_VertexAttrib3fvNV;
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_VertexAttrib4fNV;
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_VertexAttrib4fvNV;
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_Materialfv;
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_EdgeFlag;
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_Indexf;
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) vbo_Indexfv;
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* FEATURE_beginend */
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Tell the VBO module to use a real OpenGL vertex buffer object to
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * store accumulated immediate-mode vertex data.
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This replaces the malloced buffer which was created in
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * vb_exec_vtx_init() below.
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vbo_use_buffer_objects(struct gl_context *ctx)
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Any buffer name but 0 can be used here since this bufferobj won't
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * go into the bufferobj hashtable.
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint bufName = IMM_BUFFER_NAME;
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum target = GL_ARRAY_BUFFER_ARB;
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum usage = GL_STREAM_DRAW_ARB;
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLsizei size = VBO_VERT_BUFFER_SIZE;
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Make sure this func is only used once */
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(exec->vtx.bufferobj == ctx->Shared->NullBufferObj);
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (exec->vtx.buffer_map) {
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_align_free(exec->vtx.buffer_map);
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.buffer_map = NULL;
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.buffer_ptr = NULL;
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Allocate a real buffer object now */
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_reference_buffer_object(ctx, &exec->vtx.bufferobj, NULL);
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtx.bufferobj = ctx->Driver.NewBufferObject(ctx, bufName, target);
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->Driver.BufferData(ctx, target, size, NULL, usage, exec->vtx.bufferobj)) {
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_OUT_OF_MEMORY, "VBO allocation");
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If this function is called, all VBO buffers will be unmapped when
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we flush.
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Otherwise, if a simple command like glColor3f() is called and we flush,
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the current VBO may be left mapped.
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_always_unmap_buffers(struct gl_context *ctx)
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->begin_vertices_flags |= FLUSH_STORED_VERTICES;
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vbo_exec_vtx_init( struct vbo_exec_context *exec )
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = exec->ctx;
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = vbo_context(ctx);
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Allocate a buffer object.  Will just reuse this object
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * continuously, unless vbo_use_buffer_objects() is called to enable
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * use of real VBOs.
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_reference_buffer_object(ctx,
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 &exec->vtx.bufferobj,
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 ctx->Shared->NullBufferObj);
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(!exec->vtx.buffer_map);
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtx.buffer_map = (GLfloat *)_mesa_align_malloc(VBO_VERT_BUFFER_SIZE, 64);
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtx.buffer_ptr = exec->vtx.buffer_map;
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_vtxfmt_init( exec );
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_noop_vtxfmt_init(&exec->vtxfmt_noop);
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Hook our functions into the dispatch table.
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_install_exec_vtxfmt( ctx, &exec->vtxfmt );
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0 ; i < VBO_ATTRIB_MAX ; i++) {
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(i < Elements(exec->vtx.attrsz));
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.attrsz[i] = 0;
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(i < Elements(exec->vtx.attrtype));
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.attrtype[i] = GL_FLOAT;
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(i < Elements(exec->vtx.active_sz));
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.active_sz[i] = 0;
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0 ; i < VERT_ATTRIB_MAX; i++) {
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(i < Elements(exec->vtx.inputs));
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(i < Elements(exec->vtx.arrays));
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.inputs[i] = &exec->vtx.arrays[i];
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_client_array *arrays = exec->vtx.arrays;
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned i;
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy(arrays, &vbo->currval[VBO_ATTRIB_POS],
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             VERT_ATTRIB_FF_MAX * sizeof(arrays[0]));
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < VERT_ATTRIB_FF_MAX; ++i) {
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         struct gl_client_array *array;
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         array = &arrays[VERT_ATTRIB_FF(i)];
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         array->BufferObj = NULL;
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_reference_buffer_object(ctx, &arrays->BufferObj,
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 vbo->currval[VBO_ATTRIB_POS+i].BufferObj);
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy(arrays + VERT_ATTRIB_GENERIC(0),
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             &vbo->currval[VBO_ATTRIB_GENERIC0],
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             VERT_ATTRIB_GENERIC_MAX * sizeof(arrays[0]));
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < VERT_ATTRIB_GENERIC_MAX; ++i) {
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         struct gl_client_array *array;
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         array = &arrays[VERT_ATTRIB_GENERIC(i)];
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         array->BufferObj = NULL;
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_reference_buffer_object(ctx, &array->BufferObj,
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           vbo->currval[VBO_ATTRIB_GENERIC0+i].BufferObj);
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtx.vertex_size = 0;
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->begin_vertices_flags = FLUSH_UPDATE_CURRENT;
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vbo_exec_vtx_destroy( struct vbo_exec_context *exec )
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* using a real VBO for vertex data */
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = exec->ctx;
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* True VBOs should already be unmapped
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (exec->vtx.buffer_map) {
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(exec->vtx.bufferobj->Name == 0 ||
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             exec->vtx.bufferobj->Name == IMM_BUFFER_NAME);
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (exec->vtx.bufferobj->Name == 0) {
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_align_free(exec->vtx.buffer_map);
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         exec->vtx.buffer_map = NULL;
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         exec->vtx.buffer_ptr = NULL;
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Drop any outstanding reference to the vertex buffer
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < Elements(exec->vtx.arrays); i++) {
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_reference_buffer_object(ctx,
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    &exec->vtx.arrays[i].BufferObj,
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    NULL);
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Free the vertex buffer.  Unmap first if needed.
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_bufferobj_mapped(exec->vtx.bufferobj)) {
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.UnmapBuffer(ctx, exec->vtx.bufferobj);
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_reference_buffer_object(ctx, &exec->vtx.bufferobj, NULL);
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called upon first glVertex, glColor, glTexCoord, etc.
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vbo_exec_BeginVertices( struct gl_context *ctx )
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_vtx_map( exec );
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert((ctx->Driver.NeedFlush & FLUSH_UPDATE_CURRENT) == 0);
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(exec->begin_vertices_flags);
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Driver.NeedFlush |= exec->begin_vertices_flags;
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via ctx->Driver.FlushVertices()
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param flags  bitmask of FLUSH_STORED_VERTICES, FLUSH_UPDATE_CURRENT
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vbo_exec_FlushVertices( struct gl_context *ctx, GLuint flags )
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* debug check: make sure we don't get called recursively */
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->flush_call_depth++;
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(exec->flush_call_depth == 1);
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) {
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* We've had glBegin but not glEnd! */
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->flush_call_depth--;
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(exec->flush_call_depth == 0);
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Flush (draw), and make sure VBO is left unmapped when done */
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_FlushVertices_internal(exec, GL_TRUE);
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Need to do this to ensure BeginVertices gets called again:
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Driver.NeedFlush &= ~(FLUSH_UPDATE_CURRENT | flags);
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->flush_call_depth--;
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(exec->flush_call_depth == 0);
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void reset_attrfv( struct vbo_exec_context *exec )
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0 ; i < VBO_ATTRIB_MAX ; i++) {
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.attrsz[i] = 0;
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.attrtype[i] = GL_FLOAT;
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->vtx.active_sz[i] = 0;
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtx.vertex_size = 0;
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_es_Color4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a)
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_Color4f(r, g, b, a);
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_es_Normal3f(GLfloat x, GLfloat y, GLfloat z)
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_Normal3f(x, y, z);
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_es_MultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_MultiTexCoord4f(target, s, t, r, q);
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_es_Materialfv(GLenum face, GLenum pname, const GLfloat *params)
1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_Materialfv(face, pname, params);
1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_es_Materialf(GLenum face, GLenum pname, GLfloat param)
1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat p[4];
1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p[0] = param;
1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p[1] = p[2] = p[3] = 0.0F;
1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_Materialfv(face, pname, p);
1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A special version of glVertexAttrib4f that does not treat index 0 as
1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * VBO_ATTRIB_POS.
1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVertexAttrib4f_nopos(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ATTR(VBO_ATTRIB_GENERIC0 + index, 4, GL_FLOAT, x, y, z, w);
1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ERROR(GL_INVALID_VALUE);
1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_es_VertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VertexAttrib4f_nopos(index, x, y, z, w);
1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_es_VertexAttrib1f(GLuint indx, GLfloat x)
1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VertexAttrib4f_nopos(indx, x, 0.0f, 0.0f, 1.0f);
1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_es_VertexAttrib1fv(GLuint indx, const GLfloat* values)
1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VertexAttrib4f_nopos(indx, values[0], 0.0f, 0.0f, 1.0f);
1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_es_VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VertexAttrib4f_nopos(indx, x, y, 0.0f, 1.0f);
1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_es_VertexAttrib2fv(GLuint indx, const GLfloat* values)
1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VertexAttrib4f_nopos(indx, values[0], values[1], 0.0f, 1.0f);
1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_es_VertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VertexAttrib4f_nopos(indx, x, y, z, 1.0f);
1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_es_VertexAttrib3fv(GLuint indx, const GLfloat* values)
1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VertexAttrib4f_nopos(indx, values[0], values[1], values[2], 1.0f);
1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_es_VertexAttrib4fv(GLuint indx, const GLfloat* values)
1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VertexAttrib4f_nopos(indx, values[0], values[1], values[2], values[3]);
1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1460