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.pitoi...@gmail.com <mailto:samuel.pitoi...@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.pitoi...@gmail.com
    <mailto:samuel.pitoi...@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@lists.freedesktop.org <mailto:mesa-dev@lists.freedesktop.org>
    https://lists.freedesktop.org/mailman/listinfo/mesa-dev
    <https://lists.freedesktop.org/mailman/listinfo/mesa-dev>


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to