#include <inttypes.h> /* for PRId64 macro */
#include "glheader.h"
-#include "util/imports.h"
+
#include "bufferobj.h"
#include "context.h"
#include "enable.h"
if (array->BufferBindingIndex != bindingIndex) {
const GLbitfield array_bit = VERT_BIT(attribIndex);
- if (_mesa_is_bufferobj(vao->BufferBinding[bindingIndex].BufferObj))
+ if (vao->BufferBinding[bindingIndex].BufferObj)
vao->VertexAttribBufferMask |= array_bit;
else
vao->VertexAttribBufferMask &= ~array_bit;
assert(!vao->SharedAndImmutable);
struct gl_vertex_buffer_binding *binding = &vao->BufferBinding[index];
- assert(vbo != ctx->Shared->NullBufferObj);
-
if (ctx->Const.VertexBufferOffsetIsInt32 && (int)offset < 0 &&
- _mesa_is_bufferobj(vbo)) {
+ vbo) {
/* The offset will be interpreted as a signed int, so make sure
* the user supplied offset is not negative (driver limitation).
*/
binding->Offset = offset;
binding->Stride = stride;
- if (!_mesa_is_bufferobj(vbo)) {
+ if (!vbo) {
vao->VertexAttribBufferMask &= ~binding->_BoundArrays;
} else {
vao->VertexAttribBufferMask |= binding->_BoundArrays;
GLuint relativeOffset)
{
struct gl_array_attributes *const array = &vao->VertexAttrib[attrib];
+ struct gl_vertex_format new_format;
assert(!vao->SharedAndImmutable);
assert(size <= 4);
- array->RelativeOffset = relativeOffset;
- _mesa_set_vertex_format(&array->Format, size, type, format,
+ _mesa_set_vertex_format(&new_format, size, type, format,
normalized, integer, doubles);
+ if ((array->RelativeOffset == relativeOffset) &&
+ !memcmp(&new_format, &array->Format, sizeof(new_format)))
+ return;
+
+ array->RelativeOffset = relativeOffset;
+ array->Format = new_format;
+
vao->NewArrays |= vao->Enabled & VERT_BIT(attrib);
}
* 2.9.6), and the pointer argument is not NULL."
*/
if (ptr != NULL && vao != ctx->Array.DefaultVAO &&
- !_mesa_is_bufferobj(obj)) {
+ !obj) {
_mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-VBO array)", func);
return;
}
/* The Stride and Ptr fields are not set by update_array_format() */
struct gl_array_attributes *array = &vao->VertexAttrib[attrib];
- array->Stride = stride;
- /* For updating the pointer we would need to add the vao->NewArrays flag
- * to the VAO. But but that is done already unconditionally in
- * _mesa_update_array_format called above.
- */
- assert((vao->NewArrays | ~vao->Enabled) & VERT_BIT(attrib));
- array->Ptr = ptr;
-
- /* TODO: remove this hack by not using NullBufferObj in callers */
- if (obj == ctx->Shared->NullBufferObj)
- obj = NULL;
+ if ((array->Stride != stride) || (array->Ptr != ptr)) {
+ array->Stride = stride;
+ array->Ptr = ptr;
+ vao->NewArrays |= vao->Enabled & VERT_BIT(attrib);
+ }
/* Update the vertex buffer binding */
GLsizei effectiveStride = stride != 0 ?
primitive_restart_index(struct gl_context *ctx, GLuint index)
{
ctx->Array.RestartIndex = index;
+ _mesa_update_derived_primitive_restart_state(ctx);
}
else if (binding->BufferObj && binding->BufferObj->Name == buffers[i])
vbo = binding->BufferObj;
else {
- vbo = _mesa_multi_bind_lookup_bufferobj(ctx, buffers, i, func);
- if (!vbo)
+ bool error;
+ vbo = _mesa_multi_bind_lookup_bufferobj(ctx, buffers, i, func,
+ &error);
+ if (error)
continue;
-
- /* TODO: remove this hack */
- if (vbo == ctx->Shared->NullBufferObj)
- vbo = NULL;
}
} else {
vbo = NULL;
array->Ptr, _mesa_enum_to_string(array->Format.Type),
array->Format.Size,
array->Format._ElementSize, binding->Stride, bo ? bo->Name : 0,
- (unsigned long) bo ? bo->Size : 0);
+ (unsigned long)(bo ? bo->Size : 0));
}
}