i965/disasm: Actually disassemble Gen7+ URB opcodes.
authorKenneth Graunke <kenneth@whitecape.org>
Sun, 29 Jun 2014 01:37:02 +0000 (18:37 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 30 Jun 2014 21:05:28 +0000 (14:05 -0700)
I never bothered implementing the disassembler for Gen7+ URB opcodes, so
we were just disassembling them as Ironlake/Sandybridge ones.  This
looked pretty bad when running Paul's GS EndPrimitive tests, as the
"write OWord" message was decoded at ff_sync, which doesn't exist.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>
src/mesa/drivers/dri/i965/brw_disasm.c

index 14cb687..4e75cc7 100644 (file)
@@ -478,11 +478,24 @@ static const char *const math_precision[2] = {
    [1] = "partial_precision"
 };
 
-static const char *const urb_opcode[2] = {
+static const char *const gen5_urb_opcode[] = {
    [0] = "urb_write",
    [1] = "ff_sync",
 };
 
+static const char *const gen7_urb_opcode[] = {
+   [0] = "write HWord",
+   [1] = "write OWord",
+   [2] = "read HWord",
+   [3] = "read OWord",
+   [4] = "atomic mov",  /* Gen7+ */
+   [5] = "atomic inc",  /* Gen7+ */
+   [6] = "atomic add",  /* Gen8+ */
+   [7] = "SIMD8 write", /* Gen8+ */
+   [8] = "SIMD8 read",  /* Gen8+ */
+   /* [9-15] - reserved */
+};
+
 static const char *const urb_swizzle[4] = {
    [BRW_URB_SWIZZLE_NONE]       = "",
    [BRW_URB_SWIZZLE_INTERLEAVE] = "interleave",
@@ -1361,8 +1374,11 @@ brw_disassemble_inst(FILE *file, struct brw_context *brw, brw_inst *inst,
          format(file, " %d", brw_inst_urb_global_offset(brw, inst));
 
          space = 1;
-         if (brw->gen >= 5) {
-            err |= control(file, "urb opcode", urb_opcode,
+         if (brw->gen >= 7) {
+            err |= control(file, "urb opcode", gen7_urb_opcode,
+                           brw_inst_urb_opcode(brw, inst), &space);
+         } else if (brw->gen >= 5) {
+            err |= control(file, "urb opcode", gen5_urb_opcode,
                            brw_inst_urb_opcode(brw, inst), &space);
          }
          err |= control(file, "urb swizzle", urb_swizzle,