[Mesa-dev] [PATCH 02/17] st/mesa: decrease the size of st_vertex_program
Brian Paul
brianp at vmware.com
Mon May 1 16:40:04 UTC 2017
On 05/01/2017 06:52 AM, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
> src/mesa/state_tracker/st_atifs_to_tgsi.c | 8 ++++----
> src/mesa/state_tracker/st_atifs_to_tgsi.h | 4 ++--
> src/mesa/state_tracker/st_cb_rasterpos.c | 4 ++--
> src/mesa/state_tracker/st_context.h | 2 +-
> src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 16 ++++++++--------
> src/mesa/state_tracker/st_glsl_to_tgsi.h | 8 ++++----
> src/mesa/state_tracker/st_mesa_to_tgsi.c | 8 ++++----
> src/mesa/state_tracker/st_mesa_to_tgsi.h | 4 ++--
> src/mesa/state_tracker/st_program.c | 10 +++++-----
> src/mesa/state_tracker/st_program.h | 8 ++++----
> 10 files changed, 36 insertions(+), 36 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_atifs_to_tgsi.c b/src/mesa/state_tracker/st_atifs_to_tgsi.c
> index 90286a1..0cba169 100644
> --- a/src/mesa/state_tracker/st_atifs_to_tgsi.c
> +++ b/src/mesa/state_tracker/st_atifs_to_tgsi.c
> @@ -38,22 +38,22 @@
> struct st_translate {
> struct ureg_program *ureg;
> struct ati_fragment_shader *atifs;
>
> struct ureg_dst temps[MAX_PROGRAM_TEMPS];
> struct ureg_src *constants;
> struct ureg_dst outputs[PIPE_MAX_SHADER_OUTPUTS];
> struct ureg_src inputs[PIPE_MAX_SHADER_INPUTS];
> struct ureg_src samplers[PIPE_MAX_SAMPLERS];
>
> - const GLuint *inputMapping;
> - const GLuint *outputMapping;
> + const ubyte *inputMapping;
> + const ubyte *outputMapping;
>
> unsigned current_pass;
>
> bool regs_written[MAX_NUM_PASSES_ATI][MAX_NUM_FRAGMENT_REGISTERS_ATI];
>
> boolean error;
> };
>
> struct instruction_desc {
> unsigned TGSI_opcode;
> @@ -418,26 +418,26 @@ finalize_shader(struct st_translate *t, unsigned numPasses)
> /**
> * Called when a new variant is needed, we need to translate
> * the ATI fragment shader to TGSI
> */
> enum pipe_error
> st_translate_atifs_program(
> struct ureg_program *ureg,
> struct ati_fragment_shader *atifs,
> struct gl_program *program,
> GLuint numInputs,
> - const GLuint inputMapping[],
> + const ubyte inputMapping[],
> const ubyte inputSemanticName[],
> const ubyte inputSemanticIndex[],
> const GLuint interpMode[],
> GLuint numOutputs,
> - const GLuint outputMapping[],
> + const ubyte outputMapping[],
> const ubyte outputSemanticName[],
> const ubyte outputSemanticIndex[])
> {
> enum pipe_error ret = PIPE_OK;
>
> unsigned pass, i, r;
>
> struct st_translate translate, *t;
> t = &translate;
> memset(t, 0, sizeof *t);
> diff --git a/src/mesa/state_tracker/st_atifs_to_tgsi.h b/src/mesa/state_tracker/st_atifs_to_tgsi.h
> index 1422702..980555c 100644
> --- a/src/mesa/state_tracker/st_atifs_to_tgsi.h
> +++ b/src/mesa/state_tracker/st_atifs_to_tgsi.h
> @@ -36,26 +36,26 @@ struct ureg_program;
> struct tgsi_token;
> struct ati_fragment_shader;
> struct st_fp_variant_key;
>
> enum pipe_error
> st_translate_atifs_program(
> struct ureg_program *ureg,
> struct ati_fragment_shader *atifs,
> struct gl_program *program,
> GLuint numInputs,
> - const GLuint inputMapping[],
> + const ubyte inputMapping[],
> const ubyte inputSemanticName[],
> const ubyte inputSemanticIndex[],
> const GLuint interpMode[],
> GLuint numOutputs,
> - const GLuint outputMapping[],
> + const ubyte outputMapping[],
> const ubyte outputSemanticName[],
> const ubyte outputSemanticIndex[]);
>
>
> void
> st_init_atifs_prog(struct gl_context *ctx, struct gl_program *prog);
>
> const struct tgsi_token *
> st_fixup_atifs(const struct tgsi_token *tokens,
> const struct st_fp_variant_key *key);
> diff --git a/src/mesa/state_tracker/st_cb_rasterpos.c b/src/mesa/state_tracker/st_cb_rasterpos.c
> index 8518454..c55b624 100644
> --- a/src/mesa/state_tracker/st_cb_rasterpos.c
> +++ b/src/mesa/state_tracker/st_cb_rasterpos.c
> @@ -102,21 +102,21 @@ rastpos_destroy(struct draw_stage *stage)
> {
> free(stage);
> }
>
>
> /**
> * Update a raster pos attribute from the vertex result if it's present,
> * else copy the current attrib.
> */
> static void
> -update_attrib(struct gl_context *ctx, const GLuint *outputMapping,
> +update_attrib(struct gl_context *ctx, const ubyte *outputMapping,
> const struct vertex_header *vert,
> GLfloat *dest,
> GLuint result, GLuint defaultAttrib)
> {
> const GLfloat *src;
> const GLuint k = outputMapping[result];
> if (k != ~0U)
> src = vert->data[k];
> else
> src = ctx->Current.Attrib[defaultAttrib];
> @@ -127,21 +127,21 @@ update_attrib(struct gl_context *ctx, const GLuint *outputMapping,
> /**
> * Normally, this function would render a GL_POINT.
> */
> static void
> rastpos_point(struct draw_stage *stage, struct prim_header *prim)
> {
> struct rastpos_stage *rs = rastpos_stage(stage);
> struct gl_context *ctx = rs->ctx;
> struct st_context *st = st_context(ctx);
> const GLfloat height = (GLfloat) ctx->DrawBuffer->Height;
> - const GLuint *outputMapping = st->vertex_result_to_slot;
> + const ubyte *outputMapping = st->vertex_result_to_slot;
> const GLfloat *pos;
> GLuint i;
>
> /* if we get here, we didn't get clipped */
> ctx->Current.RasterPosValid = GL_TRUE;
>
> /* update raster pos */
> pos = prim->v[0]->data[0];
> ctx->Current.RasterPos[0] = pos[0];
> if (st_fb_orientation(ctx->DrawBuffer) == Y_0_TOP)
> diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
> index 74ab43c..d02c6f8 100644
> --- a/src/mesa/state_tracker/st_context.h
> +++ b/src/mesa/state_tracker/st_context.h
> @@ -164,21 +164,21 @@ struct st_context
> /* If true, further analysis of states is required to know if something
> * has changed. Used mainly for shaders.
> */
> bool gfx_shaders_may_be_dirty;
> bool compute_shader_may_be_dirty;
>
> GLboolean vertdata_edgeflags;
> GLboolean edgeflag_culls_prims;
>
> /** Mapping from VARYING_SLOT_x to post-transformed vertex slot */
> - const GLuint *vertex_result_to_slot;
> + const ubyte *vertex_result_to_slot;
>
> struct st_vertex_program *vp; /**< Currently bound vertex program */
> struct st_fragment_program *fp; /**< Currently bound fragment program */
> struct st_geometry_program *gp; /**< Currently bound geometry program */
> struct st_tessctrl_program *tcp; /**< Currently bound tess control program */
> struct st_tesseval_program *tep; /**< Currently bound tess eval program */
> struct st_compute_program *cp; /**< Currently bound compute program */
>
> struct st_vp_variant *vp_variant;
> struct st_fp_variant *fp_variant;
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index 0f8688a..664dd61 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -5395,22 +5395,22 @@ struct st_translate {
> struct ureg_src buffers[PIPE_MAX_SHADER_BUFFERS];
> struct ureg_src images[PIPE_MAX_SHADER_IMAGES];
> struct ureg_src systemValues[SYSTEM_VALUE_MAX];
> struct ureg_src shared_memory;
> unsigned *array_sizes;
> struct inout_decl *input_decls;
> unsigned num_input_decls;
> struct inout_decl *output_decls;
> unsigned num_output_decls;
>
> - const GLuint *inputMapping;
> - const GLuint *outputMapping;
> + const ubyte *inputMapping;
> + const ubyte *outputMapping;
>
> unsigned procType; /**< PIPE_SHADER_VERTEX/FRAGMENT */
> };
>
> /** Map Mesa's SYSTEM_VALUE_x to TGSI_SEMANTIC_x */
> unsigned
> _mesa_sysval_to_semantic(unsigned sysval)
> {
> switch (sysval) {
> /* Vertex shader */
> @@ -6131,32 +6131,32 @@ emit_compute_block_size(const struct gl_program *prog,
> prog->info.cs.local_size[1]);
> ureg_property(ureg, TGSI_PROPERTY_CS_FIXED_BLOCK_DEPTH,
> prog->info.cs.local_size[2]);
> }
>
> struct sort_inout_decls {
> bool operator()(const struct inout_decl &a, const struct inout_decl &b) const {
> return mapping[a.mesa_index] < mapping[b.mesa_index];
> }
>
> - const GLuint *mapping;
> + const ubyte *mapping;
> };
>
> /* Sort the given array of decls by the corresponding slot (TGSI file index).
> *
> * This is for the benefit of older drivers which are broken when the
> * declarations aren't sorted in this way.
> */
> static void
> sort_inout_decls_by_slot(struct inout_decl *decls,
> unsigned count,
> - const GLuint mapping[])
> + const ubyte mapping[])
> {
> sort_inout_decls sorter;
> sorter.mapping = mapping;
> std::sort(decls, decls + count, sorter);
> }
>
> static unsigned
> st_translate_interp(enum glsl_interp_mode glsl_qual, GLuint varying)
> {
> switch (glsl_qual) {
> @@ -6196,27 +6196,27 @@ st_translate_interp(enum glsl_interp_mode glsl_qual, GLuint varying)
> * \return PIPE_OK or PIPE_ERROR_OUT_OF_MEMORY
> */
> extern "C" enum pipe_error
> st_translate_program(
> struct gl_context *ctx,
> uint procType,
> struct ureg_program *ureg,
> glsl_to_tgsi_visitor *program,
> const struct gl_program *proginfo,
> GLuint numInputs,
> - const GLuint inputMapping[],
> + const ubyte inputMapping[],
> const GLuint inputSlotToAttr[],
> const ubyte inputSemanticName[],
> const ubyte inputSemanticIndex[],
> const GLuint interpMode[],
> GLuint numOutputs,
> - const GLuint outputMapping[],
> + const ubyte outputMapping[],
> const GLuint outputSlotToAttr[],
> const ubyte outputSemanticName[],
> const ubyte outputSemanticIndex[])
> {
> struct st_translate *t;
> unsigned i;
> struct gl_program_constants *frag_const =
> &ctx->Const.Program[MESA_SHADER_FRAGMENT];
> enum pipe_error ret = PIPE_OK;
>
> @@ -7058,34 +7058,34 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
> return GL_FALSE;
> }
> }
> }
>
> return GL_TRUE;
> }
>
> void
> st_translate_stream_output_info(glsl_to_tgsi_visitor *glsl_to_tgsi,
> - const GLuint outputMapping[],
> + const ubyte *outputMapping,
I'd prefer to keep the [] syntax here and below. That keeps things
consistent with other functions and it's an easy reminder that we're
dealing with an array and not a pointer to an object.
-Brian
> struct pipe_stream_output_info *so)
> {
> if (!glsl_to_tgsi->shader_program->last_vert_prog)
> return;
>
> struct gl_transform_feedback_info *info =
> glsl_to_tgsi->shader_program->last_vert_prog->sh.LinkedTransformFeedback;
> st_translate_stream_output_info2(info, outputMapping, so);
> }
>
> void
> st_translate_stream_output_info2(struct gl_transform_feedback_info *info,
> - const GLuint outputMapping[],
> + const ubyte *outputMapping,
> struct pipe_stream_output_info *so)
> {
> unsigned i;
>
> for (i = 0; i < info->NumOutputs; i++) {
> so->output[i].register_index =
> outputMapping[info->Outputs[i].OutputRegister];
> so->output[i].start_component = info->Outputs[i].ComponentOffset;
> so->output[i].num_components = info->Outputs[i].NumComponents;
> so->output[i].output_buffer = info->Outputs[i].OutputBuffer;
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.h b/src/mesa/state_tracker/st_glsl_to_tgsi.h
> index add534c..dec68c5 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.h
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.h
> @@ -35,41 +35,41 @@ struct gl_shader_program;
> struct glsl_to_tgsi_visitor;
> struct ureg_program;
>
> enum pipe_error st_translate_program(
> struct gl_context *ctx,
> uint procType,
> struct ureg_program *ureg,
> struct glsl_to_tgsi_visitor *program,
> const struct gl_program *proginfo,
> GLuint numInputs,
> - const GLuint inputMapping[],
> + const ubyte inputMapping[],
> const GLuint inputSlotToAttr[],
> const ubyte inputSemanticName[],
> const ubyte inputSemanticIndex[],
> const GLuint interpMode[],
> GLuint numOutputs,
> - const GLuint outputMapping[],
> + const ubyte outputMapping[],
> const GLuint outputSlotToAttr[],
> const ubyte outputSemanticName[],
> const ubyte outputSemanticIndex[]);
>
> void free_glsl_to_tgsi_visitor(struct glsl_to_tgsi_visitor *v);
>
> GLboolean st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog);
>
> void
> st_translate_stream_output_info(struct glsl_to_tgsi_visitor *glsl_to_tgsi,
> - const GLuint outputMapping[],
> + const ubyte *outputMapping,
> struct pipe_stream_output_info *so);
>
> void
> st_translate_stream_output_info2(struct gl_transform_feedback_info *info,
> - const GLuint outputMapping[],
> + const ubyte *outputMapping,
> struct pipe_stream_output_info *so);
>
> unsigned
> _mesa_sysval_to_semantic(unsigned sysval);
>
> #ifdef __cplusplus
> }
> #endif
> diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c b/src/mesa/state_tracker/st_mesa_to_tgsi.c
> index f906fed..d760962 100644
> --- a/src/mesa/state_tracker/st_mesa_to_tgsi.c
> +++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c
> @@ -58,22 +58,22 @@ struct st_translate {
> struct ureg_program *ureg;
>
> struct ureg_dst temps[MAX_PROGRAM_TEMPS];
> struct ureg_src *constants;
> struct ureg_dst outputs[PIPE_MAX_SHADER_OUTPUTS];
> struct ureg_src inputs[PIPE_MAX_SHADER_INPUTS];
> struct ureg_dst address[1];
> struct ureg_src samplers[PIPE_MAX_SAMPLERS];
> struct ureg_src systemValues[SYSTEM_VALUE_MAX];
>
> - const GLuint *inputMapping;
> - const GLuint *outputMapping;
> + const ubyte *inputMapping;
> + const ubyte *outputMapping;
>
> unsigned procType; /**< PIPE_SHADER_VERTEX/FRAGMENT */
> };
>
>
> /**
> * Map a Mesa dst register to a TGSI ureg_dst register.
> */
> static struct ureg_dst
> dst_register( struct st_translate *t,
> @@ -792,26 +792,26 @@ emit_wpos(struct st_context *st,
> *
> * \return PIPE_OK or PIPE_ERROR_OUT_OF_MEMORY
> */
> enum pipe_error
> st_translate_mesa_program(
> struct gl_context *ctx,
> uint procType,
> struct ureg_program *ureg,
> const struct gl_program *program,
> GLuint numInputs,
> - const GLuint inputMapping[],
> + const ubyte inputMapping[],
> const ubyte inputSemanticName[],
> const ubyte inputSemanticIndex[],
> const GLuint interpMode[],
> GLuint numOutputs,
> - const GLuint outputMapping[],
> + const ubyte outputMapping[],
> const ubyte outputSemanticName[],
> const ubyte outputSemanticIndex[])
> {
> struct st_translate translate, *t;
> unsigned i;
> enum pipe_error ret = PIPE_OK;
>
> assert(numInputs <= ARRAY_SIZE(t->inputs));
> assert(numOutputs <= ARRAY_SIZE(t->outputs));
>
> diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.h b/src/mesa/state_tracker/st_mesa_to_tgsi.h
> index 3df54ce..42015fc 100644
> --- a/src/mesa/state_tracker/st_mesa_to_tgsi.h
> +++ b/src/mesa/state_tracker/st_mesa_to_tgsi.h
> @@ -44,26 +44,26 @@ struct tgsi_token;
> struct ureg_program;
>
>
> enum pipe_error
> st_translate_mesa_program(
> struct gl_context *ctx,
> uint procType,
> struct ureg_program *ureg,
> const struct gl_program *program,
> GLuint numInputs,
> - const GLuint inputMapping[],
> + const ubyte inputMapping[],
> const ubyte inputSemanticName[],
> const ubyte inputSemanticIndex[],
> const GLuint interpMode[],
> GLuint numOutputs,
> - const GLuint outputMapping[],
> + const ubyte outputMapping[],
> const ubyte outputSemanticName[],
> const ubyte outputSemanticIndex[]);
>
> unsigned
> st_translate_texture_target(GLuint textarget, GLboolean shadow);
>
>
> #if defined __cplusplus
> } /* extern "C" */
> #endif
> diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
> index 0dc3b1e..65377b9 100644
> --- a/src/mesa/state_tracker/st_program.c
> +++ b/src/mesa/state_tracker/st_program.c
> @@ -369,21 +369,21 @@ st_release_cp_variants(struct st_context *st, struct st_compute_program *stcp)
> * Translate a vertex program.
> */
> bool
> st_translate_vertex_program(struct st_context *st,
> struct st_vertex_program *stvp)
> {
> struct ureg_program *ureg;
> enum pipe_error error;
> unsigned num_outputs = 0;
> unsigned attr;
> - unsigned input_to_index[VERT_ATTRIB_MAX] = {0};
> + ubyte input_to_index[VERT_ATTRIB_MAX] = {0};
> unsigned output_slot_to_attr[VARYING_SLOT_MAX] = {0};
> ubyte output_semantic_name[VARYING_SLOT_MAX] = {0};
> ubyte output_semantic_index[VARYING_SLOT_MAX] = {0};
>
> stvp->num_inputs = 0;
>
> if (stvp->Base.arb.IsPositionInvariant)
> _mesa_insert_mvp_code(st->ctx, &stvp->Base);
>
> /*
> @@ -709,22 +709,22 @@ st_get_vp_variant(struct st_context *st,
> }
>
>
> /**
> * Translate a Mesa fragment shader into a TGSI shader.
> */
> bool
> st_translate_fragment_program(struct st_context *st,
> struct st_fragment_program *stfp)
> {
> - GLuint outputMapping[2 * FRAG_RESULT_MAX];
> - GLuint inputMapping[VARYING_SLOT_MAX];
> + ubyte outputMapping[2 * FRAG_RESULT_MAX];
> + ubyte inputMapping[VARYING_SLOT_MAX];
> GLuint inputSlotToAttr[VARYING_SLOT_MAX];
> GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */
> GLuint attr;
> GLbitfield64 inputsRead;
> struct ureg_program *ureg;
>
> GLboolean write_all = GL_FALSE;
>
> ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
> ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
> @@ -1342,23 +1342,23 @@ st_get_fp_variant(struct st_context *st,
> */
> static void
> st_translate_program_common(struct st_context *st,
> struct gl_program *prog,
> struct glsl_to_tgsi_visitor *glsl_to_tgsi,
> struct ureg_program *ureg,
> unsigned tgsi_processor,
> struct pipe_shader_state *out_state)
> {
> GLuint inputSlotToAttr[VARYING_SLOT_TESS_MAX];
> - GLuint inputMapping[VARYING_SLOT_TESS_MAX];
> + ubyte inputMapping[VARYING_SLOT_TESS_MAX];
> GLuint outputSlotToAttr[VARYING_SLOT_TESS_MAX];
> - GLuint outputMapping[VARYING_SLOT_TESS_MAX];
> + ubyte outputMapping[VARYING_SLOT_TESS_MAX];
> GLuint attr;
>
> ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
> ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
> uint num_inputs = 0;
>
> ubyte output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
> ubyte output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
> uint num_outputs = 0;
>
> diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h
> index 70664d1..cdc68a7 100644
> --- a/src/mesa/state_tracker/st_program.h
> +++ b/src/mesa/state_tracker/st_program.h
> @@ -40,21 +40,21 @@
> #include "pipe/p_state.h"
> #include "st_context.h"
> #include "st_texture.h"
> #include "st_glsl_to_tgsi.h"
>
>
> #ifdef __cplusplus
> extern "C" {
> #endif
>
> -#define ST_DOUBLE_ATTRIB_PLACEHOLDER 0xffffffff
> +#define ST_DOUBLE_ATTRIB_PLACEHOLDER 0xff
>
> struct st_external_sampler_key
> {
> GLuint lower_nv12; /**< bitmask of 2 plane YUV samplers */
> GLuint lower_iyuv; /**< bitmask of 3 plane YUV samplers */
> };
>
> static inline struct st_external_sampler_key
> st_get_external_sampler_key(struct st_context *st, struct gl_program *prog)
> {
> @@ -207,25 +207,25 @@ struct st_vertex_program
> struct gl_program Base; /**< The Mesa vertex program */
> struct pipe_shader_state tgsi;
> struct glsl_to_tgsi_visitor* glsl_to_tgsi;
> uint64_t affected_states; /**< ST_NEW_* flags to mark dirty when binding */
>
> /* used when bypassing glsl_to_tgsi: */
> struct gl_shader_program *shader_program;
>
> /** maps a Mesa VERT_ATTRIB_x to a packed TGSI input index */
> /** maps a TGSI input index back to a Mesa VERT_ATTRIB_x */
> - GLuint index_to_input[PIPE_MAX_SHADER_INPUTS];
> - GLuint num_inputs;
> + ubyte index_to_input[PIPE_MAX_ATTRIBS];
> + ubyte num_inputs;
>
> /** Maps VARYING_SLOT_x to slot */
> - GLuint result_to_output[VARYING_SLOT_MAX];
> + ubyte result_to_output[VARYING_SLOT_MAX];
>
> /** List of translated variants of this vertex program.
> */
> struct st_vp_variant *variants;
>
> /** SHA1 hash of linked tgsi shader program, used for on-disk cache */
> unsigned char sha1[20];
> };
>
>
>
More information about the mesa-dev
mailing list