[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