[Mesa-dev] [PATCH 18/25] st: get interpolation location at translation time
Marek Olšák
maraeo at gmail.com
Wed Oct 19 18:11:40 UTC 2016
The prefix should be: "st/mesa:". Other than that:
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Tue, Oct 18, 2016 at 8:12 AM, Timothy Arceri
<timothy.arceri at collabora.com> wrote:
> Rather then messing around creating bitfields and arrays to store
> the interpolation location just translate it on the fly.
> ---
> src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 22 ++++++++++++++++++----
> src/mesa/state_tracker/st_glsl_to_tgsi.h | 1 -
> src/mesa/state_tracker/st_program.c | 10 ----------
> 3 files changed, 18 insertions(+), 15 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index ccca718..b563bec 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -365,6 +365,7 @@ struct inout_decl {
> unsigned mesa_index;
> unsigned array_id; /* TGSI ArrayID; 1-based: 0 means not an array */
> unsigned size;
> + unsigned interp_loc;
> enum glsl_interp_mode interp;
> enum glsl_base_type base_type;
> ubyte usage_mask; /* GLSL-style usage-mask, i.e. single bit per double */
> @@ -2415,6 +2416,17 @@ is_inout_array(unsigned stage, ir_variable *var, bool *remove_array)
> return type->is_array() || type->is_matrix();
> }
>
> +static unsigned
> +st_translate_interp_loc(ir_variable *var)
> +{
> + if (var->data.centroid)
> + return TGSI_INTERPOLATE_LOC_CENTROID;
> + else if (var->data.sample)
> + return TGSI_INTERPOLATE_LOC_SAMPLE;
> + else
> + return TGSI_INTERPOLATE_LOC_CENTER;
> +}
> +
> void
> glsl_to_tgsi_visitor::visit(ir_dereference_variable *ir)
> {
> @@ -2452,6 +2464,7 @@ glsl_to_tgsi_visitor::visit(ir_dereference_variable *ir)
>
> decl->mesa_index = var->data.location;
> decl->interp = (glsl_interp_mode) var->data.interpolation;
> + decl->interp_loc = st_translate_interp_loc(var);
> decl->base_type = type_without_array->base_type;
> decl->usage_mask = u_bit_consecutive(component, num_components);
>
> @@ -6129,7 +6142,6 @@ st_translate_interp(enum glsl_interp_mode glsl_qual, GLuint varying)
> * \param inputSemanticIndex the semantic index (ex: which texcoord) for
> * each input
> * \param interpMode the TGSI_INTERPOLATE_LINEAR/PERSP mode for each input
> - * \param interpLocation the TGSI_INTERPOLATE_LOC_* location for each input
> * \param numOutputs number of output registers used
> * \param outputMapping maps Mesa fragment program outputs to TGSI
> * generic outputs
> @@ -6152,7 +6164,6 @@ st_translate_program(
> const ubyte inputSemanticName[],
> const ubyte inputSemanticIndex[],
> const GLuint interpMode[],
> - const GLuint interpLocation[],
> GLuint numOutputs,
> const GLuint outputMapping[],
> const GLuint outputSlotToAttr[],
> @@ -6207,17 +6218,20 @@ st_translate_program(
> }
>
> unsigned interp_mode = 0;
> + unsigned interp_location = 0;
> if (procType == PIPE_SHADER_FRAGMENT) {
> assert(interpMode);
> interp_mode = interpMode[slot] != TGSI_INTERPOLATE_NONE ?
> interpMode[slot] :
> st_translate_interp(decl->interp, inputSlotToAttr[slot]);
> +
> + interp_location = decl->interp_loc;
> }
>
> src = ureg_DECL_fs_input_cyl_centroid_layout(ureg,
> inputSemanticName[slot], inputSemanticIndex[slot],
> - interp_mode, 0, interpLocation ? interpLocation[slot] : 0,
> - slot, tgsi_usage_mask, decl->array_id, decl->size);
> + interp_mode, 0, interp_location, slot, tgsi_usage_mask,
> + decl->array_id, decl->size);
>
> for (unsigned j = 0; j < decl->size; ++j) {
> if (t->inputs[slot + j].File != TGSI_FILE_INPUT) {
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.h b/src/mesa/state_tracker/st_glsl_to_tgsi.h
> index 0f485fb..add534c 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.h
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.h
> @@ -47,7 +47,6 @@ enum pipe_error st_translate_program(
> const ubyte inputSemanticName[],
> const ubyte inputSemanticIndex[],
> const GLuint interpMode[],
> - const GLuint interpLocation[],
> GLuint numOutputs,
> const GLuint outputMapping[],
> const GLuint outputSlotToAttr[],
> diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
> index 8880636..b6275e5 100644
> --- a/src/mesa/state_tracker/st_program.c
> +++ b/src/mesa/state_tracker/st_program.c
> @@ -425,7 +425,6 @@ st_translate_vertex_program(struct st_context *st,
> NULL, /* input semantic name */
> NULL, /* input semantic index */
> NULL, /* interp mode */
> - NULL, /* interp location */
> /* outputs */
> num_outputs,
> stvp->result_to_output,
> @@ -569,7 +568,6 @@ st_translate_fragment_program(struct st_context *st,
> GLuint inputMapping[VARYING_SLOT_MAX];
> GLuint inputSlotToAttr[VARYING_SLOT_MAX];
> GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */
> - GLuint interpLocation[PIPE_MAX_SHADER_INPUTS];
> GLuint attr;
> GLbitfield64 inputsRead;
> struct ureg_program *ureg;
> @@ -623,12 +621,6 @@ st_translate_fragment_program(struct st_context *st,
>
> inputMapping[attr] = slot;
> inputSlotToAttr[slot] = attr;
> - if (stfp->Base.IsCentroid & BITFIELD64_BIT(attr))
> - interpLocation[slot] = TGSI_INTERPOLATE_LOC_CENTROID;
> - else if (stfp->Base.IsSample & BITFIELD64_BIT(attr))
> - interpLocation[slot] = TGSI_INTERPOLATE_LOC_SAMPLE;
> - else
> - interpLocation[slot] = TGSI_INTERPOLATE_LOC_CENTER;
>
> switch (attr) {
> case VARYING_SLOT_POS:
> @@ -888,7 +880,6 @@ st_translate_fragment_program(struct st_context *st,
> input_semantic_name,
> input_semantic_index,
> interpMode,
> - interpLocation,
> /* outputs */
> fs_num_outputs,
> outputMapping,
> @@ -1459,7 +1450,6 @@ st_translate_program_common(struct st_context *st,
> input_semantic_name,
> input_semantic_index,
> NULL,
> - NULL,
> /* outputs */
> num_outputs,
> outputMapping,
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list