1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 VMware, Inc.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/state.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/api_validate.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/varray.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/bufferobj.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/enums.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/transformfeedback.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vbo_context.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All vertex buffers should be in an unmapped state when we're about
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to draw.  This debug function checks that.
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcheck_buffers_are_unmapped(const struct gl_client_array **inputs)
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < VERT_ATTRIB_MAX; i++) {
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (inputs[i]) {
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         struct gl_buffer_object *obj = inputs[i]->BufferObj;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(!_mesa_bufferobj_mapped(obj));
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         (void) obj;
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A debug function that may be called from other parts of Mesa as
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * needed during debugging.
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_check_buffers_are_unmapped(struct gl_context *ctx)
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = vbo_context(ctx);
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_exec_context *exec = &vbo->exec;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* check the current vertex arrays */
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   check_buffers_are_unmapped(exec->array.inputs);
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* check the current glBegin/glVertex/glEnd-style VBO */
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(!_mesa_bufferobj_mapped(exec->vtx.bufferobj));
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute min and max elements by scanning the index buffer for
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glDraw[Range]Elements() calls.
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If primitive restart is enabled, we need to ignore restart
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * indexes when computing min/max.
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_get_minmax_index(struct gl_context *ctx,
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     const struct _mesa_prim *prim,
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     const struct _mesa_index_buffer *ib,
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     GLuint *min_index, GLuint *max_index,
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     const GLuint count)
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean restart = ctx->Array.PrimitiveRestart;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint restartIndex = ctx->Array.RestartIndex;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int index_size = vbo_sizeof_ib_type(ib->type);
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *indices;
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   indices = (char *) ib->ptr + prim->start * index_size;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_bufferobj(ib->obj)) {
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLsizeiptr size = MIN2(count * index_size, ib->obj->Size);
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      indices = ctx->Driver.MapBufferRange(ctx, (GLintptr) indices, size,
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           GL_MAP_READ_BIT, ib->obj);
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (ib->type) {
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT: {
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *ui_indices = (const GLuint *)indices;
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint max_ui = 0;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint min_ui = ~0U;
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (restart) {
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < count; i++) {
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ui_indices[i] != restartIndex) {
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               if (ui_indices[i] > max_ui) max_ui = ui_indices[i];
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               if (ui_indices[i] < min_ui) min_ui = ui_indices[i];
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < count; i++) {
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ui_indices[i] > max_ui) max_ui = ui_indices[i];
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ui_indices[i] < min_ui) min_ui = ui_indices[i];
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *min_index = min_ui;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *max_index = max_ui;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT: {
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLushort *us_indices = (const GLushort *)indices;
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint max_us = 0;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint min_us = ~0U;
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (restart) {
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < count; i++) {
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (us_indices[i] != restartIndex) {
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               if (us_indices[i] > max_us) max_us = us_indices[i];
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               if (us_indices[i] < min_us) min_us = us_indices[i];
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < count; i++) {
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (us_indices[i] > max_us) max_us = us_indices[i];
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (us_indices[i] < min_us) min_us = us_indices[i];
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *min_index = min_us;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *max_index = max_us;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE: {
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLubyte *ub_indices = (const GLubyte *)indices;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint max_ub = 0;
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint min_ub = ~0U;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (restart) {
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < count; i++) {
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ub_indices[i] != restartIndex) {
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               if (ub_indices[i] > max_ub) max_ub = ub_indices[i];
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               if (ub_indices[i] < min_ub) min_ub = ub_indices[i];
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < count; i++) {
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ub_indices[i] > max_ub) max_ub = ub_indices[i];
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ub_indices[i] < min_ub) min_ub = ub_indices[i];
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *min_index = min_ub;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *max_index = max_ub;
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_bufferobj(ib->obj)) {
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.UnmapBuffer(ctx, ib->obj);
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute min and max elements for nr_prims
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_get_minmax_indices(struct gl_context *ctx,
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const struct _mesa_prim *prims,
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const struct _mesa_index_buffer *ib,
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       GLuint *min_index,
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       GLuint *max_index,
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       GLuint nr_prims)
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint tmp_min, tmp_max;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint count;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *min_index = ~0;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *max_index = 0;
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < nr_prims; i++) {
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const struct _mesa_prim *start_prim;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      start_prim = &prims[i];
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      count = start_prim->count;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Do combination if possible to reduce map/unmap count */
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      while ((i + 1 < nr_prims) &&
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             (prims[i].start + prims[i].count == prims[i+1].start)) {
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         count += prims[i+1].count;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         i++;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbo_get_minmax_index(ctx, start_prim, ib, &tmp_min, &tmp_max, count);
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *min_index = MIN2(*min_index, tmp_min);
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *max_index = MAX2(*max_index, tmp_max);
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Check that element 'j' of the array has reasonable data.
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Map VBO if needed.
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For debugging purposes; not normally used.
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcheck_array_data(struct gl_context *ctx, struct gl_client_array *array,
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 GLuint attrib, GLuint j)
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (array->Enabled) {
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const void *data = array->Ptr;
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (_mesa_is_bufferobj(array->BufferObj)) {
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!array->BufferObj->Pointer) {
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* need to map now */
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            array->BufferObj->Pointer =
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               ctx->Driver.MapBufferRange(ctx, 0, array->BufferObj->Size,
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  GL_MAP_READ_BIT, array->BufferObj);
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         data = ADD_POINTERS(data, array->BufferObj->Pointer);
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (array->Type) {
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_FLOAT:
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         {
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLfloat *f = (GLfloat *) ((GLubyte *) data + array->StrideB * j);
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint k;
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (k = 0; k < array->Size; k++) {
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               if (IS_INF_OR_NAN(f[k]) ||
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   f[k] >= 1.0e20 || f[k] <= -1.0e10) {
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  printf("Bad array data:\n");
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  printf("  Element[%u].%u = %f\n", j, k, f[k]);
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  printf("  Array %u at %p\n", attrib, (void* ) array);
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  printf("  Type 0x%x, Size %d, Stride %d\n",
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 array->Type, array->Size, array->Stride);
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  printf("  Address/offset %p in Buffer Object %u\n",
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 array->Ptr, array->BufferObj->Name);
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  f[k] = 1.0; /* XXX replace the bad value! */
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               /*assert(!IS_INF_OR_NAN(f[k]));*/
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ;
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unmap the buffer object referenced by given array, if mapped.
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunmap_array_buffer(struct gl_context *ctx, struct gl_client_array *array)
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (array->Enabled &&
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_is_bufferobj(array->BufferObj) &&
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_bufferobj_mapped(array->BufferObj)) {
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.UnmapBuffer(ctx, array->BufferObj);
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Examine the array's data for NaNs, etc.
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For debug purposes; not normally used.
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcheck_draw_elements_data(struct gl_context *ctx, GLsizei count, GLenum elemType,
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         const void *elements, GLint basevertex)
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_array_object *arrayObj = ctx->Array.ArrayObj;
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const void *elemMap;
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint i, k;
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_bufferobj(ctx->Array.ArrayObj->ElementArrayBufferObj)) {
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      elemMap = ctx->Driver.MapBufferRange(ctx, 0,
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   ctx->Array.ArrayObj->ElementArrayBufferObj->Size,
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   GL_MAP_READ_BIT,
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   ctx->Array.ArrayObj->ElementArrayBufferObj);
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      elements = ADD_POINTERS(elements, elemMap);
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < count; i++) {
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j;
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* j = element[i] */
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (elemType) {
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_UNSIGNED_BYTE:
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         j = ((const GLubyte *) elements)[i];
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_UNSIGNED_SHORT:
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         j = ((const GLushort *) elements)[i];
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_UNSIGNED_INT:
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         j = ((const GLuint *) elements)[i];
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* check element j of each enabled array */
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (k = 0; k < Elements(arrayObj->VertexAttrib); k++) {
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         check_array_data(ctx, &arrayObj->VertexAttrib[k], k, j);
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_bufferobj(arrayObj->ElementArrayBufferObj)) {
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.UnmapBuffer(ctx, ctx->Array.ArrayObj->ElementArrayBufferObj);
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (k = 0; k < Elements(arrayObj->VertexAttrib); k++) {
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unmap_array_buffer(ctx, &arrayObj->VertexAttrib[k]);
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Check array data, looking for NaNs, etc.
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcheck_draw_arrays_data(struct gl_context *ctx, GLint start, GLsizei count)
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* TO DO */
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Print info/data for glDrawArrays(), for debugging.
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprint_draw_arrays(struct gl_context *ctx,
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLenum mode, GLint start, GLsizei count)
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = vbo_context(ctx);
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_exec_context *exec = &vbo->exec;
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_array_object *arrayObj = ctx->Array.ArrayObj;
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("vbo_exec_DrawArrays(mode 0x%x, start %d, count %d):\n",
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  mode, start, count);
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < 32; i++) {
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_buffer_object *bufObj = exec->array.inputs[i]->BufferObj;
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint bufName = bufObj->Name;
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint stride = exec->array.inputs[i]->Stride;
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      printf("attr %2d: size %d stride %d  enabled %d  "
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     "ptr %p  Bufobj %u\n",
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     i,
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     exec->array.inputs[i]->Size,
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     stride,
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     /*exec->array.inputs[i]->Enabled,*/
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     arrayObj->VertexAttrib[VERT_ATTRIB_FF(i)].Enabled,
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     exec->array.inputs[i]->Ptr,
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     bufName);
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (bufName) {
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *p = ctx->Driver.MapBufferRange(ctx, 0, bufObj->Size,
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						 GL_MAP_READ_BIT, bufObj);
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         int offset = (int) (GLintptr) exec->array.inputs[i]->Ptr;
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         float *f = (float *) (p + offset);
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         int *k = (int *) f;
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         int i;
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         int n = (count * stride) / 4;
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (n > 32)
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            n = 32;
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         printf("  Data at offset %d:\n", offset);
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < n; i++) {
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            printf("    float[%d] = 0x%08x %f\n", i, k[i], f[i]);
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->Driver.UnmapBuffer(ctx, bufObj);
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the vbo->exec->inputs[] pointers to point to the enabled
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * vertex arrays.  This depends on the current vertex program/shader
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * being executed because of whether or not generic vertex arrays
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * alias the conventional vertex arrays.
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For arrays that aren't enabled, we set the input[attrib] pointer
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to point at a zero-stride current value "array".
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgrecalculate_input_bindings(struct gl_context *ctx)
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = vbo_context(ctx);
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_exec_context *exec = &vbo->exec;
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_client_array *vertexAttrib = ctx->Array.ArrayObj->VertexAttrib;
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct gl_client_array **inputs = &exec->array.inputs[0];
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbitfield64 const_inputs = 0x0;
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (get_program_mode(ctx)) {
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VP_NONE:
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* When no vertex program is active (or the vertex program is generated
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * from fixed-function state).  We put the material values into the
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * generic slots.  This is the only situation where material values
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * are available as per-vertex attributes.
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < VERT_ATTRIB_FF_MAX; i++) {
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (vertexAttrib[VERT_ATTRIB_FF(i)].Enabled)
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inputs[i] = &vertexAttrib[VERT_ATTRIB_FF(i)];
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else {
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inputs[i] = &vbo->currval[VBO_ATTRIB_POS+i];
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            const_inputs |= VERT_BIT(i);
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < MAT_ATTRIB_MAX; i++) {
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 inputs[VERT_ATTRIB_GENERIC(i)] =
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    &vbo->currval[VBO_ATTRIB_MAT_FRONT_AMBIENT+i];
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const_inputs |= VERT_BIT_GENERIC(i);
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Could use just about anything, just to fill in the empty
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * slots:
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = MAT_ATTRIB_MAX; i < VERT_ATTRIB_GENERIC_MAX; i++) {
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 inputs[VERT_ATTRIB_GENERIC(i)] = &vbo->currval[VBO_ATTRIB_GENERIC0+i];
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const_inputs |= VERT_BIT_GENERIC(i);
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VP_NV:
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* NV_vertex_program - attribute arrays alias and override
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * conventional, legacy arrays.  No materials, and the generic
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * slots are vacant.
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < VERT_ATTRIB_FF_MAX; i++) {
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (i < VERT_ATTRIB_GENERIC_MAX
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             && vertexAttrib[VERT_ATTRIB_GENERIC(i)].Enabled)
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inputs[i] = &vertexAttrib[VERT_ATTRIB_GENERIC(i)];
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else if (vertexAttrib[VERT_ATTRIB_FF(i)].Enabled)
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inputs[i] = &vertexAttrib[VERT_ATTRIB_FF(i)];
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else {
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inputs[i] = &vbo->currval[VBO_ATTRIB_POS+i];
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            const_inputs |= VERT_BIT_FF(i);
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Could use just about anything, just to fill in the empty
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * slots:
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < VERT_ATTRIB_GENERIC_MAX; i++) {
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 inputs[VERT_ATTRIB_GENERIC(i)] = &vbo->currval[VBO_ATTRIB_GENERIC0+i];
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const_inputs |= VERT_BIT_GENERIC(i);
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VP_ARB:
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* GL_ARB_vertex_program or GLSL vertex shader - Only the generic[0]
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * attribute array aliases and overrides the legacy position array.
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Otherwise, legacy attributes available in the legacy slots,
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * generic attributes in the generic slots and materials are not
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * available as per-vertex attributes.
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (vertexAttrib[VERT_ATTRIB_GENERIC0].Enabled)
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 inputs[0] = &vertexAttrib[VERT_ATTRIB_GENERIC0];
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (vertexAttrib[VERT_ATTRIB_POS].Enabled)
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 inputs[0] = &vertexAttrib[VERT_ATTRIB_POS];
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 inputs[0] = &vbo->currval[VBO_ATTRIB_POS];
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const_inputs |= VERT_BIT_POS;
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 1; i < VERT_ATTRIB_FF_MAX; i++) {
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (vertexAttrib[VERT_ATTRIB_FF(i)].Enabled)
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inputs[i] = &vertexAttrib[VERT_ATTRIB_FF(i)];
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else {
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inputs[i] = &vbo->currval[VBO_ATTRIB_POS+i];
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            const_inputs |= VERT_BIT_FF(i);
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 1; i < VERT_ATTRIB_GENERIC_MAX; i++) {
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (vertexAttrib[VERT_ATTRIB_GENERIC(i)].Enabled)
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inputs[VERT_ATTRIB_GENERIC(i)] = &vertexAttrib[VERT_ATTRIB_GENERIC(i)];
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else {
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inputs[VERT_ATTRIB_GENERIC(i)] = &vbo->currval[VBO_ATTRIB_GENERIC0+i];
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            const_inputs |= VERT_BIT_GENERIC(i);
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      inputs[VERT_ATTRIB_GENERIC0] = inputs[0];
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_set_varying_vp_inputs( ctx, VERT_BIT_ALL & (~const_inputs) );
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->NewDriverState |= ctx->DriverFlags.NewArray;
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Examine the enabled vertex arrays to set the exec->array.inputs[] values.
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * These will point to the arrays to actually use for drawing.  Some will
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * be user-provided arrays, other will be zero-stride const-valued arrays.
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that this might set the _NEW_VARYING_VP_INPUTS dirty flag so state
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * validation must be done after this call.
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_bind_arrays(struct gl_context *ctx)
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = vbo_context(ctx);
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_exec_context *exec = &vbo->exec;
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_draw_method(vbo, DRAW_ARRAYS);
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (exec->array.recalculate_inputs) {
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      recalculate_input_bindings(ctx);
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Again... because we may have changed the bitmask of per-vertex varying
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * attributes.  If we regenerate the fixed-function vertex program now
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * we may be able to prune down the number of vertex attributes which we
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * need in the shader.
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->NewState) {
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_update_state(ctx);
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->array.recalculate_inputs = GL_FALSE;
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Handle a draw case that potentially has primitive restart enabled.
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If primitive restart is enabled, and PrimitiveRestartInSoftware is
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * set, then vbo_sw_primitive_restart is used to handle the primitive
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * restart case in software.
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_handle_primitive_restart(struct gl_context *ctx,
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             const struct _mesa_prim *prim,
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             GLuint nr_prims,
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             const struct _mesa_index_buffer *ib,
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             GLboolean index_bounds_valid,
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             GLuint min_index,
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             GLuint max_index)
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = vbo_context(ctx);
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((ib != NULL) &&
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ctx->Const.PrimitiveRestartInSoftware &&
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ctx->Array.PrimitiveRestart) {
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Handle primitive restart in software */
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbo_sw_primitive_restart(ctx, prim, nr_prims, ib);
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Call driver directly for draw_prims */
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbo->draw_prims(ctx, prim, nr_prims, ib,
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      index_bounds_valid, min_index, max_index, NULL);
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helper function called by the other DrawArrays() functions below.
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is where we handle primitive restart for drawing non-indexed
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * arrays.  If primitive restart is enabled, it typically means
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * splitting one DrawArrays() into two.
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start,
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                GLsizei count, GLuint numInstances, GLuint baseInstance)
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = vbo_context(ctx);
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_exec_context *exec = &vbo->exec;
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct _mesa_prim prim[2];
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_bind_arrays(ctx);
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* init most fields to zero */
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(prim, 0, sizeof(prim));
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].begin = 1;
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].end = 1;
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].mode = mode;
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].num_instances = numInstances;
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].base_instance = baseInstance;
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Implement the primitive restart index */
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Array.PrimitiveRestart && ctx->Array.RestartIndex < count) {
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint primCount = 0;
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Array.RestartIndex == start) {
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* special case: RestartIndex at beginning */
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (count > 1) {
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            prim[0].start = start + 1;
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            prim[0].count = count - 1;
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            primCount = 1;
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (ctx->Array.RestartIndex == start + count - 1) {
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* special case: RestartIndex at end */
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (count > 1) {
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            prim[0].start = start;
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            prim[0].count = count - 1;
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            primCount = 1;
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* general case: RestartIndex in middle, split into two prims */
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         prim[0].start = start;
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         prim[0].count = ctx->Array.RestartIndex - start;
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         prim[1] = prim[0];
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         prim[1].start = ctx->Array.RestartIndex + 1;
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         prim[1].count = count - prim[1].start;
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         primCount = 2;
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (primCount > 0) {
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* draw one or two prims */
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         check_buffers_are_unmapped(exec->array.inputs);
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         vbo->draw_prims(ctx, prim, primCount, NULL,
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GL_TRUE, start, start + count - 1, NULL);
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* no prim restart */
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      prim[0].start = start;
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      prim[0].count = count;
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      check_buffers_are_unmapped(exec->array.inputs);
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbo->draw_prims(ctx, prim, 1, NULL,
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      GL_TRUE, start, start + count - 1,
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      NULL);
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) {
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_flush(ctx);
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called from glDrawArrays when in immediate mode (not display list mode).
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_DrawArrays(GLenum mode, GLint start, GLsizei count)
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_DRAW)
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glDrawArrays(%s, %d, %d)\n",
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(mode), start, count);
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_validate_DrawArrays( ctx, mode, start, count ))
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (0)
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      check_draw_arrays_data(ctx, start, count);
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_draw_arrays(ctx, mode, start, count, 1, 0);
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (0)
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_draw_arrays(ctx, mode, start, count);
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called from glDrawArraysInstanced when in immediate mode (not
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * display list mode).
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_DrawArraysInstanced(GLenum mode, GLint start, GLsizei count,
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             GLsizei numInstances)
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_DRAW)
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glDrawArraysInstanced(%s, %d, %d, %d)\n",
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(mode), start, count, numInstances);
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_validate_DrawArraysInstanced(ctx, mode, start, count, numInstances))
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (0)
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      check_draw_arrays_data(ctx, start, count);
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_draw_arrays(ctx, mode, start, count, numInstances, 0);
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (0)
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_draw_arrays(ctx, mode, start, count);
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called from glDrawArraysInstancedBaseInstance when in immediate mode.
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_DrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count,
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         GLsizei numInstances, GLuint baseInstance)
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_DRAW)
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glDrawArraysInstancedBaseInstance(%s, %d, %d, %d, %d)\n",
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(mode), first, count,
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  numInstances, baseInstance);
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_validate_DrawArraysInstanced(ctx, mode, first, count,
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           numInstances))
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (0)
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      check_draw_arrays_data(ctx, first, count);
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_draw_arrays(ctx, mode, first, count, numInstances, baseInstance);
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (0)
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_draw_arrays(ctx, mode, first, count);
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Map GL_ELEMENT_ARRAY_BUFFER and print contents.
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For debugging.
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdump_element_buffer(struct gl_context *ctx, GLenum type)
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLvoid *map =
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.MapBufferRange(ctx, 0,
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 ctx->Array.ArrayObj->ElementArrayBufferObj->Size,
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 GL_MAP_READ_BIT,
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 ctx->Array.ArrayObj->ElementArrayBufferObj);
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (type) {
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE:
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLubyte *us = (const GLubyte *) map;
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLint i;
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < ctx->Array.ArrayObj->ElementArrayBufferObj->Size; i++) {
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            printf("%02x ", us[i]);
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (i % 32 == 31)
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               printf("\n");
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         printf("\n");
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT:
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLushort *us = (const GLushort *) map;
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLint i;
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < ctx->Array.ArrayObj->ElementArrayBufferObj->Size / 2; i++) {
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            printf("%04x ", us[i]);
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (i % 16 == 15)
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               printf("\n");
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         printf("\n");
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT:
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLuint *us = (const GLuint *) map;
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLint i;
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < ctx->Array.ArrayObj->ElementArrayBufferObj->Size / 4; i++) {
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            printf("%08x ", us[i]);
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (i % 8 == 7)
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               printf("\n");
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         printf("\n");
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ;
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Driver.UnmapBuffer(ctx, ctx->Array.ArrayObj->ElementArrayBufferObj);
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Inner support for both _mesa_DrawElements and _mesa_DrawRangeElements.
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do the rendering for a glDrawElements or glDrawRangeElements call after
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we've validated buffer bounds, etc.
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_validated_drawrangeelements(struct gl_context *ctx, GLenum mode,
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLboolean index_bounds_valid,
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLuint start, GLuint end,
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLsizei count, GLenum type,
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				const GLvoid *indices,
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLint basevertex, GLint numInstances,
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLuint baseInstance)
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = vbo_context(ctx);
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_exec_context *exec = &vbo->exec;
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct _mesa_index_buffer ib;
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct _mesa_prim prim[1];
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_bind_arrays(ctx);
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ib.count = count;
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ib.type = type;
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ib.obj = ctx->Array.ArrayObj->ElementArrayBufferObj;
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ib.ptr = indices;
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].begin = 1;
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].end = 1;
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].weak = 0;
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].pad = 0;
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].mode = mode;
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].start = 0;
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].count = count;
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].indexed = 1;
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].basevertex = basevertex;
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].num_instances = numInstances;
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].base_instance = baseInstance;
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Need to give special consideration to rendering a range of
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * indices starting somewhere above zero.  Typically the
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * application is issuing multiple DrawRangeElements() to draw
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * successive primitives layed out linearly in the vertex arrays.
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Unless the vertex arrays are all in a VBO (or locked as with
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * CVA), the OpenGL semantics imply that we need to re-read or
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * re-upload the vertex data on each draw call.
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * In the case of hardware tnl, we want to avoid starting the
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * upload at zero, as it will mean every draw call uploads an
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * increasing amount of not-used vertex data.  Worse - in the
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * software tnl module, all those vertices might be transformed and
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * lit but never rendered.
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * If we just upload or transform the vertices in start..end,
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * however, the indices will be incorrect.
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * At this level, we don't know exactly what the requirements of
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * the backend are going to be, though it will likely boil down to
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * either:
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * 1) Do nothing, everything is in a VBO and is processed once
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *       only.
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * 2) Adjust the indices and vertex arrays so that start becomes
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *    zero.
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Rather than doing anything here, I'll provide a helper function
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * for the latter case elsewhere.
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   check_buffers_are_unmapped(exec->array.inputs);
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_handle_primitive_restart(ctx, prim, 1, &ib,
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                index_bounds_valid, start, end);
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) {
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_flush(ctx);
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called by glDrawRangeElementsBaseVertex() in immediate mode.
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_DrawRangeElementsBaseVertex(GLenum mode,
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     GLuint start, GLuint end,
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     GLsizei count, GLenum type,
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     const GLvoid *indices,
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     GLint basevertex)
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   static GLuint warnCount = 0;
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean index_bounds_valid = GL_TRUE;
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_DRAW)
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx,
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                "glDrawRangeElementsBaseVertex(%s, %u, %u, %d, %s, %p, %d)\n",
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                _mesa_lookup_enum_by_nr(mode), start, end, count,
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                _mesa_lookup_enum_by_nr(type), indices, basevertex);
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_validate_DrawRangeElements( ctx, mode, start, end, count,
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          type, indices, basevertex ))
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((int) end + basevertex < 0 ||
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       start + basevertex >= ctx->Array.ArrayObj->_MaxElement) {
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* The application requested we draw using a range of indices that's
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * outside the bounds of the current VBO.  This is invalid and appears
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * to give undefined results.  The safest thing to do is to simply
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * ignore the range, in case the application botched their range tracking
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * but did provide valid indices.  Also issue a warning indicating that
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * the application is broken.
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (warnCount++ < 10) {
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_warning(ctx, "glDrawRangeElements(start %u, end %u, "
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       "basevertex %d, count %d, type 0x%x, indices=%p):\n"
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       "\trange is outside VBO bounds (max=%u); ignoring.\n"
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       "\tThis should be fixed in the application.",
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       start, end, basevertex, count, type, indices,
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       ctx->Array.ArrayObj->_MaxElement - 1);
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      index_bounds_valid = GL_FALSE;
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* NOTE: It's important that 'end' is a reasonable value.
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * in _tnl_draw_prims(), we use end to determine how many vertices
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * to transform.  If it's too large, we can unnecessarily split prims
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * or we can read/write out of memory in several different places!
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Catch/fix some potential user errors */
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (type == GL_UNSIGNED_BYTE) {
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      start = MIN2(start, 0xff);
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      end = MIN2(end, 0xff);
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (type == GL_UNSIGNED_SHORT) {
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      start = MIN2(start, 0xffff);
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      end = MIN2(end, 0xffff);
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (0) {
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      printf("glDraw[Range]Elements{,BaseVertex}"
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     "(start %u, end %u, type 0x%x, count %d) ElemBuf %u, "
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     "base %d\n",
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     start, end, type, count,
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     ctx->Array.ArrayObj->ElementArrayBufferObj->Name,
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     basevertex);
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((int) start + basevertex < 0 ||
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       end + basevertex >= ctx->Array.ArrayObj->_MaxElement)
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      index_bounds_valid = GL_FALSE;
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   check_draw_elements_data(ctx, count, type, indices);
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) check_draw_elements_data;
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_validated_drawrangeelements(ctx, mode, index_bounds_valid, start, end,
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   count, type, indices, basevertex, 1, 0);
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called by glDrawRangeElements() in immediate mode.
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_DrawRangeElements(GLenum mode, GLuint start, GLuint end,
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           GLsizei count, GLenum type, const GLvoid *indices)
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_DRAW) {
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GET_CURRENT_CONTEXT(ctx);
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx,
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glDrawRangeElements(%s, %u, %u, %d, %s, %p)\n",
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(mode), start, end, count,
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(type), indices);
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_DrawRangeElementsBaseVertex(mode, start, end, count, type,
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					indices, 0);
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called by glDrawElements() in immediate mode.
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_DrawElements(GLenum mode, GLsizei count, GLenum type,
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const GLvoid *indices)
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_DRAW)
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glDrawElements(%s, %u, %s, %p)\n",
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(mode), count,
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(type), indices);
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_validate_DrawElements( ctx, mode, count, type, indices, 0 ))
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0,
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   count, type, indices, 0, 1, 0);
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called by glDrawElementsBaseVertex() in immediate mode.
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_DrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type,
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				const GLvoid *indices, GLint basevertex)
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_DRAW)
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glDrawElementsBaseVertex(%s, %d, %s, %p, %d)\n",
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(mode), count,
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(type), indices, basevertex);
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_validate_DrawElements( ctx, mode, count, type, indices,
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     basevertex ))
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0,
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   count, type, indices, basevertex, 1, 0);
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called by glDrawElementsInstanced() in immediate mode.
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type,
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               const GLvoid *indices, GLsizei numInstances)
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_DRAW)
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glDrawElementsInstanced(%s, %d, %s, %p, %d)\n",
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(mode), count,
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(type), indices, numInstances);
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_validate_DrawElementsInstanced(ctx, mode, count, type, indices,
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             numInstances, 0))
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0,
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   count, type, indices, 0, numInstances, 0);
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called by glDrawElementsInstancedBaseVertex() in immediate mode.
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_DrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type,
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               const GLvoid *indices, GLsizei numInstances,
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               GLint basevertex)
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_DRAW)
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glDrawElementsInstancedBaseVertex(%s, %d, %s, %p, %d; %d)\n",
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(mode), count,
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(type), indices,
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  numInstances, basevertex);
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_validate_DrawElementsInstanced(ctx, mode, count, type, indices,
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             numInstances, basevertex))
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0,
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   count, type, indices, basevertex, numInstances, 0);
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called by glDrawElementsInstancedBaseInstance() in immediate mode.
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_DrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type,
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           const GLvoid *indices, GLsizei numInstances,
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           GLuint baseInstance)
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_DRAW)
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glDrawElementsInstancedBaseInstance(%s, %d, %s, %p, %d, %d)\n",
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(mode), count,
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(type), indices,
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  numInstances, baseInstance);
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_validate_DrawElementsInstanced(ctx, mode, count, type, indices,
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             numInstances, 0))
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0,
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   count, type, indices, 0, numInstances,
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   baseInstance);
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called by glDrawElementsInstancedBaseVertexBaseInstance() in immediate mode.
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_DrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type,
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     const GLvoid *indices, GLsizei numInstances,
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     GLint basevertex, GLuint baseInstance)
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_DRAW)
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glDrawElementsInstancedBaseVertexBaseInstance(%s, %d, %s, %p, %d, %d, %d)\n",
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(mode), count,
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(type), indices,
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  numInstances, basevertex, baseInstance);
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_validate_DrawElementsInstanced(ctx, mode, count, type, indices,
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             numInstances, basevertex))
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0,
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   count, type, indices, basevertex, numInstances,
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   baseInstance);
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Inner support for both _mesa_MultiDrawElements() and
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _mesa_MultiDrawRangeElements().
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This does the actual rendering after we've checked array indexes, etc.
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_validated_multidrawelements(struct gl_context *ctx, GLenum mode,
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				const GLsizei *count, GLenum type,
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				const GLvoid * const *indices,
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLsizei primcount,
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				const GLint *basevertex)
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = vbo_context(ctx);
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_exec_context *exec = &vbo->exec;
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct _mesa_index_buffer ib;
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct _mesa_prim *prim;
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int index_type_size = vbo_sizeof_ib_type(type);
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uintptr_t min_index_ptr, max_index_ptr;
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean fallback = GL_FALSE;
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (primcount == 0)
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim = calloc(1, primcount * sizeof(*prim));
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (prim == NULL) {
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glMultiDrawElements");
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_bind_arrays(ctx);
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   min_index_ptr = (uintptr_t)indices[0];
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   max_index_ptr = 0;
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < primcount; i++) {
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      min_index_ptr = MIN2(min_index_ptr, (uintptr_t)indices[i]);
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      max_index_ptr = MAX2(max_index_ptr, (uintptr_t)indices[i] +
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   index_type_size * count[i]);
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Check if we can handle this thing as a bunch of index offsets from the
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * same index pointer.  If we can't, then we have to fall back to doing
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * a draw_prims per primitive.
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Check that the difference between each prim's indexes is a multiple of
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * the index/element size.
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index_type_size != 1) {
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < primcount; i++) {
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if ((((uintptr_t)indices[i] - min_index_ptr) % index_type_size) != 0) {
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    fallback = GL_TRUE;
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* If the index buffer isn't in a VBO, then treating the application's
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * subranges of the index buffer as one large index buffer may lead to
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * us reading unmapped memory.
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_is_bufferobj(ctx->Array.ArrayObj->ElementArrayBufferObj))
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fallback = GL_TRUE;
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!fallback) {
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ib.count = (max_index_ptr - min_index_ptr) / index_type_size;
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ib.type = type;
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ib.obj = ctx->Array.ArrayObj->ElementArrayBufferObj;
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ib.ptr = (void *)min_index_ptr;
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < primcount; i++) {
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prim[i].begin = (i == 0);
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prim[i].end = (i == primcount - 1);
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prim[i].weak = 0;
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prim[i].pad = 0;
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prim[i].mode = mode;
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prim[i].start = ((uintptr_t)indices[i] - min_index_ptr) / index_type_size;
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prim[i].count = count[i];
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prim[i].indexed = 1;
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         prim[i].num_instances = 1;
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         prim[i].base_instance = 0;
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (basevertex != NULL)
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    prim[i].basevertex = basevertex[i];
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    prim[i].basevertex = 0;
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      check_buffers_are_unmapped(exec->array.inputs);
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbo_handle_primitive_restart(ctx, prim, primcount, &ib,
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   GL_FALSE, ~0, ~0);
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* render one prim at a time */
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < primcount; i++) {
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ib.count = count[i];
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ib.type = type;
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ib.obj = ctx->Array.ArrayObj->ElementArrayBufferObj;
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ib.ptr = indices[i];
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prim[0].begin = 1;
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prim[0].end = 1;
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prim[0].weak = 0;
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prim[0].pad = 0;
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prim[0].mode = mode;
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prim[0].start = 0;
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prim[0].count = count[i];
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prim[0].indexed = 1;
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         prim[0].num_instances = 1;
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         prim[0].base_instance = 0;
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (basevertex != NULL)
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    prim[0].basevertex = basevertex[i];
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    prim[0].basevertex = 0;
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         check_buffers_are_unmapped(exec->array.inputs);
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         vbo_handle_primitive_restart(ctx, prim, 1, &ib,
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      GL_FALSE, ~0, ~0);
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(prim);
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) {
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_flush(ctx);
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_MultiDrawElements(GLenum mode,
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   const GLsizei *count, GLenum type,
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   const GLvoid **indices,
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   GLsizei primcount)
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_validate_MultiDrawElements(ctx, mode, count, type, indices,
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         primcount, NULL))
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_validated_multidrawelements(ctx, mode, count, type, indices, primcount,
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   NULL);
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_MultiDrawElementsBaseVertex(GLenum mode,
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     const GLsizei *count, GLenum type,
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     const GLvoid * const *indices,
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     GLsizei primcount,
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     const GLsizei *basevertex)
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_validate_MultiDrawElements(ctx, mode, count, type, indices,
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         primcount, basevertex))
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_validated_multidrawelements(ctx, mode, count, type, indices, primcount,
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   basevertex);
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_EXT_transform_feedback
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_draw_transform_feedback(struct gl_context *ctx, GLenum mode,
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            struct gl_transform_feedback_object *obj,
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            GLuint stream, GLuint numInstances)
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_context *vbo = vbo_context(ctx);
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbo_exec_context *exec = &vbo->exec;
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct _mesa_prim prim[2];
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_validate_DrawTransformFeedback(ctx, mode, obj, stream,
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             numInstances)) {
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_bind_arrays(ctx);
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* init most fields to zero */
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(prim, 0, sizeof(prim));
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].begin = 1;
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].end = 1;
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].mode = mode;
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].num_instances = numInstances;
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim[0].base_instance = 0;
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Maybe we should do some primitive splitting for primitive restart
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * (like in DrawArrays), but we have no way to know how many vertices
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * will be rendered. */
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   check_buffers_are_unmapped(exec->array.inputs);
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo->draw_prims(ctx, prim, 1, NULL,
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   GL_TRUE, 0, 0, obj);
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) {
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_flush(ctx);
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Like DrawArrays, but take the count from a transform feedback object.
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param mode  GL_POINTS, GL_LINES, GL_TRIANGLE_STRIP, etc.
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param name  the transform feedback object
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * User still has to setup of the vertex attribute info with
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glVertexPointer, glColorPointer, etc.
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Part of GL_ARB_transform_feedback2.
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_DrawTransformFeedback(GLenum mode, GLuint name)
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_transform_feedback_object *obj =
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_lookup_transform_feedback_object(ctx, name);
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_DRAW)
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glDrawTransformFeedback(%s, %d)\n",
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(mode), name);
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_draw_transform_feedback(ctx, mode, obj, 0, 1);
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_DrawTransformFeedbackStream(GLenum mode, GLuint name, GLuint stream)
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_transform_feedback_object *obj =
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_lookup_transform_feedback_object(ctx, name);
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_DRAW)
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glDrawTransformFeedbackStream(%s, %u, %u)\n",
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(mode), name, stream);
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_draw_transform_feedback(ctx, mode, obj, stream, 1);
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_DrawTransformFeedbackInstanced(GLenum mode, GLuint name,
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        GLsizei primcount)
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_transform_feedback_object *obj =
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_lookup_transform_feedback_object(ctx, name);
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_DRAW)
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glDrawTransformFeedbackInstanced(%s, %d)\n",
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(mode), name);
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_draw_transform_feedback(ctx, mode, obj, 0, primcount);
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_DrawTransformFeedbackStreamInstanced(GLenum mode, GLuint name,
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                              GLuint stream, GLsizei primcount)
1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_transform_feedback_object *obj =
1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_lookup_transform_feedback_object(ctx, name);
1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_DRAW)
1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glDrawTransformFeedbackStreamInstanced"
1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "(%s, %u, %u, %i)\n",
1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(mode), name, stream, primcount);
1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_draw_transform_feedback(ctx, mode, obj, stream, primcount);
1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Plug in the immediate-mode vertex array drawing commands into the
1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * givven vbo_exec_context object.
1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_array_init( struct vbo_exec_context *exec )
1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtxfmt.DrawArrays = vbo_exec_DrawArrays;
1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtxfmt.DrawElements = vbo_exec_DrawElements;
1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtxfmt.DrawRangeElements = vbo_exec_DrawRangeElements;
1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtxfmt.MultiDrawElementsEXT = vbo_exec_MultiDrawElements;
1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtxfmt.DrawElementsBaseVertex = vbo_exec_DrawElementsBaseVertex;
1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtxfmt.DrawRangeElementsBaseVertex = vbo_exec_DrawRangeElementsBaseVertex;
1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtxfmt.MultiDrawElementsBaseVertex = vbo_exec_MultiDrawElementsBaseVertex;
1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtxfmt.DrawArraysInstanced = vbo_exec_DrawArraysInstanced;
1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtxfmt.DrawArraysInstancedBaseInstance = vbo_exec_DrawArraysInstancedBaseInstance;
1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtxfmt.DrawElementsInstanced = vbo_exec_DrawElementsInstanced;
1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtxfmt.DrawElementsInstancedBaseInstance = vbo_exec_DrawElementsInstancedBaseInstance;
1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtxfmt.DrawElementsInstancedBaseVertex = vbo_exec_DrawElementsInstancedBaseVertex;
1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtxfmt.DrawElementsInstancedBaseVertexBaseInstance = vbo_exec_DrawElementsInstancedBaseVertexBaseInstance;
1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_EXT_transform_feedback
1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtxfmt.DrawTransformFeedback = vbo_exec_DrawTransformFeedback;
1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtxfmt.DrawTransformFeedbackStream =
1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         vbo_exec_DrawTransformFeedbackStream;
1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtxfmt.DrawTransformFeedbackInstanced =
1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         vbo_exec_DrawTransformFeedbackInstanced;
1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->vtxfmt.DrawTransformFeedbackStreamInstanced =
1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         vbo_exec_DrawTransformFeedbackStreamInstanced;
1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvbo_exec_array_destroy( struct vbo_exec_context *exec )
1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* nothing to do */
1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The following functions are only used for OpenGL ES 1/2 support.
1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * And some aren't even supported (yet) in ES 1/2.
1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_DrawArrays(GLenum mode, GLint first, GLsizei count)
1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_DrawArrays(mode, first, count);
1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_DrawElements(GLenum mode, GLsizei count, GLenum type,
1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   const GLvoid *indices)
1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_DrawElements(mode, count, type, indices);
1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_DrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type,
1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     const GLvoid *indices, GLint basevertex)
1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_DrawElementsBaseVertex(mode, count, type, indices, basevertex);
1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count,
1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        GLenum type, const GLvoid *indices)
1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_DrawRangeElements(mode, start, end, count, type, indices);
1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_DrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end,
1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  GLsizei count, GLenum type,
1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  const GLvoid *indices, GLint basevertex)
1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_DrawRangeElementsBaseVertex(mode, start, end, count, type,
1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					indices, basevertex);
1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_MultiDrawElementsEXT(GLenum mode, const GLsizei *count, GLenum type,
1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   const GLvoid **indices, GLsizei primcount)
1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_MultiDrawElements(mode, count, type, indices, primcount);
1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_MultiDrawElementsBaseVertex(GLenum mode,
1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  const GLsizei *count, GLenum type,
1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  const GLvoid **indices, GLsizei primcount,
1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  const GLint *basevertex)
1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_MultiDrawElementsBaseVertex(mode, count, type, indices,
1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					primcount, basevertex);
1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_EXT_transform_feedback
1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_DrawTransformFeedback(GLenum mode, GLuint name)
1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbo_exec_DrawTransformFeedback(mode, name);
1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1506