[Mesa-dev] [PATCH v2 2/3] tgsi: store the sampler view type directly in the instruction
Marek Olšák
maraeo at gmail.com
Wed May 17 18:03:27 UTC 2017
mesa_to_tgsi is for the old Mesa IR. The return type is always FLOAT.
Same for atifs_to_tgsi.
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