[Mesa-dev] [PATCH 5/8] vbo: Use static const VERT_ATTRIB->VBO_ATTRIB maps.
Brian Paul
brianp at vmware.com
Wed Jan 31 16:55:37 UTC 2018
On 01/31/2018 12:55 AM, Mathias.Froehlich at gmx.net wrote:
> From: Mathias Fröhlich <mathias.froehlich at web.de>
>
> Instead of each context having its own map instance for
> this purpose, use a global static const map.
>
> Signed-off-by: Mathias Fröhlich <Mathias.Froehlich at web.de>
> ---
> src/mesa/vbo/vbo_context.c | 23 ++------------
> src/mesa/vbo/vbo_exec.c | 74 +++++++++++++++++++++++++++++++++++++++++++
> src/mesa/vbo/vbo_exec_array.c | 5 ++-
> src/mesa/vbo/vbo_exec_draw.c | 8 ++---
> src/mesa/vbo/vbo_private.h | 15 ++++++---
> src/mesa/vbo/vbo_save_draw.c | 8 ++---
> 6 files changed, 98 insertions(+), 35 deletions(-)
>
> diff --git a/src/mesa/vbo/vbo_context.c b/src/mesa/vbo/vbo_context.c
> index 265b73d2db..fe1d0f510a 100644
> --- a/src/mesa/vbo/vbo_context.c
> +++ b/src/mesa/vbo/vbo_context.c
> @@ -229,27 +229,8 @@ _vbo_CreateContext(struct gl_context *ctx)
> init_mat_currval(ctx);
> vbo_set_indirect_draw_func(ctx, vbo_draw_indirect_prims);
>
> - /* Build mappings from VERT_ATTRIB -> VBO_ATTRIB depending on type
> - * of vertex program active.
> - */
> - {
> - GLuint i;
> -
> - /* make sure all VBO_ATTRIB_ values can fit in an unsigned byte */
> - STATIC_ASSERT(VBO_ATTRIB_MAX <= 255);
> -
> - /* identity mapping */
> - for (i = 0; i < ARRAY_SIZE(vbo->map_vp_none); i++)
> - vbo->map_vp_none[i] = i;
> - /* map material attribs to generic slots */
> - for (i = 0; i < VERT_ATTRIB_MAT_MAX; i++)
> - vbo->map_vp_none[VERT_ATTRIB_MAT(i)]
> - = VBO_ATTRIB_MAT_FRONT_AMBIENT + i;
> -
> - for (i = 0; i < ARRAY_SIZE(vbo->map_vp_arb); i++)
> - vbo->map_vp_arb[i] = i;
> - }
> -
> + /* make sure all VBO_ATTRIB_ values can fit in an unsigned byte */
> + STATIC_ASSERT(VBO_ATTRIB_MAX <= 255);
>
> /* Hook our functions into exec and compile dispatch tables. These
> * will pretty much be permanently installed, which means that the
> diff --git a/src/mesa/vbo/vbo_exec.c b/src/mesa/vbo/vbo_exec.c
> index 82f204e3dc..987fa84a9b 100644
> --- a/src/mesa/vbo/vbo_exec.c
> +++ b/src/mesa/vbo/vbo_exec.c
> @@ -32,6 +32,80 @@
> #include "main/vtxfmt.h"
> #include "vbo_private.h"
>
> +const unsigned char
GLubyte?
> +_vbo_attribute_alias_map[_VP_MODE_MAX][VERT_ATTRIB_MAX] = {
> + /* VP_FF: */
> + {
> + VBO_ATTRIB_POS, /* VERT_ATTRIB_POS */
> + VBO_ATTRIB_NORMAL, /* VERT_ATTRIB_NORMAL */
> + VBO_ATTRIB_COLOR0, /* VERT_ATTRIB_COLOR0 */
> + VBO_ATTRIB_COLOR1, /* VERT_ATTRIB_COLOR1 */
> + VBO_ATTRIB_FOG, /* VERT_ATTRIB_FOG */
> + VBO_ATTRIB_COLOR_INDEX, /* VERT_ATTRIB_COLOR_INDEX */
> + VBO_ATTRIB_EDGEFLAG, /* VERT_ATTRIB_EDGEFLAG */
> + VBO_ATTRIB_TEX0, /* VERT_ATTRIB_TEX0 */
> + VBO_ATTRIB_TEX1, /* VERT_ATTRIB_TEX1 */
> + VBO_ATTRIB_TEX2, /* VERT_ATTRIB_TEX2 */
> + VBO_ATTRIB_TEX3, /* VERT_ATTRIB_TEX3 */
> + VBO_ATTRIB_TEX4, /* VERT_ATTRIB_TEX4 */
> + VBO_ATTRIB_TEX5, /* VERT_ATTRIB_TEX5 */
> + VBO_ATTRIB_TEX6, /* VERT_ATTRIB_TEX6 */
> + VBO_ATTRIB_TEX7, /* VERT_ATTRIB_TEX7 */
> + VBO_ATTRIB_POINT_SIZE, /* VERT_ATTRIB_POINT_SIZE */
> + VBO_ATTRIB_GENERIC0, /* VERT_ATTRIB_GENERIC0 */
> + VBO_ATTRIB_GENERIC1, /* VERT_ATTRIB_GENERIC1 */
> + VBO_ATTRIB_GENERIC2, /* VERT_ATTRIB_GENERIC2 */
> + VBO_ATTRIB_GENERIC3, /* VERT_ATTRIB_GENERIC3 */
> + VBO_ATTRIB_MAT_FRONT_AMBIENT, /* VERT_ATTRIB_GENERIC4 */
> + VBO_ATTRIB_MAT_BACK_AMBIENT, /* VERT_ATTRIB_GENERIC5 */
> + VBO_ATTRIB_MAT_FRONT_DIFFUSE, /* VERT_ATTRIB_GENERIC6 */
> + VBO_ATTRIB_MAT_BACK_DIFFUSE, /* VERT_ATTRIB_GENERIC7 */
> + VBO_ATTRIB_MAT_FRONT_SPECULAR, /* VERT_ATTRIB_GENERIC8 */
> + VBO_ATTRIB_MAT_BACK_SPECULAR, /* VERT_ATTRIB_GENERIC9 */
> + VBO_ATTRIB_MAT_FRONT_EMISSION, /* VERT_ATTRIB_GENERIC10 */
> + VBO_ATTRIB_MAT_BACK_EMISSION, /* VERT_ATTRIB_GENERIC11 */
> + VBO_ATTRIB_MAT_FRONT_SHININESS, /* VERT_ATTRIB_GENERIC12 */
> + VBO_ATTRIB_MAT_BACK_SHININESS, /* VERT_ATTRIB_GENERIC13 */
> + VBO_ATTRIB_MAT_FRONT_INDEXES, /* VERT_ATTRIB_GENERIC14 */
> + VBO_ATTRIB_MAT_BACK_INDEXES /* VERT_ATTRIB_GENERIC15 */
> + },
> +
> + /* VP_SHADER: */
> + {
> + VBO_ATTRIB_POS, /* VERT_ATTRIB_POS */
> + VBO_ATTRIB_NORMAL, /* VERT_ATTRIB_NORMAL */
> + VBO_ATTRIB_COLOR0, /* VERT_ATTRIB_COLOR0 */
> + VBO_ATTRIB_COLOR1, /* VERT_ATTRIB_COLOR1 */
> + VBO_ATTRIB_FOG, /* VERT_ATTRIB_FOG */
> + VBO_ATTRIB_COLOR_INDEX, /* VERT_ATTRIB_COLOR_INDEX */
> + VBO_ATTRIB_EDGEFLAG, /* VERT_ATTRIB_EDGEFLAG */
> + VBO_ATTRIB_TEX0, /* VERT_ATTRIB_TEX0 */
> + VBO_ATTRIB_TEX1, /* VERT_ATTRIB_TEX1 */
> + VBO_ATTRIB_TEX2, /* VERT_ATTRIB_TEX2 */
> + VBO_ATTRIB_TEX3, /* VERT_ATTRIB_TEX3 */
> + VBO_ATTRIB_TEX4, /* VERT_ATTRIB_TEX4 */
> + VBO_ATTRIB_TEX5, /* VERT_ATTRIB_TEX5 */
> + VBO_ATTRIB_TEX6, /* VERT_ATTRIB_TEX6 */
> + VBO_ATTRIB_TEX7, /* VERT_ATTRIB_TEX7 */
> + VBO_ATTRIB_POINT_SIZE, /* VERT_ATTRIB_POINT_SIZE */
> + VBO_ATTRIB_GENERIC0, /* VERT_ATTRIB_GENERIC0 */
> + VBO_ATTRIB_GENERIC1, /* VERT_ATTRIB_GENERIC1 */
> + VBO_ATTRIB_GENERIC2, /* VERT_ATTRIB_GENERIC2 */
> + VBO_ATTRIB_GENERIC3, /* VERT_ATTRIB_GENERIC3 */
> + VBO_ATTRIB_GENERIC4, /* VERT_ATTRIB_GENERIC4 */
> + VBO_ATTRIB_GENERIC5, /* VERT_ATTRIB_GENERIC5 */
> + VBO_ATTRIB_GENERIC6, /* VERT_ATTRIB_GENERIC6 */
> + VBO_ATTRIB_GENERIC7, /* VERT_ATTRIB_GENERIC7 */
> + VBO_ATTRIB_GENERIC8, /* VERT_ATTRIB_GENERIC8 */
> + VBO_ATTRIB_GENERIC9, /* VERT_ATTRIB_GENERIC9 */
> + VBO_ATTRIB_GENERIC10, /* VERT_ATTRIB_GENERIC10 */
> + VBO_ATTRIB_GENERIC11, /* VERT_ATTRIB_GENERIC11 */
> + VBO_ATTRIB_GENERIC12, /* VERT_ATTRIB_GENERIC12 */
> + VBO_ATTRIB_GENERIC13, /* VERT_ATTRIB_GENERIC13 */
> + VBO_ATTRIB_GENERIC14, /* VERT_ATTRIB_GENERIC14 */
> + VBO_ATTRIB_GENERIC15 /* VERT_ATTRIB_GENERIC15 */
> + }
> +};
I wonder if it wouldn't be better to just use a small inline fnction to
do this mapping. It may be faster to evaluate than to do a memory lookup.
static inline enum vbo_attrib
vbo_attribute_alias_map(enum vp_mode mode, gl_vert_attrib attrib)
{
STATIC_ASSERT(VBO_ATTRIB_GENERIC0 == VERT_ATTRIB_GENERIC0);
if (mode == VP_SHADER) {
return (vbo_attrib) attrib;
}
else {
const int offset = VBO_ATTRIB_MAT_FRONT_AMBIENT - VBO_ATTRIB_GENERIC0;
return attrib < VERT_ATTRIB_MAT0 ? (vbo_attrib) attrib
: VBO_ATTRIB_MAT_FRONT_AMBIENT + offset;
}
}
>
>
> void
> diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c
> index 28f64e1422..50cd1deaa6 100644
> --- a/src/mesa/vbo/vbo_exec_array.c
> +++ b/src/mesa/vbo/vbo_exec_array.c
> @@ -319,7 +319,8 @@ recalculate_input_bindings(struct gl_context *ctx)
> GLbitfield const_inputs = 0x0;
> GLuint i;
>
> - switch (get_vp_mode(ctx)) {
> + const enum vp_mode program_mode = get_vp_mode(ctx);
> + switch (program_mode) {
> case VP_FF:
> /* When no vertex program is active (or the vertex program is generated
> * from fixed-function state). We put the material values into the
> @@ -424,6 +425,8 @@ recalculate_input_bindings(struct gl_context *ctx)
> }
>
> break;
> + default:
> + assert(0);
> }
>
> _mesa_set_varying_vp_inputs(ctx, VERT_BIT_ALL & (~const_inputs));
> diff --git a/src/mesa/vbo/vbo_exec_draw.c b/src/mesa/vbo/vbo_exec_draw.c
> index b077fbeb6d..c4caff40bc 100644
> --- a/src/mesa/vbo/vbo_exec_draw.c
> +++ b/src/mesa/vbo/vbo_exec_draw.c
> @@ -174,18 +174,20 @@ vbo_exec_bind_arrays(struct gl_context *ctx)
> struct vbo_context *vbo = vbo_context(ctx);
> struct vbo_exec_context *exec = &vbo->exec;
> struct gl_vertex_array *arrays = exec->vtx.arrays;
> - const GLubyte *map;
> GLuint attr;
> GLbitfield varying_inputs = 0x0;
> bool swap_pos = false;
>
> + const enum vp_mode program_mode = get_vp_mode(exec->ctx);
> + const unsigned char * const map = _vbo_attribute_alias_map[program_mode];
> +
> /* Install the default (ie Current) attributes first */
> for (attr = 0; attr < VERT_ATTRIB_FF_MAX; attr++) {
> exec->vtx.inputs[attr] = &vbo->currval[VBO_ATTRIB_POS+attr];
> }
>
> /* Overlay other active attributes */
> - switch (get_vp_mode(exec->ctx)) {
> + switch (program_mode) {
> case VP_FF:
> for (attr = 0; attr < VERT_ATTRIB_MAT_OFFSET; attr++) {
> assert(VERT_ATTRIB_GENERIC(attr) < ARRAY_SIZE(exec->vtx.inputs));
> @@ -197,7 +199,6 @@ vbo_exec_bind_arrays(struct gl_context *ctx)
> exec->vtx.inputs[VERT_ATTRIB_MAT(attr)] =
> &vbo->currval[VBO_ATTRIB_MAT_FRONT_AMBIENT+attr];
> }
> - map = vbo->map_vp_none;
> break;
> case VP_SHADER:
> for (attr = 0; attr < VERT_ATTRIB_GENERIC_MAX; attr++) {
> @@ -205,7 +206,6 @@ vbo_exec_bind_arrays(struct gl_context *ctx)
> exec->vtx.inputs[VERT_ATTRIB_GENERIC(attr)] =
> &vbo->currval[VBO_ATTRIB_GENERIC0+attr];
> }
> - map = vbo->map_vp_arb;
>
> /* check if VERT_ATTRIB_POS is not read but VERT_BIT_GENERIC0 is read.
> * In that case we effectively need to route the data from
> diff --git a/src/mesa/vbo/vbo_private.h b/src/mesa/vbo/vbo_private.h
> index 7c1e3c481f..9be186a5a7 100644
> --- a/src/mesa/vbo/vbo_private.h
> +++ b/src/mesa/vbo/vbo_private.h
> @@ -45,10 +45,6 @@ struct _mesa_prim;
> struct vbo_context {
> struct gl_vertex_array currval[VBO_ATTRIB_MAX];
>
> - /** Map VERT_ATTRIB_x to VBO_ATTRIB_y */
> - GLubyte map_vp_none[VERT_ATTRIB_MAX];
> - GLubyte map_vp_arb[VERT_ATTRIB_MAX];
> -
> struct vbo_exec_context exec;
> struct vbo_save_context save;
>
> @@ -79,7 +75,8 @@ vbo_context(struct gl_context *ctx)
> */
> enum vp_mode {
> VP_FF, /**< legacy / fixed function */
> - VP_SHADER /**< ARB vertex program or GLSL vertex shader */
> + VP_SHADER, /**< ARB vertex program or GLSL vertex shader */
> + _VP_MODE_MAX /**< for sizing arrays */
> };
>
>
> @@ -98,6 +95,14 @@ get_vp_mode( struct gl_context *ctx )
> }
>
>
> +/* Array to apply the fixed function material aliasing map to
> + * an attribute value used in vbo processing inputs to an attribute
> + * as they appear in the vao.
> + */
> +extern const unsigned char
> +_vbo_attribute_alias_map[_VP_MODE_MAX][VERT_ATTRIB_MAX];
> +
> +
> /**
> * Return if format is integer. The immediate mode commands only emit floats
> * for non-integer types, thus everything else is integer.
> diff --git a/src/mesa/vbo/vbo_save_draw.c b/src/mesa/vbo/vbo_save_draw.c
> index 940739cd29..f9a0e39cea 100644
> --- a/src/mesa/vbo/vbo_save_draw.c
> +++ b/src/mesa/vbo/vbo_save_draw.c
> @@ -138,18 +138,20 @@ bind_vertex_list(struct gl_context *ctx,
> struct vbo_context *vbo = vbo_context(ctx);
> struct vbo_save_context *save = &vbo->save;
> struct gl_vertex_array *arrays = save->arrays;
> - const GLubyte *map;
> GLuint attr;
> GLbitfield varying_inputs = 0x0;
> bool generic_from_pos = false;
>
> + const enum vp_mode program_mode = get_vp_mode(ctx);
> + const unsigned char * const map = _vbo_attribute_alias_map[program_mode];
> +
> /* Install the default (ie Current) attributes first */
> for (attr = 0; attr < VERT_ATTRIB_FF_MAX; attr++) {
> save->inputs[attr] = &vbo->currval[VBO_ATTRIB_POS + attr];
> }
>
> /* Overlay other active attributes */
> - switch (get_vp_mode(ctx)) {
> + switch (program_mode) {
> case VP_FF:
> for (attr = 0; attr < VERT_ATTRIB_MAT_OFFSET; attr++) {
> save->inputs[VERT_ATTRIB_GENERIC(attr)] =
> @@ -159,14 +161,12 @@ bind_vertex_list(struct gl_context *ctx,
> save->inputs[VERT_ATTRIB_MAT(attr)] =
> &vbo->currval[VBO_ATTRIB_MAT_FRONT_AMBIENT+attr];
> }
> - map = vbo->map_vp_none;
> break;
> case VP_SHADER:
> for (attr = 0; attr < VERT_ATTRIB_GENERIC_MAX; attr++) {
> save->inputs[VERT_ATTRIB_GENERIC(attr)] =
> &vbo->currval[VBO_ATTRIB_GENERIC0+attr];
> }
> - map = vbo->map_vp_arb;
>
> /* check if VERT_ATTRIB_POS is not read but VERT_BIT_GENERIC0 is read.
> * In that case we effectively need to route the data from
>
More information about the mesa-dev
mailing list