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 <alyssa.rosenzweig@collabora.com>
This commit is contained in:
Alyssa Rosenzweig 2019-08-19 08:10:28 -07:00
parent 8c1bc3c000
commit 7f14916372
2 changed files with 28 additions and 6 deletions

View file

@ -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(", ");

View file

@ -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;
}