summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2010-07-24 18:01:09 -0400
committerJerome Glisse <jglisse@redhat.com>2010-07-24 18:01:09 -0400
commita1f0f783981c1601502fa0199588818f87bcda9f (patch)
tree6bc66f2256ec778ac87281b8b03c481ae7ef7f28
parente62738260d16e3382fb32c614b1388c5a6da6d32 (diff)
radeondb: r600 disassmbler, texture instruction support
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
-rw-r--r--src/r600_disassembler.c60
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;
}