[Mesa-dev] [PATCH 2/3] tgsi: store the sampler view type directly in the instruction

Nicolai Hähnle nhaehnle at gmail.com
Wed May 17 12:02:07 UTC 2017


On 17.05.2017 11:17, Samuel Pitoiset wrote:
> RadeonSI needs to do a special lowering for Gather4 with integer
> formats, but with bindless samplers we just can't access the index.
>
> Instead, store the return type in the instruction like the target.
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
>  src/gallium/auxiliary/tgsi/tgsi_ureg.c     |  7 +++++--
>  src/gallium/auxiliary/tgsi/tgsi_ureg.h     | 11 ++++++++---
>  src/gallium/include/pipe/p_shader_tokens.h |  2 ++
>  src/mesa/state_tracker/st_atifs_to_tgsi.c  |  2 +-
>  src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 17 ++---------------
>  src/mesa/state_tracker/st_mesa_to_tgsi.c   | 21 +++++++++++++++++++++
>  src/mesa/state_tracker/st_mesa_to_tgsi.h   |  4 ++++
>  7 files changed, 43 insertions(+), 21 deletions(-)
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> index 9eb00d0919..1cdb95cc95 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> @@ -1289,7 +1289,7 @@ ureg_fixup_label(struct ureg_program *ureg,
>  void
>  ureg_emit_texture(struct ureg_program *ureg,
>                    unsigned extended_token,
> -                  unsigned target, unsigned num_offsets)
> +                  unsigned target, unsigned return_type, unsigned num_offsets)
>  {
>     union tgsi_any_token *out, *insn;
>
> @@ -1300,6 +1300,7 @@ ureg_emit_texture(struct ureg_program *ureg,
>
>     out[0].value = 0;
>     out[0].insn_texture.Texture = target;
> +   out[0].insn_texture.ReturnType = return_type;
>     out[0].insn_texture.NumOffsets = num_offsets;
>  }
>
> @@ -1386,6 +1387,7 @@ ureg_tex_insn(struct ureg_program *ureg,
>                const struct ureg_dst *dst,
>                unsigned nr_dst,
>                unsigned target,
> +              unsigned return_type,
>                const struct tgsi_texture_offset *texoffsets,
>                unsigned nr_offset,
>                const struct ureg_src *src,
> @@ -1407,7 +1409,8 @@ ureg_tex_insn(struct ureg_program *ureg,
>                           nr_dst,
>                           nr_src);
>
> -   ureg_emit_texture( ureg, insn.extended_token, target, nr_offset );
> +   ureg_emit_texture( ureg, insn.extended_token, target, return_type,
> +                      nr_offset );
>
>     for (i = 0; i < nr_offset; i++)
>        ureg_emit_texture_offset( ureg, &texoffsets[i]);
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> index 6d2f5c0e99..54f95ba565 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> @@ -555,6 +555,7 @@ ureg_tex_insn(struct ureg_program *ureg,
>                const struct ureg_dst *dst,
>                unsigned nr_dst,
>                unsigned target,
> +              unsigned return_type,
>                const struct tgsi_texture_offset *texoffsets,
>                unsigned nr_offset,
>                const struct ureg_src *src,
> @@ -596,7 +597,7 @@ ureg_emit_label(struct ureg_program *ureg,
>  void
>  ureg_emit_texture(struct ureg_program *ureg,
>                    unsigned insn_token,
> -                  unsigned target, unsigned num_offsets);
> +                  unsigned target, unsigned return_type, unsigned num_offsets);
>
>  void
>  ureg_emit_texture_offset(struct ureg_program *ureg,
> @@ -748,6 +749,7 @@ static inline void ureg_##op( struct ureg_program *ureg,                \
>                                struct ureg_src src1 )                    \
>  {                                                                       \
>     unsigned opcode = TGSI_OPCODE_##op;                                  \
> +   unsigned return_type = TGSI_RETURN_TYPE_UNKNOWN;                     \
>     struct ureg_emit_insn_result insn;                                   \
>     if (ureg_dst_is_empty(dst))                                          \
>        return;                                                           \
> @@ -756,7 +758,8 @@ static inline void ureg_##op( struct ureg_program *ureg,                \
>                           dst.Saturate,                                  \
>                           1,                                             \
>                           2);                                            \
> -   ureg_emit_texture( ureg, insn.extended_token, target, 0 );		\
> +   ureg_emit_texture( ureg, insn.extended_token, target,                \
> +                      return_type, 0 );                                 \
>     ureg_emit_dst( ureg, dst );                                          \
>     ureg_emit_src( ureg, src0 );                                         \
>     ureg_emit_src( ureg, src1 );                                         \
> @@ -796,6 +799,7 @@ static inline void ureg_##op( struct ureg_program *ureg,                \
>                                struct ureg_src src3 )                    \
>  {                                                                       \
>     unsigned opcode = TGSI_OPCODE_##op;                                  \
> +   unsigned return_type = TGSI_RETURN_TYPE_UNKNOWN;                     \
>     struct ureg_emit_insn_result insn;                                   \
>     if (ureg_dst_is_empty(dst))                                          \
>        return;                                                           \
> @@ -804,7 +808,8 @@ static inline void ureg_##op( struct ureg_program *ureg,                \
>                           dst.Saturate,                                  \
>                           1,                                             \
>                           4);                                            \
> -   ureg_emit_texture( ureg, insn.extended_token, target, 0 );		\
> +   ureg_emit_texture( ureg, insn.extended_token, target,                \
> +                      return_type, 0 );                                 \
>     ureg_emit_dst( ureg, dst );                                          \
>     ureg_emit_src( ureg, src0 );                                         \
>     ureg_emit_src( ureg, src1 );                                         \
> diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h
> index a671121f10..dfc477a73c 100644
> --- a/src/gallium/include/pipe/p_shader_tokens.h
> +++ b/src/gallium/include/pipe/p_shader_tokens.h
> @@ -233,6 +233,7 @@ enum tgsi_return_type {
>     TGSI_RETURN_TYPE_SINT,
>     TGSI_RETURN_TYPE_UINT,
>     TGSI_RETURN_TYPE_FLOAT,
> +   TGSI_RETURN_TYPE_UNKNOWN,
>     TGSI_RETURN_TYPE_COUNT
>  };
>
> @@ -695,6 +696,7 @@ struct tgsi_instruction_texture
>     unsigned Texture  : 8;    /* TGSI_TEXTURE_ */
>     unsigned NumOffsets : 4;
>     unsigned Padding : 20;
> +   unsigned ReturnType : 3; /* TGSI_RETURN_TYPE_x */
>  };
>
>  /* for texture offsets in GLSL and DirectX.
> diff --git a/src/mesa/state_tracker/st_atifs_to_tgsi.c b/src/mesa/state_tracker/st_atifs_to_tgsi.c
> index 8b9c332feb..ff20511d95 100644
> --- a/src/mesa/state_tracker/st_atifs_to_tgsi.c
> +++ b/src/mesa/state_tracker/st_atifs_to_tgsi.c
> @@ -334,7 +334,7 @@ compile_setupinst(struct st_translate *t,
>        src[1] = t->samplers[r];
>        /* the texture target is still unknown, it will be fixed in the draw call */
>        ureg_tex_insn(t->ureg, TGSI_OPCODE_TEX, dst, 1, TGSI_TEXTURE_2D,
> -                    NULL, 0, src, 2);
> +                    TGSI_RETURN_TYPE_UNKNOWN, NULL, 0, src, 2);
>     } else if (texinst->Opcode == ATI_FRAGMENT_SHADER_PASS_OP) {
>        ureg_insn(t->ureg, TGSI_OPCODE_MOV, dst, 1, src, 1);
>     }
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index 54bc70f57b..9620ef760f 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -5877,6 +5877,7 @@ compile_tgsi_instruction(struct st_translate *t,
>                      inst->op,
>                      dst, num_dst,
>                      tex_target,
> +                    st_translate_texture_type(inst->tex_type),
>                      texoffsets, inst->tex_offset_num_offset,
>                      src, num_src);
>        return;
> @@ -6570,24 +6571,10 @@ st_translate_program(
>     /* texture samplers */
>     for (i = 0; i < frag_const->MaxTextureImageUnits; i++) {
>        if (program->samplers_used & (1u << i)) {
> -         unsigned type;
> +         unsigned type = st_translate_texture_type(program->sampler_types[i]);
>
>           t->samplers[i] = ureg_DECL_sampler(ureg, i);
>
> -         switch (program->sampler_types[i]) {
> -         case GLSL_TYPE_INT:
> -            type = TGSI_RETURN_TYPE_SINT;
> -            break;
> -         case GLSL_TYPE_UINT:
> -            type = TGSI_RETURN_TYPE_UINT;
> -            break;
> -         case GLSL_TYPE_FLOAT:
> -            type = TGSI_RETURN_TYPE_FLOAT;
> -            break;
> -         default:
> -            unreachable("not reached");
> -         }
> -
>           ureg_DECL_sampler_view( ureg, i, program->sampler_targets[i],
>                                   type, type, type, type );
>        }
> diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c b/src/mesa/state_tracker/st_mesa_to_tgsi.c
> index b3721d8703..17cc5f4ea6 100644
> --- a/src/mesa/state_tracker/st_mesa_to_tgsi.c
> +++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c
> @@ -223,6 +223,26 @@ st_translate_texture_target(GLuint textarget, GLboolean shadow)
>
>
>  /**
> + * Map GLSL base type to TGSI return type.
> + */
> +unsigned
> +st_translate_texture_type(enum glsl_base_type type)
> +{
> +	switch (type) {
> +	case GLSL_TYPE_INT:
> +		return TGSI_RETURN_TYPE_SINT;
> +	case GLSL_TYPE_UINT:
> +		return TGSI_RETURN_TYPE_UINT;
> +	case GLSL_TYPE_FLOAT:
> +		return TGSI_RETURN_TYPE_FLOAT;
> +	default:
> +		debug_assert(!"unexpected texture type");

Is there a good reason not to use plain assert()? Style-wise, I'd prefer 
that, but it's a nitpick. With Nils comment addressed, this series is:

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>


> +		return TGSI_RETURN_TYPE_UNKNOWN;
> +	}
> +}
> +
> +
> +/**
>   * Translate a (1 << TEXTURE_x_INDEX) bit into a TGSI_TEXTURE_x enum.
>   */
>  static unsigned
> @@ -536,6 +556,7 @@ compile_instruction(
>                       dst, num_dst,
>                       st_translate_texture_target( inst->TexSrcTarget,
>                                                 inst->TexShadow ),
> +                     TGSI_RETURN_TYPE_UNKNOWN,
>                       NULL, 0,
>                       src, num_src );
>        return;
> diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.h b/src/mesa/state_tracker/st_mesa_to_tgsi.h
> index b4d9af635a..106cf85a3e 100644
> --- a/src/mesa/state_tracker/st_mesa_to_tgsi.h
> +++ b/src/mesa/state_tracker/st_mesa_to_tgsi.h
> @@ -34,6 +34,8 @@
>  #include "pipe/p_compiler.h"
>  #include "pipe/p_defines.h"
>
> +#include "compiler/glsl_types.h"
> +
>  #if defined __cplusplus
>  extern "C" {
>  #endif
> @@ -63,6 +65,8 @@ st_translate_mesa_program(
>  unsigned
>  st_translate_texture_target(GLuint textarget, GLboolean shadow);
>
> +unsigned
> +st_translate_texture_type(enum glsl_base_type type);
>
>  #if defined __cplusplus
>  } /* extern "C" */
>


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list