aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2012-10-03 16:11:26 -0700
committerEric Anholt <[email protected]>2012-10-17 12:23:59 -0700
commit914d8f9f84a3539758716d676d59a1fee4cc559f (patch)
treee086bb9ed59d1a54d84045511e9c45ebdbb01c65 /src
parenta30d14635d5d55ce0e022b0b66770da32155a3d7 (diff)
i965/vs: Add a little bit of IR-level debug ability.
This is super basic, but it let me visualize a problem I had with opt_compute_to_mrf(). Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i965/brw_context.h8
-rw-r--r--src/mesa/drivers/dri/i965/brw_disasm.c7
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4.cpp83
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4.h3
4 files changed, 96 insertions, 5 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
index eae41d16d84..e9d6cc43810 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -1298,6 +1298,14 @@ brw_program_reloc(struct brw_context *brw, uint32_t state_offset,
bool brw_do_cubemap_normalize(struct exec_list *instructions);
bool brw_lower_texture_gradients(struct exec_list *instructions);
+struct opcode_desc {
+ char *name;
+ int nsrc;
+ int ndst;
+};
+
+extern const struct opcode_desc opcode_descs[128];
+
#ifdef __cplusplus
}
#endif
diff --git a/src/mesa/drivers/dri/i965/brw_disasm.c b/src/mesa/drivers/dri/i965/brw_disasm.c
index 59a42467a34..9246dee8733 100644
--- a/src/mesa/drivers/dri/i965/brw_disasm.c
+++ b/src/mesa/drivers/dri/i965/brw_disasm.c
@@ -32,11 +32,7 @@
#include "brw_context.h"
#include "brw_defines.h"
-static const struct {
- char *name;
- int nsrc;
- int ndst;
-} opcode[128] = {
+const struct opcode_desc opcode_descs[128] = {
[BRW_OPCODE_MOV] = { .name = "mov", .nsrc = 1, .ndst = 1 },
[BRW_OPCODE_FRC] = { .name = "frc", .nsrc = 1, .ndst = 1 },
[BRW_OPCODE_RNDU] = { .name = "rndu", .nsrc = 1, .ndst = 1 },
@@ -91,6 +87,7 @@ static const struct {
[BRW_OPCODE_DO] = { .name = "do", .nsrc = 0, .ndst = 0 },
[BRW_OPCODE_ENDIF] = { .name = "endif", .nsrc = 2, .ndst = 0 },
};
+static const struct opcode_desc *opcode = opcode_descs;
static const char * const conditional_modifier[16] = {
[BRW_CONDITIONAL_NONE] = "",
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp
index e0b643242a3..727d980c314 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
@@ -925,4 +925,87 @@ vec4_visitor::split_virtual_grfs()
this->live_intervals_valid = false;
}
+void
+vec4_visitor::dump_instruction(vec4_instruction *inst)
+{
+ if (inst->opcode < ARRAY_SIZE(opcode_descs) &&
+ opcode_descs[inst->opcode].name) {
+ printf("%s ", opcode_descs[inst->opcode].name);
+ } else {
+ printf("op%d ", inst->opcode);
+ }
+
+ switch (inst->dst.file) {
+ case GRF:
+ printf("vgrf%d.%d", inst->dst.reg, inst->dst.reg_offset);
+ break;
+ case MRF:
+ printf("m%d", inst->dst.reg);
+ break;
+ case BAD_FILE:
+ printf("(null)");
+ break;
+ default:
+ printf("???");
+ break;
+ }
+ if (inst->dst.writemask != WRITEMASK_XYZW) {
+ printf(".");
+ if (inst->dst.writemask & 1)
+ printf("x");
+ if (inst->dst.writemask & 2)
+ printf("y");
+ if (inst->dst.writemask & 4)
+ printf("z");
+ if (inst->dst.writemask & 8)
+ printf("w");
+ }
+ printf(", ");
+
+ for (int i = 0; i < 3; i++) {
+ switch (inst->src[i].file) {
+ case GRF:
+ printf("vgrf%d", inst->src[i].reg);
+ break;
+ case ATTR:
+ printf("attr%d", inst->src[i].reg);
+ break;
+ case UNIFORM:
+ printf("u%d", inst->src[i].reg);
+ break;
+ case BAD_FILE:
+ printf("(null)");
+ break;
+ default:
+ printf("???");
+ break;
+ }
+
+ if (inst->src[i].reg_offset)
+ printf(".%d", inst->src[i].reg_offset);
+
+ static const char *chans[4] = {"x", "y", "z", "w"};
+ printf(".");
+ for (int c = 0; c < 4; c++) {
+ printf(chans[BRW_GET_SWZ(inst->src[i].swizzle, c)]);
+ }
+
+ if (i < 3)
+ printf(", ");
+ }
+
+ printf("\n");
+}
+
+void
+vec4_visitor::dump_instructions()
+{
+ int ip = 0;
+ foreach_list_safe(node, &this->instructions) {
+ vec4_instruction *inst = (vec4_instruction *)node;
+ printf("%d: ", ip++);
+ dump_instruction(inst);
+ }
+}
+
} /* namespace brw */
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h
index 4fdede3ab26..de0df552553 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.h
+++ b/src/mesa/drivers/dri/i965/brw_vec4.h
@@ -482,6 +482,9 @@ public:
struct brw_reg dst,
struct brw_reg index,
struct brw_reg offset);
+
+ void dump_instruction(vec4_instruction *inst);
+ void dump_instructions();
};
} /* namespace brw */