[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:57 UTC 2017
On 05/17/2017 06:02 PM, Roland Scheidegger wrote:
> Am 17.05.2017 um 11:17 schrieb Samuel Pitoiset:
>> 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 */
>> };
> Aside from the padding bug, I can't say I like the idea much. The issue
> here is that with the SAMPLE opcodes, it is impossible to fill in. So,
> basically, with TEX instructions, you should take that information from
> here, whereas with SAMPLE, it will come from the resource dcl. This is
> quite inconsistent.
> However, I suppose it's workable, so I won't stop you (the texture
> target is also similarly unused with sample opcodes already). I suppose
> potentially sample opcodes could possibly not use
> tgsi_instruction_texture at all but something else (it's only needed for
> the offset stuff).
Yes, that's not ideal. Though we could imagine a helper function which
returns the info according to the opcode.
>
> Roland
>
>
>>
>> /* 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" */
>>
>
More information about the mesa-dev
mailing list