[Mesa-dev] [PATCH 1/2] tgsi: add texture-type info to texture instructions
Jose Fonseca
jfonseca at vmware.com
Thu Jun 4 11:14:39 PDT 2015
I think we had a discussion about this on mesa3d-dev a while ago. I
don't recall the conclusions but I wish I did.
We have tgsi_return_type. Why isn't this enough? Or better, why isn't
being used for this?
Jose
On 04/06/15 16:50, Rob Clark wrote:
> From: Rob Clark <robclark at freedesktop.org>
>
> Signed-off-by: Rob Clark <robclark at freedesktop.org>
> ---
> src/gallium/auxiliary/tgsi/tgsi_ureg.c | 7 +++++--
> src/gallium/auxiliary/tgsi/tgsi_ureg.h | 22 +++++++++++++++-------
> src/gallium/include/pipe/p_shader_tokens.h | 7 ++++++-
> src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 19 +++++++++++++++++++
> src/mesa/state_tracker/st_mesa_to_tgsi.c | 1 +
> 5 files changed, 46 insertions(+), 10 deletions(-)
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> index 7a8bf54..cd0bf71 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> @@ -1072,7 +1072,8 @@ 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 num_offsets,
> + unsigned texture_type)
> {
> union tgsi_any_token *out, *insn;
>
> @@ -1084,6 +1085,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.TextureType = texture_type;
> }
>
> void
> @@ -1169,6 +1171,7 @@ ureg_tex_insn(struct ureg_program *ureg,
> unsigned target,
> const struct tgsi_texture_offset *texoffsets,
> unsigned nr_offset,
> + unsigned tex_type,
> const struct ureg_src *src,
> unsigned nr_src )
> {
> @@ -1205,7 +1208,7 @@ 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, nr_offset, tex_type );
>
> 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 c3f4012..7ceacd9 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> @@ -495,6 +495,7 @@ ureg_tex_insn(struct ureg_program *ureg,
> unsigned target,
> const struct tgsi_texture_offset *texoffsets,
> unsigned nr_offset,
> + unsigned tex_type,
> const struct ureg_src *src,
> unsigned nr_src );
>
> @@ -537,7 +538,8 @@ 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 num_offsets,
> + unsigned texture_type);
>
> void
> ureg_emit_texture_offset(struct ureg_program *ureg,
> @@ -738,7 +740,8 @@ static INLINE void ureg_##op( struct ureg_program *ureg, \
> dst.PredSwizzleW, \
> 1, \
> 2); \
> - ureg_emit_texture( ureg, insn.extended_token, target, 0 ); \
> + ureg_emit_texture(ureg, insn.extended_token, target, 0, \
> + TGSI_TEXTURE_TYPE_FLOAT); \
> ureg_emit_dst( ureg, dst ); \
> ureg_emit_src( ureg, src0 ); \
> ureg_emit_src( ureg, src1 ); \
> @@ -767,7 +770,8 @@ static INLINE void ureg_##op( struct ureg_program *ureg, \
> dst.PredSwizzleW, \
> 1, \
> 2); \
> - ureg_emit_texture( ureg, insn.extended_token, target, 0 ); \
> + ureg_emit_texture(ureg, insn.extended_token, target, 0, \
> + TGSI_TEXTURE_TYPE_FLOAT); \
> ureg_emit_dst( ureg, dst ); \
> ureg_emit_src( ureg, src0 ); \
> ureg_emit_src( ureg, src1 ); \
> @@ -826,7 +830,8 @@ static INLINE void ureg_##op( struct ureg_program *ureg, \
> dst.PredSwizzleW, \
> 1, \
> 3); \
> - ureg_emit_texture( ureg, insn.extended_token, target, 0 ); \
> + ureg_emit_texture(ureg, insn.extended_token, target, 0, \
> + TGSI_TEXTURE_TYPE_FLOAT); \
> ureg_emit_dst( ureg, dst ); \
> ureg_emit_src( ureg, src0 ); \
> ureg_emit_src( ureg, src1 ); \
> @@ -858,7 +863,8 @@ static INLINE void ureg_##op( struct ureg_program *ureg, \
> dst.PredSwizzleW, \
> 1, \
> 4); \
> - ureg_emit_texture( ureg, insn.extended_token, target, 0 ); \
> + ureg_emit_texture(ureg, insn.extended_token, target, 0, \
> + TGSI_TEXTURE_TYPE_FLOAT); \
> ureg_emit_dst( ureg, dst ); \
> ureg_emit_src( ureg, src0 ); \
> ureg_emit_src( ureg, src1 ); \
> @@ -891,7 +897,8 @@ static INLINE void ureg_##op( struct ureg_program *ureg, \
> dst.PredSwizzleW, \
> 1, \
> 4); \
> - ureg_emit_texture( ureg, insn.extended_token, target, 0 ); \
> + ureg_emit_texture(ureg, insn.extended_token, target, 0, \
> + TGSI_TEXTURE_TYPE_FLOAT); \
> ureg_emit_dst( ureg, dst ); \
> ureg_emit_src( ureg, src0 ); \
> ureg_emit_src( ureg, src1 ); \
> @@ -991,7 +998,8 @@ static INLINE void ureg_##op( struct ureg_program *ureg, \
> dst.PredSwizzleW, \
> 1, \
> 5); \
> - ureg_emit_texture( ureg, insn.extended_token, target, 0 ); \
> + ureg_emit_texture(ureg, insn.extended_token, target, 0, \
> + TGSI_TEXTURE_TYPE_FLOAT); \
> 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 953bdf6..b2fc9a0 100644
> --- a/src/gallium/include/pipe/p_shader_tokens.h
> +++ b/src/gallium/include/pipe/p_shader_tokens.h
> @@ -613,11 +613,16 @@ struct tgsi_instruction_label
> #define TGSI_TEXTURE_UNKNOWN 18
> #define TGSI_TEXTURE_COUNT 19
>
> +#define TGSI_TEXTURE_TYPE_FLOAT 0
> +#define TGSI_TEXTURE_TYPE_INT 1
> +#define TGSI_TEXTURE_TYPE_UNSIGNED 2
> +
> struct tgsi_instruction_texture
> {
> unsigned Texture : 8; /* TGSI_TEXTURE_ */
> unsigned NumOffsets : 4;
> - unsigned Padding : 20;
> + unsigned TextureType : 2; /* TGSI_TEXTURE_TYPE_ */
> + unsigned Padding : 18;
> };
>
> /* for texture offsets in GLSL and DirectX.
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index f0f2a77..fb6ecfd 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -233,6 +233,7 @@ public:
> st_src_reg sampler; /**< sampler register */
> int sampler_array_size; /**< 1-based size of sampler array, 1 if not array */
> int tex_target; /**< One of TEXTURE_*_INDEX */
> + glsl_base_type tex_type;
> GLboolean tex_shadow;
>
> st_src_reg tex_offsets[MAX_GLSL_TEXTURE_OFFSET];
> @@ -3246,6 +3247,8 @@ glsl_to_tgsi_visitor::visit(ir_texture *ir)
> assert(!"Should not get here.");
> }
>
> + inst->tex_type = ir->type->base_type;
> +
> this->result = result_src;
> }
>
> @@ -4768,6 +4771,7 @@ compile_tgsi_instruction(struct st_translate *t,
> unsigned num_dst;
> unsigned num_src;
> unsigned tex_target;
> + unsigned tex_type;
>
> num_dst = num_inst_dst_regs(inst->op);
> num_src = num_inst_src_regs(inst->op);
> @@ -4781,6 +4785,20 @@ compile_tgsi_instruction(struct st_translate *t,
> for (i = 0; i < num_src; i++)
> src[i] = translate_src(t, &inst->src[i]);
>
> + switch (inst->tex_type) {
> + case GLSL_TYPE_FLOAT:
> + tex_type = TGSI_TEXTURE_TYPE_FLOAT;
> + break;
> + case GLSL_TYPE_INT:
> + tex_type = TGSI_TEXTURE_TYPE_INT;
> + break;
> + case GLSL_TYPE_UINT:
> + tex_type = TGSI_TEXTURE_TYPE_UNSIGNED;
> + break;
> + default:
> + unreachable("not reached");
> + }
> +
> switch(inst->op) {
> case TGSI_OPCODE_BGNLOOP:
> case TGSI_OPCODE_CAL:
> @@ -4824,6 +4842,7 @@ compile_tgsi_instruction(struct st_translate *t,
> dst, num_dst,
> tex_target,
> texoffsets, inst->tex_offset_num_offset,
> + tex_type,
> src, num_src);
> return;
>
> diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c b/src/mesa/state_tracker/st_mesa_to_tgsi.c
> index 98d525c..49bdbf9 100644
> --- a/src/mesa/state_tracker/st_mesa_to_tgsi.c
> +++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c
> @@ -707,6 +707,7 @@ compile_instruction(
> st_translate_texture_target( inst->TexSrcTarget,
> inst->TexShadow ),
> NULL, 0,
> + TGSI_TEXTURE_TYPE_FLOAT,
> src, num_src );
> return;
>
>
More information about the mesa-dev
mailing list