pan/bi: Use padding bytes for checking whether to stop disassembly

Both Panfrost and the DDK add padding zero bytes to the end of
shaders, so we can use this instead of the end-of-shader clause for
checking whether to stop disassembling.

Shaders can have end-of-shader clauses partway through; these shaders
will now be completely disassembled instead of cut off at the first
end-of-shader clause.

A tag byte of zero is an invalid encoding, so unlike the previous
version of this test only check the first word.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12153>
This commit is contained in:
Icecream95 2021-07-31 12:27:43 +12:00 committed by Marge Bot
parent 8574ca4491
commit 1acc3394c4
1 changed files with 10 additions and 9 deletions

View File

@ -439,7 +439,7 @@ decode_M(enum bi_constmod *mod, unsigned M1, unsigned M2, bool single)
}
}
static bool dump_clause(FILE *fp, uint32_t *words, unsigned *size, unsigned offset, bool verbose)
static void dump_clause(FILE *fp, uint32_t *words, unsigned *size, unsigned offset, bool verbose)
{
// State for a decoded clause
struct bifrost_alu_inst instrs[8] = {};
@ -447,7 +447,6 @@ static bool dump_clause(FILE *fp, uint32_t *words, unsigned *size, unsigned offs
unsigned num_instrs = 0;
unsigned num_consts = 0;
uint64_t header_bits = 0;
bool stopbit = false;
unsigned i;
for (i = 0; ; i++, words += 4) {
@ -648,8 +647,6 @@ static bool dump_clause(FILE *fp, uint32_t *words, unsigned *size, unsigned offs
struct bifrost_header header;
memcpy((char *) &header, (char *) &header_bits, sizeof(struct bifrost_header));
dump_header(fp, header, verbose);
if (header.flow_control == BIFROST_FLOW_END)
stopbit = true;
fprintf(fp, "{\n");
for (i = 0; i < num_instrs; i++) {
@ -687,7 +684,7 @@ static bool dump_clause(FILE *fp, uint32_t *words, unsigned *size, unsigned offs
}
fprintf(fp, "\n");
return stopbit;
return;
}
void disassemble_bifrost(FILE *fp, uint8_t *code, size_t size, bool verbose)
@ -697,12 +694,16 @@ void disassemble_bifrost(FILE *fp, uint8_t *code, size_t size, bool verbose)
// used for displaying branch targets
unsigned offset = 0;
while (words != words_end) {
fprintf(fp, "clause_%d:\n", offset);
unsigned size;
if (dump_clause(fp, words, &size, offset, verbose))
/* Shaders have zero bytes at the end for padding; stop
* disassembling when we hit them. */
if (*words == 0)
break;
fprintf(fp, "clause_%d:\n", offset);
unsigned size;
dump_clause(fp, words, &size, offset, verbose);
words += size * 4;
offset += size;
}