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 <[email protected]> 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 <[email protected]> > --- > 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 > [email protected] > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
