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

Samuel Pitoiset samuel.pitoiset at gmail.com
Wed May 17 18:47:56 UTC 2017



On 05/17/2017 08:03 PM, Marek Olšák wrote:
> mesa_to_tgsi is for the old Mesa IR. The return type is always FLOAT.
> Same for atifs_to_tgsi.

Ah okay, I will change this.

> 
> Marek
> 
> On Wed, May 17, 2017 at 7:06 PM, Samuel Pitoiset
> <samuel.pitoiset at gmail.com> 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.
>>
>> v2: - fix padding
>>      - initialize default value of ReturnType
>>      - replace debug_assert() by assert()
>>
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> ---
>>   src/gallium/auxiliary/tgsi/tgsi_build.c    |  6 +++++-
>>   src/gallium/auxiliary/tgsi/tgsi_ureg.c     |  7 +++++--
>>   src/gallium/auxiliary/tgsi/tgsi_ureg.h     | 11 ++++++++---
>>   src/gallium/include/pipe/p_shader_tokens.h |  4 +++-
>>   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 ++++
>>   8 files changed, 49 insertions(+), 23 deletions(-)
>>
>> diff --git a/src/gallium/auxiliary/tgsi/tgsi_build.c b/src/gallium/auxiliary/tgsi/tgsi_build.c
>> index 39c20b5e88..00843241f8 100644
>> --- a/src/gallium/auxiliary/tgsi/tgsi_build.c
>> +++ b/src/gallium/auxiliary/tgsi/tgsi_build.c
>> @@ -720,6 +720,7 @@ tgsi_default_instruction_texture( void )
>>
>>      instruction_texture.Texture = TGSI_TEXTURE_UNKNOWN;
>>      instruction_texture.NumOffsets = 0;
>> +   instruction_texture.ReturnType = TGSI_RETURN_TYPE_UNKNOWN;
>>      instruction_texture.Padding = 0;
>>
>>      return instruction_texture;
>> @@ -729,6 +730,7 @@ static struct tgsi_instruction_texture
>>   tgsi_build_instruction_texture(
>>      unsigned texture,
>>      unsigned num_offsets,
>> +   unsigned return_type,
>>      struct tgsi_token *prev_token,
>>      struct tgsi_instruction *instruction,
>>      struct tgsi_header *header )
>> @@ -737,6 +739,7 @@ tgsi_build_instruction_texture(
>>
>>      instruction_texture.Texture = texture;
>>      instruction_texture.NumOffsets = num_offsets;
>> +   instruction_texture.ReturnType = return_type;
>>      instruction_texture.Padding = 0;
>>      instruction->Texture = 1;
>>
>> @@ -1090,7 +1093,8 @@ tgsi_build_full_instruction(
>>
>>         *instruction_texture = tgsi_build_instruction_texture(
>>            full_inst->Texture.Texture,
>> -        full_inst->Texture.NumOffsets,
>> +         full_inst->Texture.NumOffsets,
>> +         full_inst->Texture.ReturnType,
>>            prev_token,
>>            instruction,
>>            header   );
>> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
>> index 9eb00d0919..5bd779728a 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;
>>
>> @@ -1301,6 +1301,7 @@ ureg_emit_texture(struct ureg_program *ureg,
>>      out[0].value = 0;
>>      out[0].insn_texture.Texture = target;
>>      out[0].insn_texture.NumOffsets = num_offsets;
>> +   out[0].insn_texture.ReturnType = return_type;
>>   }
>>
>>   void
>> @@ -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..cb49e3b033 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
>>   };
>>
>> @@ -694,7 +695,8 @@ struct tgsi_instruction_texture
>>   {
>>      unsigned Texture  : 8;    /* TGSI_TEXTURE_ */
>>      unsigned NumOffsets : 4;
>> -   unsigned Padding : 20;
>> +   unsigned ReturnType : 3; /* TGSI_RETURN_TYPE_x */
>> +   unsigned Padding : 17;
>>   };
>>
>>   /* 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..77cf2b6292 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:
>> +               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
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list