[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 16:57:18 UTC 2017



On 05/17/2017 02:21 PM, Samuel Pitoiset wrote:
> 
> 
> On 05/17/2017 02:02 PM, Nicolai Hähnle wrote:
>> 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:
> 
> To be consistent with st_translate_texture_target(), but I can change 
> this. Thanks!
> 
>>

Oh and just noticed that ReturnType should be initialized, I will send a 
v2 with both fixes.

>> 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" */
>>>
>>
>>


More information about the mesa-dev mailing list