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:
@@ -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);
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user