static void
copy_array_object(struct gl_context *ctx,
struct gl_vertex_array_object *dest,
- struct gl_vertex_array_object *src)
+ struct gl_vertex_array_object *src,
+ unsigned copy_attrib_mask)
{
- GLuint i;
-
/* skip Name */
/* skip RefCount */
- for (i = 0; i < ARRAY_SIZE(src->VertexAttrib); i++) {
+ while (copy_attrib_mask) {
+ unsigned i = u_bit_scan(©_attrib_mask);
+
copy_vertex_attrib_array(ctx, &dest->VertexAttrib[i], &src->VertexAttrib[i]);
copy_vertex_buffer_binding(ctx, &dest->BufferBinding[i], &src->BufferBinding[i]);
}
copy_array_attrib(struct gl_context *ctx,
struct gl_array_attrib *dest,
struct gl_array_attrib *src,
- bool vbo_deleted)
+ bool vbo_deleted,
+ unsigned copy_attrib_mask)
{
/* skip ArrayObj */
/* skip DefaultArrayObj, Objects */
/* skip RebindArrays */
if (!vbo_deleted)
- copy_array_object(ctx, dest->VAO, src->VAO);
+ copy_array_object(ctx, dest->VAO, src->VAO, copy_attrib_mask);
/* skip ArrayBufferObj */
/* skip IndexBufferObj */
/* Set the Name, needed for restore, but do never overwrite.
* Needs to match value in the object hash. */
dest->VAO->Name = src->VAO->Name;
+ dest->VAO->NonDefaultStateMask = src->VAO->NonDefaultStateMask;
/* And copy all of the rest. */
- copy_array_attrib(ctx, dest, src, false);
+ copy_array_attrib(ctx, dest, src, false, src->VAO->NonDefaultStateMask);
/* Just reference them here */
_mesa_reference_buffer_object(ctx, &dest->ArrayBufferObj,
if (is_vao_name_zero || !src->ArrayBufferObj ||
_mesa_IsBuffer(src->ArrayBufferObj->Name)) {
/* ... and restore its content */
- copy_array_attrib(ctx, dest, src, false);
+ dest->VAO->NonDefaultStateMask |= src->VAO->NonDefaultStateMask;
+ copy_array_attrib(ctx, dest, src, false,
+ dest->VAO->NonDefaultStateMask);
_mesa_BindBuffer(GL_ARRAY_BUFFER_ARB,
src->ArrayBufferObj ?
src->ArrayBufferObj->Name : 0);
} else {
- copy_array_attrib(ctx, dest, src, true);
+ copy_array_attrib(ctx, dest, src, true, 0);
}
/* Invalidate array state. It will be updated during the next draw. */
array->BufferBindingIndex = bindingIndex;
vao->NewArrays |= vao->Enabled & array_bit;
+ vao->NonDefaultStateMask |= array_bit | BITFIELD_BIT(bindingIndex);
}
}
}
vao->NewArrays |= vao->Enabled & binding->_BoundArrays;
+ vao->NonDefaultStateMask |= BITFIELD_BIT(index);
}
}
vao->NonZeroDivisorMask &= ~binding->_BoundArrays;
vao->NewArrays |= vao->Enabled & binding->_BoundArrays;
+ vao->NonDefaultStateMask |= BITFIELD_BIT(bindingIndex);
}
}
array->Format = new_format;
vao->NewArrays |= vao->Enabled & VERT_BIT(attrib);
+ vao->NonDefaultStateMask |= BITFIELD_BIT(attrib);
}
/**
array->Stride = stride;
array->Ptr = ptr;
vao->NewArrays |= vao->Enabled & VERT_BIT(attrib);
+ vao->NonDefaultStateMask |= BITFIELD_BIT(attrib);
}
/* Update the vertex buffer binding */
/* was disabled, now being enabled */
vao->Enabled |= attrib_bits;
vao->NewArrays |= attrib_bits;
+ vao->NonDefaultStateMask |= attrib_bits;
/* Update the map mode if needed */
if (attrib_bits & (VERT_BIT_POS|VERT_BIT_GENERIC0))