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