From 7f149163720a08634c3b91be119e5a14f8c85bcd Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Mon, 19 Aug 2019 08:10:28 -0700 Subject: pan/midgard: Identify and disassemble indirect texture/sampler A pair of special flags can turn the texture/sampler handle fields into register selects. This means code like: texture(uTextures[hr28.w], ...) can be compiled to something like: texture ..., fsampler[hr28.w], texture[hr28.w] Signed-off-by: Alyssa Rosenzweig --- src/panfrost/midgard/disassemble.c | 22 +++++++++++++++++----- src/panfrost/midgard/midgard.h | 12 +++++++++++- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/panfrost/midgard/disassemble.c b/src/panfrost/midgard/disassemble.c index eba9cb1505d..be26a9c3686 100644 --- a/src/panfrost/midgard/disassemble.c +++ b/src/panfrost/midgard/disassemble.c @@ -1208,8 +1208,6 @@ print_texture_word(uint32_t *word, unsigned tabs) /* Specific format in question */ print_texture_format(texture->format); - assert(texture->zero == 0); - /* Instruction "modifiers" parallel the ALU instructions. */ if (texture->shadow) @@ -1230,11 +1228,25 @@ print_texture_word(uint32_t *word, unsigned tabs) print_mask_4(texture->mask); printf(", "); - printf("texture%d, ", texture->texture_handle); + if (texture->texture_register) { + printf("texture["); + print_texture_reg_select(texture->texture_handle); + printf("], "); + } else { + printf("texture%d, ", texture->texture_handle); + } /* Print the type, GL style */ - printf("%c", sampler_type_name(texture->sampler_type)); - printf("sampler%d", texture->sampler_handle); + printf("%csampler", sampler_type_name(texture->sampler_type)); + + if (texture->sampler_register) { + printf("["); + print_texture_reg_select(texture->sampler_handle); + printf("]"); + } else { + printf("%d", texture->sampler_handle); + } + print_swizzle_vec4(texture->swizzle, false, false); printf(", "); diff --git a/src/panfrost/midgard/midgard.h b/src/panfrost/midgard/midgard.h index 753da1c064e..f1235ec5130 100644 --- a/src/panfrost/midgard/midgard.h +++ b/src/panfrost/midgard/midgard.h @@ -628,7 +628,13 @@ __attribute__((__packed__)) unsigned last : 1; enum mali_texture_type format : 2; - unsigned zero : 2; + + /* Are sampler_handle/texture_handler respectively set by registers? If + * true, the lower 8-bits of the respective field is a register word. + * If false, they are an immediate */ + + unsigned sampler_register : 1; + unsigned texture_register : 1; /* Is a register used to specify the * LOD/bias/offset? If set, use the `bias` field as @@ -693,6 +699,10 @@ __attribute__((__packed__)) unsigned bias : 8; signed bias_int : 8; + /* If sampler/texture_register is set, the bottom 8-bits are + * midgard_tex_register_select and the top 8-bits are zero. If they are + * clear, they are immediate texture indices */ + unsigned sampler_handle : 16; unsigned texture_handle : 16; } -- cgit v1.2.3