--- src/mesa/state_tracker/st_atom_array.c | 38 ++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 17 deletions(-)
diff --git a/src/mesa/state_tracker/st_atom_array.c b/src/mesa/state_tracker/st_atom_array.c index c96f6dc..86328e2 100644 --- a/src/mesa/state_tracker/st_atom_array.c +++ b/src/mesa/state_tracker/st_atom_array.c @@ -47,6 +47,7 @@ #include "main/bufferobj.h" #include "main/glformats.h" +#include "vbo/vbo.h" static GLuint double_types[4] = { @@ -472,7 +473,6 @@ setup_non_interleaved_attribs(struct st_context *st, const GLuint mesaAttr = vp->index_to_input[attr]; const struct gl_client_array *array = arrays[mesaAttr]; struct gl_buffer_object *bufobj = array->BufferObj; - GLsizei stride = array->StrideB; assert(array->_ElementSize == array->Size * _mesa_sizeof_type(array->Type)); @@ -490,30 +490,34 @@ setup_non_interleaved_attribs(struct st_context *st, vbuffer[attr].buffer = stobj->buffer; vbuffer[attr].user_buffer = NULL; vbuffer[attr].buffer_offset = pointer_to_offset(array->Ptr); + vbuffer[attr].stride = array->StrideB; /* in bytes */ } - else { - /* wrap user data */ - void *ptr; + else if (!array->Ptr || + (GLfloat*)array->Ptr == &ctx->Current.Attrib[mesaAttr][0]) { + struct st_buffer_object *stobj; - if (array->Ptr) { - ptr = (void *) array->Ptr; - } - else { - /* no array, use ctx->Current.Attrib[] value */ - ptr = (void *) ctx->Current.Attrib[mesaAttr]; - stride = 0; - } + /* current (zero-stride) attrib */ + vbo_get_current_attrib_buffer(ctx, mesaAttr, &bufobj, + &vbuffer[attr].buffer_offset); - assert(ptr); + stobj = st_buffer_object(bufobj); + if (!stobj || !stobj->buffer) { + return FALSE; /* out-of-memory error probably */ + } + vbuffer[attr].buffer = stobj->buffer; + vbuffer[attr].user_buffer = NULL; + vbuffer[attr].stride = 0; + } + else { + /* user buffer */ vbuffer[attr].buffer = NULL; - vbuffer[attr].user_buffer = ptr; + vbuffer[attr].user_buffer = array->Ptr; vbuffer[attr].buffer_offset = 0; + vbuffer[attr].stride = array->StrideB; } /* common-case setup */ - vbuffer[attr].stride = stride; /* in bytes */ - velements[attr].src_offset = 0; velements[attr].instance_divisor = array->InstanceDivisor; velements[attr].vertex_buffer_index = attr; @@ -588,7 +592,7 @@ static void update_array(struct st_context *st) const struct st_tracked_state st_update_array = { "st_update_array", /* name */ { /* dirty */ - (_NEW_PROGRAM | _NEW_BUFFER_OBJECT), /* mesa */ + (_NEW_PROGRAM | _NEW_BUFFER_OBJECT | _NEW_CURRENT_ATTRIB), /* mesa */ ST_NEW_VERTEX_ARRAYS | ST_NEW_VERTEX_PROGRAM, /* st */ }, update_array /* update */ -- 1.7.9.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev