mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 21:50:12 +01:00
freedreno/ir3: Generalize ir3_shader_disasm()
Use a helper function to get the sysval/attribute/varying/output name and make the disam debug output independent of shader stage. Reviewed-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
parent
1ea987576d
commit
cea39af2fb
1 changed files with 42 additions and 46 deletions
|
|
@ -316,6 +316,28 @@ static void dump_output(FILE *out, struct ir3_shader_variant *so,
|
|||
dump_reg(out, name, regid);
|
||||
}
|
||||
|
||||
static const char *
|
||||
input_name(struct ir3_shader_variant *so, int i)
|
||||
{
|
||||
if (so->inputs[i].sysval) {
|
||||
return gl_system_value_name(so->inputs[i].slot);
|
||||
} else if (so->type == MESA_SHADER_VERTEX) {
|
||||
return gl_vert_attrib_name(so->inputs[i].slot);
|
||||
} else {
|
||||
return gl_varying_slot_name(so->inputs[i].slot);
|
||||
}
|
||||
}
|
||||
|
||||
static const char *
|
||||
output_name(struct ir3_shader_variant *so, int i)
|
||||
{
|
||||
if (so->type == MESA_SHADER_FRAGMENT) {
|
||||
return gl_frag_result_name(so->outputs[i].slot);
|
||||
} else {
|
||||
return gl_varying_slot_name(so->outputs[i].slot);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ir3_shader_disasm(struct ir3_shader_variant *so, uint32_t *bin, FILE *out)
|
||||
{
|
||||
|
|
@ -364,53 +386,27 @@ ir3_shader_disasm(struct ir3_shader_variant *so, uint32_t *bin, FILE *out)
|
|||
|
||||
disasm_a3xx(bin, so->info.sizedwords, 0, out, ir->compiler->gpu_id);
|
||||
|
||||
switch (so->type) {
|
||||
case MESA_SHADER_VERTEX:
|
||||
fprintf(out, "; %s: outputs:", type);
|
||||
for (i = 0; i < so->outputs_count; i++) {
|
||||
uint8_t regid = so->outputs[i].regid;
|
||||
fprintf(out, " r%d.%c (%s)",
|
||||
(regid >> 2), "xyzw"[regid & 0x3],
|
||||
gl_varying_slot_name(so->outputs[i].slot));
|
||||
}
|
||||
fprintf(out, "\n");
|
||||
fprintf(out, "; %s: inputs:", type);
|
||||
for (i = 0; i < so->inputs_count; i++) {
|
||||
uint8_t regid = so->inputs[i].regid;
|
||||
fprintf(out, " r%d.%c (cm=%x,il=%u,b=%u)",
|
||||
(regid >> 2), "xyzw"[regid & 0x3],
|
||||
so->inputs[i].compmask,
|
||||
so->inputs[i].inloc,
|
||||
so->inputs[i].bary);
|
||||
}
|
||||
fprintf(out, "\n");
|
||||
break;
|
||||
case MESA_SHADER_FRAGMENT:
|
||||
fprintf(out, "; %s: outputs:", type);
|
||||
for (i = 0; i < so->outputs_count; i++) {
|
||||
uint8_t regid = so->outputs[i].regid;
|
||||
const char *reg_type = so->outputs[i].half ? "hr" : "r";
|
||||
fprintf(out, " %s%d.%c (%s)",
|
||||
reg_type, (regid >> 2), "xyzw"[regid & 0x3],
|
||||
gl_frag_result_name(so->outputs[i].slot));
|
||||
}
|
||||
fprintf(out, "\n");
|
||||
fprintf(out, "; %s: inputs:", type);
|
||||
for (i = 0; i < so->inputs_count; i++) {
|
||||
uint8_t regid = so->inputs[i].regid;
|
||||
fprintf(out, " r%d.%c (%s,cm=%x,il=%u,b=%u)",
|
||||
(regid >> 2), "xyzw"[regid & 0x3],
|
||||
gl_varying_slot_name(so->inputs[i].slot),
|
||||
so->inputs[i].compmask,
|
||||
so->inputs[i].inloc,
|
||||
so->inputs[i].bary);
|
||||
}
|
||||
fprintf(out, "\n");
|
||||
break;
|
||||
default:
|
||||
/* TODO */
|
||||
break;
|
||||
fprintf(out, "; %s: outputs:", type);
|
||||
for (i = 0; i < so->outputs_count; i++) {
|
||||
uint8_t regid = so->outputs[i].regid;
|
||||
fprintf(out, " r%d.%c (%s)",
|
||||
(regid >> 2), "xyzw"[regid & 0x3],
|
||||
output_name(so, i));
|
||||
}
|
||||
fprintf(out, "\n");
|
||||
|
||||
fprintf(out, "; %s: inputs:", type);
|
||||
for (i = 0; i < so->inputs_count; i++) {
|
||||
uint8_t regid = so->inputs[i].regid;
|
||||
fprintf(out, " r%d.%c (%s slot=%d cm=%x,il=%u,b=%u)",
|
||||
(regid >> 2), "xyzw"[regid & 0x3],
|
||||
input_name(so, i),
|
||||
so->inputs[i].slot,
|
||||
so->inputs[i].compmask,
|
||||
so->inputs[i].inloc,
|
||||
so->inputs[i].bary);
|
||||
}
|
||||
fprintf(out, "\n");
|
||||
|
||||
/* print generic shader info: */
|
||||
fprintf(out, "; %s prog %d/%d: %u instructions, %d half, %d full\n",
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue