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