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

Samuel Pitoiset samuel.pitoiset at gmail.com
Wed May 17 10:30:17 UTC 2017



On 05/17/2017 12:28 PM, Nils Wallménius wrote:
> Hi Samuel,
> 
> A comment below.
> 
> 
> Den 17 maj 2017 11:18 fm skrev "Samuel Pitoiset" 
> <samuel.pitoiset at gmail.com <mailto:samuel.pitoiset at gmail.com>>:
> 
>     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
>     <mailto: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 */
> 
> 
> Shouldn't Padding be adjusted here, and probably kept at the end?

Right, good point.

> 
> BR
> Nils
> 
> 
>       };
> 
>       /* 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");
>     +               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" */
>     --
>     2.13.0
> 
>     _______________________________________________
>     mesa-dev mailing list
>     mesa-dev at lists.freedesktop.org <mailto:mesa-dev at lists.freedesktop.org>
>     https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>     <https://lists.freedesktop.org/mailman/listinfo/mesa-dev>
> 
> 


More information about the mesa-dev mailing list