diff options
Diffstat (limited to 'src/mesa/main')
-rw-r--r-- | src/mesa/main/arrayobj.c | 4 | ||||
-rw-r--r-- | src/mesa/main/attrib.c | 2 | ||||
-rw-r--r-- | src/mesa/main/context.c | 2 | ||||
-rw-r--r-- | src/mesa/main/mtypes.h | 22 | ||||
-rw-r--r-- | src/mesa/main/state.c | 29 | ||||
-rw-r--r-- | src/mesa/main/state.h | 8 | ||||
-rw-r--r-- | src/mesa/main/varray.c | 2 |
7 files changed, 69 insertions, 0 deletions
diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c index a6fa33c82c8..cf9c5d7ecc7 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 398ff653b73..dd6b98ce043 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 0aa2e3639f0..e13343b5e6c 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 41df04d38d4..bdecd422a9a 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1692,6 +1692,28 @@ struct gl_array_attrib struct gl_buffer_object *ArrayBufferObj; /** + * Vertex array object that is used with the currently active draw command. + * The _DrawVAO is either set to the currently bound VAO for array type + * draws or to internal VAO's set up by the vbo module to execute immediate + * mode or display list draws. + */ + struct gl_vertex_array_object *_DrawVAO; + /** + * The VERT_BIT_* bits effectively enabled from the current _DrawVAO. + * This is always a subset of _mesa_get_vao_vp_inputs(_DrawVAO) + * but may omit those arrays that shall not be referenced by the current + * gl_vertex_program_state::_VPMode. For example the generic attributes are + * maked out form the _DrawVAO's enabled arrays when a fixed function + * array draw is executed. + */ + GLbitfield _DrawVAOEnabledAttribs; + /** + * Initially or if the VAO referenced by _DrawVAO is deleted the _DrawVAO + * pointer is set to the _EmptyVAO which is just an empty VAO all the time. + */ + struct gl_vertex_array_object *_EmptyVAO; + + /** * 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 2fd4fb9d323..6dd7a7ec075 100644 --- a/src/mesa/main/state.c +++ b/src/mesa/main/state.c @@ -479,3 +479,32 @@ _mesa_update_vertex_processing_mode(struct gl_context *ctx) else ctx->VertexProgram._VPMode = VP_MODE_FF; } + + +/** + * Set the _DrawVAO and the net enabled arrays. + * The vao->_Enabled bitmask is transformed due to position/generic0 + * as stored in vao->_AttributeMapMode. Then the filter bitmask is applied + * to filter out arrays unwanted for the currently executed draw operation. + * For example, the generic attributes are masked out form the _DrawVAO's + * enabled arrays when a fixed function array draw is executed. + */ +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._DrawVAOEnabledAttribs != enabled) + ctx->NewDriverState |= ctx->DriverFlags.NewArray; + ctx->Array._DrawVAOEnabledAttribs = enabled; + _mesa_set_varying_vp_inputs(ctx, enabled); +} diff --git a/src/mesa/main/state.h b/src/mesa/main/state.h index 049166578c2..589c6650add 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 d55f74e968f..fc9e6fb6ba5 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(); |