[Mesa-dev] [PATCH 02/17] st/mesa: decrease the size of st_vertex_program
Marek Olšák
maraeo at gmail.com
Mon May 1 12:52:51 UTC 2017
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,
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];
};
--
2.7.4
More information about the mesa-dev
mailing list