[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