From: Mathias Fröhlich <mathias.froehl...@web.de> During the patch series this VAO gets populated with either the currently bound VAO or an internal VAO that will be used for immediate mode and dlist rendering.
Signed-off-by: Mathias Fröhlich <mathias.froehl...@web.de> --- src/mesa/main/arrayobj.c | 4 ++++ src/mesa/main/attrib.c | 2 ++ src/mesa/main/context.c | 2 ++ src/mesa/main/mtypes.h | 7 +++++++ src/mesa/main/state.c | 21 +++++++++++++++++++++ src/mesa/main/state.h | 8 ++++++++ src/mesa/main/varray.c | 2 ++ 7 files changed, 46 insertions(+) diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c index a6fa33c82c..cf9c5d7ecc 100644 --- a/src/mesa/main/arrayobj.c +++ b/src/mesa/main/arrayobj.c @@ -49,6 +49,7 @@ #include "arrayobj.h" #include "macros.h" #include "mtypes.h" +#include "state.h" #include "varray.h" #include "main/dispatch.h" #include "util/bitscan.h" @@ -578,6 +579,7 @@ bind_vertex_array(struct gl_context *ctx, GLuint id, bool no_error) * deleted. */ _mesa_set_drawing_arrays(ctx, NULL); + _mesa_set_draw_vao(ctx, ctx->Array._EmptyVAO, 0); ctx->NewState |= _NEW_ARRAY; _mesa_reference_vao(ctx, &ctx->Array.VAO, newObj); @@ -629,6 +631,8 @@ delete_vertex_arrays(struct gl_context *ctx, GLsizei n, const GLuint *ids) if (ctx->Array.LastLookedUpVAO == obj) _mesa_reference_vao(ctx, &ctx->Array.LastLookedUpVAO, NULL); + if (ctx->Array._DrawVAO == obj) + _mesa_set_draw_vao(ctx, ctx->Array._EmptyVAO, 0); /* Unreference the array object. * If refcount hits zero, the object will be deleted. diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c index 398ff653b7..dd6b98ce04 100644 --- a/src/mesa/main/attrib.c +++ b/src/mesa/main/attrib.c @@ -57,6 +57,7 @@ #include "viewport.h" #include "mtypes.h" #include "main/dispatch.h" +#include "state.h" #include "hash.h" #include <stdbool.h> @@ -1548,6 +1549,7 @@ copy_array_attrib(struct gl_context *ctx, /* Invalidate array state. It will be updated during the next draw. */ _mesa_set_drawing_arrays(ctx, NULL); + _mesa_set_draw_vao(ctx, ctx->Array._EmptyVAO, 0); } /** diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 0aa2e3639f..e13343b5e6 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -1335,6 +1335,8 @@ _mesa_free_context_data( struct gl_context *ctx ) _mesa_reference_vao(ctx, &ctx->Array.VAO, NULL); _mesa_reference_vao(ctx, &ctx->Array.DefaultVAO, NULL); + _mesa_reference_vao(ctx, &ctx->Array._EmptyVAO, NULL); + _mesa_reference_vao(ctx, &ctx->Array._DrawVAO, NULL); _mesa_free_attrib_data(ctx); _mesa_free_buffer_objects(ctx); diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 41df04d38d..b6fdb69283 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1691,6 +1691,13 @@ struct gl_array_attrib /* GL_ARB_vertex_buffer_object */ struct gl_buffer_object *ArrayBufferObj; + /** Vertex array object used when no specific DrawVAO is bound */ + struct gl_vertex_array_object *_EmptyVAO; + /** Vertex array object used for the current draw */ + struct gl_vertex_array_object *_DrawVAO; + /** The possibly reduced set of enabled vertex attributes from the above */ + GLbitfield _DrawVAOEnabled; + /** * Vertex arrays as consumed by a driver. * The array pointer is set up only by the VBO module. diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c index 2fd4fb9d32..42bf483682 100644 --- a/src/mesa/main/state.c +++ b/src/mesa/main/state.c @@ -479,3 +479,24 @@ _mesa_update_vertex_processing_mode(struct gl_context *ctx) else ctx->VertexProgram._VPMode = VP_MODE_FF; } + + +void +_mesa_set_draw_vao(struct gl_context *ctx, struct gl_vertex_array_object *vao, + GLbitfield filter) +{ + struct gl_vertex_array_object **ptr = &ctx->Array._DrawVAO; + if (*ptr != vao) { + _mesa_reference_vao_(ctx, ptr, vao); + ctx->NewDriverState |= ctx->DriverFlags.NewArray; + } else if (vao->NewArrays) { + ctx->NewDriverState |= ctx->DriverFlags.NewArray; + } + + /* May shuffle the position and generic0 bits around, filter out unwanted */ + const GLbitfield enabled = filter & _mesa_get_vao_vp_inputs(vao); + if (ctx->Array._DrawVAOEnabled != enabled) + ctx->NewDriverState |= ctx->DriverFlags.NewArray; + ctx->Array._DrawVAOEnabled = enabled; + _mesa_set_varying_vp_inputs(ctx, enabled); +} diff --git a/src/mesa/main/state.h b/src/mesa/main/state.h index 049166578c..589c6650ad 100644 --- a/src/mesa/main/state.h +++ b/src/mesa/main/state.h @@ -53,6 +53,14 @@ extern void _mesa_update_vertex_processing_mode(struct gl_context *ctx); +/** + * Set the _DrawVAO and the net enabled arrays. + */ +void +_mesa_set_draw_vao(struct gl_context *ctx, struct gl_vertex_array_object *vao, + GLbitfield filter); + + static inline bool _mesa_ati_fragment_shader_enabled(const struct gl_context *ctx) { diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c index d55f74e968..fc9e6fb6ba 100644 --- a/src/mesa/main/varray.c +++ b/src/mesa/main/varray.c @@ -2925,6 +2925,8 @@ _mesa_init_varray(struct gl_context *ctx) { ctx->Array.DefaultVAO = _mesa_new_vao(ctx, 0); _mesa_reference_vao(ctx, &ctx->Array.VAO, ctx->Array.DefaultVAO); + ctx->Array._EmptyVAO = _mesa_new_vao(ctx, ~0u); + _mesa_reference_vao(ctx, &ctx->Array._DrawVAO, ctx->Array._EmptyVAO); ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */ ctx->Array.Objects = _mesa_NewHashTable(); -- 2.14.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev