vbo: Implement method to track the inputs array.

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 <Mathias.Froehlich@web.de>
Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
Mathias Fröhlich
2018-02-03 17:19:24 +01:00
parent 08c7474189
commit 6002ab564b
4 changed files with 122 additions and 0 deletions
+36
View File
@@ -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);
+1
View File
@@ -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 */
+83
View File
@@ -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);
}
+2
View File
@@ -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;