diff options
author | Jerome Glisse <jglisse@redhat.com> | 2010-07-24 18:01:09 -0400 |
---|---|---|
committer | Jerome Glisse <jglisse@redhat.com> | 2010-07-24 18:01:09 -0400 |
commit | a1f0f783981c1601502fa0199588818f87bcda9f (patch) | |
tree | 6bc66f2256ec778ac87281b8b03c481ae7ef7f28 | |
parent | e62738260d16e3382fb32c614b1388c5a6da6d32 (diff) |
radeondb: r600 disassmbler, texture instruction support
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
-rw-r--r-- | src/r600_disassembler.c | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/src/r600_disassembler.c b/src/r600_disassembler.c index cef4ff3..61cf7df 100644 --- a/src/r600_disassembler.c +++ b/src/r600_disassembler.c @@ -61,6 +61,7 @@ struct disassembler { static const char *cf_alu_op[16]; static const char *cf_exp_op[41]; +static const char *tex_op[32]; static const char *sel[8]; static const char *cf_exp_type[8]; static const char *cf_mem_type[8]; @@ -623,7 +624,64 @@ static int do_vtx_clause(struct disassembler *d) static int do_tex_clause(struct disassembler *d) { - printf("0x%08X 0x%08X tex\n", d->id, d->bcode[d->id++]); + u32 dword0, dword1, dword2, dword3; + unsigned inst, resourceid, samplerid, src_gpr, dst_gpr; + unsigned dst_sel_x, dst_sel_y, dst_sel_z, dst_sel_w; + unsigned lod_bias, coord_type_x, coord_type_y, coord_type_z, coord_type_w; + unsigned offset_x, offset_y, offset_z; + unsigned src_sel_x, src_sel_y, src_sel_z, src_sel_w; + int tmp, count; + char s; + + count = d->section[d->id].count; + while (count) { + dword0 = d->bcode[d->id]; + dword1 = d->bcode[d->id + 1]; + dword2 = d->bcode[d->id + 2]; + dword3 = d->bcode[d->id + 3]; + /* dword 0 */ + inst = dword0 & 0x1F; + resourceid = (dword0 >> 8) & 0xFF; + src_gpr = (dword0 >> 16) & 0x7F; + /* dword 1 */ + dst_gpr = (dword1 >> 0) & 0x7F; + dst_sel_x = (dword1 >> 9) & 0x7; + dst_sel_y = (dword1 >> 12) & 0x7; + dst_sel_z = (dword1 >> 15) & 0x7; + dst_sel_w = (dword1 >> 18) & 0x7; + lod_bias = (dword1 >> 21) & 0x7F; + coord_type_x = (dword1 >> 28) & 0x1; + coord_type_y = (dword1 >> 29) & 0x1; + coord_type_z = (dword1 >> 30) & 0x1; + coord_type_w = (dword1 >> 31) & 0x1; + /* dword 2 */ + offset_x = (dword2 >> 0) & 0x1F; + offset_y = (dword2 >> 5) & 0x1F; + offset_z = (dword2 >> 10) & 0x1F; + samplerid = (dword2 >> 15) & 0x1F; + src_sel_x = (dword2 >> 20) & 0x7; + src_sel_y = (dword2 >> 23) & 0x7; + src_sel_z = (dword2 >> 26) & 0x7; + src_sel_w = (dword2 >> 29) & 0x7; + printf("0x%08X 0x%08X %s rid=%d sgpr=%d\n", d->id + 0, dword0, tex_op[inst], resourceid, src_gpr); + printf("0x%08X 0x%08X ", d->id + 1, dword1); + printf("dgpr=%d.%s%s%s%s ", dst_gpr, sel[dst_sel_x], sel[dst_sel_y], sel[dst_sel_z], sel[dst_sel_w]); + s = ' '; + tmp = lod_bias; + if ((lod_bias >> 6) & 1) { + s = '-'; + tmp = (~lod_bias) & 0x7F; + tmp += 1; + } + printf("lod=%c%d.%d ", s, (tmp >> 4) & 0x7, tmp & 0xF); + printf("NORMALIZED %d%d%d%d\n", coord_type_x, coord_type_y, coord_type_z, coord_type_w); + printf("0x%08X 0x%08X ", d->id + 2, dword2); + printf("sid=%d ", samplerid); + printf("sgpr=%s%s%s%s\n", sel[src_sel_x], sel[src_sel_y], sel[src_sel_z], sel[src_sel_w]); + printf("0x%08X 0x%08X \n", d->id + 3, dword3); + count--; + d->id += 4; + } return 0; } |