_mesa_lookup_vao(struct gl_context *ctx, GLuint id);
extern struct gl_vertex_array_object *
-_mesa_lookup_vao_err(struct gl_context *ctx, GLuint id, const char *caller);
+_mesa_lookup_vao_err(struct gl_context *ctx, GLuint id,
+ bool is_ext_dsa, const char *caller);
extern struct gl_vertex_array_object *
_mesa_new_vao(struct gl_context *ctx, GLuint name);
+extern void
+_mesa_unbind_array_object_vbos(struct gl_context *ctx,
+ struct gl_vertex_array_object *obj);
+
extern void
_mesa_delete_vao(struct gl_context *ctx, struct gl_vertex_array_object *obj);
_mesa_all_buffers_are_unmapped(const struct gl_vertex_array_object *vao);
+extern void
+_mesa_vao_map_arrays(struct gl_context *ctx, struct gl_vertex_array_object *vao,
+ GLbitfield access);
+
+extern void
+_mesa_vao_map(struct gl_context *ctx, struct gl_vertex_array_object *vao,
+ GLbitfield access);
+
+
+extern void
+_mesa_vao_unmap_arrays(struct gl_context *ctx,
+ struct gl_vertex_array_object *vao);
+
+extern void
+_mesa_vao_unmap(struct gl_context *ctx,
+ struct gl_vertex_array_object *vao);
+
+
/**
* Array to apply the position/generic0 aliasing map to
* an attribute value used in vertex processing inputs to an attribute
}
+/**
+ * Return which enabled vertex attributes have a non-zero instance divisor.
+ *
+ * Needs the a fully updated VAO ready for draw.
+ */
+static inline GLbitfield
+_mesa_draw_nonzero_divisor_bits(const struct gl_context *ctx)
+{
+ const struct gl_vertex_array_object *const vao = ctx->Array._DrawVAO;
+ assert(vao->NewArrays == 0);
+ return vao->_EffEnabledNonZeroDivisor & ctx->Array._DrawVAOEnabledAttribs;
+}
+
+
/**
* Return enabled current values attribute bits for draw.
*/
}
+/**
+ * Return a vertex array vertex format provided the attribute number.
+ */
+static inline const struct gl_vertex_format *
+_mesa_draw_array_format(const struct gl_vertex_array_object *vao,
+ gl_vert_attrib attr)
+{
+ return &_mesa_draw_array_attrib(vao, attr)->Format;
+}
+
+
/**
* Return vertex buffer binding provided an attribute number.
*/
/**
- * Return true if we have the VERT_ATTRIB_EDGEFLAG array enabled.
- */
-static inline bool
-_mesa_draw_edge_flag_array_enabled(const struct gl_context *ctx)
-{
- return ctx->Array._DrawVAOEnabledAttribs & VERT_BIT_EDGEFLAG;
-}
-
-
-/**
- * Return the attrib for the given attribute.
+ * Return a current value vertex format provided the attribute number.
*/
-static inline const struct gl_array_attributes*
-_mesa_draw_attrib(const struct gl_context *ctx, gl_vert_attrib attr)
+static inline const struct gl_vertex_format *
+_mesa_draw_current_format(const struct gl_context *ctx, gl_vert_attrib attr)
{
- if (ctx->Array._DrawVAOEnabledAttribs & VERT_BIT(attr)) {
- const struct gl_vertex_array_object *vao = ctx->Array._DrawVAO;
- return _mesa_draw_array_attrib(vao, attr);
- } else {
- return _vbo_current_attrib(ctx, attr);
- }
+ return &_vbo_current_attrib(ctx, attr)->Format;
}
/**
- * Return the attrib, binding pair for the given attribute.
+ * Return true if we have the VERT_ATTRIB_EDGEFLAG array enabled.
*/
-static inline void
-_mesa_draw_attrib_and_binding(const struct gl_context *ctx, gl_vert_attrib attr,
- const struct gl_array_attributes **attrib,
- const struct gl_vertex_buffer_binding **binding)
+static inline bool
+_mesa_draw_edge_flag_array_enabled(const struct gl_context *ctx)
{
- if (ctx->Array._DrawVAOEnabledAttribs & VERT_BIT(attr)) {
- const struct gl_vertex_array_object *vao = ctx->Array._DrawVAO;
- *attrib = _mesa_draw_array_attrib(vao, attr);
- *binding = _mesa_draw_buffer_binding_from_attrib(vao, *attrib);
- } else {
- *attrib = _vbo_current_attrib(ctx, attr);
- *binding = _vbo_current_binding(ctx);
- }
+ return ctx->Array._DrawVAOEnabledAttribs & VERT_BIT_EDGEFLAG;
}