From 6002ab564bfb643d5e9fd1b8c3c7c45384de570a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mathias=20Fr=C3=B6hlich?= Date: Sat, 3 Feb 2018 17:19:24 +0100 Subject: [PATCH] vbo: Implement method to track the inputs array. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Provided the _DrawVAO and the derived state that is maintained if we have the _DrawVAO set, implement a method to incrementally update the array of gl_vertex_array input pointers. v2: Add some more comments. Rename _vbo_array_init to _vbo_init_inputs. Rename vbo_context::arrays to vbo_context::draw_arrays. Signed-off-by: Mathias Fröhlich Reviewed-by: Brian Paul --- src/mesa/vbo/vbo.h | 36 +++++++++++++++++ src/mesa/vbo/vbo_context.c | 1 + src/mesa/vbo/vbo_exec.c | 83 ++++++++++++++++++++++++++++++++++++++ src/mesa/vbo/vbo_private.h | 2 + 4 files changed, 122 insertions(+) diff --git a/src/mesa/vbo/vbo.h b/src/mesa/vbo/vbo.h index d594ba8f6a6..345aa6b0d23 100644 --- a/src/mesa/vbo/vbo.h +++ b/src/mesa/vbo/vbo.h @@ -254,6 +254,42 @@ vbo_sw_primitive_restart(struct gl_context *ctx, const struct _mesa_index_buffer *ib, struct gl_buffer_object *indirect); + +/** + * Utility that tracks and updates the current array entries. + */ +struct vbo_inputs +{ + /** + * Array of inputs to be set to the _DrawArrays pointer. + * The array contains pointers into the _DrawVAO and to the vbo modules + * current values. The array of pointers is updated incrementally + * based on the current and vertex_processing_mode values below. + */ + const struct gl_vertex_array *inputs[VERT_ATTRIB_MAX]; + /** Those VERT_BIT_'s where the inputs array point to current values. */ + GLbitfield current; + /** Store which aliasing current values - generics or materials - are set. */ + gl_vertex_processing_mode vertex_processing_mode; +}; + + +/** + * Initialize inputs. + */ +void +_vbo_init_inputs(struct vbo_inputs *inputs); + + +/** + * Update the gl_vertex_array array inside the vbo_inputs structure + * provided the current _VPMode, the provided vao and + * the vao's enabled arrays filtered by the filter bitmask. + */ +void +_vbo_update_inputs(struct gl_context *ctx, struct vbo_inputs *inputs); + + void GLAPIENTRY _es_Color4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a); diff --git a/src/mesa/vbo/vbo_context.c b/src/mesa/vbo/vbo_context.c index 5bc6bf0acd7..7b1ebc68f16 100644 --- a/src/mesa/vbo/vbo_context.c +++ b/src/mesa/vbo/vbo_context.c @@ -234,6 +234,7 @@ _vbo_CreateContext(struct gl_context *ctx) init_legacy_currval(ctx); init_generic_currval(ctx); init_mat_currval(ctx); + _vbo_init_inputs(&vbo->draw_arrays); vbo_set_indirect_draw_func(ctx, vbo_draw_indirect_prims); /* make sure all VBO_ATTRIB_ values can fit in an unsigned byte */ diff --git a/src/mesa/vbo/vbo_exec.c b/src/mesa/vbo/vbo_exec.c index 372d0237aad..69a150c78b7 100644 --- a/src/mesa/vbo/vbo_exec.c +++ b/src/mesa/vbo/vbo_exec.c @@ -27,6 +27,7 @@ #include "main/glheader.h" +#include "main/arrayobj.h" #include "main/mtypes.h" #include "main/api_arrayelt.h" #include "main/vtxfmt.h" @@ -240,3 +241,85 @@ vbo_merge_prims(struct _mesa_prim *p0, const struct _mesa_prim *p1) p0->count += p1->count; p0->end = p1->end; } + + +void +_vbo_init_inputs(struct vbo_inputs *inputs) +{ + inputs->current = 0; + inputs->vertex_processing_mode = VP_MODE_FF; +} + + +/** + * Update the vbo_inputs's arrays to point to the vao->_VertexArray arrays + * according to the 'enable' bitmask. + * \param enable bitfield of VERT_BIT_x flags. + */ +static inline void +update_vao_inputs(struct gl_context *ctx, + struct vbo_inputs *inputs, GLbitfield enable) +{ + const struct gl_vertex_array_object *vao = ctx->Array._DrawVAO; + + /* Make sure we process only arrays enabled in the VAO */ + assert((enable & ~_mesa_get_vao_vp_inputs(vao)) == 0); + + /* Fill in the client arrays from the VAO */ + const GLubyte *const map = _mesa_vao_attribute_map[vao->_AttributeMapMode]; + const struct gl_vertex_array *array = vao->_VertexArray; + const struct gl_vertex_array **iarray = &inputs->inputs[0]; + while (enable) { + const int attr = u_bit_scan(&enable); + iarray[attr] = &array[map[attr]]; + } +} + + +/** + * Update the vbo_inputs's arrays to point to the vbo->currval arrays + * according to the 'current' bitmask. + * \param current bitfield of VERT_BIT_x flags. + */ +static inline void +update_current_inputs(struct gl_context *ctx, + struct vbo_inputs *inputs, GLbitfield current) +{ + gl_vertex_processing_mode mode = ctx->VertexProgram._VPMode; + + /* All previously non current array pointers need update. */ + GLbitfield mask = current & ~inputs->current; + /* On mode change, the slots aliasing with materials need update too */ + if (mode != inputs->vertex_processing_mode) + mask |= current & VERT_BIT_MAT_ALL; + + struct vbo_context *vbo = vbo_context(ctx); + const struct gl_vertex_array *const currval = &vbo->currval[0]; + const struct gl_vertex_array **iarray = &inputs->inputs[0]; + const GLubyte *const map = _vbo_attribute_alias_map[mode]; + while (mask) { + const int attr = u_bit_scan(&mask); + iarray[attr] = &currval[map[attr]]; + } + + inputs->current = current; + inputs->vertex_processing_mode = mode; +} + + +/** + * Update the vbo_inputs's arrays to point to the vao->_VertexArray and + * vbo->currval arrays according to Array._DrawVAO and + * Array._DrawVAOEnableAttribs. + */ +void +_vbo_update_inputs(struct gl_context *ctx, struct vbo_inputs *inputs) +{ + const GLbitfield enable = ctx->Array._DrawVAOEnabledAttribs; + + /* Update array input pointers */ + update_vao_inputs(ctx, inputs, enable); + + /* The rest must be current inputs. */ + update_current_inputs(ctx, inputs, ~enable & VERT_BIT_ALL); +} diff --git a/src/mesa/vbo/vbo_private.h b/src/mesa/vbo/vbo_private.h index 49922892e5e..2fda06dec68 100644 --- a/src/mesa/vbo/vbo_private.h +++ b/src/mesa/vbo/vbo_private.h @@ -44,6 +44,8 @@ struct _mesa_prim; struct vbo_context { struct gl_vertex_array currval[VBO_ATTRIB_MAX]; + /* The array of inputs used for _DrawVAO draws. */ + struct vbo_inputs draw_arrays; struct vbo_exec_context exec; struct vbo_save_context save; -- 2.30.2