All of lore.kernel.org
 help / color / mirror / Atom feed
* Moving intel_decode.c to libdrm
@ 2011-12-21 18:09 Eric Anholt
  2011-12-21 18:09 ` [PATCH 01/13] intel: Import intel_decode.c from intel-gpu-tools Eric Anholt
                   ` (13 more replies)
  0 siblings, 14 replies; 16+ messages in thread
From: Eric Anholt @ 2011-12-21 18:09 UTC (permalink / raw)
  To: intel-gfx

I was once again embarassed while explaining to either Ken or Paul
about how we handle reusing the intel_decode.c file in two trees.
Here's my attempt at a solution to the problem: Move the code into
libdrm, and try to give it an API that we won't have to continually
rev as we throw the kitchen sink into the intel_decode() function
arguments.

One of the things I'm interested in is doing a version that directly
pokes at BOs instead of just a pointer, which would let us decode
associated blocks as we see the various state pointers to them.
There's also room for some interesting validation in that case.

Further patches (mostly fixing up style) are in my libdrm tree on the
intel-decode branch.  I've tested it with Mesa on gen7 (I have further
code to land to make gen7 decode more reasonable).

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 01/13] intel: Import intel_decode.c from intel-gpu-tools.
  2011-12-21 18:09 Moving intel_decode.c to libdrm Eric Anholt
@ 2011-12-21 18:09 ` Eric Anholt
  2011-12-21 18:09 ` [PATCH 02/13] intel: Make intel_chipset handle devid directly Eric Anholt
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Eric Anholt @ 2011-12-21 18:09 UTC (permalink / raw)
  To: intel-gfx

This is from commit dd9a5b4f7fb07c78db4e7481bedca1b981030e3f.
We've been sharing this file between that repo and Mesa, and it's time
to build a real interface using it.  I'm also hoping to apply some of
its packet-walking logic for AUB dumping and batch validation
purposes.
---
 intel/intel_decode.c | 2931 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 2931 insertions(+), 0 deletions(-)
 create mode 100644 intel/intel_decode.c

diff --git a/intel/intel_decode.c b/intel/intel_decode.c
new file mode 100644
index 0000000..344578b
--- /dev/null
+++ b/intel/intel_decode.c
@@ -0,0 +1,2931 @@
+/*
+ * Copyright © 2009-2011 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+
+#include "intel_decode.h"
+#include "intel_chipset.h"
+#include "intel_gpu_tools.h"
+
+static FILE *out;
+static uint32_t saved_s2 = 0, saved_s4 = 0;
+static char saved_s2_set = 0, saved_s4_set = 0;
+static uint32_t head_offset = 0xffffffff; /* undefined */
+static uint32_t tail_offset = 0xffffffff; /* undefined */
+
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(A) (sizeof(A)/sizeof(A[0]))
+#endif
+
+#define BUFFER_FAIL(_count, _len, _name) do {			\
+    fprintf(out, "Buffer size too small in %s (%d < %d)\n",	\
+	    (_name), (_count), (_len));				\
+    (*failures)++;						\
+    return count;						\
+} while (0)
+
+
+static float
+int_as_float(uint32_t intval)
+{
+    union intfloat {
+	uint32_t i;
+	float f;
+    } uval;
+
+    uval.i = intval;
+    return uval.f;
+}
+
+static void
+instr_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
+	  char *fmt, ...)
+{
+    va_list va;
+    char *parseinfo;
+    uint32_t offset = hw_offset + index * 4;
+
+    if (offset == head_offset)
+	parseinfo = "HEAD";
+    else if (offset == tail_offset)
+	parseinfo = "TAIL";
+    else
+	parseinfo = "    ";
+
+    fprintf(out, "0x%08x: %s 0x%08x: %s", offset, parseinfo,
+	    data[index],
+	    index == 0 ? "" : "   ");
+    va_start(va, fmt);
+    vfprintf(out, fmt, va);
+    va_end(va);
+}
+
+static int
+decode_mi(uint32_t *data, int count, uint32_t hw_offset, int *failures)
+{
+    unsigned int opcode, len = -1;
+    char *post_sync_op = "";
+
+    struct {
+	uint32_t opcode;
+	int len_mask;
+	int min_len;
+	int max_len;
+	char *name;
+    } opcodes_mi[] = {
+	{ 0x08, 0, 1, 1, "MI_ARB_ON_OFF" },
+	{ 0x0a, 0, 1, 1, "MI_BATCH_BUFFER_END" },
+	{ 0x30, 0x3f, 3, 3, "MI_BATCH_BUFFER" },
+	{ 0x31, 0x3f, 2, 2, "MI_BATCH_BUFFER_START" },
+	{ 0x14, 0x3f, 3, 3, "MI_DISPLAY_BUFFER_INFO" },
+	{ 0x04, 0, 1, 1, "MI_FLUSH" },
+	{ 0x22, 0x1f, 3, 3, "MI_LOAD_REGISTER_IMM" },
+	{ 0x13, 0x3f, 2, 2, "MI_LOAD_SCAN_LINES_EXCL" },
+	{ 0x12, 0x3f, 2, 2, "MI_LOAD_SCAN_LINES_INCL" },
+	{ 0x00, 0, 1, 1, "MI_NOOP" },
+	{ 0x11, 0x3f, 2, 2, "MI_OVERLAY_FLIP" },
+	{ 0x07, 0, 1, 1, "MI_REPORT_HEAD" },
+	{ 0x18, 0x3f, 2, 2, "MI_SET_CONTEXT" },
+	{ 0x20, 0x3f, 3, 4, "MI_STORE_DATA_IMM" },
+	{ 0x21, 0x3f, 3, 4, "MI_STORE_DATA_INDEX" },
+	{ 0x24, 0x3f, 3, 3, "MI_STORE_REGISTER_MEM" },
+	{ 0x02, 0, 1, 1, "MI_USER_INTERRUPT" },
+	{ 0x03, 0, 1, 1, "MI_WAIT_FOR_EVENT" },
+	{ 0x16, 0x7f, 3, 3, "MI_SEMAPHORE_MBOX" },
+	{ 0x26, 0x1f, 3, 4, "MI_FLUSH_DW" },
+	{ 0x0b, 0, 1, 1, "MI_SUSPEND_FLUSH" },
+    };
+
+    /* check instruction length */
+    for (opcode = 0; opcode < sizeof(opcodes_mi) / sizeof(opcodes_mi[0]);
+	 opcode++) {
+	if ((data[0] & 0x1f800000) >> 23 == opcodes_mi[opcode].opcode) {
+	    len = 1;
+	    if (opcodes_mi[opcode].max_len > 1) {
+		len = (data[0] & opcodes_mi[opcode].len_mask) + 2;
+		if (len < opcodes_mi[opcode].min_len ||
+		    len > opcodes_mi[opcode].max_len)
+		{
+		    fprintf(out, "Bad length (%d) in %s, [%d, %d]\n",
+			    len, opcodes_mi[opcode].name,
+			    opcodes_mi[opcode].min_len,
+			    opcodes_mi[opcode].max_len);
+		}
+	    }
+	    break;
+	}
+    }
+
+    switch ((data[0] & 0x1f800000) >> 23) {
+    case 0x0a:
+	instr_out(data, hw_offset, 0, "MI_BATCH_BUFFER_END\n");
+	return -1;
+    case 0x16:
+	instr_out(data, hw_offset, 0, "MI_SEMAPHORE_MBOX%s%s%s%s %u\n",
+		  data[0] & (1<<22) ? " global gtt," : "",
+		  data[0] & (1<<21) ? " update semaphore," : "",
+		  data[0] & (1<<20) ? " compare semaphore," : "",
+		  data[0] & (1<<18) ? " use compare reg" : "",
+		  (data[0] & (0x3<<16)) >> 16);
+	instr_out(data, hw_offset, 1, "value\n");
+	instr_out(data, hw_offset, 2, "address\n");
+	return len;
+    case 0x21:
+	instr_out(data, hw_offset, 0, "MI_STORE_DATA_INDEX%s\n",
+		  data[0] & (1<<21) ? " use per-process HWS," : "");
+	instr_out(data, hw_offset, 1, "index\n");
+	instr_out(data, hw_offset, 2, "dword\n");
+	if (len == 4)
+		instr_out(data, hw_offset, 3, "upper dword\n");
+	return len;
+    case 0x00:
+	if (data[0] & (1<<22))
+		instr_out(data, hw_offset, 0, "MI_NOOP write NOPID reg, val=0x%x\n",
+			  data[0] & ((1<<22) - 1));
+	else
+		instr_out(data, hw_offset, 0, "MI_NOOP\n");
+	return len;
+    case 0x26:
+	switch (data[0] & (0x3<<14)) {
+	case (0<<14): post_sync_op = "no write"; break;
+	case (1<<14): post_sync_op = "write data"; break;
+	case (2<<14): post_sync_op = "reserved"; break;
+	case (3<<14): post_sync_op = "write TIMESTAMP"; break;
+	}
+	instr_out(data, hw_offset, 0, "MI_FLUSH_DW%s%s%s%s post_sync_op='%s' %s%s\n",
+		  data[0] & (1<<22) ? " enable protected mem (BCS-only)," : "",
+		  data[0] & (1<<21) ? " store in hws," : "",
+		  data[0] & (1<<18) ? " invalidate tlb," : "",
+		  data[0] & (1<<17) ? " flush gfdt," : "",
+		  post_sync_op,
+		  data[0] & (1<<8) ? " enable notify interrupt," : "",
+		  data[0] & (1<<7) ? " invalidate video state (BCS-only)," : "");
+	if (data[0] & (1<<21))
+		instr_out(data, hw_offset, 1, "hws index\n");
+	else
+		instr_out(data, hw_offset, 1, "address\n");
+	instr_out(data, hw_offset, 2, "dword\n");
+	if (len == 4)
+		instr_out(data, hw_offset, 3, "upper dword\n");
+	return len;
+    }
+
+    for (opcode = 0; opcode < sizeof(opcodes_mi) / sizeof(opcodes_mi[0]);
+	 opcode++) {
+	if ((data[0] & 0x1f800000) >> 23 == opcodes_mi[opcode].opcode) {
+
+	    instr_out(data, hw_offset, 0, "%s\n", opcodes_mi[opcode].name);
+	    for (int i = 1; i < len; i++) {
+		if (i >= count)
+		    BUFFER_FAIL(count, len, opcodes_mi[opcode].name);
+		instr_out(data, hw_offset, i, "dword %d\n", i);
+	    }
+
+	    return len;
+	}
+    }
+
+    instr_out(data, hw_offset, 0, "MI UNKNOWN\n");
+    (*failures)++;
+    return 1;
+}
+
+static void
+decode_2d_br00(uint32_t *data, int count, uint32_t hw_offset, char *cmd)
+{
+    instr_out(data, hw_offset, 0,
+	      "%s (rgb %sabled, alpha %sabled, src tile %d, dst tile %d)\n",
+	      cmd,
+	      (data[count] & (1 << 20)) ? "en" : "dis",
+	      (data[count] & (1 << 21)) ? "en" : "dis",
+	      (data[count] >> 15) & 1,
+	      (data[count] >> 11) & 1);
+}
+
+static void
+decode_2d_br01(uint32_t *data, int count, uint32_t hw_offset)
+{
+    char *format;
+    switch ((data[count] >> 24) & 0x3) {
+    case 0:
+	format="8";
+	break;
+    case 1:
+	format="565";
+	break;
+    case 2:
+	format="1555";
+	break;
+    case 3:
+	format="8888";
+	break;
+    }
+
+    instr_out(data, hw_offset, count, "format %s, pitch %d, rop 0x%02x, "
+	      "clipping %sabled, %s%s \n",
+
+	      format,
+	      (short)(data[count] & 0xffff),
+	      (data[count] >> 16) &0xff,
+	      data[count] & (1 << 30) ? "en" : "dis",
+	      data[count] & (1 << 31) ? "solid pattern enabled, " : "",
+	      data[count] & (1 << 31) ? "mono pattern transparency enabled, " : "");
+
+}
+
+static int
+decode_2d(uint32_t *data, int count, uint32_t hw_offset, int *failures)
+{
+    unsigned int opcode, len;
+
+    struct {
+	uint32_t opcode;
+	int min_len;
+	int max_len;
+	char *name;
+    } opcodes_2d[] = {
+	{ 0x40, 5, 5, "COLOR_BLT" },
+	{ 0x43, 6, 6, "SRC_COPY_BLT" },
+	{ 0x01, 8, 8, "XY_SETUP_BLT" },
+	{ 0x11, 9, 9, "XY_SETUP_MONO_PATTERN_SL_BLT" },
+	{ 0x03, 3, 3, "XY_SETUP_CLIP_BLT" },
+	{ 0x24, 2, 2, "XY_PIXEL_BLT" },
+	{ 0x25, 3, 3, "XY_SCANLINES_BLT" },
+	{ 0x26, 4, 4, "Y_TEXT_BLT" },
+	{ 0x31, 5, 134, "XY_TEXT_IMMEDIATE_BLT" },
+	{ 0x50, 6, 6, "XY_COLOR_BLT" },
+	{ 0x51, 6, 6, "XY_PAT_BLT" },
+	{ 0x76, 8, 8, "XY_PAT_CHROMA_BLT" },
+	{ 0x72, 7, 135, "XY_PAT_BLT_IMMEDIATE" },
+	{ 0x77, 9, 137, "XY_PAT_CHROMA_BLT_IMMEDIATE" },
+	{ 0x52, 9, 9, "XY_MONO_PAT_BLT" },
+	{ 0x59, 7, 7, "XY_MONO_PAT_FIXED_BLT" },
+	{ 0x53, 8, 8, "XY_SRC_COPY_BLT" },
+	{ 0x54, 8, 8, "XY_MONO_SRC_COPY_BLT" },
+	{ 0x71, 9, 137, "XY_MONO_SRC_COPY_IMMEDIATE_BLT" },
+	{ 0x55, 9, 9, "XY_FULL_BLT" },
+	{ 0x55, 9, 137, "XY_FULL_IMMEDIATE_PATTERN_BLT" },
+	{ 0x56, 9, 9, "XY_FULL_MONO_SRC_BLT" },
+	{ 0x75, 10, 138, "XY_FULL_MONO_SRC_IMMEDIATE_PATTERN_BLT" },
+	{ 0x57, 12, 12, "XY_FULL_MONO_PATTERN_BLT" },
+	{ 0x58, 12, 12, "XY_FULL_MONO_PATTERN_MONO_SRC_BLT" },
+    };
+
+    switch ((data[0] & 0x1fc00000) >> 22) {
+    case 0x25:
+	instr_out(data, hw_offset, 0,
+		  "XY_SCANLINES_BLT (pattern seed (%d, %d), dst tile %d)\n",
+		  (data[0] >> 12) &0x8,
+		  (data[0] >> 8) &0x8,
+		  (data[0] >> 11) & 1);
+
+	len = (data[0] & 0x000000ff) + 2;
+	if (len != 3)
+	    fprintf(out, "Bad count in XY_SCANLINES_BLT\n");
+	if (count < 3)
+	    BUFFER_FAIL(count, len, "XY_SCANLINES_BLT");
+
+	instr_out(data, hw_offset, 1, "dest (%d,%d)\n",
+		  data[1] & 0xffff, data[1] >> 16);
+	instr_out(data, hw_offset, 2, "dest (%d,%d)\n",
+		  data[2] & 0xffff, data[2] >> 16);
+	return len;
+    case 0x01:
+	decode_2d_br00(data, 0, hw_offset, "XY_SETUP_BLT");
+
+	len = (data[0] & 0x000000ff) + 2;
+	if (len != 8)
+	    fprintf(out, "Bad count in XY_SETUP_BLT\n");
+	if (count < 8)
+	    BUFFER_FAIL(count, len, "XY_SETUP_BLT");
+
+	decode_2d_br01(data, 1, hw_offset);
+	instr_out(data, hw_offset, 2, "cliprect (%d,%d)\n",
+		  data[2] & 0xffff, data[2] >> 16);
+	instr_out(data, hw_offset, 3, "cliprect (%d,%d)\n",
+		  data[3] & 0xffff, data[3] >> 16);
+	instr_out(data, hw_offset, 4, "setup dst offset 0x%08x\n", data[4]);
+	instr_out(data, hw_offset, 5, "setup background color\n");
+	instr_out(data, hw_offset, 6, "setup foreground color\n");
+	instr_out(data, hw_offset, 7, "color pattern offset\n");
+	return len;
+    case 0x03:
+	decode_2d_br00(data, 0, hw_offset, "XY_SETUP_CLIP_BLT");
+
+	len = (data[0] & 0x000000ff) + 2;
+	if (len != 3)
+	    fprintf(out, "Bad count in XY_SETUP_CLIP_BLT\n");
+	if (count < 3)
+	    BUFFER_FAIL(count, len, "XY_SETUP_CLIP_BLT");
+
+	instr_out(data, hw_offset, 1, "cliprect (%d,%d)\n",
+		  data[1] & 0xffff, data[2] >> 16);
+	instr_out(data, hw_offset, 2, "cliprect (%d,%d)\n",
+		  data[2] & 0xffff, data[3] >> 16);
+	return len;
+    case 0x11:
+	decode_2d_br00(data, 0, hw_offset, "XY_SETUP_MONO_PATTERN_SL_BLT");
+
+	len = (data[0] & 0x000000ff) + 2;
+	if (len != 9)
+	    fprintf(out, "Bad count in XY_SETUP_MONO_PATTERN_SL_BLT\n");
+	if (count < 9)
+	    BUFFER_FAIL(count, len, "XY_SETUP_MONO_PATTERN_SL_BLT");
+
+	decode_2d_br01(data, 1, hw_offset);
+	instr_out(data, hw_offset, 2, "cliprect (%d,%d)\n",
+		  data[2] & 0xffff, data[2] >> 16);
+	instr_out(data, hw_offset, 3, "cliprect (%d,%d)\n",
+		  data[3] & 0xffff, data[3] >> 16);
+	instr_out(data, hw_offset, 4, "setup dst offset 0x%08x\n", data[4]);
+	instr_out(data, hw_offset, 5, "setup background color\n");
+	instr_out(data, hw_offset, 6, "setup foreground color\n");
+	instr_out(data, hw_offset, 7, "mono pattern dw0\n");
+	instr_out(data, hw_offset, 8, "mono pattern dw1\n");
+	return len;
+    case 0x50:
+	decode_2d_br00(data, 0, hw_offset, "XY_COLOR_BLT");
+
+	len = (data[0] & 0x000000ff) + 2;
+	if (len != 6)
+	    fprintf(out, "Bad count in XY_COLOR_BLT\n");
+	if (count < 6)
+	    BUFFER_FAIL(count, len, "XY_COLOR_BLT");
+
+	decode_2d_br01(data, 1, hw_offset);
+	instr_out(data, hw_offset, 2, "(%d,%d)\n",
+		  data[2] & 0xffff, data[2] >> 16);
+	instr_out(data, hw_offset, 3, "(%d,%d)\n",
+		  data[3] & 0xffff, data[3] >> 16);
+	instr_out(data, hw_offset, 4, "offset 0x%08x\n", data[4]);
+	instr_out(data, hw_offset, 5, "color\n");
+	return len;
+    case 0x53:
+	decode_2d_br00(data, 0, hw_offset, "XY_SRC_COPY_BLT");
+
+	len = (data[0] & 0x000000ff) + 2;
+	if (len != 8)
+	    fprintf(out, "Bad count in XY_SRC_COPY_BLT\n");
+	if (count < 8)
+	    BUFFER_FAIL(count, len, "XY_SRC_COPY_BLT");
+
+	decode_2d_br01(data, 1, hw_offset);
+	instr_out(data, hw_offset, 2, "dst (%d,%d)\n",
+		  data[2] & 0xffff, data[2] >> 16);
+	instr_out(data, hw_offset, 3, "dst (%d,%d)\n",
+		  data[3] & 0xffff, data[3] >> 16);
+	instr_out(data, hw_offset, 4, "dst offset 0x%08x\n", data[4]);
+	instr_out(data, hw_offset, 5, "src (%d,%d)\n",
+		  data[5] & 0xffff, data[5] >> 16);
+	instr_out(data, hw_offset, 6, "src pitch %d\n",
+		  (short)(data[6] & 0xffff));
+	instr_out(data, hw_offset, 7, "src offset 0x%08x\n", data[7]);
+	return len;
+    }
+
+    for (opcode = 0; opcode < sizeof(opcodes_2d) / sizeof(opcodes_2d[0]);
+	 opcode++) {
+	if ((data[0] & 0x1fc00000) >> 22 == opcodes_2d[opcode].opcode) {
+	    unsigned int i;
+
+	    len = 1;
+	    instr_out(data, hw_offset, 0, "%s\n", opcodes_2d[opcode].name);
+	    if (opcodes_2d[opcode].max_len > 1) {
+		len = (data[0] & 0x000000ff) + 2;
+		if (len < opcodes_2d[opcode].min_len ||
+		    len > opcodes_2d[opcode].max_len)
+		{
+		    fprintf(out, "Bad count in %s\n", opcodes_2d[opcode].name);
+		}
+	    }
+
+	    for (i = 1; i < len; i++) {
+		if (i >= count)
+		    BUFFER_FAIL(count, len, opcodes_2d[opcode].name);
+		instr_out(data, hw_offset, i, "dword %d\n", i);
+	    }
+
+	    return len;
+	}
+    }
+
+    instr_out(data, hw_offset, 0, "2D UNKNOWN\n");
+    (*failures)++;
+    return 1;
+}
+
+static int
+decode_3d_1c(uint32_t *data, int count, uint32_t hw_offset, int *failures)
+{
+    uint32_t opcode;
+
+    opcode = (data[0] & 0x00f80000) >> 19;
+
+    switch (opcode) {
+    case 0x11:
+	instr_out(data, hw_offset, 0, "3DSTATE_DEPTH_SUBRECTANGLE_DISABLE\n");
+	return 1;
+    case 0x10:
+	instr_out(data, hw_offset, 0, "3DSTATE_SCISSOR_ENABLE %s\n",
+		data[0]&1?"enabled":"disabled");
+	return 1;
+    case 0x01:
+	instr_out(data, hw_offset, 0, "3DSTATE_MAP_COORD_SET_I830\n");
+	return 1;
+    case 0x0a:
+	instr_out(data, hw_offset, 0, "3DSTATE_MAP_CUBE_I830\n");
+	return 1;
+    case 0x05:
+	instr_out(data, hw_offset, 0, "3DSTATE_MAP_TEX_STREAM_I830\n");
+	return 1;
+    }
+
+    instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d_1c opcode = 0x%x\n",
+	      opcode);
+    (*failures)++;
+    return 1;
+}
+
+/** Sets the string dstname to describe the destination of the PS instruction */
+static void
+i915_get_instruction_dst(uint32_t *data, int i, char *dstname, int do_mask)
+{
+    uint32_t a0 = data[i];
+    int dst_nr = (a0 >> 14) & 0xf;
+    char dstmask[8];
+    char *sat;
+
+    if (do_mask) {
+	if (((a0 >> 10) & 0xf) == 0xf) {
+	    dstmask[0] = 0;
+	} else {
+	    int dstmask_index = 0;
+
+	    dstmask[dstmask_index++] = '.';
+	    if (a0 & (1 << 10))
+		dstmask[dstmask_index++] = 'x';
+	    if (a0 & (1 << 11))
+		dstmask[dstmask_index++] = 'y';
+	    if (a0 & (1 << 12))
+		dstmask[dstmask_index++] = 'z';
+	    if (a0 & (1 << 13))
+		dstmask[dstmask_index++] = 'w';
+	    dstmask[dstmask_index++] = 0;
+	}
+
+	if (a0 & (1 << 22))
+	    sat = ".sat";
+	else
+	    sat = "";
+    } else {
+	dstmask[0] = 0;
+	sat = "";
+    }
+
+    switch ((a0 >> 19) & 0x7) {
+    case 0:
+	if (dst_nr > 15)
+	    fprintf(out, "bad destination reg R%d\n", dst_nr);
+	sprintf(dstname, "R%d%s%s", dst_nr, dstmask, sat);
+	break;
+    case 4:
+	if (dst_nr > 0)
+	    fprintf(out, "bad destination reg oC%d\n", dst_nr);
+	sprintf(dstname, "oC%s%s", dstmask, sat);
+	break;
+    case 5:
+	if (dst_nr > 0)
+	    fprintf(out, "bad destination reg oD%d\n", dst_nr);
+	sprintf(dstname, "oD%s%s",  dstmask, sat);
+	break;
+    case 6:
+	if (dst_nr > 3)
+	    fprintf(out, "bad destination reg U%d\n", dst_nr);
+	sprintf(dstname, "U%d%s%s", dst_nr, dstmask, sat);
+	break;
+    default:
+	sprintf(dstname, "RESERVED");
+	break;
+    }
+}
+
+static char *
+i915_get_channel_swizzle(uint32_t select)
+{
+    switch (select & 0x7) {
+    case 0:
+	return (select & 8) ? "-x" : "x";
+    case 1:
+	return (select & 8) ? "-y" : "y";
+    case 2:
+	return (select & 8) ? "-z" : "z";
+    case 3:
+	return (select & 8) ? "-w" : "w";
+    case 4:
+	return (select & 8) ? "-0" : "0";
+    case 5:
+	return (select & 8) ? "-1" : "1";
+    default:
+	return (select & 8) ? "-bad" : "bad";
+    }
+}
+
+static void
+i915_get_instruction_src_name(uint32_t src_type, uint32_t src_nr, char *name)
+{
+    switch (src_type) {
+    case 0:
+	sprintf(name, "R%d", src_nr);
+	if (src_nr > 15)
+	    fprintf(out, "bad src reg %s\n", name);
+	break;
+    case 1:
+	if (src_nr < 8)
+	    sprintf(name, "T%d", src_nr);
+	else if (src_nr == 8)
+	    sprintf(name, "DIFFUSE");
+	else if (src_nr == 9)
+	    sprintf(name, "SPECULAR");
+	else if (src_nr == 10)
+	    sprintf(name, "FOG");
+	else {
+	    fprintf(out, "bad src reg T%d\n", src_nr);
+	    sprintf(name, "RESERVED");
+	}
+	break;
+    case 2:
+	sprintf(name, "C%d", src_nr);
+	if (src_nr > 31)
+	    fprintf(out, "bad src reg %s\n", name);
+	break;
+    case 4:
+	sprintf(name, "oC");
+	if (src_nr > 0)
+	    fprintf(out, "bad src reg oC%d\n", src_nr);
+	break;
+    case 5:
+	sprintf(name, "oD");
+	if (src_nr > 0)
+	    fprintf(out, "bad src reg oD%d\n", src_nr);
+	break;
+    case 6:
+	sprintf(name, "U%d", src_nr);
+	if (src_nr > 3)
+	    fprintf(out, "bad src reg %s\n", name);
+	break;
+    default:
+	fprintf(out, "bad src reg type %d\n", src_type);
+	sprintf(name, "RESERVED");
+	break;
+    }
+}
+
+static void
+i915_get_instruction_src0(uint32_t *data, int i, char *srcname)
+{
+    uint32_t a0 = data[i];
+    uint32_t a1 = data[i + 1];
+    int src_nr = (a0 >> 2) & 0x1f;
+    char *swizzle_x = i915_get_channel_swizzle((a1 >> 28) & 0xf);
+    char *swizzle_y = i915_get_channel_swizzle((a1 >> 24) & 0xf);
+    char *swizzle_z = i915_get_channel_swizzle((a1 >> 20) & 0xf);
+    char *swizzle_w = i915_get_channel_swizzle((a1 >> 16) & 0xf);
+    char swizzle[100];
+
+    i915_get_instruction_src_name((a0 >> 7) & 0x7, src_nr, srcname);
+    sprintf(swizzle, ".%s%s%s%s", swizzle_x, swizzle_y, swizzle_z, swizzle_w);
+    if (strcmp(swizzle, ".xyzw") != 0)
+	strcat(srcname, swizzle);
+}
+
+static void
+i915_get_instruction_src1(uint32_t *data, int i, char *srcname)
+{
+    uint32_t a1 = data[i + 1];
+    uint32_t a2 = data[i + 2];
+    int src_nr = (a1 >> 8) & 0x1f;
+    char *swizzle_x = i915_get_channel_swizzle((a1 >> 4) & 0xf);
+    char *swizzle_y = i915_get_channel_swizzle((a1 >> 0) & 0xf);
+    char *swizzle_z = i915_get_channel_swizzle((a2 >> 28) & 0xf);
+    char *swizzle_w = i915_get_channel_swizzle((a2 >> 24) & 0xf);
+    char swizzle[100];
+
+    i915_get_instruction_src_name((a1 >> 13) & 0x7, src_nr, srcname);
+    sprintf(swizzle, ".%s%s%s%s", swizzle_x, swizzle_y, swizzle_z, swizzle_w);
+    if (strcmp(swizzle, ".xyzw") != 0)
+	strcat(srcname, swizzle);
+}
+
+static void
+i915_get_instruction_src2(uint32_t *data, int i, char *srcname)
+{
+    uint32_t a2 = data[i + 2];
+    int src_nr = (a2 >> 16) & 0x1f;
+    char *swizzle_x = i915_get_channel_swizzle((a2 >> 12) & 0xf);
+    char *swizzle_y = i915_get_channel_swizzle((a2 >> 8) & 0xf);
+    char *swizzle_z = i915_get_channel_swizzle((a2 >> 4) & 0xf);
+    char *swizzle_w = i915_get_channel_swizzle((a2 >> 0) & 0xf);
+    char swizzle[100];
+
+    i915_get_instruction_src_name((a2 >> 21) & 0x7, src_nr, srcname);
+    sprintf(swizzle, ".%s%s%s%s", swizzle_x, swizzle_y, swizzle_z, swizzle_w);
+    if (strcmp(swizzle, ".xyzw") != 0)
+	strcat(srcname, swizzle);
+}
+
+static void
+i915_get_instruction_addr(uint32_t src_type, uint32_t src_nr, char *name)
+{
+    switch (src_type) {
+    case 0:
+	sprintf(name, "R%d", src_nr);
+	if (src_nr > 15)
+	    fprintf(out, "bad src reg %s\n", name);
+	break;
+    case 1:
+	if (src_nr < 8)
+	    sprintf(name, "T%d", src_nr);
+	else if (src_nr == 8)
+	    sprintf(name, "DIFFUSE");
+	else if (src_nr == 9)
+	    sprintf(name, "SPECULAR");
+	else if (src_nr == 10)
+	    sprintf(name, "FOG");
+	else {
+	    fprintf(out, "bad src reg T%d\n", src_nr);
+	    sprintf(name, "RESERVED");
+	}
+	break;
+    case 4:
+	sprintf(name, "oC");
+	if (src_nr > 0)
+	    fprintf(out, "bad src reg oC%d\n", src_nr);
+	break;
+    case 5:
+	sprintf(name, "oD");
+	if (src_nr > 0)
+	    fprintf(out, "bad src reg oD%d\n", src_nr);
+	break;
+    default:
+	fprintf(out, "bad src reg type %d\n", src_type);
+	sprintf(name, "RESERVED");
+	break;
+    }
+}
+
+static void
+i915_decode_alu1(uint32_t *data, uint32_t hw_offset,
+		 int i, char *instr_prefix, char *op_name)
+{
+    char dst[100], src0[100];
+
+    i915_get_instruction_dst(data, i, dst, 1);
+    i915_get_instruction_src0(data, i, src0);
+
+    instr_out(data, hw_offset, i++, "%s: %s %s, %s\n", instr_prefix,
+	      op_name, dst, src0);
+    instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+    instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+}
+
+static void
+i915_decode_alu2(uint32_t *data, uint32_t hw_offset,
+		 int i, char *instr_prefix, char *op_name)
+{
+    char dst[100], src0[100], src1[100];
+
+    i915_get_instruction_dst(data, i, dst, 1);
+    i915_get_instruction_src0(data, i, src0);
+    i915_get_instruction_src1(data, i, src1);
+
+    instr_out(data, hw_offset, i++, "%s: %s %s, %s, %s\n", instr_prefix,
+	      op_name, dst, src0, src1);
+    instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+    instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+}
+
+static void
+i915_decode_alu3(uint32_t *data, uint32_t hw_offset,
+		 int i, char *instr_prefix, char *op_name)
+{
+    char dst[100], src0[100], src1[100], src2[100];
+
+    i915_get_instruction_dst(data, i, dst, 1);
+    i915_get_instruction_src0(data, i, src0);
+    i915_get_instruction_src1(data, i, src1);
+    i915_get_instruction_src2(data, i, src2);
+
+    instr_out(data, hw_offset, i++, "%s: %s %s, %s, %s, %s\n", instr_prefix,
+	      op_name, dst, src0, src1, src2);
+    instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+    instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+}
+
+static void
+i915_decode_tex(uint32_t *data, uint32_t hw_offset, int i, char *instr_prefix,
+		char *tex_name)
+{
+    uint32_t t0 = data[i];
+    uint32_t t1 = data[i + 1];
+    char dst_name[100];
+    char addr_name[100];
+    int sampler_nr;
+
+    i915_get_instruction_dst(data, i, dst_name, 0);
+    i915_get_instruction_addr((t1 >> 24) & 0x7,
+			      (t1 >> 17) & 0xf,
+			      addr_name);
+    sampler_nr = t0 & 0xf;
+
+    instr_out(data, hw_offset, i++, "%s: %s %s, S%d, %s\n", instr_prefix,
+	      tex_name, dst_name, sampler_nr, addr_name);
+    instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+    instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+}
+
+static void
+i915_decode_dcl(uint32_t *data, uint32_t hw_offset, int i, char *instr_prefix)
+{
+    uint32_t d0 = data[i];
+    char *sampletype;
+    int dcl_nr = (d0 >> 14) & 0xf;
+    char *dcl_x = d0 & (1 << 10) ? "x" : "";
+    char *dcl_y = d0 & (1 << 11) ? "y" : "";
+    char *dcl_z = d0 & (1 << 12) ? "z" : "";
+    char *dcl_w = d0 & (1 << 13) ? "w" : "";
+    char dcl_mask[10];
+
+    switch ((d0 >> 19) & 0x3) {
+    case 1:
+	sprintf(dcl_mask, ".%s%s%s%s", dcl_x, dcl_y, dcl_z, dcl_w);
+	if (strcmp(dcl_mask, ".") == 0)
+	    fprintf(out, "bad (empty) dcl mask\n");
+
+	if (dcl_nr > 10)
+	    fprintf(out, "bad T%d dcl register number\n", dcl_nr);
+	if (dcl_nr < 8) {
+	    if (strcmp(dcl_mask, ".x") != 0 &&
+		strcmp(dcl_mask, ".xy") != 0 &&
+		strcmp(dcl_mask, ".xz") != 0 &&
+		strcmp(dcl_mask, ".w") != 0 &&
+		strcmp(dcl_mask, ".xyzw") != 0) {
+		fprintf(out, "bad T%d.%s dcl mask\n", dcl_nr, dcl_mask);
+	    }
+	    instr_out(data, hw_offset, i++, "%s: DCL T%d%s\n", instr_prefix,
+		      dcl_nr, dcl_mask);
+	} else {
+	    if (strcmp(dcl_mask, ".xz") == 0)
+		fprintf(out, "errataed bad dcl mask %s\n", dcl_mask);
+	    else if (strcmp(dcl_mask, ".xw") == 0)
+		fprintf(out, "errataed bad dcl mask %s\n", dcl_mask);
+	    else if (strcmp(dcl_mask, ".xzw") == 0)
+		fprintf(out, "errataed bad dcl mask %s\n", dcl_mask);
+
+	    if (dcl_nr == 8) {
+		instr_out(data, hw_offset, i++, "%s: DCL DIFFUSE%s\n", instr_prefix,
+			  dcl_mask);
+	    } else if (dcl_nr == 9) {
+		instr_out(data, hw_offset, i++, "%s: DCL SPECULAR%s\n", instr_prefix,
+			  dcl_mask);
+	    } else if (dcl_nr == 10) {
+		instr_out(data, hw_offset, i++, "%s: DCL FOG%s\n", instr_prefix,
+			  dcl_mask);
+	    }
+	}
+	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+	break;
+    case 3:
+	switch ((d0 >> 22) & 0x3) {
+	case 0:
+	    sampletype = "2D";
+	    break;
+	case 1:
+	    sampletype = "CUBE";
+	    break;
+	case 2:
+	    sampletype = "3D";
+	    break;
+	default:
+	    sampletype = "RESERVED";
+	    break;
+	}
+	if (dcl_nr > 15)
+	    fprintf(out, "bad S%d dcl register number\n", dcl_nr);
+	instr_out(data, hw_offset, i++, "%s: DCL S%d %s\n", instr_prefix,
+		  dcl_nr, sampletype);
+	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+	break;
+    default:
+	instr_out(data, hw_offset, i++, "%s: DCL RESERVED%d\n", instr_prefix, dcl_nr);
+	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+    }
+}
+
+static void
+i915_decode_instruction(uint32_t *data, uint32_t hw_offset,
+			int i, char *instr_prefix)
+{
+    switch ((data[i] >> 24) & 0x1f) {
+    case 0x0:
+	instr_out(data, hw_offset, i++, "%s: NOP\n", instr_prefix);
+	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+	break;
+    case 0x01:
+	i915_decode_alu2(data, hw_offset, i, instr_prefix, "ADD");
+	break;
+    case 0x02:
+	i915_decode_alu1(data, hw_offset, i, instr_prefix, "MOV");
+	break;
+    case 0x03:
+	i915_decode_alu2(data, hw_offset, i, instr_prefix, "MUL");
+	break;
+    case 0x04:
+	i915_decode_alu3(data, hw_offset, i, instr_prefix, "MAD");
+	break;
+    case 0x05:
+	i915_decode_alu3(data, hw_offset, i, instr_prefix, "DP2ADD");
+	break;
+    case 0x06:
+	i915_decode_alu2(data, hw_offset, i, instr_prefix, "DP3");
+	break;
+    case 0x07:
+	i915_decode_alu2(data, hw_offset, i, instr_prefix, "DP4");
+	break;
+    case 0x08:
+	i915_decode_alu1(data, hw_offset, i, instr_prefix, "FRC");
+	break;
+    case 0x09:
+	i915_decode_alu1(data, hw_offset, i, instr_prefix, "RCP");
+	break;
+    case 0x0a:
+	i915_decode_alu1(data, hw_offset, i, instr_prefix, "RSQ");
+	break;
+    case 0x0b:
+	i915_decode_alu1(data, hw_offset, i, instr_prefix, "EXP");
+	break;
+    case 0x0c:
+	i915_decode_alu1(data, hw_offset, i, instr_prefix, "LOG");
+	break;
+    case 0x0d:
+	i915_decode_alu2(data, hw_offset, i, instr_prefix, "CMP");
+	break;
+    case 0x0e:
+	i915_decode_alu2(data, hw_offset, i, instr_prefix, "MIN");
+	break;
+    case 0x0f:
+	i915_decode_alu2(data, hw_offset, i, instr_prefix, "MAX");
+	break;
+    case 0x10:
+	i915_decode_alu1(data, hw_offset, i, instr_prefix, "FLR");
+	break;
+    case 0x11:
+	i915_decode_alu1(data, hw_offset, i, instr_prefix, "MOD");
+	break;
+    case 0x12:
+	i915_decode_alu1(data, hw_offset, i, instr_prefix, "TRC");
+	break;
+    case 0x13:
+	i915_decode_alu2(data, hw_offset, i, instr_prefix, "SGE");
+	break;
+    case 0x14:
+	i915_decode_alu2(data, hw_offset, i, instr_prefix, "SLT");
+	break;
+    case 0x15:
+	i915_decode_tex(data, hw_offset, i, instr_prefix, "TEXLD");
+	break;
+    case 0x16:
+	i915_decode_tex(data, hw_offset, i, instr_prefix, "TEXLDP");
+	break;
+    case 0x17:
+	i915_decode_tex(data, hw_offset, i, instr_prefix, "TEXLDB");
+	break;
+    case 0x19:
+	i915_decode_dcl(data, hw_offset, i, instr_prefix);
+	break;
+    default:
+	instr_out(data, hw_offset, i++, "%s: unknown\n", instr_prefix);
+	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+	break;
+    }
+}
+
+static char *
+decode_compare_func(uint32_t op)
+{
+    switch (op&0x7) {
+    case 0: return "always";
+    case 1: return "never";
+    case 2: return "less";
+    case 3: return "equal";
+    case 4: return "lequal";
+    case 5: return "greater";
+    case 6: return "notequal";
+    case 7: return "gequal";
+    }
+    return "";
+}
+
+static char *
+decode_stencil_op(uint32_t op)
+{
+    switch (op&0x7) {
+    case 0: return "keep";
+    case 1: return "zero";
+    case 2: return "replace";
+    case 3: return "incr_sat";
+    case 4: return "decr_sat";
+    case 5: return "greater";
+    case 6: return "incr";
+    case 7: return "decr";
+    }
+    return "";
+}
+
+static char *
+decode_logic_op(uint32_t op)
+{
+    switch (op&0xf) {
+    case 0: return "clear";
+    case 1: return "nor";
+    case 2: return "and_inv";
+    case 3: return "copy_inv";
+    case 4: return "and_rvrse";
+    case 5: return "inv";
+    case 6: return "xor";
+    case 7: return "nand";
+    case 8: return "and";
+    case 9: return "equiv";
+    case 10: return "noop";
+    case 11: return "or_inv";
+    case 12: return "copy";
+    case 13: return "or_rvrse";
+    case 14: return "or";
+    case 15: return "set";
+    }
+    return "";
+}
+
+static char *
+decode_blend_fact(uint32_t op)
+{
+    switch (op&0xf) {
+    case 1: return "zero";
+    case 2: return "one";
+    case 3: return "src_colr";
+    case 4: return "inv_src_colr";
+    case 5: return "src_alpha";
+    case 6: return "inv_src_alpha";
+    case 7: return "dst_alpha";
+    case 8: return "inv_dst_alpha";
+    case 9: return "dst_colr";
+    case 10: return "inv_dst_colr";
+    case 11: return "src_alpha_sat";
+    case 12: return "cnst_colr";
+    case 13: return "inv_cnst_colr";
+    case 14: return "cnst_alpha";
+    case 15: return "inv_const_alpha";
+    }
+    return "";
+}
+
+static char *
+decode_tex_coord_mode(uint32_t mode)
+{
+    switch (mode&0x7) {
+    case 0: return "wrap";
+    case 1: return "mirror";
+    case 2: return "clamp_edge";
+    case 3: return "cube";
+    case 4: return "clamp_border";
+    case 5: return "mirror_once";
+    }
+    return "";
+}
+
+static char *
+decode_sample_filter(uint32_t mode)
+{
+    switch (mode&0x7) {
+    case 0: return "nearest";
+    case 1: return "linear";
+    case 2: return "anisotropic";
+    case 3: return "4x4_1";
+    case 4: return "4x4_2";
+    case 5: return "4x4_flat";
+    case 6: return "6x5_mono";
+    }
+    return "";
+}
+
+static int
+decode_3d_1d(uint32_t *data, int count,
+	     uint32_t hw_offset,
+	     uint32_t devid,
+	     int *failures)
+{
+    unsigned int len, i, c, idx, word, map, sampler, instr;
+    char *format, *zformat, *type;
+    uint32_t opcode;
+
+    struct {
+	uint32_t opcode;
+	int i830_only;
+	int min_len;
+	int max_len;
+	char *name;
+    } opcodes_3d_1d[] = {
+	{ 0x86, 0, 4, 4, "3DSTATE_CHROMA_KEY" },
+	{ 0x88, 0, 2, 2, "3DSTATE_CONSTANT_BLEND_COLOR" },
+	{ 0x99, 0, 2, 2, "3DSTATE_DEFAULT_DIFFUSE" },
+	{ 0x9a, 0, 2, 2, "3DSTATE_DEFAULT_SPECULAR" },
+	{ 0x98, 0, 2, 2, "3DSTATE_DEFAULT_Z" },
+	{ 0x97, 0, 2, 2, "3DSTATE_DEPTH_OFFSET_SCALE" },
+	{ 0x9d, 0, 65, 65, "3DSTATE_FILTER_COEFFICIENTS_4X4" },
+	{ 0x9e, 0, 4, 4, "3DSTATE_MONO_FILTER" },
+	{ 0x89, 0, 4, 4, "3DSTATE_FOG_MODE" },
+	{ 0x8f, 0, 2, 16, "3DSTATE_MAP_PALLETE_LOAD_32" },
+	{ 0x83, 0, 2, 2, "3DSTATE_SPAN_STIPPLE" },
+	{ 0x8c, 1, 2, 2, "3DSTATE_MAP_COORD_TRANSFORM_I830" },
+	{ 0x8b, 1, 2, 2, "3DSTATE_MAP_VERTEX_TRANSFORM_I830" },
+	{ 0x8d, 1, 3, 3, "3DSTATE_W_STATE_I830" },
+	{ 0x01, 1, 2, 2, "3DSTATE_COLOR_FACTOR_I830" },
+	{ 0x02, 1, 2, 2, "3DSTATE_MAP_COORD_SETBIND_I830" },
+    }, *opcode_3d_1d;
+
+    opcode = (data[0] & 0x00ff0000) >> 16;
+
+    switch (opcode) {
+    case 0x07:
+	/* This instruction is unusual.  A 0 length means just 1 DWORD instead of
+	 * 2.  The 0 length is specified in one place to be unsupported, but
+	 * stated to be required in another, and 0 length LOAD_INDIRECTs appear
+	 * to cause no harm at least.
+	 */
+	instr_out(data, hw_offset, 0, "3DSTATE_LOAD_INDIRECT\n");
+	len = (data[0] & 0x000000ff) + 1;
+	i = 1;
+	if (data[0] & (0x01 << 8)) {
+	    if (i + 2 >= count)
+		BUFFER_FAIL(count, len, "3DSTATE_LOAD_INDIRECT");
+	    instr_out(data, hw_offset, i++, "SIS.0\n");
+	    instr_out(data, hw_offset, i++, "SIS.1\n");
+	}
+	if (data[0] & (0x02 << 8)) {
+	    if (i + 1 >= count)
+		BUFFER_FAIL(count, len, "3DSTATE_LOAD_INDIRECT");
+	    instr_out(data, hw_offset, i++, "DIS.0\n");
+	}
+	if (data[0] & (0x04 << 8)) {
+	    if (i + 2 >= count)
+		BUFFER_FAIL(count, len, "3DSTATE_LOAD_INDIRECT");
+	    instr_out(data, hw_offset, i++, "SSB.0\n");
+	    instr_out(data, hw_offset, i++, "SSB.1\n");
+	}
+	if (data[0] & (0x08 << 8)) {
+	    if (i + 2 >= count)
+		BUFFER_FAIL(count, len, "3DSTATE_LOAD_INDIRECT");
+	    instr_out(data, hw_offset, i++, "MSB.0\n");
+	    instr_out(data, hw_offset, i++, "MSB.1\n");
+	}
+	if (data[0] & (0x10 << 8)) {
+	    if (i + 2 >= count)
+		BUFFER_FAIL(count, len, "3DSTATE_LOAD_INDIRECT");
+	    instr_out(data, hw_offset, i++, "PSP.0\n");
+	    instr_out(data, hw_offset, i++, "PSP.1\n");
+	}
+	if (data[0] & (0x20 << 8)) {
+	    if (i + 2 >= count)
+		BUFFER_FAIL(count, len, "3DSTATE_LOAD_INDIRECT");
+	    instr_out(data, hw_offset, i++, "PSC.0\n");
+	    instr_out(data, hw_offset, i++, "PSC.1\n");
+	}
+	if (len != i) {
+	    fprintf(out, "Bad count in 3DSTATE_LOAD_INDIRECT\n");
+	    (*failures)++;
+	    return len;
+	}
+	return len;
+    case 0x04:
+	instr_out(data, hw_offset, 0, "3DSTATE_LOAD_STATE_IMMEDIATE_1\n");
+	len = (data[0] & 0x0000000f) + 2;
+	i = 1;
+	for (word = 0; word <= 8; word++) {
+	    if (data[0] & (1 << (4 + word))) {
+		if (i >= count)
+		    BUFFER_FAIL(count, len, "3DSTATE_LOAD_STATE_IMMEDIATE_1");
+
+		/* save vertex state for decode */
+		if (!IS_GEN2(devid)) {
+			if (word == 2) {
+				saved_s2_set = 1;
+				saved_s2 = data[i];
+			}
+			if (word == 4) {
+				saved_s4_set = 1;
+				saved_s4 = data[i];
+			}
+
+			switch (word) {
+			case 0:
+				instr_out(data, hw_offset, i, "S0: vbo offset: 0x%08x%s\n",
+					  data[i]&(~1),data[i]&1?", auto cache invalidate disabled":"");
+				break;
+			case 1:
+				instr_out(data, hw_offset, i, "S1: vertex width: %i, vertex pitch: %i\n",
+					  (data[i]>>24)&0x3f,(data[i]>>16)&0x3f);
+				break;
+			case 2:
+				instr_out(data, hw_offset, i, "S2: texcoord formats: ");
+				for (int tex_num = 0; tex_num < 8; tex_num++) {
+					switch((data[i]>>tex_num*4)&0xf) {
+					case 0: fprintf(out, "%i=2D ", tex_num); break;
+					case 1: fprintf(out, "%i=3D ", tex_num); break;
+					case 2: fprintf(out, "%i=4D ", tex_num); break;
+					case 3: fprintf(out, "%i=1D ", tex_num); break;
+					case 4: fprintf(out, "%i=2D_16 ", tex_num); break;
+					case 5: fprintf(out, "%i=4D_16 ", tex_num); break;
+					case 0xf: fprintf(out, "%i=NP ", tex_num); break;
+					}
+				}
+				fprintf(out, "\n");
+
+				break;
+			case 3:
+				instr_out(data, hw_offset, i, "S3: not documented\n", word);
+				break;
+			case 4:
+				{
+					char *cullmode = "";
+					char *vfmt_xyzw = "";
+					switch((data[i]>>13)&0x3) {
+					case 0: cullmode = "both"; break;
+					case 1: cullmode = "none"; break;
+					case 2: cullmode = "cw"; break;
+					case 3: cullmode = "ccw"; break;
+					}
+					switch(data[i] & (7<<6 | 1<<2)) {
+					case 1<<6: vfmt_xyzw = "XYZ,"; break;
+					case 2<<6: vfmt_xyzw = "XYZW,"; break;
+					case 3<<6: vfmt_xyzw = "XY,"; break;
+					case 4<<6: vfmt_xyzw = "XYW,"; break;
+					case 1<<6 | 1<<2: vfmt_xyzw = "XYZF,"; break;
+					case 2<<6 | 1<<2: vfmt_xyzw = "XYZWF,"; break;
+					case 3<<6 | 1<<2: vfmt_xyzw = "XYF,"; break;
+					case 4<<6 | 1<<2: vfmt_xyzw = "XYWF,"; break;
+					}
+					instr_out(data, hw_offset, i, "S4: point_width=%i, line_width=%.1f,"
+						  "%s%s%s%s%s cullmode=%s, vfmt=%s%s%s%s%s%s "
+						  "%s%s\n",
+						  (data[i]>>23)&0x1ff,
+						  ((data[i]>>19)&0xf) / 2.0,
+						  data[i]&(0xf<<15)?" flatshade=":"",
+						  data[i]&(1<<18)?"Alpha,":"",
+						  data[i]&(1<<17)?"Fog,":"",
+						  data[i]&(1<<16)?"Specular,":"",
+						  data[i]&(1<<15)?"Color,":"",
+						  cullmode,
+						  data[i]&(1<<12)?"PointWidth,":"",
+						  data[i]&(1<<11)?"SpecFog,":"",
+						  data[i]&(1<<10)?"Color,":"",
+						  data[i]&(1<<9)?"DepthOfs,":"",
+						  vfmt_xyzw,
+						  data[i]&(1<<9)?"FogParam,":"",
+						  data[i]&(1<<5)?"force default diffuse, ":"",
+						  data[i]&(1<<4)?"force default specular, ":"",
+						  data[i]&(1<<3)?"local depth ofs enable, ":"",
+						  data[i]&(1<<1)?"point sprite enable, ":"",
+						  data[i]&(1<<0)?"line AA enable, ":"");
+					break;
+				}
+			case 5:
+				{
+					instr_out(data, hw_offset, i, "S5:%s%s%s%s%s"
+						  "%s%s%s%s stencil_ref=0x%x, stencil_test=%s, "
+						  "stencil_fail=%s, stencil_pass_z_fail=%s, "
+						  "stencil_pass_z_pass=%s, %s%s%s%s\n",
+						  data[i]&(0xf<<28)?" write_disable=":"",
+						  data[i]&(1<<31)?"Alpha,":"",
+						  data[i]&(1<<30)?"Red,":"",
+						  data[i]&(1<<29)?"Green,":"",
+						  data[i]&(1<<28)?"Blue,":"",
+						  data[i]&(1<<27)?" force default point size,":"",
+						  data[i]&(1<<26)?" last pixel enable,":"",
+						  data[i]&(1<<25)?" global depth ofs enable,":"",
+						  data[i]&(1<<24)?" fog enable,":"",
+						  (data[i]>>16)&0xff,
+						  decode_compare_func(data[i]>>13),
+						  decode_stencil_op(data[i]>>10),
+						  decode_stencil_op(data[i]>>7),
+						  decode_stencil_op(data[i]>>4),
+						  data[i]&(1<<3)?"stencil write enable, ":"",
+						  data[i]&(1<<2)?"stencil test enable, ":"",
+						  data[i]&(1<<1)?"color dither enable, ":"",
+						  data[i]&(1<<0)?"logicop enable, ":"");
+				}
+				break;
+			case 6:
+				instr_out(data, hw_offset, i, "S6: %salpha_test=%s, alpha_ref=0x%x, "
+					  "depth_test=%s, %ssrc_blnd_fct=%s, dst_blnd_fct=%s, "
+					  "%s%stristrip_provoking_vertex=%i\n",
+					  data[i]&(1<<31)?"alpha test enable, ":"",
+					  decode_compare_func(data[i]>>28),
+					  data[i]&(0xff<<20),
+					  decode_compare_func(data[i]>>16),
+					  data[i]&(1<<15)?"cbuf blend enable, ":"",
+					  decode_blend_fact(data[i]>>8),
+					  decode_blend_fact(data[i]>>4),
+					  data[i]&(1<<3)?"depth write enable, ":"",
+					  data[i]&(1<<2)?"cbuf write enable, ":"",
+					  data[i]&(0x3));
+				break;
+			case 7:
+				instr_out(data, hw_offset, i, "S7: depth offset constant: 0x%08x\n", data[i]);
+				break;
+			}
+		} else {
+			instr_out(data, hw_offset, i, "S%d: 0x%08x\n", i, data[i]);
+		}
+		i++;
+	    }
+	}
+	if (len != i) {
+	    fprintf(out, "Bad count in 3DSTATE_LOAD_STATE_IMMEDIATE_1\n");
+	    (*failures)++;
+	}
+	return len;
+    case 0x03:
+	instr_out(data, hw_offset, 0, "3DSTATE_LOAD_STATE_IMMEDIATE_2\n");
+	len = (data[0] & 0x0000000f) + 2;
+	i = 1;
+	for (word = 6; word <= 14; word++) {
+	    if (data[0] & (1 << word)) {
+		if (i >= count)
+		    BUFFER_FAIL(count, len, "3DSTATE_LOAD_STATE_IMMEDIATE_2");
+
+		if (word == 6)
+		    instr_out(data, hw_offset, i++, "TBCF\n");
+		else if (word >= 7 && word <= 10) {
+		    instr_out(data, hw_offset, i++, "TB%dC\n", word - 7);
+		    instr_out(data, hw_offset, i++, "TB%dA\n", word - 7);
+		} else if (word >= 11 && word <= 14) {
+		    instr_out(data, hw_offset, i, "TM%dS0: offset=0x%08x, %s\n",
+			      word - 11,
+			      data[i]&0xfffffffe,
+			      data[i]&1?"use fence":"");
+		    i++;
+		    instr_out(data, hw_offset, i, "TM%dS1: height=%i, width=%i, %s\n",
+			      word - 11,
+			      data[i]>>21, (data[i]>>10)&0x3ff,
+			      data[i]&2?(data[i]&1?"y-tiled":"x-tiled"):"");
+		    i++;
+		    instr_out(data, hw_offset, i, "TM%dS2: pitch=%i, \n",
+			      word - 11,
+			      ((data[i]>>21) + 1)*4);
+		    i++;
+		    instr_out(data, hw_offset, i++, "TM%dS3\n", word - 11);
+		    instr_out(data, hw_offset, i++, "TM%dS4: dflt color\n", word - 11);
+		}
+	    }
+	}
+	if (len != i) {
+	    fprintf(out, "Bad count in 3DSTATE_LOAD_STATE_IMMEDIATE_2\n");
+	    (*failures)++;
+	}
+	return len;
+    case 0x00:
+	instr_out(data, hw_offset, 0, "3DSTATE_MAP_STATE\n");
+	len = (data[0] & 0x0000003f) + 2;
+	instr_out(data, hw_offset, 1, "mask\n");
+
+	i = 2;
+	for (map = 0; map <= 15; map++) {
+	    if (data[1] & (1 << map)) {
+		int width, height, pitch, dword;
+		const char *tiling;
+
+		if (i + 3 >= count)
+		    BUFFER_FAIL(count, len, "3DSTATE_MAP_STATE");
+
+		dword = data[i];
+		instr_out(data, hw_offset, i++, "map %d MS2 %s%s%s\n", map,
+			  dword&(1<<31)?"untrusted surface, ":"",
+			  dword&(1<<1)?"vertical line stride enable, ":"",
+			  dword&(1<<0)?"vertical ofs enable, ":"");
+
+		dword = data[i];
+		width = ((dword >> 10) & ((1 << 11) - 1))+1;
+		height = ((dword >> 21) & ((1 << 11) - 1))+1;
+
+		tiling = "none";
+		if (dword & (1 << 2))
+			tiling = "fenced";
+		else if (dword & (1 << 1))
+			tiling = dword & (1 << 0) ? "Y" : "X";
+		type = " BAD";
+		format = "BAD";
+		switch ((dword>>7) & 0x7) {
+		case 1:
+		    type = "8b";
+		    switch ((dword>>3) & 0xf) {
+		    case 0: format = "I"; break;
+		    case 1: format = "L"; break;
+		    case 4: format = "A"; break;
+		    case 5: format = " mono"; break; }
+		    break;
+		case 2:
+		    type = "16b";
+		    switch ((dword>>3) & 0xf) {
+		    case 0: format = " rgb565"; break;
+		    case 1: format = " argb1555"; break;
+		    case 2: format = " argb4444"; break;
+		    case 5: format = " ay88"; break;
+		    case 6: format = " bump655"; break;
+		    case 7: format = "I"; break;
+		    case 8: format = "L"; break;
+		    case 9: format = "A"; break; }
+		    break;
+		case 3:
+		    type = "32b";
+		    switch ((dword>>3) & 0xf) {
+		    case 0: format = " argb8888"; break;
+		    case 1: format = " abgr8888"; break;
+		    case 2: format = " xrgb8888"; break;
+		    case 3: format = " xbgr8888"; break;
+		    case 4: format = " qwvu8888"; break;
+		    case 5: format = " axvu8888"; break;
+		    case 6: format = " lxvu8888"; break;
+		    case 7: format = " xlvu8888"; break;
+		    case 8: format = " argb2101010"; break;
+		    case 9: format = " abgr2101010"; break;
+		    case 10: format = " awvu2101010"; break;
+		    case 11: format = " gr1616"; break;
+		    case 12: format = " vu1616"; break;
+		    case 13: format = " xI824"; break;
+		    case 14: format = " xA824"; break;
+		    case 15: format = " xL824"; break; }
+		    break;
+		case 5:
+		    type = "422";
+		    switch ((dword>>3) & 0xf) {
+		    case 0: format = " yuv_swapy"; break;
+		    case 1: format = " yuv"; break;
+		    case 2: format = " yuv_swapuv"; break;
+		    case 3: format = " yuv_swapuvy"; break; }
+		    break;
+		case 6:
+		    type = "compressed";
+		    switch ((dword>>3) & 0x7) {
+		    case 0: format = " dxt1"; break;
+		    case 1: format = " dxt2_3"; break;
+		    case 2: format = " dxt4_5"; break;
+		    case 3: format = " fxt1"; break;
+		    case 4: format = " dxt1_rb"; break; }
+		    break;
+		case 7:
+		    type = "4b indexed";
+		    switch ((dword>>3) & 0xf) {
+		    case 7: format = " argb8888"; break; }
+		    break;
+		}
+		dword = data[i];
+		instr_out(data, hw_offset, i++, "map %d MS3 [width=%d, height=%d, format=%s%s, tiling=%s%s]\n",
+			  map, width, height, type, format, tiling,
+			  dword&(1<<9)?" palette select":"");
+
+		dword = data[i];
+		pitch = 4*(((dword >> 21) & ((1 << 11) - 1))+1);
+		instr_out(data, hw_offset, i++, "map %d MS4 [pitch=%d, max_lod=%i, vol_depth=%i, cube_face_ena=%x, %s]\n",
+			  map, pitch,
+			  (dword>>9)&0x3f, dword&0xff, (dword>>15)&0x3f,
+			  dword&(1<<8)?"miplayout legacy":"miplayout right");
+	    }
+	}
+	if (len != i) {
+	    fprintf(out, "Bad count in 3DSTATE_MAP_STATE\n");
+	    (*failures)++;
+	    return len;
+	}
+	return len;
+    case 0x06:
+	instr_out(data, hw_offset, 0, "3DSTATE_PIXEL_SHADER_CONSTANTS\n");
+	len = (data[0] & 0x000000ff) + 2;
+
+	i = 2;
+	for (c = 0; c <= 31; c++) {
+	    if (data[1] & (1 << c)) {
+		if (i + 4 >= count)
+		    BUFFER_FAIL(count, len, "3DSTATE_PIXEL_SHADER_CONSTANTS");
+		instr_out(data, hw_offset, i, "C%d.X = %f\n",
+			  c, int_as_float(data[i]));
+		i++;
+		instr_out(data, hw_offset, i, "C%d.Y = %f\n",
+			  c, int_as_float(data[i]));
+		i++;
+		instr_out(data, hw_offset, i, "C%d.Z = %f\n",
+			  c, int_as_float(data[i]));
+		i++;
+		instr_out(data, hw_offset, i, "C%d.W = %f\n",
+			  c, int_as_float(data[i]));
+		i++;
+	    }
+	}
+	if (len != i) {
+	    fprintf(out, "Bad count in 3DSTATE_PIXEL_SHADER_CONSTANTS\n");
+	    (*failures)++;
+	}
+	return len;
+    case 0x05:
+	instr_out(data, hw_offset, 0, "3DSTATE_PIXEL_SHADER_PROGRAM\n");
+	len = (data[0] & 0x000000ff) + 2;
+	if ((len - 1) % 3 != 0 || len > 370) {
+	    fprintf(out, "Bad count in 3DSTATE_PIXEL_SHADER_PROGRAM\n");
+	    (*failures)++;
+	}
+	i = 1;
+	for (instr = 0; instr < (len - 1) / 3; instr++) {
+	    char instr_prefix[10];
+
+	    if (i + 3 >= count)
+		BUFFER_FAIL(count, len, "3DSTATE_PIXEL_SHADER_PROGRAM");
+	    sprintf(instr_prefix, "PS%03d", instr);
+	    i915_decode_instruction(data, hw_offset, i, instr_prefix);
+	    i += 3;
+	}
+	return len;
+    case 0x01:
+	if (IS_GEN2(devid))
+		break;
+	instr_out(data, hw_offset, 0, "3DSTATE_SAMPLER_STATE\n");
+	instr_out(data, hw_offset, 1, "mask\n");
+	len = (data[0] & 0x0000003f) + 2;
+	i = 2;
+	for (sampler = 0; sampler <= 15; sampler++) {
+	    if (data[1] & (1 << sampler)) {
+		uint32_t dword;
+		char *mip_filter = "";
+		if (i + 3 >= count)
+		    BUFFER_FAIL(count, len, "3DSTATE_SAMPLER_STATE");
+		dword = data[i];
+		switch ((dword>>20)&0x3) {
+		case 0: mip_filter = "none"; break;
+		case 1: mip_filter = "nearest"; break;
+		case 3: mip_filter = "linear"; break;
+		}
+		instr_out(data, hw_offset, i++, "sampler %d SS2:%s%s%s "
+			  "base_mip_level=%i, mip_filter=%s, mag_filter=%s, min_filter=%s "
+			  "lod_bias=%.2f,%s max_aniso=%i, shadow_func=%s\n", sampler,
+			  dword&(1<<31)?" reverse gamma,":"",
+			  dword&(1<<30)?" packed2planar,":"",
+			  dword&(1<<29)?" colorspace conversion,":"",
+			  (dword>>22)&0x1f,
+			  mip_filter,
+			  decode_sample_filter(dword>>17),
+			  decode_sample_filter(dword>>14),
+			  ((dword>>5)&0x1ff)/(0x10*1.0),
+			  dword&(1<<4)?" shadow,":"",
+			  dword&(1<<3)?4:2,
+			  decode_compare_func(dword));
+		dword = data[i];
+		instr_out(data, hw_offset, i++, "sampler %d SS3: min_lod=%.2f,%s "
+			  "tcmode_x=%s, tcmode_y=%s, tcmode_z=%s,%s texmap_idx=%i,%s\n",
+			  sampler, ((dword>>24)&0xff)/(0x10*1.0),
+			  dword&(1<<17)?" kill pixel enable,":"",
+			  decode_tex_coord_mode(dword>>12),
+			  decode_tex_coord_mode(dword>>9),
+			  decode_tex_coord_mode(dword>>6),
+			  dword&(1<<5)?" normalized coords,":"",
+			  (dword>>1)&0xf,
+			  dword&(1<<0)?" deinterlacer,":"");
+		dword = data[i];
+		instr_out(data, hw_offset, i++, "sampler %d SS4: border color\n",
+			  sampler, ((dword>>24)&0xff)/(0x10*1.0),
+			  dword);
+	    }
+	}
+	if (len != i) {
+	    fprintf(out, "Bad count in 3DSTATE_SAMPLER_STATE\n");
+	    (*failures)++;
+	}
+	return len;
+    case 0x85:
+	len = (data[0] & 0x0000000f) + 2;
+
+	if (len != 2)
+	    fprintf(out, "Bad count in 3DSTATE_DEST_BUFFER_VARIABLES\n");
+	if (count < 2)
+	    BUFFER_FAIL(count, len, "3DSTATE_DEST_BUFFER_VARIABLES");
+
+	instr_out(data, hw_offset, 0,
+		  "3DSTATE_DEST_BUFFER_VARIABLES\n");
+
+	switch ((data[1] >> 8) & 0xf) {
+	case 0x0: format = "g8"; break;
+	case 0x1: format = "x1r5g5b5"; break;
+	case 0x2: format = "r5g6b5"; break;
+	case 0x3: format = "a8r8g8b8"; break;
+	case 0x4: format = "ycrcb_swapy"; break;
+	case 0x5: format = "ycrcb_normal"; break;
+	case 0x6: format = "ycrcb_swapuv"; break;
+	case 0x7: format = "ycrcb_swapuvy"; break;
+	case 0x8: format = "a4r4g4b4"; break;
+	case 0x9: format = "a1r5g5b5"; break;
+	case 0xa: format = "a2r10g10b10"; break;
+	default: format = "BAD"; break;
+	}
+	switch ((data[1] >> 2) & 0x3) {
+	case 0x0: zformat = "u16"; break;
+	case 0x1: zformat = "f16"; break;
+	case 0x2: zformat = "u24x8"; break;
+	default: zformat = "BAD"; break;
+	}
+	instr_out(data, hw_offset, 1, "%s format, %s depth format, early Z %sabled\n",
+		  format, zformat,
+		  (data[1] & (1 << 31)) ? "en" : "dis");
+	return len;
+
+    case 0x8e:
+	{
+	    const char *name, *tiling;
+
+	    len = (data[0] & 0x0000000f) + 2;
+	    if (len != 3)
+		fprintf(out, "Bad count in 3DSTATE_BUFFER_INFO\n");
+	    if (count < 3)
+		BUFFER_FAIL(count, len, "3DSTATE_BUFFER_INFO");
+
+	    switch((data[1] >> 24) & 0x7) {
+	    case 0x3: name = "color"; break;
+	    case 0x7: name = "depth"; break;
+	    default: name = "unknown"; break;
+	    }
+
+	    tiling = "none";
+	    if (data[1] & (1 << 23))
+		tiling = "fenced";
+	    else if (data[1] & (1 << 22))
+		tiling = data[1] & (1 << 21) ? "Y" : "X";
+
+	    instr_out(data, hw_offset, 0, "3DSTATE_BUFFER_INFO\n");
+	    instr_out(data, hw_offset, 1, "%s, tiling = %s, pitch=%d\n", name, tiling, data[1]&0xffff);
+
+	    instr_out(data, hw_offset, 2, "address\n");
+	    return len;
+	}
+    case 0x81:
+	len = (data[0] & 0x0000000f) + 2;
+
+	if (len != 3)
+	    fprintf(out, "Bad count in 3DSTATE_SCISSOR_RECTANGLE\n");
+	if (count < 3)
+	    BUFFER_FAIL(count, len, "3DSTATE_SCISSOR_RECTANGLE");
+
+	instr_out(data, hw_offset, 0,
+		  "3DSTATE_SCISSOR_RECTANGLE\n");
+	instr_out(data, hw_offset, 1, "(%d,%d)\n",
+		  data[1] & 0xffff, data[1] >> 16);
+	instr_out(data, hw_offset, 2, "(%d,%d)\n",
+		  data[2] & 0xffff, data[2] >> 16);
+
+	return len;
+    case 0x80:
+	len = (data[0] & 0x0000000f) + 2;
+
+	if (len != 5)
+	    fprintf(out, "Bad count in 3DSTATE_DRAWING_RECTANGLE\n");
+	if (count < 5)
+	    BUFFER_FAIL(count, len, "3DSTATE_DRAWING_RECTANGLE");
+
+	instr_out(data, hw_offset, 0,
+		  "3DSTATE_DRAWING_RECTANGLE\n");
+	instr_out(data, hw_offset, 1, "%s\n",
+		  data[1]&(1<<30)?"depth ofs disabled ":"");
+	instr_out(data, hw_offset, 2, "(%d,%d)\n",
+		  data[2] & 0xffff, data[2] >> 16);
+	instr_out(data, hw_offset, 3, "(%d,%d)\n",
+		  data[3] & 0xffff, data[3] >> 16);
+	instr_out(data, hw_offset, 4, "(%d,%d)\n",
+		  data[4] & 0xffff, data[4] >> 16);
+
+	return len;
+    case 0x9c:
+	len = (data[0] & 0x0000000f) + 2;
+
+	if (len != 7)
+	    fprintf(out, "Bad count in 3DSTATE_CLEAR_PARAMETERS\n");
+	if (count < 7)
+	    BUFFER_FAIL(count, len, "3DSTATE_CLEAR_PARAMETERS");
+
+	instr_out(data, hw_offset, 0,
+		  "3DSTATE_CLEAR_PARAMETERS\n");
+	instr_out(data, hw_offset, 1, "prim_type=%s, clear=%s%s%s\n",
+		  data[1]&(1<<16)?"CLEAR_RECT":"ZONE_INIT",
+		  data[1]&(1<<2)?"color,":"",
+		  data[1]&(1<<1)?"depth,":"",
+		  data[1]&(1<<0)?"stencil,":"");
+	instr_out(data, hw_offset, 2, "clear color\n");
+	instr_out(data, hw_offset, 3, "clear depth/stencil\n");
+	instr_out(data, hw_offset, 4, "color value (rgba8888)\n");
+	instr_out(data, hw_offset, 5, "depth value %f\n",
+		  int_as_float(data[5]));
+	instr_out(data, hw_offset, 6, "clear stencil\n");
+	return len;
+    }
+
+    for (idx = 0; idx < ARRAY_SIZE(opcodes_3d_1d); idx++)
+    {
+	opcode_3d_1d = &opcodes_3d_1d[idx];
+	if (opcode_3d_1d->i830_only && !IS_GEN2(devid))
+	    continue;
+
+	if (((data[0] & 0x00ff0000) >> 16) == opcode_3d_1d->opcode) {
+	    len = 1;
+
+	    instr_out(data, hw_offset, 0, "%s\n", opcode_3d_1d->name);
+	    if (opcode_3d_1d->max_len > 1) {
+		len = (data[0] & 0x0000ffff) + 2;
+		if (len < opcode_3d_1d->min_len ||
+		    len > opcode_3d_1d->max_len)
+		{
+		    fprintf(out, "Bad count in %s\n",
+			    opcode_3d_1d->name);
+		    (*failures)++;
+		}
+	    }
+
+	    for (i = 1; i < len; i++) {
+		if (i >= count)
+		    BUFFER_FAIL(count, len,  opcode_3d_1d->name);
+		instr_out(data, hw_offset, i, "dword %d\n", i);
+	    }
+
+	    return len;
+	}
+    }
+
+    instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d_1d opcode = 0x%x\n", opcode);
+    (*failures)++;
+    return 1;
+}
+
+static int
+decode_3d_primitive(uint32_t *data, int count, uint32_t hw_offset,
+		    int *failures)
+{
+    char immediate = (data[0] & (1 << 23)) == 0;
+    unsigned int len, i, j, ret;
+    char *primtype;
+    int original_s2 = saved_s2;
+    int original_s4 = saved_s4;
+
+    switch ((data[0] >> 18) & 0xf) {
+    case 0x0: primtype = "TRILIST"; break;
+    case 0x1: primtype = "TRISTRIP"; break;
+    case 0x2: primtype = "TRISTRIP_REVERSE"; break;
+    case 0x3: primtype = "TRIFAN"; break;
+    case 0x4: primtype = "POLYGON"; break;
+    case 0x5: primtype = "LINELIST"; break;
+    case 0x6: primtype = "LINESTRIP"; break;
+    case 0x7: primtype = "RECTLIST"; break;
+    case 0x8: primtype = "POINTLIST"; break;
+    case 0x9: primtype = "DIB"; break;
+    case 0xa: primtype = "CLEAR_RECT"; saved_s4 = 3 << 6; saved_s2 = ~0; break;
+    default: primtype = "unknown"; break;
+    }
+
+    /* XXX: 3DPRIM_DIB not supported */
+    if (immediate) {
+	len = (data[0] & 0x0003ffff) + 2;
+	instr_out(data, hw_offset, 0, "3DPRIMITIVE inline %s\n", primtype);
+	if (count < len)
+	    BUFFER_FAIL(count, len,  "3DPRIMITIVE inline");
+	if (!saved_s2_set || !saved_s4_set) {
+	    fprintf(out, "unknown vertex format\n");
+	    for (i = 1; i < len; i++) {
+		instr_out(data, hw_offset, i,
+			  "           vertex data (%f float)\n",
+			  int_as_float(data[i]));
+	    }
+	} else {
+	    unsigned int vertex = 0;
+	    for (i = 1; i < len;) {
+		unsigned int tc;
+
+#define VERTEX_OUT(fmt, ...) do {					\
+    if (i < len)							\
+	instr_out(data, hw_offset, i, " V%d."fmt"\n", vertex, __VA_ARGS__); \
+    else								\
+	fprintf(out, " missing data in V%d\n", vertex);			\
+    i++;								\
+} while (0)
+
+		VERTEX_OUT("X = %f", int_as_float(data[i]));
+		VERTEX_OUT("Y = %f", int_as_float(data[i]));
+	        switch (saved_s4 >> 6 & 0x7) {
+		case 0x1:
+		    VERTEX_OUT("Z = %f", int_as_float(data[i]));
+		    break;
+		case 0x2:
+		    VERTEX_OUT("Z = %f", int_as_float(data[i]));
+		    VERTEX_OUT("W = %f", int_as_float(data[i]));
+		    break;
+		case 0x3:
+		    break;
+		case 0x4:
+		    VERTEX_OUT("W = %f", int_as_float(data[i]));
+		    break;
+		default:
+		    fprintf(out, "bad S4 position mask\n");
+		}
+
+		if (saved_s4 & (1 << 10)) {
+		    VERTEX_OUT("color = (A=0x%02x, R=0x%02x, G=0x%02x, "
+			       "B=0x%02x)",
+			       data[i] >> 24,
+			       (data[i] >> 16) & 0xff,
+			       (data[i] >> 8) & 0xff,
+			       data[i] & 0xff);
+		}
+		if (saved_s4 & (1 << 11)) {
+		    VERTEX_OUT("spec = (A=0x%02x, R=0x%02x, G=0x%02x, "
+			       "B=0x%02x)",
+			       data[i] >> 24,
+			       (data[i] >> 16) & 0xff,
+			       (data[i] >> 8) & 0xff,
+			       data[i] & 0xff);
+		}
+		if (saved_s4 & (1 << 12))
+		    VERTEX_OUT("width = 0x%08x)", data[i]);
+
+		for (tc = 0; tc <= 7; tc++) {
+		    switch ((saved_s2 >> (tc * 4)) & 0xf) {
+		    case 0x0:
+			VERTEX_OUT("T%d.X = %f", tc, int_as_float(data[i]));
+			VERTEX_OUT("T%d.Y = %f", tc, int_as_float(data[i]));
+			break;
+		    case 0x1:
+			VERTEX_OUT("T%d.X = %f", tc, int_as_float(data[i]));
+			VERTEX_OUT("T%d.Y = %f", tc, int_as_float(data[i]));
+			VERTEX_OUT("T%d.Z = %f", tc, int_as_float(data[i]));
+			break;
+		    case 0x2:
+			VERTEX_OUT("T%d.X = %f", tc, int_as_float(data[i]));
+			VERTEX_OUT("T%d.Y = %f", tc, int_as_float(data[i]));
+			VERTEX_OUT("T%d.Z = %f", tc, int_as_float(data[i]));
+			VERTEX_OUT("T%d.W = %f", tc, int_as_float(data[i]));
+			break;
+		    case 0x3:
+			VERTEX_OUT("T%d.X = %f", tc, int_as_float(data[i]));
+			break;
+		    case 0x4:
+			VERTEX_OUT("T%d.XY = 0x%08x half-float", tc, data[i]);
+			break;
+		    case 0x5:
+			VERTEX_OUT("T%d.XY = 0x%08x half-float", tc, data[i]);
+			VERTEX_OUT("T%d.ZW = 0x%08x half-float", tc, data[i]);
+			break;
+		    case 0xf:
+			break;
+		    default:
+			fprintf(out, "bad S2.T%d format\n", tc);
+		    }
+		}
+		vertex++;
+	    }
+	}
+
+	ret = len;
+    } else {
+	/* indirect vertices */
+	len = data[0] & 0x0000ffff; /* index count */
+	if (data[0] & (1 << 17)) {
+	    /* random vertex access */
+	    if (count < (len + 1) / 2 + 1) {
+		BUFFER_FAIL(count, (len + 1) / 2 + 1,
+			    "3DPRIMITIVE random indirect");
+	    }
+	    instr_out(data, hw_offset, 0,
+		      "3DPRIMITIVE random indirect %s (%d)\n", primtype, len);
+	    if (len == 0) {
+		/* vertex indices continue until 0xffff is found */
+		for (i = 1; i < count; i++) {
+		    if ((data[i] & 0xffff) == 0xffff) {
+			instr_out(data, hw_offset, i,
+				  "    indices: (terminator)\n");
+			ret = i;
+			goto out;
+		    } else if ((data[i] >> 16) == 0xffff) {
+			instr_out(data, hw_offset, i,
+				  "    indices: 0x%04x, (terminator)\n",
+				  data[i] & 0xffff);
+			ret = i;
+			goto out;
+		    } else {
+			instr_out(data, hw_offset, i,
+				  "    indices: 0x%04x, 0x%04x\n",
+				  data[i] & 0xffff, data[i] >> 16);
+		    }
+		}
+		fprintf(out,
+			"3DPRIMITIVE: no terminator found in index buffer\n");
+		(*failures)++;
+		ret = count;
+		goto out;
+	    } else {
+		/* fixed size vertex index buffer */
+		for (j = 1, i = 0; i < len; i += 2, j++) {
+		    if (i * 2 == len - 1) {
+			instr_out(data, hw_offset, j,
+				  "    indices: 0x%04x\n",
+				  data[j] & 0xffff);
+		    } else {
+			instr_out(data, hw_offset, j,
+				  "    indices: 0x%04x, 0x%04x\n",
+				  data[j] & 0xffff, data[j] >> 16);
+		    }
+		}
+	    }
+	    ret = (len + 1) / 2 + 1;
+	    goto out;
+	} else {
+	    /* sequential vertex access */
+	    if (count < 2)
+		BUFFER_FAIL(count, 2, "3DPRIMITIVE seq indirect");
+	    instr_out(data, hw_offset, 0,
+		      "3DPRIMITIVE sequential indirect %s, %d starting from "
+		      "%d\n", primtype, len, data[1] & 0xffff);
+	    instr_out(data, hw_offset, 1, "           start\n");
+	    ret = 2;
+	    goto out;
+	}
+    }
+
+out:
+    saved_s2 = original_s2;
+    saved_s4 = original_s4;
+    return ret;
+}
+
+static int
+decode_3d(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid, int *failures)
+{
+    uint32_t opcode;
+    unsigned int idx;
+
+    struct {
+	uint32_t opcode;
+	int min_len;
+	int max_len;
+	char *name;
+    } opcodes_3d[] = {
+	{ 0x06, 1, 1, "3DSTATE_ANTI_ALIASING" },
+	{ 0x08, 1, 1, "3DSTATE_BACKFACE_STENCIL_OPS" },
+	{ 0x09, 1, 1, "3DSTATE_BACKFACE_STENCIL_MASKS" },
+	{ 0x16, 1, 1, "3DSTATE_COORD_SET_BINDINGS" },
+	{ 0x15, 1, 1, "3DSTATE_FOG_COLOR" },
+	{ 0x0b, 1, 1, "3DSTATE_INDEPENDENT_ALPHA_BLEND" },
+	{ 0x0d, 1, 1, "3DSTATE_MODES_4" },
+	{ 0x0c, 1, 1, "3DSTATE_MODES_5" },
+	{ 0x07, 1, 1, "3DSTATE_RASTERIZATION_RULES" },
+    }, *opcode_3d;
+
+    opcode = (data[0] & 0x1f000000) >> 24;
+
+    switch (opcode) {
+    case 0x1f:
+	return decode_3d_primitive(data, count, hw_offset, failures);
+    case 0x1d:
+	return decode_3d_1d(data, count, hw_offset, devid, failures);
+    case 0x1c:
+	return decode_3d_1c(data, count, hw_offset, failures);
+    }
+
+    for (idx = 0; idx < ARRAY_SIZE(opcodes_3d); idx++) {
+	opcode_3d = &opcodes_3d[idx];
+	if (opcode == opcode_3d->opcode) {
+	    unsigned int len = 1, i;
+
+	    instr_out(data, hw_offset, 0, "%s\n", opcode_3d->name);
+	    if (opcode_3d->max_len > 1) {
+		len = (data[0] & 0xff) + 2;
+		if (len < opcode_3d->min_len ||
+		    len > opcode_3d->max_len)
+		{
+		    fprintf(out, "Bad count in %s\n", opcode_3d->name);
+		}
+	    }
+
+	    for (i = 1; i < len; i++) {
+		if (i >= count)
+		    BUFFER_FAIL(count, len, opcode_3d->name);
+		instr_out(data, hw_offset, i, "dword %d\n", i);
+	    }
+	    return len;
+	}
+    }
+
+    instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d opcode = 0x%x\n", opcode);
+    (*failures)++;
+    return 1;
+}
+
+static const char *
+get_965_surfacetype(unsigned int surfacetype)
+{
+    switch (surfacetype) {
+    case 0: return "1D";
+    case 1: return "2D";
+    case 2: return "3D";
+    case 3: return "CUBE";
+    case 4: return "BUFFER";
+    case 7: return "NULL";
+    default: return "unknown";
+    }
+}
+
+static const char *
+get_965_depthformat(unsigned int depthformat)
+{
+    switch (depthformat) {
+    case 0: return "s8_z24float";
+    case 1: return "z32float";
+    case 2: return "z24s8";
+    case 5: return "z16";
+    default: return "unknown";
+    }
+}
+
+static const char *
+get_965_element_component(uint32_t data, int component)
+{
+    uint32_t component_control = (data >> (16 + (3 - component) * 4)) & 0x7;
+
+    switch (component_control) {
+    case 0:
+	return "nostore";
+    case 1:
+	switch (component) {
+	case 0: return "X";
+	case 1: return "Y";
+	case 2: return "Z";
+	case 3: return "W";
+	default: return "fail";
+	}
+    case 2:
+	return "0.0";
+    case 3:
+	return "1.0";
+    case 4:
+	return "0x1";
+    case 5:
+	return "VID";
+    default:
+	return "fail";
+    }
+}
+
+static const char *
+get_965_prim_type(uint32_t data)
+{
+    uint32_t primtype = (data >> 10) & 0x1f;
+
+    switch (primtype) {
+    case 0x01: return "point list";
+    case 0x02: return "line list";
+    case 0x03: return "line strip";
+    case 0x04: return "tri list";
+    case 0x05: return "tri strip";
+    case 0x06: return "tri fan";
+    case 0x07: return "quad list";
+    case 0x08: return "quad strip";
+    case 0x09: return "line list adj";
+    case 0x0a: return "line strip adj";
+    case 0x0b: return "tri list adj";
+    case 0x0c: return "tri strip adj";
+    case 0x0d: return "tri strip reverse";
+    case 0x0e: return "polygon";
+    case 0x0f: return "rect list";
+    case 0x10: return "line loop";
+    case 0x11: return "point list bf";
+    case 0x12: return "line strip cont";
+    case 0x13: return "line strip bf";
+    case 0x14: return "line strip cont bf";
+    case 0x15: return "tri fan no stipple";
+    default: return "fail";
+    }
+}
+
+static int
+i965_decode_urb_fence(uint32_t *data, uint32_t hw_offset, int len, int count,
+		      int *failures)
+{
+	uint32_t vs_fence, clip_fence, gs_fence, sf_fence, vfe_fence, cs_fence;
+
+	if (len != 3)
+	    fprintf(out, "Bad count in URB_FENCE\n");
+	if (count < 3)
+	    BUFFER_FAIL(count, len, "URB_FENCE");
+
+	vs_fence = data[1] & 0x3ff;
+	gs_fence = (data[1] >> 10) & 0x3ff;
+	clip_fence = (data[1] >> 20) & 0x3ff;
+	sf_fence = data[2] & 0x3ff;
+	vfe_fence = (data[2] >> 10) & 0x3ff;
+	cs_fence = (data[2] >> 20) & 0x7ff;
+
+	instr_out(data, hw_offset, 0, "URB_FENCE: %s%s%s%s%s%s\n",
+			(data[0] >> 13) & 1 ? "cs " : "",
+			(data[0] >> 12) & 1 ? "vfe " : "",
+			(data[0] >> 11) & 1 ? "sf " : "",
+			(data[0] >> 10) & 1 ? "clip " : "",
+			(data[0] >> 9)  & 1 ? "gs " : "",
+			(data[0] >> 8)  & 1 ? "vs " : "");
+	instr_out(data, hw_offset, 1,
+		  "vs fence: %d, clip_fence: %d, gs_fence: %d\n",
+		  vs_fence, clip_fence, gs_fence);
+	instr_out(data, hw_offset, 2,
+		  "sf fence: %d, vfe_fence: %d, cs_fence: %d\n",
+		  sf_fence, vfe_fence, cs_fence);
+	if (gs_fence < vs_fence)
+	    fprintf(out, "gs fence < vs fence!\n");
+	if (clip_fence < gs_fence)
+	    fprintf(out, "clip fence < gs fence!\n");
+	if (sf_fence < clip_fence)
+	    fprintf(out, "sf fence < clip fence!\n");
+	if (cs_fence < sf_fence)
+	    fprintf(out, "cs fence < sf fence!\n");
+
+	return len;
+}
+
+static void
+state_base_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
+	       char *name)
+{
+    if (data[index] & 1) {
+	instr_out(data, hw_offset, index, "%s state base address 0x%08x\n",
+		  name, data[index] & ~1);
+    } else {
+	instr_out(data, hw_offset, index, "%s state base not updated\n",
+		  name);
+    }
+}
+
+static void
+state_max_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
+	      char *name)
+{
+    if (data[index] & 1) {
+	if (data[index] == 1) {
+	    instr_out(data, hw_offset, index,
+		      "%s state upper bound disabled\n", name);
+	} else {
+	    instr_out(data, hw_offset, index, "%s state upper bound 0x%08x\n",
+		      name, data[index] & ~1);
+	}
+    } else {
+	instr_out(data, hw_offset, index, "%s state upper bound not updated\n",
+		  name);
+    }
+}
+
+static int
+decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid, int *failures)
+{
+    uint32_t opcode;
+    unsigned int idx, len;
+    int i, sba_len;
+    char *desc1 = NULL;
+
+    struct {
+	uint32_t opcode;
+	int min_len;
+	int max_len;
+	char *name;
+    } opcodes_3d[] = {
+	{ 0x6000, 3, 3, "URB_FENCE" },
+	{ 0x6001, 2, 2, "CS_URB_STATE" },
+	{ 0x6002, 2, 2, "CONSTANT_BUFFER" },
+	{ 0x6101, 6, 6, "STATE_BASE_ADDRESS" },
+	{ 0x6102, 2, 2 , "STATE_SIP" },
+	{ 0x6104, 1, 1, "3DSTATE_PIPELINE_SELECT" },
+	{ 0x680b, 1, 1, "3DSTATE_VF_STATISTICS" },
+	{ 0x6904, 1, 1, "3DSTATE_PIPELINE_SELECT" },
+	{ 0x7800, 7, 7, "3DSTATE_PIPELINED_POINTERS" },
+	{ 0x7801, 6, 6, "3DSTATE_BINDING_TABLE_POINTERS" },
+	{ 0x7808, 5, 257, "3DSTATE_VERTEX_BUFFERS" },
+	{ 0x7809, 3, 256, "3DSTATE_VERTEX_ELEMENTS" },
+	{ 0x780a, 3, 3, "3DSTATE_INDEX_BUFFER" },
+	{ 0x780b, 1, 1, "3DSTATE_VF_STATISTICS" },
+	{ 0x7900, 4, 4, "3DSTATE_DRAWING_RECTANGLE" },
+	{ 0x7901, 5, 5, "3DSTATE_CONSTANT_COLOR" },
+	{ 0x7905, 5, 7, "3DSTATE_DEPTH_BUFFER" },
+	{ 0x7906, 2, 2, "3DSTATE_POLY_STIPPLE_OFFSET" },
+	{ 0x7907, 33, 33, "3DSTATE_POLY_STIPPLE_PATTERN" },
+	{ 0x7908, 3, 3, "3DSTATE_LINE_STIPPLE" },
+	{ 0x7909, 2, 2, "3DSTATE_GLOBAL_DEPTH_OFFSET_CLAMP" },
+	{ 0x7909, 2, 2, "3DSTATE_CLEAR_PARAMS" },
+	{ 0x790a, 3, 3, "3DSTATE_AA_LINE_PARAMETERS" },
+	{ 0x790b, 4, 4, "3DSTATE_GS_SVB_INDEX" },
+	{ 0x790d, 3, 3, "3DSTATE_MULTISAMPLE" },
+	{ 0x7910, 2, 2, "3DSTATE_CLEAR_PARAMS" },
+	{ 0x7b00, 6, 6, "3DPRIMITIVE" },
+	{ 0x7802, 4, 4, "3DSTATE_SAMPLER_STATE_POINTERS" },
+	{ 0x7805, 3, 3, "3DSTATE_URB" },
+	{ 0x780d, 4, 4, "3DSTATE_VIEWPORT_STATE_POINTERS" },
+	{ 0x780e, 4, 4, "3DSTATE_CC_STATE_POINTERS" },
+	{ 0x780f, 2, 2, "3DSTATE_SCISSOR_STATE_POINTERS" },
+	{ 0x7810, 6, 6, "3DSTATE_VS_STATE" },
+	{ 0x7811, 7, 7, "3DSTATE_GS_STATE" },
+	{ 0x7812, 4, 4, "3DSTATE_CLIP_STATE" },
+	{ 0x7813, 20, 20, "3DSTATE_SF_STATE" },
+	{ 0x7814, 9, 9, "3DSTATE_WM_STATE" },
+	{ 0x7815, 5, 5, "3DSTATE_CONSTANT_VS_STATE" },
+	{ 0x7816, 5, 5, "3DSTATE_CONSTANT_GS_STATE" },
+	{ 0x7817, 5, 5, "3DSTATE_CONSTANT_PS_STATE" },
+	{ 0x7818, 2, 2, "3DSTATE_SAMPLE_MASK" },
+   }, *opcode_3d;
+
+    len = (data[0] & 0x0000ffff) + 2;
+
+    opcode = (data[0] & 0xffff0000) >> 16;
+    switch (opcode) {
+    case 0x6000:
+	len = (data[0] & 0x000000ff) + 2;
+	return i965_decode_urb_fence(data, hw_offset, len, count, failures);
+    case 0x6001:
+	instr_out(data, hw_offset, 0, "CS_URB_STATE\n");
+	instr_out(data, hw_offset, 1, "entry_size: %d [%d bytes], n_entries: %d\n",
+			(data[1] >> 4) & 0x1f,
+			(((data[1] >> 4) & 0x1f) + 1) * 64,
+			data[1] & 0x7);
+	return len;
+    case 0x6002:
+	len = (data[0] & 0x000000ff) + 2;
+	instr_out(data, hw_offset, 0, "CONSTANT_BUFFER: %s\n",
+			(data[0] >> 8) & 1 ? "valid" : "invalid");
+	instr_out(data, hw_offset, 1, "offset: 0x%08x, length: %d bytes\n",
+			data[1] & ~0x3f, ((data[1] & 0x3f) + 1) * 64);
+	return len;
+    case 0x6101:
+	i = 0;
+	instr_out(data, hw_offset, 0,
+		  "STATE_BASE_ADDRESS\n");
+	i++;
+
+	if (IS_GEN6(devid) || IS_GEN7(devid))
+	    sba_len = 10;
+	else if (IS_GEN5(devid))
+	    sba_len = 8;
+	else
+	    sba_len = 6;
+	if (len != sba_len)
+	    fprintf(out, "Bad count in STATE_BASE_ADDRESS\n");
+	if (len != sba_len)
+	    BUFFER_FAIL(count, len, "STATE_BASE_ADDRESS");
+
+	state_base_out(data, hw_offset, i++, "general");
+	state_base_out(data, hw_offset, i++, "surface");
+	if (IS_GEN6(devid) || IS_GEN7(devid))
+	    state_base_out(data, hw_offset, i++, "dynamic");
+	state_base_out(data, hw_offset, i++, "indirect");
+	if (IS_GEN5(devid) || IS_GEN6(devid) || IS_GEN7(devid))
+	    state_base_out(data, hw_offset, i++, "instruction");
+
+	state_max_out(data, hw_offset, i++, "general");
+	if (IS_GEN6(devid) || IS_GEN7(devid))
+	    state_max_out(data, hw_offset, i++, "dynamic");
+	state_max_out(data, hw_offset, i++, "indirect");
+	if (IS_GEN5(devid) || IS_GEN6(devid) || IS_GEN7(devid))
+	    state_max_out(data, hw_offset, i++, "instruction");
+
+	return len;
+    case 0x7800:
+	if (len != 7)
+	    fprintf(out, "Bad count in 3DSTATE_PIPELINED_POINTERS\n");
+	if (count < 7)
+	    BUFFER_FAIL(count, len, "3DSTATE_PIPELINED_POINTERS");
+
+	instr_out(data, hw_offset, 0,
+		  "3DSTATE_PIPELINED_POINTERS\n");
+	instr_out(data, hw_offset, 1, "VS state\n");
+	instr_out(data, hw_offset, 2, "GS state\n");
+	instr_out(data, hw_offset, 3, "Clip state\n");
+	instr_out(data, hw_offset, 4, "SF state\n");
+	instr_out(data, hw_offset, 5, "WM state\n");
+	instr_out(data, hw_offset, 6, "CC state\n");
+	return len;
+    case 0x7801:
+	len = (data[0] & 0x000000ff) + 2;
+	if (len != 6 && len != 4)
+	    fprintf(out, "Bad count in 3DSTATE_BINDING_TABLE_POINTERS\n");
+	if (len == 6) {
+	    if (count < 6)
+		BUFFER_FAIL(count, len, "3DSTATE_BINDING_TABLE_POINTERS");
+	    instr_out(data, hw_offset, 0,
+		      "3DSTATE_BINDING_TABLE_POINTERS\n");
+	    instr_out(data, hw_offset, 1, "VS binding table\n");
+	    instr_out(data, hw_offset, 2, "GS binding table\n");
+	    instr_out(data, hw_offset, 3, "Clip binding table\n");
+	    instr_out(data, hw_offset, 4, "SF binding table\n");
+	    instr_out(data, hw_offset, 5, "WM binding table\n");
+	} else {
+	    if (count < 4)
+		BUFFER_FAIL(count, len, "3DSTATE_BINDING_TABLE_POINTERS");
+
+	    instr_out(data, hw_offset, 0,
+		      "3DSTATE_BINDING_TABLE_POINTERS: VS mod %d, "
+		      "GS mod %d, PS mod %d\n",
+		      (data[0] & (1 << 8)) != 0,
+		      (data[0] & (1 << 9)) != 0,
+		      (data[0] & (1 << 12)) != 0);
+	    instr_out(data, hw_offset, 1, "VS binding table\n");
+	    instr_out(data, hw_offset, 2, "GS binding table\n");
+	    instr_out(data, hw_offset, 3, "WM binding table\n");
+	}
+
+	return len;
+    case 0x7802:
+        len = (data[0] & 0xff) + 2;
+        if (len != 4)
+            fprintf(out, "Bad count in 3DSTATE_SAMPLER_STATE_POINTERS\n");
+	if (count < 4)
+	    BUFFER_FAIL(count, len, "3DSTATE_SAMPLER_STATE_POINTERS");
+        instr_out(data, hw_offset, 0, "3DSTATE_SAMPLER_STATE_POINTERS: VS mod %d, "
+                  "GS mod %d, PS mod %d\n",
+                  (data[0] & (1 << 8)) != 0,
+                  (data[0] & (1 << 9)) != 0,
+                  (data[0] & (1 << 12)) != 0);
+        instr_out(data, hw_offset, 1, "VS sampler state\n");
+        instr_out(data, hw_offset, 2, "GS sampler state\n");
+        instr_out(data, hw_offset, 3, "WM sampler state\n");
+        return len;
+    case 0x7805:
+        len = (data[0] & 0xff) + 2;
+        if (len != 3)
+            fprintf(out, "Bad count in 3DSTATE_URB\n");
+	if (count < 3)
+	    BUFFER_FAIL(count, len, "3DSTATE_URB");
+        instr_out(data, hw_offset, 0, "3DSTATE_URB\n");
+        instr_out(data, hw_offset, 1, "VS entries %d, alloc size %d (1024bit row)\n",
+                        data[1] & 0xffff, ((data[1] >> 16) & 0x07f) + 1);
+        instr_out(data, hw_offset, 2, "GS entries %d, alloc size %d (1024bit row)\n",
+                        (data[2] >> 8) & 0x3ff, (data[2] & 7) + 1);
+        return len;
+
+    case 0x7808:
+	len = (data[0] & 0xff) + 2;
+	if ((len - 1) % 4 != 0)
+	    fprintf(out, "Bad count in 3DSTATE_VERTEX_BUFFERS\n");
+	if (count < len)
+	    BUFFER_FAIL(count, len, "3DSTATE_VERTEX_BUFFERS");
+	instr_out(data, hw_offset, 0, "3DSTATE_VERTEX_BUFFERS\n");
+
+	for (i = 1; i < len;) {
+	    int idx, access;
+	    if (IS_GEN6(devid)) {
+                idx = 26;
+                access = 20;
+            } else {
+                idx = 27;
+                access = 26;
+            }
+	    instr_out(data, hw_offset, i, "buffer %d: %s, pitch %db\n",
+		      data[i] >> idx,
+		      data[i] & (1 << access) ? "random" : "sequential",
+		      data[i] & 0x07ff);
+	    i++;
+	    instr_out(data, hw_offset, i++, "buffer address\n");
+	    instr_out(data, hw_offset, i++, "max index\n");
+	    instr_out(data, hw_offset, i++, "mbz\n");
+	}
+	return len;
+
+    case 0x7809:
+	len = (data[0] & 0xff) + 2;
+	if ((len + 1) % 2 != 0)
+	    fprintf(out, "Bad count in 3DSTATE_VERTEX_ELEMENTS\n");
+	if (count < len)
+	    BUFFER_FAIL(count, len, "3DSTATE_VERTEX_ELEMENTS");
+	instr_out(data, hw_offset, 0, "3DSTATE_VERTEX_ELEMENTS\n");
+
+	for (i = 1; i < len;) {
+	    instr_out(data, hw_offset, i, "buffer %d: %svalid, type 0x%04x, "
+		      "src offset 0x%04x bytes\n",
+		      data[i] >> (IS_GEN6(devid) ? 26 : 27),
+		      data[i] & (1 << (IS_GEN6(devid) ? 25 : 26)) ? "" : "in",
+		      (data[i] >> 16) & 0x1ff,
+		      data[i] & 0x07ff);
+	    i++;
+	    instr_out(data, hw_offset, i, "(%s, %s, %s, %s), "
+		      "dst offset 0x%02x bytes\n",
+		      get_965_element_component(data[i], 0),
+		      get_965_element_component(data[i], 1),
+		      get_965_element_component(data[i], 2),
+		      get_965_element_component(data[i], 3),
+		      (data[i] & 0xff) * 4);
+	    i++;
+	}
+	return len;
+
+    case 0x780d:
+	len = (data[0] & 0xff) + 2;
+	if (len != 4)
+	    fprintf(out, "Bad count in 3DSTATE_VIEWPORT_STATE_POINTERS\n");
+	if (count < len)
+	    BUFFER_FAIL(count, len, "3DSTATE_VIEWPORT_STATE_POINTERS");
+	instr_out(data, hw_offset, 0, "3DSTATE_VIEWPORT_STATE_POINTERS\n");
+	instr_out(data, hw_offset, 1, "clip\n");
+	instr_out(data, hw_offset, 2, "sf\n");
+	instr_out(data, hw_offset, 3, "cc\n");
+	return len;
+
+    case 0x780a:
+	len = (data[0] & 0xff) + 2;
+	if (len != 3)
+	    fprintf(out, "Bad count in 3DSTATE_INDEX_BUFFER\n");
+	if (count < len)
+	    BUFFER_FAIL(count, len, "3DSTATE_INDEX_BUFFER");
+	instr_out(data, hw_offset, 0, "3DSTATE_INDEX_BUFFER\n");
+	instr_out(data, hw_offset, 1, "beginning buffer address\n");
+	instr_out(data, hw_offset, 2, "ending buffer address\n");
+	return len;
+
+    case 0x780e:
+        len = (data[0] & 0xff) + 2;
+        if (len != 4)
+            fprintf(out, "Bad count in 3DSTATE_CC_STATE_POINTERS\n");
+	if (count < 4)
+	    BUFFER_FAIL(count, len, "3DSTATE_CC_STATE_POINTERS");
+        instr_out(data, hw_offset, 0, "3DSTATE_CC_STATE_POINTERS\n");
+        instr_out(data, hw_offset, 1, "blend change %d\n", data[1] & 1);
+        instr_out(data, hw_offset, 2, "depth stencil change %d\n", data[2] & 1);
+        instr_out(data, hw_offset, 3, "cc change %d\n", data[3] & 1);
+        return len;
+
+    case 0x780f:
+        len = (data[0] & 0xff) + 2;
+        if (len != 2)
+            fprintf(out, "Bad count in 3DSTATE_SCISSOR_POINTERS\n");
+	if (count < 2)
+	    BUFFER_FAIL(count, len, "3DSTATE_SCISSOR_POINTERS");
+        instr_out(data, hw_offset, 0, "3DSTATE_SCISSOR_POINTERS\n");
+        instr_out(data, hw_offset, 1, "scissor rect offset\n");
+        return len;
+
+    case 0x7810:
+        len = (data[0] & 0xff) + 2;
+        if (len != 6)
+            fprintf(out, "Bad count in 3DSTATE_VS\n");
+	if (count < 6)
+	    BUFFER_FAIL(count, len, "3DSTATE_VS");
+        instr_out(data, hw_offset, 0, "3DSTATE_VS\n");
+        instr_out(data, hw_offset, 1, "kernel pointer\n");
+        instr_out(data, hw_offset, 2, "SPF=%d, VME=%d, Sampler Count %d, "
+                  "Binding table count %d\n",
+                  (data[2] >> 31) & 1,
+                  (data[2] >> 30) & 1,
+                  (data[2] >> 27) & 7,
+                  (data[2] >> 18) & 0xff);
+        instr_out(data, hw_offset, 3, "scratch offset\n");
+        instr_out(data, hw_offset, 4, "Dispatch GRF start %d, VUE read length %d, "
+                  "VUE read offset %d\n",
+                  (data[4] >> 20) & 0x1f,
+                  (data[4] >> 11) & 0x3f,
+                  (data[4] >> 4) & 0x3f);
+        instr_out(data, hw_offset, 5, "Max Threads %d, Vertex Cache %sable, "
+                  "VS func %sable\n",
+                  ((data[5] >> 25) & 0x7f) + 1,
+                  (data[5] & (1 << 1)) != 0 ? "dis" : "en",
+                  (data[5] & 1) != 0 ? "en" : "dis");
+        return len;
+
+    case 0x7811:
+        len = (data[0] & 0xff) + 2;
+        if (len != 7)
+            fprintf(out, "Bad count in 3DSTATE_GS\n");
+	if (count < 7)
+	    BUFFER_FAIL(count, len, "3DSTATE_GS");
+        instr_out(data, hw_offset, 0, "3DSTATE_GS\n");
+        instr_out(data, hw_offset, 1, "kernel pointer\n");
+        instr_out(data, hw_offset, 2, "SPF=%d, VME=%d, Sampler Count %d, "
+                  "Binding table count %d\n",
+                  (data[2] >> 31) & 1,
+                  (data[2] >> 30) & 1,
+                  (data[2] >> 27) & 7,
+                  (data[2] >> 18) & 0xff);
+        instr_out(data, hw_offset, 3, "scratch offset\n");
+        instr_out(data, hw_offset, 4, "Dispatch GRF start %d, VUE read length %d, "
+                  "VUE read offset %d\n",
+                  (data[4] & 0xf),
+                  (data[4] >> 11) & 0x3f,
+                  (data[4] >> 4) & 0x3f);
+        instr_out(data, hw_offset, 5, "Max Threads %d, Rendering %sable\n",
+                  ((data[5] >> 25) & 0x7f) + 1,
+                  (data[5] & (1 << 8)) != 0 ? "en" : "dis");
+        instr_out(data, hw_offset, 6, "Reorder %sable, Discard Adjaceny %sable, "
+                  "GS %sable\n",
+                  (data[6] & (1 << 30)) != 0 ? "en" : "dis",
+                  (data[6] & (1 << 29)) != 0 ? "en" : "dis",
+                  (data[6] & (1 << 15)) != 0 ? "en" : "dis");
+        return len;
+
+    case 0x7812:
+        len = (data[0] & 0xff) + 2;
+        if (len != 4)
+            fprintf(out, "Bad count in 3DSTATE_CLIP\n");
+	if (count < 4)
+	    BUFFER_FAIL(count, len, "3DSTATE_CLIP");
+        instr_out(data, hw_offset, 0, "3DSTATE_CLIP\n");
+        instr_out(data, hw_offset, 1, "UserClip distance cull test mask 0x%x\n",
+                  data[1] & 0xff);
+        instr_out(data, hw_offset, 2, "Clip %sable, API mode %s, Viewport XY test %sable, "
+                  "Viewport Z test %sable, Guardband test %sable, Clip mode %d, "
+                  "Perspective Divide %sable, Non-Perspective Barycentric %sable, "
+                  "Tri Provoking %d, Line Provoking %d, Trifan Provoking %d\n",
+                  (data[2] & (1 << 31)) != 0 ? "en" : "dis",
+                  (data[2] & (1 << 30)) != 0 ? "D3D" : "OGL",
+                  (data[2] & (1 << 28)) != 0 ? "en" : "dis",
+                  (data[2] & (1 << 27)) != 0 ? "en" : "dis",
+                  (data[2] & (1 << 26)) != 0 ? "en" : "dis",
+                  (data[2] >> 13) & 7,
+                  (data[2] & (1 << 9)) != 0 ? "dis" : "en",
+                  (data[2] & (1 << 8)) != 0 ? "en" : "dis",
+                  (data[2] >> 4) & 3,
+                  (data[2] >> 2) & 3,
+                  (data[2] & 3));
+        instr_out(data, hw_offset, 3, "Min PointWidth %d, Max PointWidth %d, "
+                  "Force Zero RTAIndex %sable, Max VPIndex %d\n",
+                  (data[3] >> 17) & 0x7ff,
+                  (data[3] >> 6) & 0x7ff,
+                  (data[3] & (1 << 5)) != 0 ? "en" : "dis",
+                  (data[3] & 0xf));
+        return len;
+
+    case 0x7813:
+        len = (data[0] & 0xff) + 2;
+        if (len != 20)
+            fprintf(out, "Bad count in 3DSTATE_SF\n");
+	if (count < 20)
+	    BUFFER_FAIL(count, len, "3DSTATE_SF");
+        instr_out(data, hw_offset, 0, "3DSTATE_SF\n");
+        instr_out(data, hw_offset, 1, "Attrib Out %d, Attrib Swizzle %sable, VUE read length %d, "
+                  "VUE read offset %d\n",
+                  (data[1] >> 22) & 0x3f,
+                  (data[1] & (1 << 21)) != 0 ? "en" : "dis",
+                  (data[1] >> 11) & 0x1f,
+                  (data[1] >> 4) & 0x3f);
+        instr_out(data, hw_offset, 2, "Legacy Global DepthBias %sable, FrontFace fill %d, BF fill %d, "
+                  "VP transform %sable, FrontWinding_%s\n",
+                  (data[2] & (1 << 11)) != 0 ? "en" : "dis",
+                  (data[2] >> 5) & 3,
+                  (data[2] >> 3) & 3,
+                  (data[2] & (1 << 1)) != 0 ? "en" : "dis",
+                  (data[2] & 1) != 0 ? "CCW" : "CW");
+        instr_out(data, hw_offset, 3, "AA %sable, CullMode %d, Scissor %sable, Multisample m ode %d\n",
+                  (data[3] & (1 << 31)) != 0 ? "en" : "dis",
+                  (data[3] >> 29) & 3,
+                  (data[3] & (1 << 11)) != 0 ? "en" : "dis",
+                  (data[3] >> 8) & 3);
+        instr_out(data, hw_offset, 4, "Last Pixel %sable, SubPixel Precision %d, Use PixelWidth %d\n",
+                  (data[4] & (1 << 31)) != 0 ? "en" : "dis",
+                  (data[4] & (1 << 12)) != 0 ? 4 : 8,
+                  (data[4] & (1 << 11)) != 0);
+        instr_out(data, hw_offset, 5, "Global Depth Offset Constant %f\n", data[5]);
+        instr_out(data, hw_offset, 6, "Global Depth Offset Scale %f\n", data[6]);
+        instr_out(data, hw_offset, 7, "Global Depth Offset Clamp %f\n", data[7]);
+        int i, j;
+        for (i = 0, j = 0; i < 8; i++, j+=2)
+            instr_out(data, hw_offset, i+8, "Attrib %d (Override %s%s%s%s, Const Source %d, Swizzle Select %d, "
+                  "Source %d); Attrib %d (Override %s%s%s%s, Const Source %d, Swizzle Select %d, Source %d)\n",
+                  j+1,
+                  (data[8+i] & (1 << 31)) != 0 ? "W":"",
+                  (data[8+i] & (1 << 30)) != 0 ? "Z":"",
+                  (data[8+i] & (1 << 29)) != 0 ? "Y":"",
+                  (data[8+i] & (1 << 28)) != 0 ? "X":"",
+                  (data[8+i] >> 25) & 3, (data[8+i] >> 22) & 3,
+                  (data[8+i] >> 16) & 0x1f,
+                  j,
+                  (data[8+i] & (1 << 15)) != 0 ? "W":"",
+                  (data[8+i] & (1 << 14)) != 0 ? "Z":"",
+                  (data[8+i] & (1 << 13)) != 0 ? "Y":"",
+                  (data[8+i] & (1 << 12)) != 0 ? "X":"",
+                  (data[8+i] >> 9) & 3, (data[8+i] >> 6) & 3,
+                  (data[8+i] & 0x1f));
+	instr_out(data, hw_offset, 16, "Point Sprite TexCoord Enable\n");
+        instr_out(data, hw_offset, 17, "Const Interp Enable\n");
+        instr_out(data, hw_offset, 18, "Attrib 7-0 WrapShortest Enable\n");
+        instr_out(data, hw_offset, 19, "Attrib 15-8 WrapShortest Enable\n");
+
+        return len;
+
+    case 0x7814:
+        len = (data[0] & 0xff) + 2;
+        if (len != 9)
+            fprintf(out, "Bad count in 3DSTATE_WM\n");
+	if (count < 9)
+	    BUFFER_FAIL(count, len, "3DSTATE_WM");
+        instr_out(data, hw_offset, 0, "3DSTATE_WM\n");
+        instr_out(data, hw_offset, 1, "kernel start pointer 0\n");
+        instr_out(data, hw_offset, 2, "SPF=%d, VME=%d, Sampler Count %d, "
+                  "Binding table count %d\n",
+                  (data[2] >> 31) & 1,
+                  (data[2] >> 30) & 1,
+                  (data[2] >> 27) & 7,
+                  (data[2] >> 18) & 0xff);
+        instr_out(data, hw_offset, 3, "scratch offset\n");
+        instr_out(data, hw_offset, 4, "Depth Clear %d, Depth Resolve %d, HiZ Resolve %d, "
+                  "Dispatch GRF start[0] %d, start[1] %d, start[2] %d\n",
+                  (data[4] & (1 << 30)) != 0,
+                  (data[4] & (1 << 28)) != 0,
+                  (data[4] & (1 << 27)) != 0,
+                  (data[4] >> 16) & 0x7f,
+                  (data[4] >> 8) & 0x7f,
+                  (data[4] & 0x7f));
+        instr_out(data, hw_offset, 5, "MaxThreads %d, PS KillPixel %d, PS computed Z %d, "
+                  "PS use sourceZ %d, Thread Dispatch %d, PS use sourceW %d, Dispatch32 %d, "
+                  "Dispatch16 %d, Dispatch8 %d\n",
+                  ((data[5] >> 25) & 0x7f) + 1,
+                  (data[5] & (1 << 22)) != 0,
+                  (data[5] & (1 << 21)) != 0,
+                  (data[5] & (1 << 20)) != 0,
+                  (data[5] & (1 << 19)) != 0,
+                  (data[5] & (1 << 8)) != 0,
+                  (data[5] & (1 << 2)) != 0,
+                  (data[5] & (1 << 1)) != 0,
+                  (data[5] & (1 << 0)) != 0);
+        instr_out(data, hw_offset, 6, "Num SF output %d, Pos XY offset %d, ZW interp mode %d , "
+                  "Barycentric interp mode 0x%x, Point raster rule %d, Multisample mode %d, "
+                  "Multisample Dispatch mode %d\n",
+                  (data[6] >> 20) & 0x3f,
+                  (data[6] >> 18) & 3,
+                  (data[6] >> 16) & 3,
+                  (data[6] >> 10) & 0x3f,
+                  (data[6] & (1 << 9)) != 0,
+                  (data[6] >> 1) & 3,
+                  (data[6] & 1));
+        instr_out(data, hw_offset, 7, "kernel start pointer 1\n");
+        instr_out(data, hw_offset, 8, "kernel start pointer 2\n");
+
+        return len;
+
+    case 0x7900:
+	if (len != 4)
+	    fprintf(out, "Bad count in 3DSTATE_DRAWING_RECTANGLE\n");
+	if (count < 4)
+	    BUFFER_FAIL(count, len, "3DSTATE_DRAWING_RECTANGLE");
+
+	instr_out(data, hw_offset, 0,
+		  "3DSTATE_DRAWING_RECTANGLE\n");
+	instr_out(data, hw_offset, 1, "top left: %d,%d\n",
+		  data[1] & 0xffff,
+		  (data[1] >> 16) & 0xffff);
+	instr_out(data, hw_offset, 2, "bottom right: %d,%d\n",
+		  data[2] & 0xffff,
+		  (data[2] >> 16) & 0xffff);
+	instr_out(data, hw_offset, 3, "origin: %d,%d\n",
+		  (int)data[3] & 0xffff,
+		  ((int)data[3] >> 16) & 0xffff);
+
+	return len;
+
+    case 0x7905:
+	if (len < 5 || len > 7)
+	    fprintf(out, "Bad count in 3DSTATE_DEPTH_BUFFER\n");
+	if (count < len)
+	    BUFFER_FAIL(count, len, "3DSTATE_DEPTH_BUFFER");
+
+	instr_out(data, hw_offset, 0,
+		  "3DSTATE_DEPTH_BUFFER\n");
+	if (IS_GEN5(devid) || IS_GEN6(devid))
+            instr_out(data, hw_offset, 1, "%s, %s, pitch = %d bytes, %stiled, HiZ %d, Seperate Stencil %d\n",
+                    get_965_surfacetype(data[1] >> 29),
+                    get_965_depthformat((data[1] >> 18) & 0x7),
+                    (data[1] & 0x0001ffff) + 1,
+                    data[1] & (1 << 27) ? "" : "not ",
+                    (data[1] & (1 << 22)) != 0,
+                    (data[1] & (1 << 21)) != 0);
+        else
+            instr_out(data, hw_offset, 1, "%s, %s, pitch = %d bytes, %stiled\n",
+                    get_965_surfacetype(data[1] >> 29),
+                    get_965_depthformat((data[1] >> 18) & 0x7),
+                    (data[1] & 0x0001ffff) + 1,
+                    data[1] & (1 << 27) ? "" : "not ");
+	instr_out(data, hw_offset, 2, "depth offset\n");
+	instr_out(data, hw_offset, 3, "%dx%d\n",
+		  ((data[3] & 0x0007ffc0) >> 6) + 1,
+		  ((data[3] & 0xfff80000) >> 19) + 1);
+	instr_out(data, hw_offset, 4, "volume depth\n");
+	if (len >= 6)
+	    instr_out(data, hw_offset, 5, "\n");
+	if (len >= 7) {
+            if (IS_GEN6(devid))
+                instr_out(data, hw_offset, 6, "\n");
+            else
+                instr_out(data, hw_offset, 6, "render target view extent\n");
+        }
+
+
+	return len;
+
+    case 0x7a00:
+	if (intel_gen(devid) >= 6) {
+		int i;
+		len = (data[0] & 0xff) + 2;
+		if (len != 4 && len != 5)
+			fprintf(out, "Bad count in PIPE_CONTROL\n");
+		if (count < len)
+			BUFFER_FAIL(count, len, "PIPE_CONTROL");
+
+		switch ((data[1] >> 14) & 0x3) {
+		case 0: desc1 = "no write"; break;
+		case 1: desc1 = "qword write"; break;
+		case 2: desc1 = "PS_DEPTH_COUNT write"; break;
+		case 3: desc1 = "TIMESTAMP write"; break;
+		}
+		instr_out(data, hw_offset, 0, "PIPE_CONTROL\n");
+		instr_out(data, hw_offset, 1,
+			  "%s, %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
+			  desc1,
+			  data[1] & (1 << 20) ? "cs stall, " : "",
+			  data[1] & (1 << 19) ? "global snapshot count reset, " : "",
+			  data[1] & (1 << 18) ? "tlb invalidate, " : "",
+			  data[1] & (1 << 17) ? "gfdt flush, " : "",
+			  data[1] & (1 << 17) ? "media state clear, " : "",
+			  data[1] & (1 << 13) ? "depth stall, " : "",
+			  data[1] & (1 << 12) ? "render target cache flush, " : "",
+			  data[1] & (1 << 11) ? "instruction cache invalidate, " : "",
+			  data[1] & (1 << 10) ? "texture cache invalidate, " : "",
+			  data[1] & (1 << 9) ? "indirect state invalidate, " : "",
+			  data[1] & (1 << 8) ? "notify irq, " : "",
+			  data[1] & (1 << 7) ? "PIPE_CONTROL flush, " : "",
+			  data[1] & (1 << 6) ? "protect mem app_id, " : "",
+			  data[1] & (1 << 5) ? "DC flush, " : "",
+			  data[1] & (1 << 4) ? "vf fetch invalidate, " : "",
+			  data[1] & (1 << 3) ? "constant cache invalidate, " : "",
+			  data[1] & (1 << 2) ? "state cache invalidate, " : "",
+			  data[1] & (1 << 1) ? "stall at scoreboard, " : "",
+			  data[1] & (1 << 0) ? "depth cache flush, " : "");
+		if (len == 5) {
+		    instr_out(data, hw_offset, 2, "destination address\n");
+		    instr_out(data, hw_offset, 3, "immediate dword low\n");
+		    instr_out(data, hw_offset, 4, "immediate dword high\n");
+		} else {
+		    for (i = 2; i < len; i++) {
+			instr_out(data, hw_offset, i, "\n");
+		    }
+		}
+		return len;
+	} else {
+		len = (data[0] & 0xff) + 2;
+		if (len != 4)
+			fprintf(out, "Bad count in PIPE_CONTROL\n");
+		if (count < len)
+			BUFFER_FAIL(count, len, "PIPE_CONTROL");
+
+		switch ((data[0] >> 14) & 0x3) {
+		case 0: desc1 = "no write"; break;
+		case 1: desc1 = "qword write"; break;
+		case 2: desc1 = "PS_DEPTH_COUNT write"; break;
+		case 3: desc1 = "TIMESTAMP write"; break;
+		}
+		instr_out(data, hw_offset, 0,
+			  "PIPE_CONTROL: %s, %sdepth stall, %sRC write flush, "
+			  "%sinst flush\n",
+			  desc1,
+			  data[0] & (1 << 13) ? "" : "no ",
+			  data[0] & (1 << 12) ? "" : "no ",
+			  data[0] & (1 << 11) ? "" : "no ");
+		instr_out(data, hw_offset, 1, "destination address\n");
+		instr_out(data, hw_offset, 2, "immediate dword low\n");
+		instr_out(data, hw_offset, 3, "immediate dword high\n");
+		return len;
+	}
+    case 0x7b00:
+	len = (data[0] & 0xff) + 2;
+	if (len != 6)
+	    fprintf(out, "Bad count in 3DPRIMITIVE\n");
+	if (count < len)
+	    BUFFER_FAIL(count, len, "3DPRIMITIVE");
+
+	instr_out(data, hw_offset, 0,
+		  "3DPRIMITIVE: %s %s\n",
+		  get_965_prim_type(data[0]),
+		  (data[0] & (1 << 15)) ? "random" : "sequential");
+	instr_out(data, hw_offset, 1, "vertex count\n");
+	instr_out(data, hw_offset, 2, "start vertex\n");
+	instr_out(data, hw_offset, 3, "instance count\n");
+	instr_out(data, hw_offset, 4, "start instance\n");
+	instr_out(data, hw_offset, 5, "index bias\n");
+	return len;
+    }
+
+    for (idx = 0; idx < ARRAY_SIZE(opcodes_3d); idx++) {
+	opcode_3d = &opcodes_3d[idx];
+	if ((data[0] & 0xffff0000) >> 16 == opcode_3d->opcode) {
+	    unsigned int i;
+	    len = 1;
+
+	    instr_out(data, hw_offset, 0, "%s\n", opcode_3d->name);
+	    if (opcode_3d->max_len > 1) {
+		len = (data[0] & 0xff) + 2;
+		if (len < opcode_3d->min_len ||
+		    len > opcode_3d->max_len)
+		{
+		    fprintf(out, "Bad count in %s\n", opcode_3d->name);
+		}
+	    }
+
+	    for (i = 1; i < len; i++) {
+		if (i >= count)
+		    BUFFER_FAIL(count, len, opcode_3d->name);
+		instr_out(data, hw_offset, i, "dword %d\n", i);
+	    }
+	    return len;
+	}
+    }
+
+    instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d_965 opcode = 0x%x\n", opcode);
+    (*failures)++;
+    return 1;
+}
+
+static int
+decode_3d_i830(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid, int *failures)
+{
+    unsigned int idx;
+    uint32_t opcode;
+
+    struct {
+	uint32_t opcode;
+	int min_len;
+	int max_len;
+	char *name;
+    } opcodes_3d[] = {
+	{ 0x02, 1, 1, "3DSTATE_MODES_3" },
+	{ 0x03, 1, 1, "3DSTATE_ENABLES_1"},
+	{ 0x04, 1, 1, "3DSTATE_ENABLES_2"},
+	{ 0x05, 1, 1, "3DSTATE_VFT0"},
+	{ 0x06, 1, 1, "3DSTATE_AA"},
+	{ 0x07, 1, 1, "3DSTATE_RASTERIZATION_RULES" },
+	{ 0x08, 1, 1, "3DSTATE_MODES_1" },
+	{ 0x09, 1, 1, "3DSTATE_STENCIL_TEST" },
+	{ 0x0a, 1, 1, "3DSTATE_VFT1"},
+	{ 0x0b, 1, 1, "3DSTATE_INDPT_ALPHA_BLEND" },
+	{ 0x0c, 1, 1, "3DSTATE_MODES_5" },
+	{ 0x0d, 1, 1, "3DSTATE_MAP_BLEND_OP" },
+	{ 0x0e, 1, 1, "3DSTATE_MAP_BLEND_ARG" },
+	{ 0x0f, 1, 1, "3DSTATE_MODES_2" },
+	{ 0x15, 1, 1, "3DSTATE_FOG_COLOR" },
+	{ 0x16, 1, 1, "3DSTATE_MODES_4" },
+    }, *opcode_3d;
+
+    opcode = (data[0] & 0x1f000000) >> 24;
+
+    switch (opcode) {
+    case 0x1f:
+	return decode_3d_primitive(data, count, hw_offset, failures);
+    case 0x1d:
+	return decode_3d_1d(data, count, hw_offset, devid, failures);
+    case 0x1c:
+	return decode_3d_1c(data, count, hw_offset, failures);
+    }
+
+    for (idx = 0; idx < ARRAY_SIZE(opcodes_3d); idx++) {
+	opcode_3d = &opcodes_3d[idx];
+	if ((data[0] & 0x1f000000) >> 24 == opcode_3d->opcode) {
+	    unsigned int len = 1, i;
+
+	    instr_out(data, hw_offset, 0, "%s\n", opcode_3d->name);
+	    if (opcode_3d->max_len > 1) {
+		len = (data[0] & 0xff) + 2;
+		if (len < opcode_3d->min_len ||
+		    len > opcode_3d->max_len)
+		{
+		    fprintf(out, "Bad count in %s\n", opcode_3d->name);
+		}
+	    }
+
+	    for (i = 1; i < len; i++) {
+		if (i >= count)
+		    BUFFER_FAIL(count, len, opcode_3d->name);
+		instr_out(data, hw_offset, i, "dword %d\n", i);
+	    }
+	    return len;
+	}
+    }
+
+    instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d_i830 opcode = 0x%x\n", opcode);
+    (*failures)++;
+    return 1;
+}
+
+/**
+ * Decodes an i830-i915 batch buffer, writing the output to stdout.
+ *
+ * \param data batch buffer contents
+ * \param count number of DWORDs to decode in the batch buffer
+ * \param hw_offset hardware address for the buffer
+ */
+int
+intel_decode(uint32_t *data, int count,
+	     uint32_t hw_offset,
+	     uint32_t devid,
+	     uint32_t ignore_end_of_batchbuffer)
+{
+    int ret;
+    int index = 0;
+    int failures = 0;
+
+    out = stdout;
+
+    while (index < count) {
+	switch ((data[index] & 0xe0000000) >> 29) {
+	case 0x0:
+	    ret = decode_mi(data + index, count - index,
+			       hw_offset + index * 4, &failures);
+
+	    /* If MI_BATCHBUFFER_END happened, then dump the rest of the
+	     * output in case we some day want it in debugging, but don't
+	     * decode it since it'll just confuse in the common case.
+	     */
+	    if (ret == -1) {
+		if (ignore_end_of_batchbuffer) {
+		    index++;
+		} else {
+		    for (index = index + 1; index < count; index++) {
+			instr_out(data, hw_offset, index, "\n");
+		    }
+		}
+	    } else
+		index += ret;
+	    break;
+	case 0x2:
+	    index += decode_2d(data + index, count - index,
+			       hw_offset + index * 4, &failures);
+	    break;
+	case 0x3:
+	    if (IS_965(devid)) {
+		index += decode_3d_965(data + index, count - index,
+				       hw_offset + index * 4,
+				       devid, &failures);
+	    } else if (IS_GEN3(devid)) {
+		index += decode_3d(data + index, count - index,
+				   hw_offset + index * 4,
+				   devid, &failures);
+	    } else {
+		index += decode_3d_i830(data + index, count - index,
+					hw_offset + index * 4,
+					devid, &failures);
+	    }
+	    break;
+	default:
+	    instr_out(data, hw_offset, index, "UNKNOWN\n");
+	    failures++;
+	    index++;
+	    break;
+	}
+	fflush(out);
+    }
+
+    return failures;
+}
+
+void intel_decode_context_reset(void)
+{
+    saved_s2_set = 0;
+    saved_s4_set = 1;
+}
+
+void intel_decode_context_set_head_tail(uint32_t head, uint32_t tail)
+{
+	head_offset = head;
+	tail_offset = tail;
+}
-- 
1.7.7.3

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 02/13] intel: Make intel_chipset handle devid directly.
  2011-12-21 18:09 Moving intel_decode.c to libdrm Eric Anholt
  2011-12-21 18:09 ` [PATCH 01/13] intel: Import intel_decode.c from intel-gpu-tools Eric Anholt
@ 2011-12-21 18:09 ` Eric Anholt
  2011-12-21 18:09 ` [PATCH 03/13] intel: intel: Add IS_GEN[567] macros Eric Anholt
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Eric Anholt @ 2011-12-21 18:09 UTC (permalink / raw)
  To: intel-gfx

This will make these macros reusable from intel_decode.c, which
doesn't have a bufmgr_gem context, without faking the struct.  We
should generally only be using these macros from bufmgr_gem context
setup anyway.
---
 intel/intel_bufmgr_gem.c |   17 ++++++----
 intel/intel_chipset.h    |   72 +++++++++++++++++++++++-----------------------
 2 files changed, 46 insertions(+), 43 deletions(-)

diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c
index eb9dd32..2b4fab1 100644
--- a/intel/intel_bufmgr_gem.c
+++ b/intel/intel_bufmgr_gem.c
@@ -284,7 +284,8 @@ drm_intel_gem_bo_tile_pitch(drm_intel_bufmgr_gem *bufmgr_gem,
 		return ALIGN(pitch, 64);
 
 	if (*tiling_mode == I915_TILING_X
-			|| (IS_915(bufmgr_gem) && *tiling_mode == I915_TILING_Y))
+			|| (IS_915(bufmgr_gem->pci_device)
+			    && *tiling_mode == I915_TILING_Y))
 		tile_width = 512;
 	else
 		tile_width = 128;
@@ -772,10 +773,11 @@ drm_intel_gem_bo_alloc_tiled(drm_intel_bufmgr *bufmgr, const char *name,
 		aligned_y = y;
 		height_alignment = 2;
 
-		if (IS_GEN2(bufmgr_gem) && tiling != I915_TILING_NONE)
+		if ((bufmgr_gem->gen == 2) && tiling != I915_TILING_NONE)
 			height_alignment = 16;
 		else if (tiling == I915_TILING_X
-			|| (IS_915(bufmgr_gem) && tiling == I915_TILING_Y))
+			|| (IS_915(bufmgr_gem->pci_device)
+			    && tiling == I915_TILING_Y))
 			height_alignment = 8;
 		else if (tiling == I915_TILING_Y)
 			height_alignment = 32;
@@ -2313,16 +2315,17 @@ drm_intel_bufmgr_gem_init(int fd, int batch_size)
 		fprintf(stderr, "param: %d, val: %d\n", gp.param, *gp.value);
 	}
 
-	if (IS_GEN2(bufmgr_gem))
+	if (IS_GEN2(bufmgr_gem->pci_device))
 		bufmgr_gem->gen = 2;
-	else if (IS_GEN3(bufmgr_gem))
+	else if (IS_GEN3(bufmgr_gem->pci_device))
 		bufmgr_gem->gen = 3;
-	else if (IS_GEN4(bufmgr_gem))
+	else if (IS_GEN4(bufmgr_gem->pci_device))
 		bufmgr_gem->gen = 4;
 	else
 		bufmgr_gem->gen = 6;
 
-	if (IS_GEN3(bufmgr_gem) && bufmgr_gem->gtt_size > 256*1024*1024) {
+	if (IS_GEN3(bufmgr_gem->pci_device) &&
+	    bufmgr_gem->gtt_size > 256*1024*1024) {
 		/* The unmappable part of gtt on gen 3 (i.e. above 256MB) can't
 		 * be used for tiled blits. To simplify the accounting, just
 		 * substract the unmappable part (fixed to 256MB on all known
diff --git a/intel/intel_chipset.h b/intel/intel_chipset.h
index b4e0747..5d417da 100644
--- a/intel/intel_chipset.h
+++ b/intel/intel_chipset.h
@@ -28,22 +28,22 @@
 #ifndef _INTEL_CHIPSET_H
 #define _INTEL_CHIPSET_H
 
-#define IS_830(dev) ((dev)->pci_device == 0x3577)
-#define IS_845(dev) ((dev)->pci_device == 0x2562)
-#define IS_85X(dev) ((dev)->pci_device == 0x3582)
-#define IS_865(dev) ((dev)->pci_device == 0x2572)
+#define IS_830(dev) (dev == 0x3577)
+#define IS_845(dev) (dev == 0x2562)
+#define IS_85X(dev) (dev == 0x3582)
+#define IS_865(dev) (dev == 0x2572)
 
 #define IS_GEN2(dev) (IS_830(dev) ||				\
 		      IS_845(dev) ||				\
 		      IS_85X(dev) ||				\
 		      IS_865(dev))
 
-#define IS_915G(dev) ((dev)->pci_device == 0x2582 ||		\
-		       (dev)->pci_device == 0x258a)
-#define IS_915GM(dev) ((dev)->pci_device == 0x2592)
-#define IS_945G(dev) ((dev)->pci_device == 0x2772)
-#define IS_945GM(dev) ((dev)->pci_device == 0x27A2 ||		\
-                        (dev)->pci_device == 0x27AE)
+#define IS_915G(dev) (dev == 0x2582 ||		\
+		       dev == 0x258a)
+#define IS_915GM(dev) (dev == 0x2592)
+#define IS_945G(dev) (dev == 0x2772)
+#define IS_945GM(dev) (dev == 0x27A2 ||		\
+                        dev == 0x27AE)
 
 #define IS_915(dev) (IS_915G(dev) ||				\
 		     IS_915GM(dev))
@@ -53,44 +53,44 @@
 		     IS_G33(dev) ||				\
 		     IS_PINEVIEW(dev))
 
-#define IS_G33(dev)    ((dev)->pci_device == 0x29C2 ||		\
-                        (dev)->pci_device == 0x29B2 ||		\
-                        (dev)->pci_device == 0x29D2)
+#define IS_G33(dev)    (dev == 0x29C2 ||		\
+                        dev == 0x29B2 ||		\
+                        dev == 0x29D2)
 
-#define IS_PINEVIEW(dev) ((dev)->pci_device == 0xa001 ||	\
-			  (dev)->pci_device == 0xa011)
+#define IS_PINEVIEW(dev) (dev == 0xa001 ||	\
+			  dev == 0xa011)
 
 #define IS_GEN3(dev) (IS_915(dev) ||				\
 		      IS_945(dev) ||				\
 		      IS_G33(dev) ||				\
 		      IS_PINEVIEW(dev))
 
-#define IS_I965GM(dev) ((dev)->pci_device == 0x2A02)
+#define IS_I965GM(dev) (dev == 0x2A02)
 
-#define IS_GEN4(dev) ((dev)->pci_device == 0x2972 ||	\
-		      (dev)->pci_device == 0x2982 ||	\
-		      (dev)->pci_device == 0x2992 ||	\
-		      (dev)->pci_device == 0x29A2 ||	\
-		      (dev)->pci_device == 0x2A02 ||	\
-		      (dev)->pci_device == 0x2A12 ||	\
-		      (dev)->pci_device == 0x2A42 ||	\
-		      (dev)->pci_device == 0x2E02 ||	\
-		      (dev)->pci_device == 0x2E12 ||	\
-		      (dev)->pci_device == 0x2E22 ||	\
-		      (dev)->pci_device == 0x2E32 ||	\
-		      (dev)->pci_device == 0x2E42 ||	\
-		      (dev)->pci_device == 0x0042 ||	\
-		      (dev)->pci_device == 0x0046 ||	\
+#define IS_GEN4(dev) (dev == 0x2972 ||	\
+		      dev == 0x2982 ||	\
+		      dev == 0x2992 ||	\
+		      dev == 0x29A2 ||	\
+		      dev == 0x2A02 ||	\
+		      dev == 0x2A12 ||	\
+		      dev == 0x2A42 ||	\
+		      dev == 0x2E02 ||	\
+		      dev == 0x2E12 ||	\
+		      dev == 0x2E22 ||	\
+		      dev == 0x2E32 ||	\
+		      dev == 0x2E42 ||	\
+		      dev == 0x0042 ||	\
+		      dev == 0x0046 ||	\
 		      IS_I965GM(dev) || \
 		      IS_G4X(dev))
 
-#define IS_GM45(dev) ((dev)->pci_device == 0x2A42)
+#define IS_GM45(dev) (dev == 0x2A42)
 
-#define IS_G4X(dev) ((dev)->pci_device == 0x2E02 || \
-                     (dev)->pci_device == 0x2E12 || \
-                     (dev)->pci_device == 0x2E22 || \
-                     (dev)->pci_device == 0x2E32 || \
-                     (dev)->pci_device == 0x2E42 || \
+#define IS_G4X(dev) (dev == 0x2E02 || \
+                     dev == 0x2E12 || \
+                     dev == 0x2E22 || \
+                     dev == 0x2E32 || \
+                     dev == 0x2E42 || \
 		     IS_GM45(dev))
 
 #define IS_9XX(dev) (IS_GEN3(dev) ||				\
-- 
1.7.7.3

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 03/13] intel: intel: Add IS_GEN[567] macros.
  2011-12-21 18:09 Moving intel_decode.c to libdrm Eric Anholt
  2011-12-21 18:09 ` [PATCH 01/13] intel: Import intel_decode.c from intel-gpu-tools Eric Anholt
  2011-12-21 18:09 ` [PATCH 02/13] intel: Make intel_chipset handle devid directly Eric Anholt
@ 2011-12-21 18:09 ` Eric Anholt
  2011-12-21 18:09 ` [PATCH 04/13] intel: Reformat intel_decode.c from intel-gpu-tools using Lindent Eric Anholt
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Eric Anholt @ 2011-12-21 18:09 UTC (permalink / raw)
  To: intel-gfx

These will be used by intel_decode.c, and were taken from intel-gpu-tools.
---
 intel/intel_chipset.h |   38 +++++++++++++++++++++++++++++++++++++-
 1 files changed, 37 insertions(+), 1 deletions(-)

diff --git a/intel/intel_chipset.h b/intel/intel_chipset.h
index 5d417da..e3a30fc 100644
--- a/intel/intel_chipset.h
+++ b/intel/intel_chipset.h
@@ -28,6 +28,23 @@
 #ifndef _INTEL_CHIPSET_H
 #define _INTEL_CHIPSET_H
 
+#define PCI_CHIP_ILD_G                  0x0042
+#define PCI_CHIP_ILM_G                  0x0046
+
+#define PCI_CHIP_SANDYBRIDGE_GT1	0x0102 /* desktop */
+#define PCI_CHIP_SANDYBRIDGE_GT2	0x0112
+#define PCI_CHIP_SANDYBRIDGE_GT2_PLUS	0x0122
+#define PCI_CHIP_SANDYBRIDGE_M_GT1	0x0106 /* mobile */
+#define PCI_CHIP_SANDYBRIDGE_M_GT2	0x0116
+#define PCI_CHIP_SANDYBRIDGE_M_GT2_PLUS	0x0126
+#define PCI_CHIP_SANDYBRIDGE_S		0x010A /* server */
+
+#define PCI_CHIP_IVYBRIDGE_GT1		0x0152 /* desktop */
+#define PCI_CHIP_IVYBRIDGE_GT2		0x0162
+#define PCI_CHIP_IVYBRIDGE_M_GT1	0x0156 /* mobile */
+#define PCI_CHIP_IVYBRIDGE_M_GT2	0x0166
+#define PCI_CHIP_IVYBRIDGE_S		0x015a /* server */
+
 #define IS_830(dev) (dev == 0x3577)
 #define IS_845(dev) (dev == 0x2562)
 #define IS_85X(dev) (dev == 0x3582)
@@ -86,6 +103,24 @@
 
 #define IS_GM45(dev) (dev == 0x2A42)
 
+
+#define IS_GEN5(dev)	(dev == PCI_CHIP_ILD_G || \
+			 dev == PCI_CHIP_ILM_G)
+
+#define IS_GEN6(dev)	(dev == PCI_CHIP_SANDYBRIDGE_GT1 || \
+			 dev == PCI_CHIP_SANDYBRIDGE_GT2 || \
+			 dev == PCI_CHIP_SANDYBRIDGE_GT2_PLUS || \
+			 dev == PCI_CHIP_SANDYBRIDGE_M_GT1 || \
+			 dev == PCI_CHIP_SANDYBRIDGE_M_GT2 || \
+			 dev == PCI_CHIP_SANDYBRIDGE_M_GT2_PLUS || \
+			 dev == PCI_CHIP_SANDYBRIDGE_S)
+
+#define IS_GEN7(dev)	(dev == PCI_CHIP_IVYBRIDGE_GT1 || \
+			 dev == PCI_CHIP_IVYBRIDGE_GT2 || \
+			 dev == PCI_CHIP_IVYBRIDGE_M_GT1 || \
+			 dev == PCI_CHIP_IVYBRIDGE_M_GT2 || \
+			 dev == PCI_CHIP_IVYBRIDGE_S)
+
 #define IS_G4X(dev) (dev == 0x2E02 || \
                      dev == 0x2E12 || \
                      dev == 0x2E22 || \
@@ -96,6 +131,7 @@
 #define IS_9XX(dev) (IS_GEN3(dev) ||				\
 		     IS_GEN4(dev) ||				\
 		     IS_GEN5(dev) ||				\
-		     IS_GEN6(dev))
+		     IS_GEN6(dev) ||				\
+		     IS_GEN7(dev))
 
 #endif /* _INTEL_CHIPSET_H */
-- 
1.7.7.3

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 04/13] intel: Reformat intel_decode.c from intel-gpu-tools using Lindent.
  2011-12-21 18:09 Moving intel_decode.c to libdrm Eric Anholt
                   ` (2 preceding siblings ...)
  2011-12-21 18:09 ` [PATCH 03/13] intel: intel: Add IS_GEN[567] macros Eric Anholt
@ 2011-12-21 18:09 ` Eric Anholt
  2011-12-21 18:09 ` [PATCH 05/13] intel: Minor style tweaks after Lindent Eric Anholt
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Eric Anholt @ 2011-12-21 18:09 UTC (permalink / raw)
  To: intel-gfx

We generally go for kernel style in this tree, and this 4-space indent
stuff was bothering me.  The new results have some ugly bits, but
they're in places where we desperately want to be using helper
functions anyway.
---
 intel/intel_decode.c | 5776 ++++++++++++++++++++++++++++----------------------
 1 files changed, 3217 insertions(+), 2559 deletions(-)

diff --git a/intel/intel_decode.c b/intel/intel_decode.c
index 344578b..85e8f37 100644
--- a/intel/intel_decode.c
+++ b/intel/intel_decode.c
@@ -33,8 +33,8 @@
 static FILE *out;
 static uint32_t saved_s2 = 0, saved_s4 = 0;
 static char saved_s2_set = 0, saved_s4_set = 0;
-static uint32_t head_offset = 0xffffffff; /* undefined */
-static uint32_t tail_offset = 0xffffffff; /* undefined */
+static uint32_t head_offset = 0xffffffff;	/* undefined */
+static uint32_t tail_offset = 0xffffffff;	/* undefined */
 
 #ifndef ARRAY_SIZE
 #define ARRAY_SIZE(A) (sizeof(A)/sizeof(A[0]))
@@ -47,1696 +47,2225 @@ static uint32_t tail_offset = 0xffffffff; /* undefined */
     return count;						\
 } while (0)
 
-
-static float
-int_as_float(uint32_t intval)
+static float int_as_float(uint32_t intval)
 {
-    union intfloat {
-	uint32_t i;
-	float f;
-    } uval;
+	union intfloat {
+		uint32_t i;
+		float f;
+	} uval;
 
-    uval.i = intval;
-    return uval.f;
+	uval.i = intval;
+	return uval.f;
 }
 
 static void
-instr_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
+instr_out(uint32_t * data, uint32_t hw_offset, unsigned int index,
 	  char *fmt, ...)
 {
-    va_list va;
-    char *parseinfo;
-    uint32_t offset = hw_offset + index * 4;
-
-    if (offset == head_offset)
-	parseinfo = "HEAD";
-    else if (offset == tail_offset)
-	parseinfo = "TAIL";
-    else
-	parseinfo = "    ";
-
-    fprintf(out, "0x%08x: %s 0x%08x: %s", offset, parseinfo,
-	    data[index],
-	    index == 0 ? "" : "   ");
-    va_start(va, fmt);
-    vfprintf(out, fmt, va);
-    va_end(va);
+	va_list va;
+	char *parseinfo;
+	uint32_t offset = hw_offset + index * 4;
+
+	if (offset == head_offset)
+		parseinfo = "HEAD";
+	else if (offset == tail_offset)
+		parseinfo = "TAIL";
+	else
+		parseinfo = "    ";
+
+	fprintf(out, "0x%08x: %s 0x%08x: %s", offset, parseinfo,
+		data[index], index == 0 ? "" : "   ");
+	va_start(va, fmt);
+	vfprintf(out, fmt, va);
+	va_end(va);
 }
 
 static int
-decode_mi(uint32_t *data, int count, uint32_t hw_offset, int *failures)
+decode_mi(uint32_t * data, int count, uint32_t hw_offset, int *failures)
 {
-    unsigned int opcode, len = -1;
-    char *post_sync_op = "";
-
-    struct {
-	uint32_t opcode;
-	int len_mask;
-	int min_len;
-	int max_len;
-	char *name;
-    } opcodes_mi[] = {
-	{ 0x08, 0, 1, 1, "MI_ARB_ON_OFF" },
-	{ 0x0a, 0, 1, 1, "MI_BATCH_BUFFER_END" },
-	{ 0x30, 0x3f, 3, 3, "MI_BATCH_BUFFER" },
-	{ 0x31, 0x3f, 2, 2, "MI_BATCH_BUFFER_START" },
-	{ 0x14, 0x3f, 3, 3, "MI_DISPLAY_BUFFER_INFO" },
-	{ 0x04, 0, 1, 1, "MI_FLUSH" },
-	{ 0x22, 0x1f, 3, 3, "MI_LOAD_REGISTER_IMM" },
-	{ 0x13, 0x3f, 2, 2, "MI_LOAD_SCAN_LINES_EXCL" },
-	{ 0x12, 0x3f, 2, 2, "MI_LOAD_SCAN_LINES_INCL" },
-	{ 0x00, 0, 1, 1, "MI_NOOP" },
-	{ 0x11, 0x3f, 2, 2, "MI_OVERLAY_FLIP" },
-	{ 0x07, 0, 1, 1, "MI_REPORT_HEAD" },
-	{ 0x18, 0x3f, 2, 2, "MI_SET_CONTEXT" },
-	{ 0x20, 0x3f, 3, 4, "MI_STORE_DATA_IMM" },
-	{ 0x21, 0x3f, 3, 4, "MI_STORE_DATA_INDEX" },
-	{ 0x24, 0x3f, 3, 3, "MI_STORE_REGISTER_MEM" },
-	{ 0x02, 0, 1, 1, "MI_USER_INTERRUPT" },
-	{ 0x03, 0, 1, 1, "MI_WAIT_FOR_EVENT" },
-	{ 0x16, 0x7f, 3, 3, "MI_SEMAPHORE_MBOX" },
-	{ 0x26, 0x1f, 3, 4, "MI_FLUSH_DW" },
-	{ 0x0b, 0, 1, 1, "MI_SUSPEND_FLUSH" },
-    };
-
-    /* check instruction length */
-    for (opcode = 0; opcode < sizeof(opcodes_mi) / sizeof(opcodes_mi[0]);
-	 opcode++) {
-	if ((data[0] & 0x1f800000) >> 23 == opcodes_mi[opcode].opcode) {
-	    len = 1;
-	    if (opcodes_mi[opcode].max_len > 1) {
-		len = (data[0] & opcodes_mi[opcode].len_mask) + 2;
-		if (len < opcodes_mi[opcode].min_len ||
-		    len > opcodes_mi[opcode].max_len)
+	unsigned int opcode, len = -1;
+	char *post_sync_op = "";
+
+	struct {
+		uint32_t opcode;
+		int len_mask;
+		int min_len;
+		int max_len;
+		char *name;
+	} opcodes_mi[] = {
 		{
-		    fprintf(out, "Bad length (%d) in %s, [%d, %d]\n",
-			    len, opcodes_mi[opcode].name,
-			    opcodes_mi[opcode].min_len,
-			    opcodes_mi[opcode].max_len);
+		0x08, 0, 1, 1, "MI_ARB_ON_OFF"}, {
+		0x0a, 0, 1, 1, "MI_BATCH_BUFFER_END"}, {
+		0x30, 0x3f, 3, 3, "MI_BATCH_BUFFER"}, {
+		0x31, 0x3f, 2, 2, "MI_BATCH_BUFFER_START"}, {
+		0x14, 0x3f, 3, 3, "MI_DISPLAY_BUFFER_INFO"}, {
+		0x04, 0, 1, 1, "MI_FLUSH"}, {
+		0x22, 0x1f, 3, 3, "MI_LOAD_REGISTER_IMM"}, {
+		0x13, 0x3f, 2, 2, "MI_LOAD_SCAN_LINES_EXCL"}, {
+		0x12, 0x3f, 2, 2, "MI_LOAD_SCAN_LINES_INCL"}, {
+		0x00, 0, 1, 1, "MI_NOOP"}, {
+		0x11, 0x3f, 2, 2, "MI_OVERLAY_FLIP"}, {
+		0x07, 0, 1, 1, "MI_REPORT_HEAD"}, {
+		0x18, 0x3f, 2, 2, "MI_SET_CONTEXT"}, {
+		0x20, 0x3f, 3, 4, "MI_STORE_DATA_IMM"}, {
+		0x21, 0x3f, 3, 4, "MI_STORE_DATA_INDEX"}, {
+		0x24, 0x3f, 3, 3, "MI_STORE_REGISTER_MEM"}, {
+		0x02, 0, 1, 1, "MI_USER_INTERRUPT"}, {
+		0x03, 0, 1, 1, "MI_WAIT_FOR_EVENT"}, {
+		0x16, 0x7f, 3, 3, "MI_SEMAPHORE_MBOX"}, {
+		0x26, 0x1f, 3, 4, "MI_FLUSH_DW"}, {
+	0x0b, 0, 1, 1, "MI_SUSPEND_FLUSH"},};
+
+	/* check instruction length */
+	for (opcode = 0; opcode < sizeof(opcodes_mi) / sizeof(opcodes_mi[0]);
+	     opcode++) {
+		if ((data[0] & 0x1f800000) >> 23 == opcodes_mi[opcode].opcode) {
+			len = 1;
+			if (opcodes_mi[opcode].max_len > 1) {
+				len =
+				    (data[0] & opcodes_mi[opcode].len_mask) + 2;
+				if (len < opcodes_mi[opcode].min_len
+				    || len > opcodes_mi[opcode].max_len) {
+					fprintf(out,
+						"Bad length (%d) in %s, [%d, %d]\n",
+						len, opcodes_mi[opcode].name,
+						opcodes_mi[opcode].min_len,
+						opcodes_mi[opcode].max_len);
+				}
+			}
+			break;
 		}
-	    }
-	    break;
 	}
-    }
-
-    switch ((data[0] & 0x1f800000) >> 23) {
-    case 0x0a:
-	instr_out(data, hw_offset, 0, "MI_BATCH_BUFFER_END\n");
-	return -1;
-    case 0x16:
-	instr_out(data, hw_offset, 0, "MI_SEMAPHORE_MBOX%s%s%s%s %u\n",
-		  data[0] & (1<<22) ? " global gtt," : "",
-		  data[0] & (1<<21) ? " update semaphore," : "",
-		  data[0] & (1<<20) ? " compare semaphore," : "",
-		  data[0] & (1<<18) ? " use compare reg" : "",
-		  (data[0] & (0x3<<16)) >> 16);
-	instr_out(data, hw_offset, 1, "value\n");
-	instr_out(data, hw_offset, 2, "address\n");
-	return len;
-    case 0x21:
-	instr_out(data, hw_offset, 0, "MI_STORE_DATA_INDEX%s\n",
-		  data[0] & (1<<21) ? " use per-process HWS," : "");
-	instr_out(data, hw_offset, 1, "index\n");
-	instr_out(data, hw_offset, 2, "dword\n");
-	if (len == 4)
-		instr_out(data, hw_offset, 3, "upper dword\n");
-	return len;
-    case 0x00:
-	if (data[0] & (1<<22))
-		instr_out(data, hw_offset, 0, "MI_NOOP write NOPID reg, val=0x%x\n",
-			  data[0] & ((1<<22) - 1));
-	else
-		instr_out(data, hw_offset, 0, "MI_NOOP\n");
-	return len;
-    case 0x26:
-	switch (data[0] & (0x3<<14)) {
-	case (0<<14): post_sync_op = "no write"; break;
-	case (1<<14): post_sync_op = "write data"; break;
-	case (2<<14): post_sync_op = "reserved"; break;
-	case (3<<14): post_sync_op = "write TIMESTAMP"; break;
-	}
-	instr_out(data, hw_offset, 0, "MI_FLUSH_DW%s%s%s%s post_sync_op='%s' %s%s\n",
-		  data[0] & (1<<22) ? " enable protected mem (BCS-only)," : "",
-		  data[0] & (1<<21) ? " store in hws," : "",
-		  data[0] & (1<<18) ? " invalidate tlb," : "",
-		  data[0] & (1<<17) ? " flush gfdt," : "",
-		  post_sync_op,
-		  data[0] & (1<<8) ? " enable notify interrupt," : "",
-		  data[0] & (1<<7) ? " invalidate video state (BCS-only)," : "");
-	if (data[0] & (1<<21))
-		instr_out(data, hw_offset, 1, "hws index\n");
-	else
-		instr_out(data, hw_offset, 1, "address\n");
-	instr_out(data, hw_offset, 2, "dword\n");
-	if (len == 4)
-		instr_out(data, hw_offset, 3, "upper dword\n");
-	return len;
-    }
 
-    for (opcode = 0; opcode < sizeof(opcodes_mi) / sizeof(opcodes_mi[0]);
-	 opcode++) {
-	if ((data[0] & 0x1f800000) >> 23 == opcodes_mi[opcode].opcode) {
+	switch ((data[0] & 0x1f800000) >> 23) {
+	case 0x0a:
+		instr_out(data, hw_offset, 0, "MI_BATCH_BUFFER_END\n");
+		return -1;
+	case 0x16:
+		instr_out(data, hw_offset, 0, "MI_SEMAPHORE_MBOX%s%s%s%s %u\n",
+			  data[0] & (1 << 22) ? " global gtt," : "",
+			  data[0] & (1 << 21) ? " update semaphore," : "",
+			  data[0] & (1 << 20) ? " compare semaphore," : "",
+			  data[0] & (1 << 18) ? " use compare reg" : "",
+			  (data[0] & (0x3 << 16)) >> 16);
+		instr_out(data, hw_offset, 1, "value\n");
+		instr_out(data, hw_offset, 2, "address\n");
+		return len;
+	case 0x21:
+		instr_out(data, hw_offset, 0, "MI_STORE_DATA_INDEX%s\n",
+			  data[0] & (1 << 21) ? " use per-process HWS," : "");
+		instr_out(data, hw_offset, 1, "index\n");
+		instr_out(data, hw_offset, 2, "dword\n");
+		if (len == 4)
+			instr_out(data, hw_offset, 3, "upper dword\n");
+		return len;
+	case 0x00:
+		if (data[0] & (1 << 22))
+			instr_out(data, hw_offset, 0,
+				  "MI_NOOP write NOPID reg, val=0x%x\n",
+				  data[0] & ((1 << 22) - 1));
+		else
+			instr_out(data, hw_offset, 0, "MI_NOOP\n");
+		return len;
+	case 0x26:
+		switch (data[0] & (0x3 << 14)) {
+		case (0 << 14):
+			post_sync_op = "no write";
+			break;
+		case (1 << 14):
+			post_sync_op = "write data";
+			break;
+		case (2 << 14):
+			post_sync_op = "reserved";
+			break;
+		case (3 << 14):
+			post_sync_op = "write TIMESTAMP";
+			break;
+		}
+		instr_out(data, hw_offset, 0,
+			  "MI_FLUSH_DW%s%s%s%s post_sync_op='%s' %s%s\n",
+			  data[0] & (1 << 22) ?
+			  " enable protected mem (BCS-only)," : "",
+			  data[0] & (1 << 21) ? " store in hws," : "",
+			  data[0] & (1 << 18) ? " invalidate tlb," : "",
+			  data[0] & (1 << 17) ? " flush gfdt," : "",
+			  post_sync_op,
+			  data[0] & (1 << 8) ? " enable notify interrupt," : "",
+			  data[0] & (1 << 7) ?
+			  " invalidate video state (BCS-only)," : "");
+		if (data[0] & (1 << 21))
+			instr_out(data, hw_offset, 1, "hws index\n");
+		else
+			instr_out(data, hw_offset, 1, "address\n");
+		instr_out(data, hw_offset, 2, "dword\n");
+		if (len == 4)
+			instr_out(data, hw_offset, 3, "upper dword\n");
+		return len;
+	}
 
-	    instr_out(data, hw_offset, 0, "%s\n", opcodes_mi[opcode].name);
-	    for (int i = 1; i < len; i++) {
-		if (i >= count)
-		    BUFFER_FAIL(count, len, opcodes_mi[opcode].name);
-		instr_out(data, hw_offset, i, "dword %d\n", i);
-	    }
+	for (opcode = 0; opcode < sizeof(opcodes_mi) / sizeof(opcodes_mi[0]);
+	     opcode++) {
+		if ((data[0] & 0x1f800000) >> 23 == opcodes_mi[opcode].opcode) {
+
+			instr_out(data, hw_offset, 0, "%s\n",
+				  opcodes_mi[opcode].name);
+			for (int i = 1; i < len; i++) {
+				if (i >= count)
+					BUFFER_FAIL(count, len,
+						    opcodes_mi[opcode].name);
+				instr_out(data, hw_offset, i, "dword %d\n", i);
+			}
 
-	    return len;
+			return len;
+		}
 	}
-    }
 
-    instr_out(data, hw_offset, 0, "MI UNKNOWN\n");
-    (*failures)++;
-    return 1;
+	instr_out(data, hw_offset, 0, "MI UNKNOWN\n");
+	(*failures)++;
+	return 1;
 }
 
 static void
-decode_2d_br00(uint32_t *data, int count, uint32_t hw_offset, char *cmd)
+decode_2d_br00(uint32_t * data, int count, uint32_t hw_offset, char *cmd)
 {
-    instr_out(data, hw_offset, 0,
-	      "%s (rgb %sabled, alpha %sabled, src tile %d, dst tile %d)\n",
-	      cmd,
-	      (data[count] & (1 << 20)) ? "en" : "dis",
-	      (data[count] & (1 << 21)) ? "en" : "dis",
-	      (data[count] >> 15) & 1,
-	      (data[count] >> 11) & 1);
+	instr_out(data, hw_offset, 0,
+		  "%s (rgb %sabled, alpha %sabled, src tile %d, dst tile %d)\n",
+		  cmd,
+		  (data[count] & (1 << 20)) ? "en" : "dis",
+		  (data[count] & (1 << 21)) ? "en" : "dis",
+		  (data[count] >> 15) & 1, (data[count] >> 11) & 1);
 }
 
-static void
-decode_2d_br01(uint32_t *data, int count, uint32_t hw_offset)
+static void decode_2d_br01(uint32_t * data, int count, uint32_t hw_offset)
 {
-    char *format;
-    switch ((data[count] >> 24) & 0x3) {
-    case 0:
-	format="8";
-	break;
-    case 1:
-	format="565";
-	break;
-    case 2:
-	format="1555";
-	break;
-    case 3:
-	format="8888";
-	break;
-    }
-
-    instr_out(data, hw_offset, count, "format %s, pitch %d, rop 0x%02x, "
-	      "clipping %sabled, %s%s \n",
-
-	      format,
-	      (short)(data[count] & 0xffff),
-	      (data[count] >> 16) &0xff,
-	      data[count] & (1 << 30) ? "en" : "dis",
-	      data[count] & (1 << 31) ? "solid pattern enabled, " : "",
-	      data[count] & (1 << 31) ? "mono pattern transparency enabled, " : "");
+	char *format;
+	switch ((data[count] >> 24) & 0x3) {
+	case 0:
+		format = "8";
+		break;
+	case 1:
+		format = "565";
+		break;
+	case 2:
+		format = "1555";
+		break;
+	case 3:
+		format = "8888";
+		break;
+	}
+
+	instr_out(data, hw_offset, count, "format %s, pitch %d, rop 0x%02x, "
+		  "clipping %sabled, %s%s \n",
+		  format,
+		  (short)(data[count] & 0xffff),
+		  (data[count] >> 16) & 0xff,
+		  data[count] & (1 << 30) ? "en" : "dis",
+		  data[count] & (1 << 31) ? "solid pattern enabled, " : "",
+		  data[count] & (1 << 31) ?
+		  "mono pattern transparency enabled, " : "");
 
 }
 
 static int
-decode_2d(uint32_t *data, int count, uint32_t hw_offset, int *failures)
+decode_2d(uint32_t * data, int count, uint32_t hw_offset, int *failures)
 {
-    unsigned int opcode, len;
-
-    struct {
-	uint32_t opcode;
-	int min_len;
-	int max_len;
-	char *name;
-    } opcodes_2d[] = {
-	{ 0x40, 5, 5, "COLOR_BLT" },
-	{ 0x43, 6, 6, "SRC_COPY_BLT" },
-	{ 0x01, 8, 8, "XY_SETUP_BLT" },
-	{ 0x11, 9, 9, "XY_SETUP_MONO_PATTERN_SL_BLT" },
-	{ 0x03, 3, 3, "XY_SETUP_CLIP_BLT" },
-	{ 0x24, 2, 2, "XY_PIXEL_BLT" },
-	{ 0x25, 3, 3, "XY_SCANLINES_BLT" },
-	{ 0x26, 4, 4, "Y_TEXT_BLT" },
-	{ 0x31, 5, 134, "XY_TEXT_IMMEDIATE_BLT" },
-	{ 0x50, 6, 6, "XY_COLOR_BLT" },
-	{ 0x51, 6, 6, "XY_PAT_BLT" },
-	{ 0x76, 8, 8, "XY_PAT_CHROMA_BLT" },
-	{ 0x72, 7, 135, "XY_PAT_BLT_IMMEDIATE" },
-	{ 0x77, 9, 137, "XY_PAT_CHROMA_BLT_IMMEDIATE" },
-	{ 0x52, 9, 9, "XY_MONO_PAT_BLT" },
-	{ 0x59, 7, 7, "XY_MONO_PAT_FIXED_BLT" },
-	{ 0x53, 8, 8, "XY_SRC_COPY_BLT" },
-	{ 0x54, 8, 8, "XY_MONO_SRC_COPY_BLT" },
-	{ 0x71, 9, 137, "XY_MONO_SRC_COPY_IMMEDIATE_BLT" },
-	{ 0x55, 9, 9, "XY_FULL_BLT" },
-	{ 0x55, 9, 137, "XY_FULL_IMMEDIATE_PATTERN_BLT" },
-	{ 0x56, 9, 9, "XY_FULL_MONO_SRC_BLT" },
-	{ 0x75, 10, 138, "XY_FULL_MONO_SRC_IMMEDIATE_PATTERN_BLT" },
-	{ 0x57, 12, 12, "XY_FULL_MONO_PATTERN_BLT" },
-	{ 0x58, 12, 12, "XY_FULL_MONO_PATTERN_MONO_SRC_BLT" },
-    };
-
-    switch ((data[0] & 0x1fc00000) >> 22) {
-    case 0x25:
-	instr_out(data, hw_offset, 0,
-		  "XY_SCANLINES_BLT (pattern seed (%d, %d), dst tile %d)\n",
-		  (data[0] >> 12) &0x8,
-		  (data[0] >> 8) &0x8,
-		  (data[0] >> 11) & 1);
+	unsigned int opcode, len;
+
+	struct {
+		uint32_t opcode;
+		int min_len;
+		int max_len;
+		char *name;
+	} opcodes_2d[] = {
+		{
+		0x40, 5, 5, "COLOR_BLT"}, {
+		0x43, 6, 6, "SRC_COPY_BLT"}, {
+		0x01, 8, 8, "XY_SETUP_BLT"}, {
+		0x11, 9, 9, "XY_SETUP_MONO_PATTERN_SL_BLT"}, {
+		0x03, 3, 3, "XY_SETUP_CLIP_BLT"}, {
+		0x24, 2, 2, "XY_PIXEL_BLT"}, {
+		0x25, 3, 3, "XY_SCANLINES_BLT"}, {
+		0x26, 4, 4, "Y_TEXT_BLT"}, {
+		0x31, 5, 134, "XY_TEXT_IMMEDIATE_BLT"}, {
+		0x50, 6, 6, "XY_COLOR_BLT"}, {
+		0x51, 6, 6, "XY_PAT_BLT"}, {
+		0x76, 8, 8, "XY_PAT_CHROMA_BLT"}, {
+		0x72, 7, 135, "XY_PAT_BLT_IMMEDIATE"}, {
+		0x77, 9, 137, "XY_PAT_CHROMA_BLT_IMMEDIATE"}, {
+		0x52, 9, 9, "XY_MONO_PAT_BLT"}, {
+		0x59, 7, 7, "XY_MONO_PAT_FIXED_BLT"}, {
+		0x53, 8, 8, "XY_SRC_COPY_BLT"}, {
+		0x54, 8, 8, "XY_MONO_SRC_COPY_BLT"}, {
+		0x71, 9, 137, "XY_MONO_SRC_COPY_IMMEDIATE_BLT"}, {
+		0x55, 9, 9, "XY_FULL_BLT"}, {
+		0x55, 9, 137, "XY_FULL_IMMEDIATE_PATTERN_BLT"}, {
+		0x56, 9, 9, "XY_FULL_MONO_SRC_BLT"}, {
+		0x75, 10, 138, "XY_FULL_MONO_SRC_IMMEDIATE_PATTERN_BLT"}, {
+		0x57, 12, 12, "XY_FULL_MONO_PATTERN_BLT"}, {
+	0x58, 12, 12, "XY_FULL_MONO_PATTERN_MONO_SRC_BLT"},};
+
+	switch ((data[0] & 0x1fc00000) >> 22) {
+	case 0x25:
+		instr_out(data, hw_offset, 0,
+			  "XY_SCANLINES_BLT (pattern seed (%d, %d), dst tile %d)\n",
+			  (data[0] >> 12) & 0x8,
+			  (data[0] >> 8) & 0x8, (data[0] >> 11) & 1);
 
-	len = (data[0] & 0x000000ff) + 2;
-	if (len != 3)
-	    fprintf(out, "Bad count in XY_SCANLINES_BLT\n");
-	if (count < 3)
-	    BUFFER_FAIL(count, len, "XY_SCANLINES_BLT");
+		len = (data[0] & 0x000000ff) + 2;
+		if (len != 3)
+			fprintf(out, "Bad count in XY_SCANLINES_BLT\n");
+		if (count < 3)
+			BUFFER_FAIL(count, len, "XY_SCANLINES_BLT");
+
+		instr_out(data, hw_offset, 1, "dest (%d,%d)\n",
+			  data[1] & 0xffff, data[1] >> 16);
+		instr_out(data, hw_offset, 2, "dest (%d,%d)\n",
+			  data[2] & 0xffff, data[2] >> 16);
+		return len;
+	case 0x01:
+		decode_2d_br00(data, 0, hw_offset, "XY_SETUP_BLT");
 
-	instr_out(data, hw_offset, 1, "dest (%d,%d)\n",
-		  data[1] & 0xffff, data[1] >> 16);
-	instr_out(data, hw_offset, 2, "dest (%d,%d)\n",
-		  data[2] & 0xffff, data[2] >> 16);
-	return len;
-    case 0x01:
-	decode_2d_br00(data, 0, hw_offset, "XY_SETUP_BLT");
-
-	len = (data[0] & 0x000000ff) + 2;
-	if (len != 8)
-	    fprintf(out, "Bad count in XY_SETUP_BLT\n");
-	if (count < 8)
-	    BUFFER_FAIL(count, len, "XY_SETUP_BLT");
-
-	decode_2d_br01(data, 1, hw_offset);
-	instr_out(data, hw_offset, 2, "cliprect (%d,%d)\n",
-		  data[2] & 0xffff, data[2] >> 16);
-	instr_out(data, hw_offset, 3, "cliprect (%d,%d)\n",
-		  data[3] & 0xffff, data[3] >> 16);
-	instr_out(data, hw_offset, 4, "setup dst offset 0x%08x\n", data[4]);
-	instr_out(data, hw_offset, 5, "setup background color\n");
-	instr_out(data, hw_offset, 6, "setup foreground color\n");
-	instr_out(data, hw_offset, 7, "color pattern offset\n");
-	return len;
-    case 0x03:
-	decode_2d_br00(data, 0, hw_offset, "XY_SETUP_CLIP_BLT");
+		len = (data[0] & 0x000000ff) + 2;
+		if (len != 8)
+			fprintf(out, "Bad count in XY_SETUP_BLT\n");
+		if (count < 8)
+			BUFFER_FAIL(count, len, "XY_SETUP_BLT");
+
+		decode_2d_br01(data, 1, hw_offset);
+		instr_out(data, hw_offset, 2, "cliprect (%d,%d)\n",
+			  data[2] & 0xffff, data[2] >> 16);
+		instr_out(data, hw_offset, 3, "cliprect (%d,%d)\n",
+			  data[3] & 0xffff, data[3] >> 16);
+		instr_out(data, hw_offset, 4, "setup dst offset 0x%08x\n",
+			  data[4]);
+		instr_out(data, hw_offset, 5, "setup background color\n");
+		instr_out(data, hw_offset, 6, "setup foreground color\n");
+		instr_out(data, hw_offset, 7, "color pattern offset\n");
+		return len;
+	case 0x03:
+		decode_2d_br00(data, 0, hw_offset, "XY_SETUP_CLIP_BLT");
 
-	len = (data[0] & 0x000000ff) + 2;
-	if (len != 3)
-	    fprintf(out, "Bad count in XY_SETUP_CLIP_BLT\n");
-	if (count < 3)
-	    BUFFER_FAIL(count, len, "XY_SETUP_CLIP_BLT");
+		len = (data[0] & 0x000000ff) + 2;
+		if (len != 3)
+			fprintf(out, "Bad count in XY_SETUP_CLIP_BLT\n");
+		if (count < 3)
+			BUFFER_FAIL(count, len, "XY_SETUP_CLIP_BLT");
+
+		instr_out(data, hw_offset, 1, "cliprect (%d,%d)\n",
+			  data[1] & 0xffff, data[2] >> 16);
+		instr_out(data, hw_offset, 2, "cliprect (%d,%d)\n",
+			  data[2] & 0xffff, data[3] >> 16);
+		return len;
+	case 0x11:
+		decode_2d_br00(data, 0, hw_offset,
+			       "XY_SETUP_MONO_PATTERN_SL_BLT");
 
-	instr_out(data, hw_offset, 1, "cliprect (%d,%d)\n",
-		  data[1] & 0xffff, data[2] >> 16);
-	instr_out(data, hw_offset, 2, "cliprect (%d,%d)\n",
-		  data[2] & 0xffff, data[3] >> 16);
-	return len;
-    case 0x11:
-	decode_2d_br00(data, 0, hw_offset, "XY_SETUP_MONO_PATTERN_SL_BLT");
-
-	len = (data[0] & 0x000000ff) + 2;
-	if (len != 9)
-	    fprintf(out, "Bad count in XY_SETUP_MONO_PATTERN_SL_BLT\n");
-	if (count < 9)
-	    BUFFER_FAIL(count, len, "XY_SETUP_MONO_PATTERN_SL_BLT");
-
-	decode_2d_br01(data, 1, hw_offset);
-	instr_out(data, hw_offset, 2, "cliprect (%d,%d)\n",
-		  data[2] & 0xffff, data[2] >> 16);
-	instr_out(data, hw_offset, 3, "cliprect (%d,%d)\n",
-		  data[3] & 0xffff, data[3] >> 16);
-	instr_out(data, hw_offset, 4, "setup dst offset 0x%08x\n", data[4]);
-	instr_out(data, hw_offset, 5, "setup background color\n");
-	instr_out(data, hw_offset, 6, "setup foreground color\n");
-	instr_out(data, hw_offset, 7, "mono pattern dw0\n");
-	instr_out(data, hw_offset, 8, "mono pattern dw1\n");
-	return len;
-    case 0x50:
-	decode_2d_br00(data, 0, hw_offset, "XY_COLOR_BLT");
-
-	len = (data[0] & 0x000000ff) + 2;
-	if (len != 6)
-	    fprintf(out, "Bad count in XY_COLOR_BLT\n");
-	if (count < 6)
-	    BUFFER_FAIL(count, len, "XY_COLOR_BLT");
-
-	decode_2d_br01(data, 1, hw_offset);
-	instr_out(data, hw_offset, 2, "(%d,%d)\n",
-		  data[2] & 0xffff, data[2] >> 16);
-	instr_out(data, hw_offset, 3, "(%d,%d)\n",
-		  data[3] & 0xffff, data[3] >> 16);
-	instr_out(data, hw_offset, 4, "offset 0x%08x\n", data[4]);
-	instr_out(data, hw_offset, 5, "color\n");
-	return len;
-    case 0x53:
-	decode_2d_br00(data, 0, hw_offset, "XY_SRC_COPY_BLT");
-
-	len = (data[0] & 0x000000ff) + 2;
-	if (len != 8)
-	    fprintf(out, "Bad count in XY_SRC_COPY_BLT\n");
-	if (count < 8)
-	    BUFFER_FAIL(count, len, "XY_SRC_COPY_BLT");
-
-	decode_2d_br01(data, 1, hw_offset);
-	instr_out(data, hw_offset, 2, "dst (%d,%d)\n",
-		  data[2] & 0xffff, data[2] >> 16);
-	instr_out(data, hw_offset, 3, "dst (%d,%d)\n",
-		  data[3] & 0xffff, data[3] >> 16);
-	instr_out(data, hw_offset, 4, "dst offset 0x%08x\n", data[4]);
-	instr_out(data, hw_offset, 5, "src (%d,%d)\n",
-		  data[5] & 0xffff, data[5] >> 16);
-	instr_out(data, hw_offset, 6, "src pitch %d\n",
-		  (short)(data[6] & 0xffff));
-	instr_out(data, hw_offset, 7, "src offset 0x%08x\n", data[7]);
-	return len;
-    }
+		len = (data[0] & 0x000000ff) + 2;
+		if (len != 9)
+			fprintf(out,
+				"Bad count in XY_SETUP_MONO_PATTERN_SL_BLT\n");
+		if (count < 9)
+			BUFFER_FAIL(count, len, "XY_SETUP_MONO_PATTERN_SL_BLT");
+
+		decode_2d_br01(data, 1, hw_offset);
+		instr_out(data, hw_offset, 2, "cliprect (%d,%d)\n",
+			  data[2] & 0xffff, data[2] >> 16);
+		instr_out(data, hw_offset, 3, "cliprect (%d,%d)\n",
+			  data[3] & 0xffff, data[3] >> 16);
+		instr_out(data, hw_offset, 4, "setup dst offset 0x%08x\n",
+			  data[4]);
+		instr_out(data, hw_offset, 5, "setup background color\n");
+		instr_out(data, hw_offset, 6, "setup foreground color\n");
+		instr_out(data, hw_offset, 7, "mono pattern dw0\n");
+		instr_out(data, hw_offset, 8, "mono pattern dw1\n");
+		return len;
+	case 0x50:
+		decode_2d_br00(data, 0, hw_offset, "XY_COLOR_BLT");
 
-    for (opcode = 0; opcode < sizeof(opcodes_2d) / sizeof(opcodes_2d[0]);
-	 opcode++) {
-	if ((data[0] & 0x1fc00000) >> 22 == opcodes_2d[opcode].opcode) {
-	    unsigned int i;
+		len = (data[0] & 0x000000ff) + 2;
+		if (len != 6)
+			fprintf(out, "Bad count in XY_COLOR_BLT\n");
+		if (count < 6)
+			BUFFER_FAIL(count, len, "XY_COLOR_BLT");
+
+		decode_2d_br01(data, 1, hw_offset);
+		instr_out(data, hw_offset, 2, "(%d,%d)\n",
+			  data[2] & 0xffff, data[2] >> 16);
+		instr_out(data, hw_offset, 3, "(%d,%d)\n",
+			  data[3] & 0xffff, data[3] >> 16);
+		instr_out(data, hw_offset, 4, "offset 0x%08x\n", data[4]);
+		instr_out(data, hw_offset, 5, "color\n");
+		return len;
+	case 0x53:
+		decode_2d_br00(data, 0, hw_offset, "XY_SRC_COPY_BLT");
 
-	    len = 1;
-	    instr_out(data, hw_offset, 0, "%s\n", opcodes_2d[opcode].name);
-	    if (opcodes_2d[opcode].max_len > 1) {
 		len = (data[0] & 0x000000ff) + 2;
-		if (len < opcodes_2d[opcode].min_len ||
-		    len > opcodes_2d[opcode].max_len)
-		{
-		    fprintf(out, "Bad count in %s\n", opcodes_2d[opcode].name);
-		}
-	    }
+		if (len != 8)
+			fprintf(out, "Bad count in XY_SRC_COPY_BLT\n");
+		if (count < 8)
+			BUFFER_FAIL(count, len, "XY_SRC_COPY_BLT");
+
+		decode_2d_br01(data, 1, hw_offset);
+		instr_out(data, hw_offset, 2, "dst (%d,%d)\n",
+			  data[2] & 0xffff, data[2] >> 16);
+		instr_out(data, hw_offset, 3, "dst (%d,%d)\n",
+			  data[3] & 0xffff, data[3] >> 16);
+		instr_out(data, hw_offset, 4, "dst offset 0x%08x\n", data[4]);
+		instr_out(data, hw_offset, 5, "src (%d,%d)\n",
+			  data[5] & 0xffff, data[5] >> 16);
+		instr_out(data, hw_offset, 6, "src pitch %d\n",
+			  (short)(data[6] & 0xffff));
+		instr_out(data, hw_offset, 7, "src offset 0x%08x\n", data[7]);
+		return len;
+	}
+
+	for (opcode = 0; opcode < sizeof(opcodes_2d) / sizeof(opcodes_2d[0]);
+	     opcode++) {
+		if ((data[0] & 0x1fc00000) >> 22 == opcodes_2d[opcode].opcode) {
+			unsigned int i;
+
+			len = 1;
+			instr_out(data, hw_offset, 0, "%s\n",
+				  opcodes_2d[opcode].name);
+			if (opcodes_2d[opcode].max_len > 1) {
+				len = (data[0] & 0x000000ff) + 2;
+				if (len < opcodes_2d[opcode].min_len ||
+				    len > opcodes_2d[opcode].max_len) {
+					fprintf(out, "Bad count in %s\n",
+						opcodes_2d[opcode].name);
+				}
+			}
 
-	    for (i = 1; i < len; i++) {
-		if (i >= count)
-		    BUFFER_FAIL(count, len, opcodes_2d[opcode].name);
-		instr_out(data, hw_offset, i, "dword %d\n", i);
-	    }
+			for (i = 1; i < len; i++) {
+				if (i >= count)
+					BUFFER_FAIL(count, len,
+						    opcodes_2d[opcode].name);
+				instr_out(data, hw_offset, i, "dword %d\n", i);
+			}
 
-	    return len;
+			return len;
+		}
 	}
-    }
 
-    instr_out(data, hw_offset, 0, "2D UNKNOWN\n");
-    (*failures)++;
-    return 1;
+	instr_out(data, hw_offset, 0, "2D UNKNOWN\n");
+	(*failures)++;
+	return 1;
 }
 
 static int
-decode_3d_1c(uint32_t *data, int count, uint32_t hw_offset, int *failures)
+decode_3d_1c(uint32_t * data, int count, uint32_t hw_offset, int *failures)
 {
-    uint32_t opcode;
+	uint32_t opcode;
 
-    opcode = (data[0] & 0x00f80000) >> 19;
+	opcode = (data[0] & 0x00f80000) >> 19;
 
-    switch (opcode) {
-    case 0x11:
-	instr_out(data, hw_offset, 0, "3DSTATE_DEPTH_SUBRECTANGLE_DISABLE\n");
-	return 1;
-    case 0x10:
-	instr_out(data, hw_offset, 0, "3DSTATE_SCISSOR_ENABLE %s\n",
-		data[0]&1?"enabled":"disabled");
-	return 1;
-    case 0x01:
-	instr_out(data, hw_offset, 0, "3DSTATE_MAP_COORD_SET_I830\n");
-	return 1;
-    case 0x0a:
-	instr_out(data, hw_offset, 0, "3DSTATE_MAP_CUBE_I830\n");
-	return 1;
-    case 0x05:
-	instr_out(data, hw_offset, 0, "3DSTATE_MAP_TEX_STREAM_I830\n");
-	return 1;
-    }
+	switch (opcode) {
+	case 0x11:
+		instr_out(data, hw_offset, 0,
+			  "3DSTATE_DEPTH_SUBRECTANGLE_DISABLE\n");
+		return 1;
+	case 0x10:
+		instr_out(data, hw_offset, 0, "3DSTATE_SCISSOR_ENABLE %s\n",
+			  data[0] & 1 ? "enabled" : "disabled");
+		return 1;
+	case 0x01:
+		instr_out(data, hw_offset, 0, "3DSTATE_MAP_COORD_SET_I830\n");
+		return 1;
+	case 0x0a:
+		instr_out(data, hw_offset, 0, "3DSTATE_MAP_CUBE_I830\n");
+		return 1;
+	case 0x05:
+		instr_out(data, hw_offset, 0, "3DSTATE_MAP_TEX_STREAM_I830\n");
+		return 1;
+	}
 
-    instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d_1c opcode = 0x%x\n",
-	      opcode);
-    (*failures)++;
-    return 1;
+	instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d_1c opcode = 0x%x\n",
+		  opcode);
+	(*failures)++;
+	return 1;
 }
 
 /** Sets the string dstname to describe the destination of the PS instruction */
 static void
-i915_get_instruction_dst(uint32_t *data, int i, char *dstname, int do_mask)
+i915_get_instruction_dst(uint32_t * data, int i, char *dstname, int do_mask)
 {
-    uint32_t a0 = data[i];
-    int dst_nr = (a0 >> 14) & 0xf;
-    char dstmask[8];
-    char *sat;
-
-    if (do_mask) {
-	if (((a0 >> 10) & 0xf) == 0xf) {
-	    dstmask[0] = 0;
+	uint32_t a0 = data[i];
+	int dst_nr = (a0 >> 14) & 0xf;
+	char dstmask[8];
+	char *sat;
+
+	if (do_mask) {
+		if (((a0 >> 10) & 0xf) == 0xf) {
+			dstmask[0] = 0;
+		} else {
+			int dstmask_index = 0;
+
+			dstmask[dstmask_index++] = '.';
+			if (a0 & (1 << 10))
+				dstmask[dstmask_index++] = 'x';
+			if (a0 & (1 << 11))
+				dstmask[dstmask_index++] = 'y';
+			if (a0 & (1 << 12))
+				dstmask[dstmask_index++] = 'z';
+			if (a0 & (1 << 13))
+				dstmask[dstmask_index++] = 'w';
+			dstmask[dstmask_index++] = 0;
+		}
+
+		if (a0 & (1 << 22))
+			sat = ".sat";
+		else
+			sat = "";
 	} else {
-	    int dstmask_index = 0;
-
-	    dstmask[dstmask_index++] = '.';
-	    if (a0 & (1 << 10))
-		dstmask[dstmask_index++] = 'x';
-	    if (a0 & (1 << 11))
-		dstmask[dstmask_index++] = 'y';
-	    if (a0 & (1 << 12))
-		dstmask[dstmask_index++] = 'z';
-	    if (a0 & (1 << 13))
-		dstmask[dstmask_index++] = 'w';
-	    dstmask[dstmask_index++] = 0;
+		dstmask[0] = 0;
+		sat = "";
 	}
 
-	if (a0 & (1 << 22))
-	    sat = ".sat";
-	else
-	    sat = "";
-    } else {
-	dstmask[0] = 0;
-	sat = "";
-    }
-
-    switch ((a0 >> 19) & 0x7) {
-    case 0:
-	if (dst_nr > 15)
-	    fprintf(out, "bad destination reg R%d\n", dst_nr);
-	sprintf(dstname, "R%d%s%s", dst_nr, dstmask, sat);
-	break;
-    case 4:
-	if (dst_nr > 0)
-	    fprintf(out, "bad destination reg oC%d\n", dst_nr);
-	sprintf(dstname, "oC%s%s", dstmask, sat);
-	break;
-    case 5:
-	if (dst_nr > 0)
-	    fprintf(out, "bad destination reg oD%d\n", dst_nr);
-	sprintf(dstname, "oD%s%s",  dstmask, sat);
-	break;
-    case 6:
-	if (dst_nr > 3)
-	    fprintf(out, "bad destination reg U%d\n", dst_nr);
-	sprintf(dstname, "U%d%s%s", dst_nr, dstmask, sat);
-	break;
-    default:
-	sprintf(dstname, "RESERVED");
-	break;
-    }
+	switch ((a0 >> 19) & 0x7) {
+	case 0:
+		if (dst_nr > 15)
+			fprintf(out, "bad destination reg R%d\n", dst_nr);
+		sprintf(dstname, "R%d%s%s", dst_nr, dstmask, sat);
+		break;
+	case 4:
+		if (dst_nr > 0)
+			fprintf(out, "bad destination reg oC%d\n", dst_nr);
+		sprintf(dstname, "oC%s%s", dstmask, sat);
+		break;
+	case 5:
+		if (dst_nr > 0)
+			fprintf(out, "bad destination reg oD%d\n", dst_nr);
+		sprintf(dstname, "oD%s%s", dstmask, sat);
+		break;
+	case 6:
+		if (dst_nr > 3)
+			fprintf(out, "bad destination reg U%d\n", dst_nr);
+		sprintf(dstname, "U%d%s%s", dst_nr, dstmask, sat);
+		break;
+	default:
+		sprintf(dstname, "RESERVED");
+		break;
+	}
 }
 
-static char *
-i915_get_channel_swizzle(uint32_t select)
+static char *i915_get_channel_swizzle(uint32_t select)
 {
-    switch (select & 0x7) {
-    case 0:
-	return (select & 8) ? "-x" : "x";
-    case 1:
-	return (select & 8) ? "-y" : "y";
-    case 2:
-	return (select & 8) ? "-z" : "z";
-    case 3:
-	return (select & 8) ? "-w" : "w";
-    case 4:
-	return (select & 8) ? "-0" : "0";
-    case 5:
-	return (select & 8) ? "-1" : "1";
-    default:
-	return (select & 8) ? "-bad" : "bad";
-    }
+	switch (select & 0x7) {
+	case 0:
+		return (select & 8) ? "-x" : "x";
+	case 1:
+		return (select & 8) ? "-y" : "y";
+	case 2:
+		return (select & 8) ? "-z" : "z";
+	case 3:
+		return (select & 8) ? "-w" : "w";
+	case 4:
+		return (select & 8) ? "-0" : "0";
+	case 5:
+		return (select & 8) ? "-1" : "1";
+	default:
+		return (select & 8) ? "-bad" : "bad";
+	}
 }
 
 static void
 i915_get_instruction_src_name(uint32_t src_type, uint32_t src_nr, char *name)
 {
-    switch (src_type) {
-    case 0:
-	sprintf(name, "R%d", src_nr);
-	if (src_nr > 15)
-	    fprintf(out, "bad src reg %s\n", name);
-	break;
-    case 1:
-	if (src_nr < 8)
-	    sprintf(name, "T%d", src_nr);
-	else if (src_nr == 8)
-	    sprintf(name, "DIFFUSE");
-	else if (src_nr == 9)
-	    sprintf(name, "SPECULAR");
-	else if (src_nr == 10)
-	    sprintf(name, "FOG");
-	else {
-	    fprintf(out, "bad src reg T%d\n", src_nr);
-	    sprintf(name, "RESERVED");
+	switch (src_type) {
+	case 0:
+		sprintf(name, "R%d", src_nr);
+		if (src_nr > 15)
+			fprintf(out, "bad src reg %s\n", name);
+		break;
+	case 1:
+		if (src_nr < 8)
+			sprintf(name, "T%d", src_nr);
+		else if (src_nr == 8)
+			sprintf(name, "DIFFUSE");
+		else if (src_nr == 9)
+			sprintf(name, "SPECULAR");
+		else if (src_nr == 10)
+			sprintf(name, "FOG");
+		else {
+			fprintf(out, "bad src reg T%d\n", src_nr);
+			sprintf(name, "RESERVED");
+		}
+		break;
+	case 2:
+		sprintf(name, "C%d", src_nr);
+		if (src_nr > 31)
+			fprintf(out, "bad src reg %s\n", name);
+		break;
+	case 4:
+		sprintf(name, "oC");
+		if (src_nr > 0)
+			fprintf(out, "bad src reg oC%d\n", src_nr);
+		break;
+	case 5:
+		sprintf(name, "oD");
+		if (src_nr > 0)
+			fprintf(out, "bad src reg oD%d\n", src_nr);
+		break;
+	case 6:
+		sprintf(name, "U%d", src_nr);
+		if (src_nr > 3)
+			fprintf(out, "bad src reg %s\n", name);
+		break;
+	default:
+		fprintf(out, "bad src reg type %d\n", src_type);
+		sprintf(name, "RESERVED");
+		break;
 	}
-	break;
-    case 2:
-	sprintf(name, "C%d", src_nr);
-	if (src_nr > 31)
-	    fprintf(out, "bad src reg %s\n", name);
-	break;
-    case 4:
-	sprintf(name, "oC");
-	if (src_nr > 0)
-	    fprintf(out, "bad src reg oC%d\n", src_nr);
-	break;
-    case 5:
-	sprintf(name, "oD");
-	if (src_nr > 0)
-	    fprintf(out, "bad src reg oD%d\n", src_nr);
-	break;
-    case 6:
-	sprintf(name, "U%d", src_nr);
-	if (src_nr > 3)
-	    fprintf(out, "bad src reg %s\n", name);
-	break;
-    default:
-	fprintf(out, "bad src reg type %d\n", src_type);
-	sprintf(name, "RESERVED");
-	break;
-    }
 }
 
-static void
-i915_get_instruction_src0(uint32_t *data, int i, char *srcname)
+static void i915_get_instruction_src0(uint32_t * data, int i, char *srcname)
 {
-    uint32_t a0 = data[i];
-    uint32_t a1 = data[i + 1];
-    int src_nr = (a0 >> 2) & 0x1f;
-    char *swizzle_x = i915_get_channel_swizzle((a1 >> 28) & 0xf);
-    char *swizzle_y = i915_get_channel_swizzle((a1 >> 24) & 0xf);
-    char *swizzle_z = i915_get_channel_swizzle((a1 >> 20) & 0xf);
-    char *swizzle_w = i915_get_channel_swizzle((a1 >> 16) & 0xf);
-    char swizzle[100];
-
-    i915_get_instruction_src_name((a0 >> 7) & 0x7, src_nr, srcname);
-    sprintf(swizzle, ".%s%s%s%s", swizzle_x, swizzle_y, swizzle_z, swizzle_w);
-    if (strcmp(swizzle, ".xyzw") != 0)
-	strcat(srcname, swizzle);
+	uint32_t a0 = data[i];
+	uint32_t a1 = data[i + 1];
+	int src_nr = (a0 >> 2) & 0x1f;
+	char *swizzle_x = i915_get_channel_swizzle((a1 >> 28) & 0xf);
+	char *swizzle_y = i915_get_channel_swizzle((a1 >> 24) & 0xf);
+	char *swizzle_z = i915_get_channel_swizzle((a1 >> 20) & 0xf);
+	char *swizzle_w = i915_get_channel_swizzle((a1 >> 16) & 0xf);
+	char swizzle[100];
+
+	i915_get_instruction_src_name((a0 >> 7) & 0x7, src_nr, srcname);
+	sprintf(swizzle, ".%s%s%s%s", swizzle_x, swizzle_y, swizzle_z,
+		swizzle_w);
+	if (strcmp(swizzle, ".xyzw") != 0)
+		strcat(srcname, swizzle);
 }
 
-static void
-i915_get_instruction_src1(uint32_t *data, int i, char *srcname)
+static void i915_get_instruction_src1(uint32_t * data, int i, char *srcname)
 {
-    uint32_t a1 = data[i + 1];
-    uint32_t a2 = data[i + 2];
-    int src_nr = (a1 >> 8) & 0x1f;
-    char *swizzle_x = i915_get_channel_swizzle((a1 >> 4) & 0xf);
-    char *swizzle_y = i915_get_channel_swizzle((a1 >> 0) & 0xf);
-    char *swizzle_z = i915_get_channel_swizzle((a2 >> 28) & 0xf);
-    char *swizzle_w = i915_get_channel_swizzle((a2 >> 24) & 0xf);
-    char swizzle[100];
-
-    i915_get_instruction_src_name((a1 >> 13) & 0x7, src_nr, srcname);
-    sprintf(swizzle, ".%s%s%s%s", swizzle_x, swizzle_y, swizzle_z, swizzle_w);
-    if (strcmp(swizzle, ".xyzw") != 0)
-	strcat(srcname, swizzle);
+	uint32_t a1 = data[i + 1];
+	uint32_t a2 = data[i + 2];
+	int src_nr = (a1 >> 8) & 0x1f;
+	char *swizzle_x = i915_get_channel_swizzle((a1 >> 4) & 0xf);
+	char *swizzle_y = i915_get_channel_swizzle((a1 >> 0) & 0xf);
+	char *swizzle_z = i915_get_channel_swizzle((a2 >> 28) & 0xf);
+	char *swizzle_w = i915_get_channel_swizzle((a2 >> 24) & 0xf);
+	char swizzle[100];
+
+	i915_get_instruction_src_name((a1 >> 13) & 0x7, src_nr, srcname);
+	sprintf(swizzle, ".%s%s%s%s", swizzle_x, swizzle_y, swizzle_z,
+		swizzle_w);
+	if (strcmp(swizzle, ".xyzw") != 0)
+		strcat(srcname, swizzle);
 }
 
-static void
-i915_get_instruction_src2(uint32_t *data, int i, char *srcname)
+static void i915_get_instruction_src2(uint32_t * data, int i, char *srcname)
 {
-    uint32_t a2 = data[i + 2];
-    int src_nr = (a2 >> 16) & 0x1f;
-    char *swizzle_x = i915_get_channel_swizzle((a2 >> 12) & 0xf);
-    char *swizzle_y = i915_get_channel_swizzle((a2 >> 8) & 0xf);
-    char *swizzle_z = i915_get_channel_swizzle((a2 >> 4) & 0xf);
-    char *swizzle_w = i915_get_channel_swizzle((a2 >> 0) & 0xf);
-    char swizzle[100];
-
-    i915_get_instruction_src_name((a2 >> 21) & 0x7, src_nr, srcname);
-    sprintf(swizzle, ".%s%s%s%s", swizzle_x, swizzle_y, swizzle_z, swizzle_w);
-    if (strcmp(swizzle, ".xyzw") != 0)
-	strcat(srcname, swizzle);
+	uint32_t a2 = data[i + 2];
+	int src_nr = (a2 >> 16) & 0x1f;
+	char *swizzle_x = i915_get_channel_swizzle((a2 >> 12) & 0xf);
+	char *swizzle_y = i915_get_channel_swizzle((a2 >> 8) & 0xf);
+	char *swizzle_z = i915_get_channel_swizzle((a2 >> 4) & 0xf);
+	char *swizzle_w = i915_get_channel_swizzle((a2 >> 0) & 0xf);
+	char swizzle[100];
+
+	i915_get_instruction_src_name((a2 >> 21) & 0x7, src_nr, srcname);
+	sprintf(swizzle, ".%s%s%s%s", swizzle_x, swizzle_y, swizzle_z,
+		swizzle_w);
+	if (strcmp(swizzle, ".xyzw") != 0)
+		strcat(srcname, swizzle);
 }
 
 static void
 i915_get_instruction_addr(uint32_t src_type, uint32_t src_nr, char *name)
 {
-    switch (src_type) {
-    case 0:
-	sprintf(name, "R%d", src_nr);
-	if (src_nr > 15)
-	    fprintf(out, "bad src reg %s\n", name);
-	break;
-    case 1:
-	if (src_nr < 8)
-	    sprintf(name, "T%d", src_nr);
-	else if (src_nr == 8)
-	    sprintf(name, "DIFFUSE");
-	else if (src_nr == 9)
-	    sprintf(name, "SPECULAR");
-	else if (src_nr == 10)
-	    sprintf(name, "FOG");
-	else {
-	    fprintf(out, "bad src reg T%d\n", src_nr);
-	    sprintf(name, "RESERVED");
+	switch (src_type) {
+	case 0:
+		sprintf(name, "R%d", src_nr);
+		if (src_nr > 15)
+			fprintf(out, "bad src reg %s\n", name);
+		break;
+	case 1:
+		if (src_nr < 8)
+			sprintf(name, "T%d", src_nr);
+		else if (src_nr == 8)
+			sprintf(name, "DIFFUSE");
+		else if (src_nr == 9)
+			sprintf(name, "SPECULAR");
+		else if (src_nr == 10)
+			sprintf(name, "FOG");
+		else {
+			fprintf(out, "bad src reg T%d\n", src_nr);
+			sprintf(name, "RESERVED");
+		}
+		break;
+	case 4:
+		sprintf(name, "oC");
+		if (src_nr > 0)
+			fprintf(out, "bad src reg oC%d\n", src_nr);
+		break;
+	case 5:
+		sprintf(name, "oD");
+		if (src_nr > 0)
+			fprintf(out, "bad src reg oD%d\n", src_nr);
+		break;
+	default:
+		fprintf(out, "bad src reg type %d\n", src_type);
+		sprintf(name, "RESERVED");
+		break;
 	}
-	break;
-    case 4:
-	sprintf(name, "oC");
-	if (src_nr > 0)
-	    fprintf(out, "bad src reg oC%d\n", src_nr);
-	break;
-    case 5:
-	sprintf(name, "oD");
-	if (src_nr > 0)
-	    fprintf(out, "bad src reg oD%d\n", src_nr);
-	break;
-    default:
-	fprintf(out, "bad src reg type %d\n", src_type);
-	sprintf(name, "RESERVED");
-	break;
-    }
 }
 
 static void
-i915_decode_alu1(uint32_t *data, uint32_t hw_offset,
+i915_decode_alu1(uint32_t * data, uint32_t hw_offset,
 		 int i, char *instr_prefix, char *op_name)
 {
-    char dst[100], src0[100];
+	char dst[100], src0[100];
 
-    i915_get_instruction_dst(data, i, dst, 1);
-    i915_get_instruction_src0(data, i, src0);
+	i915_get_instruction_dst(data, i, dst, 1);
+	i915_get_instruction_src0(data, i, src0);
 
-    instr_out(data, hw_offset, i++, "%s: %s %s, %s\n", instr_prefix,
-	      op_name, dst, src0);
-    instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
-    instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+	instr_out(data, hw_offset, i++, "%s: %s %s, %s\n", instr_prefix,
+		  op_name, dst, src0);
+	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
 }
 
 static void
-i915_decode_alu2(uint32_t *data, uint32_t hw_offset,
+i915_decode_alu2(uint32_t * data, uint32_t hw_offset,
 		 int i, char *instr_prefix, char *op_name)
 {
-    char dst[100], src0[100], src1[100];
+	char dst[100], src0[100], src1[100];
 
-    i915_get_instruction_dst(data, i, dst, 1);
-    i915_get_instruction_src0(data, i, src0);
-    i915_get_instruction_src1(data, i, src1);
+	i915_get_instruction_dst(data, i, dst, 1);
+	i915_get_instruction_src0(data, i, src0);
+	i915_get_instruction_src1(data, i, src1);
 
-    instr_out(data, hw_offset, i++, "%s: %s %s, %s, %s\n", instr_prefix,
-	      op_name, dst, src0, src1);
-    instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
-    instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+	instr_out(data, hw_offset, i++, "%s: %s %s, %s, %s\n", instr_prefix,
+		  op_name, dst, src0, src1);
+	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
 }
 
 static void
-i915_decode_alu3(uint32_t *data, uint32_t hw_offset,
+i915_decode_alu3(uint32_t * data, uint32_t hw_offset,
 		 int i, char *instr_prefix, char *op_name)
 {
-    char dst[100], src0[100], src1[100], src2[100];
+	char dst[100], src0[100], src1[100], src2[100];
 
-    i915_get_instruction_dst(data, i, dst, 1);
-    i915_get_instruction_src0(data, i, src0);
-    i915_get_instruction_src1(data, i, src1);
-    i915_get_instruction_src2(data, i, src2);
+	i915_get_instruction_dst(data, i, dst, 1);
+	i915_get_instruction_src0(data, i, src0);
+	i915_get_instruction_src1(data, i, src1);
+	i915_get_instruction_src2(data, i, src2);
 
-    instr_out(data, hw_offset, i++, "%s: %s %s, %s, %s, %s\n", instr_prefix,
-	      op_name, dst, src0, src1, src2);
-    instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
-    instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+	instr_out(data, hw_offset, i++, "%s: %s %s, %s, %s, %s\n", instr_prefix,
+		  op_name, dst, src0, src1, src2);
+	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
 }
 
 static void
-i915_decode_tex(uint32_t *data, uint32_t hw_offset, int i, char *instr_prefix,
+i915_decode_tex(uint32_t * data, uint32_t hw_offset, int i, char *instr_prefix,
 		char *tex_name)
 {
-    uint32_t t0 = data[i];
-    uint32_t t1 = data[i + 1];
-    char dst_name[100];
-    char addr_name[100];
-    int sampler_nr;
-
-    i915_get_instruction_dst(data, i, dst_name, 0);
-    i915_get_instruction_addr((t1 >> 24) & 0x7,
-			      (t1 >> 17) & 0xf,
-			      addr_name);
-    sampler_nr = t0 & 0xf;
-
-    instr_out(data, hw_offset, i++, "%s: %s %s, S%d, %s\n", instr_prefix,
-	      tex_name, dst_name, sampler_nr, addr_name);
-    instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
-    instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+	uint32_t t0 = data[i];
+	uint32_t t1 = data[i + 1];
+	char dst_name[100];
+	char addr_name[100];
+	int sampler_nr;
+
+	i915_get_instruction_dst(data, i, dst_name, 0);
+	i915_get_instruction_addr((t1 >> 24) & 0x7,
+				  (t1 >> 17) & 0xf, addr_name);
+	sampler_nr = t0 & 0xf;
+
+	instr_out(data, hw_offset, i++, "%s: %s %s, S%d, %s\n", instr_prefix,
+		  tex_name, dst_name, sampler_nr, addr_name);
+	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
 }
 
 static void
-i915_decode_dcl(uint32_t *data, uint32_t hw_offset, int i, char *instr_prefix)
+i915_decode_dcl(uint32_t * data, uint32_t hw_offset, int i, char *instr_prefix)
 {
-    uint32_t d0 = data[i];
-    char *sampletype;
-    int dcl_nr = (d0 >> 14) & 0xf;
-    char *dcl_x = d0 & (1 << 10) ? "x" : "";
-    char *dcl_y = d0 & (1 << 11) ? "y" : "";
-    char *dcl_z = d0 & (1 << 12) ? "z" : "";
-    char *dcl_w = d0 & (1 << 13) ? "w" : "";
-    char dcl_mask[10];
-
-    switch ((d0 >> 19) & 0x3) {
-    case 1:
-	sprintf(dcl_mask, ".%s%s%s%s", dcl_x, dcl_y, dcl_z, dcl_w);
-	if (strcmp(dcl_mask, ".") == 0)
-	    fprintf(out, "bad (empty) dcl mask\n");
-
-	if (dcl_nr > 10)
-	    fprintf(out, "bad T%d dcl register number\n", dcl_nr);
-	if (dcl_nr < 8) {
-	    if (strcmp(dcl_mask, ".x") != 0 &&
-		strcmp(dcl_mask, ".xy") != 0 &&
-		strcmp(dcl_mask, ".xz") != 0 &&
-		strcmp(dcl_mask, ".w") != 0 &&
-		strcmp(dcl_mask, ".xyzw") != 0) {
-		fprintf(out, "bad T%d.%s dcl mask\n", dcl_nr, dcl_mask);
-	    }
-	    instr_out(data, hw_offset, i++, "%s: DCL T%d%s\n", instr_prefix,
-		      dcl_nr, dcl_mask);
-	} else {
-	    if (strcmp(dcl_mask, ".xz") == 0)
-		fprintf(out, "errataed bad dcl mask %s\n", dcl_mask);
-	    else if (strcmp(dcl_mask, ".xw") == 0)
-		fprintf(out, "errataed bad dcl mask %s\n", dcl_mask);
-	    else if (strcmp(dcl_mask, ".xzw") == 0)
-		fprintf(out, "errataed bad dcl mask %s\n", dcl_mask);
-
-	    if (dcl_nr == 8) {
-		instr_out(data, hw_offset, i++, "%s: DCL DIFFUSE%s\n", instr_prefix,
-			  dcl_mask);
-	    } else if (dcl_nr == 9) {
-		instr_out(data, hw_offset, i++, "%s: DCL SPECULAR%s\n", instr_prefix,
-			  dcl_mask);
-	    } else if (dcl_nr == 10) {
-		instr_out(data, hw_offset, i++, "%s: DCL FOG%s\n", instr_prefix,
-			  dcl_mask);
-	    }
-	}
-	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
-	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
-	break;
-    case 3:
-	switch ((d0 >> 22) & 0x3) {
-	case 0:
-	    sampletype = "2D";
-	    break;
+	uint32_t d0 = data[i];
+	char *sampletype;
+	int dcl_nr = (d0 >> 14) & 0xf;
+	char *dcl_x = d0 & (1 << 10) ? "x" : "";
+	char *dcl_y = d0 & (1 << 11) ? "y" : "";
+	char *dcl_z = d0 & (1 << 12) ? "z" : "";
+	char *dcl_w = d0 & (1 << 13) ? "w" : "";
+	char dcl_mask[10];
+
+	switch ((d0 >> 19) & 0x3) {
 	case 1:
-	    sampletype = "CUBE";
-	    break;
-	case 2:
-	    sampletype = "3D";
-	    break;
+		sprintf(dcl_mask, ".%s%s%s%s", dcl_x, dcl_y, dcl_z, dcl_w);
+		if (strcmp(dcl_mask, ".") == 0)
+			fprintf(out, "bad (empty) dcl mask\n");
+
+		if (dcl_nr > 10)
+			fprintf(out, "bad T%d dcl register number\n", dcl_nr);
+		if (dcl_nr < 8) {
+			if (strcmp(dcl_mask, ".x") != 0 &&
+			    strcmp(dcl_mask, ".xy") != 0 &&
+			    strcmp(dcl_mask, ".xz") != 0 &&
+			    strcmp(dcl_mask, ".w") != 0 &&
+			    strcmp(dcl_mask, ".xyzw") != 0) {
+				fprintf(out, "bad T%d.%s dcl mask\n", dcl_nr,
+					dcl_mask);
+			}
+			instr_out(data, hw_offset, i++, "%s: DCL T%d%s\n",
+				  instr_prefix, dcl_nr, dcl_mask);
+		} else {
+			if (strcmp(dcl_mask, ".xz") == 0)
+				fprintf(out, "errataed bad dcl mask %s\n",
+					dcl_mask);
+			else if (strcmp(dcl_mask, ".xw") == 0)
+				fprintf(out, "errataed bad dcl mask %s\n",
+					dcl_mask);
+			else if (strcmp(dcl_mask, ".xzw") == 0)
+				fprintf(out, "errataed bad dcl mask %s\n",
+					dcl_mask);
+
+			if (dcl_nr == 8) {
+				instr_out(data, hw_offset, i++,
+					  "%s: DCL DIFFUSE%s\n", instr_prefix,
+					  dcl_mask);
+			} else if (dcl_nr == 9) {
+				instr_out(data, hw_offset, i++,
+					  "%s: DCL SPECULAR%s\n", instr_prefix,
+					  dcl_mask);
+			} else if (dcl_nr == 10) {
+				instr_out(data, hw_offset, i++,
+					  "%s: DCL FOG%s\n", instr_prefix,
+					  dcl_mask);
+			}
+		}
+		instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+		instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+		break;
+	case 3:
+		switch ((d0 >> 22) & 0x3) {
+		case 0:
+			sampletype = "2D";
+			break;
+		case 1:
+			sampletype = "CUBE";
+			break;
+		case 2:
+			sampletype = "3D";
+			break;
+		default:
+			sampletype = "RESERVED";
+			break;
+		}
+		if (dcl_nr > 15)
+			fprintf(out, "bad S%d dcl register number\n", dcl_nr);
+		instr_out(data, hw_offset, i++, "%s: DCL S%d %s\n",
+			  instr_prefix, dcl_nr, sampletype);
+		instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+		instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+		break;
 	default:
-	    sampletype = "RESERVED";
-	    break;
+		instr_out(data, hw_offset, i++, "%s: DCL RESERVED%d\n",
+			  instr_prefix, dcl_nr);
+		instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+		instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
 	}
-	if (dcl_nr > 15)
-	    fprintf(out, "bad S%d dcl register number\n", dcl_nr);
-	instr_out(data, hw_offset, i++, "%s: DCL S%d %s\n", instr_prefix,
-		  dcl_nr, sampletype);
-	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
-	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
-	break;
-    default:
-	instr_out(data, hw_offset, i++, "%s: DCL RESERVED%d\n", instr_prefix, dcl_nr);
-	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
-	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
-    }
 }
 
 static void
-i915_decode_instruction(uint32_t *data, uint32_t hw_offset,
+i915_decode_instruction(uint32_t * data, uint32_t hw_offset,
 			int i, char *instr_prefix)
 {
-    switch ((data[i] >> 24) & 0x1f) {
-    case 0x0:
-	instr_out(data, hw_offset, i++, "%s: NOP\n", instr_prefix);
-	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
-	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
-	break;
-    case 0x01:
-	i915_decode_alu2(data, hw_offset, i, instr_prefix, "ADD");
-	break;
-    case 0x02:
-	i915_decode_alu1(data, hw_offset, i, instr_prefix, "MOV");
-	break;
-    case 0x03:
-	i915_decode_alu2(data, hw_offset, i, instr_prefix, "MUL");
-	break;
-    case 0x04:
-	i915_decode_alu3(data, hw_offset, i, instr_prefix, "MAD");
-	break;
-    case 0x05:
-	i915_decode_alu3(data, hw_offset, i, instr_prefix, "DP2ADD");
-	break;
-    case 0x06:
-	i915_decode_alu2(data, hw_offset, i, instr_prefix, "DP3");
-	break;
-    case 0x07:
-	i915_decode_alu2(data, hw_offset, i, instr_prefix, "DP4");
-	break;
-    case 0x08:
-	i915_decode_alu1(data, hw_offset, i, instr_prefix, "FRC");
-	break;
-    case 0x09:
-	i915_decode_alu1(data, hw_offset, i, instr_prefix, "RCP");
-	break;
-    case 0x0a:
-	i915_decode_alu1(data, hw_offset, i, instr_prefix, "RSQ");
-	break;
-    case 0x0b:
-	i915_decode_alu1(data, hw_offset, i, instr_prefix, "EXP");
-	break;
-    case 0x0c:
-	i915_decode_alu1(data, hw_offset, i, instr_prefix, "LOG");
-	break;
-    case 0x0d:
-	i915_decode_alu2(data, hw_offset, i, instr_prefix, "CMP");
-	break;
-    case 0x0e:
-	i915_decode_alu2(data, hw_offset, i, instr_prefix, "MIN");
-	break;
-    case 0x0f:
-	i915_decode_alu2(data, hw_offset, i, instr_prefix, "MAX");
-	break;
-    case 0x10:
-	i915_decode_alu1(data, hw_offset, i, instr_prefix, "FLR");
-	break;
-    case 0x11:
-	i915_decode_alu1(data, hw_offset, i, instr_prefix, "MOD");
-	break;
-    case 0x12:
-	i915_decode_alu1(data, hw_offset, i, instr_prefix, "TRC");
-	break;
-    case 0x13:
-	i915_decode_alu2(data, hw_offset, i, instr_prefix, "SGE");
-	break;
-    case 0x14:
-	i915_decode_alu2(data, hw_offset, i, instr_prefix, "SLT");
-	break;
-    case 0x15:
-	i915_decode_tex(data, hw_offset, i, instr_prefix, "TEXLD");
-	break;
-    case 0x16:
-	i915_decode_tex(data, hw_offset, i, instr_prefix, "TEXLDP");
-	break;
-    case 0x17:
-	i915_decode_tex(data, hw_offset, i, instr_prefix, "TEXLDB");
-	break;
-    case 0x19:
-	i915_decode_dcl(data, hw_offset, i, instr_prefix);
-	break;
-    default:
-	instr_out(data, hw_offset, i++, "%s: unknown\n", instr_prefix);
-	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
-	instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
-	break;
-    }
+	switch ((data[i] >> 24) & 0x1f) {
+	case 0x0:
+		instr_out(data, hw_offset, i++, "%s: NOP\n", instr_prefix);
+		instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+		instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+		break;
+	case 0x01:
+		i915_decode_alu2(data, hw_offset, i, instr_prefix, "ADD");
+		break;
+	case 0x02:
+		i915_decode_alu1(data, hw_offset, i, instr_prefix, "MOV");
+		break;
+	case 0x03:
+		i915_decode_alu2(data, hw_offset, i, instr_prefix, "MUL");
+		break;
+	case 0x04:
+		i915_decode_alu3(data, hw_offset, i, instr_prefix, "MAD");
+		break;
+	case 0x05:
+		i915_decode_alu3(data, hw_offset, i, instr_prefix, "DP2ADD");
+		break;
+	case 0x06:
+		i915_decode_alu2(data, hw_offset, i, instr_prefix, "DP3");
+		break;
+	case 0x07:
+		i915_decode_alu2(data, hw_offset, i, instr_prefix, "DP4");
+		break;
+	case 0x08:
+		i915_decode_alu1(data, hw_offset, i, instr_prefix, "FRC");
+		break;
+	case 0x09:
+		i915_decode_alu1(data, hw_offset, i, instr_prefix, "RCP");
+		break;
+	case 0x0a:
+		i915_decode_alu1(data, hw_offset, i, instr_prefix, "RSQ");
+		break;
+	case 0x0b:
+		i915_decode_alu1(data, hw_offset, i, instr_prefix, "EXP");
+		break;
+	case 0x0c:
+		i915_decode_alu1(data, hw_offset, i, instr_prefix, "LOG");
+		break;
+	case 0x0d:
+		i915_decode_alu2(data, hw_offset, i, instr_prefix, "CMP");
+		break;
+	case 0x0e:
+		i915_decode_alu2(data, hw_offset, i, instr_prefix, "MIN");
+		break;
+	case 0x0f:
+		i915_decode_alu2(data, hw_offset, i, instr_prefix, "MAX");
+		break;
+	case 0x10:
+		i915_decode_alu1(data, hw_offset, i, instr_prefix, "FLR");
+		break;
+	case 0x11:
+		i915_decode_alu1(data, hw_offset, i, instr_prefix, "MOD");
+		break;
+	case 0x12:
+		i915_decode_alu1(data, hw_offset, i, instr_prefix, "TRC");
+		break;
+	case 0x13:
+		i915_decode_alu2(data, hw_offset, i, instr_prefix, "SGE");
+		break;
+	case 0x14:
+		i915_decode_alu2(data, hw_offset, i, instr_prefix, "SLT");
+		break;
+	case 0x15:
+		i915_decode_tex(data, hw_offset, i, instr_prefix, "TEXLD");
+		break;
+	case 0x16:
+		i915_decode_tex(data, hw_offset, i, instr_prefix, "TEXLDP");
+		break;
+	case 0x17:
+		i915_decode_tex(data, hw_offset, i, instr_prefix, "TEXLDB");
+		break;
+	case 0x19:
+		i915_decode_dcl(data, hw_offset, i, instr_prefix);
+		break;
+	default:
+		instr_out(data, hw_offset, i++, "%s: unknown\n", instr_prefix);
+		instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+		instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
+		break;
+	}
 }
 
-static char *
-decode_compare_func(uint32_t op)
+static char *decode_compare_func(uint32_t op)
 {
-    switch (op&0x7) {
-    case 0: return "always";
-    case 1: return "never";
-    case 2: return "less";
-    case 3: return "equal";
-    case 4: return "lequal";
-    case 5: return "greater";
-    case 6: return "notequal";
-    case 7: return "gequal";
-    }
-    return "";
+	switch (op & 0x7) {
+	case 0:
+		return "always";
+	case 1:
+		return "never";
+	case 2:
+		return "less";
+	case 3:
+		return "equal";
+	case 4:
+		return "lequal";
+	case 5:
+		return "greater";
+	case 6:
+		return "notequal";
+	case 7:
+		return "gequal";
+	}
+	return "";
 }
 
-static char *
-decode_stencil_op(uint32_t op)
+static char *decode_stencil_op(uint32_t op)
 {
-    switch (op&0x7) {
-    case 0: return "keep";
-    case 1: return "zero";
-    case 2: return "replace";
-    case 3: return "incr_sat";
-    case 4: return "decr_sat";
-    case 5: return "greater";
-    case 6: return "incr";
-    case 7: return "decr";
-    }
-    return "";
+	switch (op & 0x7) {
+	case 0:
+		return "keep";
+	case 1:
+		return "zero";
+	case 2:
+		return "replace";
+	case 3:
+		return "incr_sat";
+	case 4:
+		return "decr_sat";
+	case 5:
+		return "greater";
+	case 6:
+		return "incr";
+	case 7:
+		return "decr";
+	}
+	return "";
 }
 
-static char *
-decode_logic_op(uint32_t op)
+static char *decode_logic_op(uint32_t op)
 {
-    switch (op&0xf) {
-    case 0: return "clear";
-    case 1: return "nor";
-    case 2: return "and_inv";
-    case 3: return "copy_inv";
-    case 4: return "and_rvrse";
-    case 5: return "inv";
-    case 6: return "xor";
-    case 7: return "nand";
-    case 8: return "and";
-    case 9: return "equiv";
-    case 10: return "noop";
-    case 11: return "or_inv";
-    case 12: return "copy";
-    case 13: return "or_rvrse";
-    case 14: return "or";
-    case 15: return "set";
-    }
-    return "";
+	switch (op & 0xf) {
+	case 0:
+		return "clear";
+	case 1:
+		return "nor";
+	case 2:
+		return "and_inv";
+	case 3:
+		return "copy_inv";
+	case 4:
+		return "and_rvrse";
+	case 5:
+		return "inv";
+	case 6:
+		return "xor";
+	case 7:
+		return "nand";
+	case 8:
+		return "and";
+	case 9:
+		return "equiv";
+	case 10:
+		return "noop";
+	case 11:
+		return "or_inv";
+	case 12:
+		return "copy";
+	case 13:
+		return "or_rvrse";
+	case 14:
+		return "or";
+	case 15:
+		return "set";
+	}
+	return "";
 }
 
-static char *
-decode_blend_fact(uint32_t op)
+static char *decode_blend_fact(uint32_t op)
 {
-    switch (op&0xf) {
-    case 1: return "zero";
-    case 2: return "one";
-    case 3: return "src_colr";
-    case 4: return "inv_src_colr";
-    case 5: return "src_alpha";
-    case 6: return "inv_src_alpha";
-    case 7: return "dst_alpha";
-    case 8: return "inv_dst_alpha";
-    case 9: return "dst_colr";
-    case 10: return "inv_dst_colr";
-    case 11: return "src_alpha_sat";
-    case 12: return "cnst_colr";
-    case 13: return "inv_cnst_colr";
-    case 14: return "cnst_alpha";
-    case 15: return "inv_const_alpha";
-    }
-    return "";
+	switch (op & 0xf) {
+	case 1:
+		return "zero";
+	case 2:
+		return "one";
+	case 3:
+		return "src_colr";
+	case 4:
+		return "inv_src_colr";
+	case 5:
+		return "src_alpha";
+	case 6:
+		return "inv_src_alpha";
+	case 7:
+		return "dst_alpha";
+	case 8:
+		return "inv_dst_alpha";
+	case 9:
+		return "dst_colr";
+	case 10:
+		return "inv_dst_colr";
+	case 11:
+		return "src_alpha_sat";
+	case 12:
+		return "cnst_colr";
+	case 13:
+		return "inv_cnst_colr";
+	case 14:
+		return "cnst_alpha";
+	case 15:
+		return "inv_const_alpha";
+	}
+	return "";
 }
 
-static char *
-decode_tex_coord_mode(uint32_t mode)
+static char *decode_tex_coord_mode(uint32_t mode)
 {
-    switch (mode&0x7) {
-    case 0: return "wrap";
-    case 1: return "mirror";
-    case 2: return "clamp_edge";
-    case 3: return "cube";
-    case 4: return "clamp_border";
-    case 5: return "mirror_once";
-    }
-    return "";
+	switch (mode & 0x7) {
+	case 0:
+		return "wrap";
+	case 1:
+		return "mirror";
+	case 2:
+		return "clamp_edge";
+	case 3:
+		return "cube";
+	case 4:
+		return "clamp_border";
+	case 5:
+		return "mirror_once";
+	}
+	return "";
 }
 
-static char *
-decode_sample_filter(uint32_t mode)
+static char *decode_sample_filter(uint32_t mode)
 {
-    switch (mode&0x7) {
-    case 0: return "nearest";
-    case 1: return "linear";
-    case 2: return "anisotropic";
-    case 3: return "4x4_1";
-    case 4: return "4x4_2";
-    case 5: return "4x4_flat";
-    case 6: return "6x5_mono";
-    }
-    return "";
+	switch (mode & 0x7) {
+	case 0:
+		return "nearest";
+	case 1:
+		return "linear";
+	case 2:
+		return "anisotropic";
+	case 3:
+		return "4x4_1";
+	case 4:
+		return "4x4_2";
+	case 5:
+		return "4x4_flat";
+	case 6:
+		return "6x5_mono";
+	}
+	return "";
 }
 
 static int
-decode_3d_1d(uint32_t *data, int count,
-	     uint32_t hw_offset,
-	     uint32_t devid,
-	     int *failures)
+decode_3d_1d(uint32_t * data, int count,
+	     uint32_t hw_offset, uint32_t devid, int *failures)
 {
-    unsigned int len, i, c, idx, word, map, sampler, instr;
-    char *format, *zformat, *type;
-    uint32_t opcode;
-
-    struct {
+	unsigned int len, i, c, idx, word, map, sampler, instr;
+	char *format, *zformat, *type;
 	uint32_t opcode;
-	int i830_only;
-	int min_len;
-	int max_len;
-	char *name;
-    } opcodes_3d_1d[] = {
-	{ 0x86, 0, 4, 4, "3DSTATE_CHROMA_KEY" },
-	{ 0x88, 0, 2, 2, "3DSTATE_CONSTANT_BLEND_COLOR" },
-	{ 0x99, 0, 2, 2, "3DSTATE_DEFAULT_DIFFUSE" },
-	{ 0x9a, 0, 2, 2, "3DSTATE_DEFAULT_SPECULAR" },
-	{ 0x98, 0, 2, 2, "3DSTATE_DEFAULT_Z" },
-	{ 0x97, 0, 2, 2, "3DSTATE_DEPTH_OFFSET_SCALE" },
-	{ 0x9d, 0, 65, 65, "3DSTATE_FILTER_COEFFICIENTS_4X4" },
-	{ 0x9e, 0, 4, 4, "3DSTATE_MONO_FILTER" },
-	{ 0x89, 0, 4, 4, "3DSTATE_FOG_MODE" },
-	{ 0x8f, 0, 2, 16, "3DSTATE_MAP_PALLETE_LOAD_32" },
-	{ 0x83, 0, 2, 2, "3DSTATE_SPAN_STIPPLE" },
-	{ 0x8c, 1, 2, 2, "3DSTATE_MAP_COORD_TRANSFORM_I830" },
-	{ 0x8b, 1, 2, 2, "3DSTATE_MAP_VERTEX_TRANSFORM_I830" },
-	{ 0x8d, 1, 3, 3, "3DSTATE_W_STATE_I830" },
-	{ 0x01, 1, 2, 2, "3DSTATE_COLOR_FACTOR_I830" },
-	{ 0x02, 1, 2, 2, "3DSTATE_MAP_COORD_SETBIND_I830" },
-    }, *opcode_3d_1d;
-
-    opcode = (data[0] & 0x00ff0000) >> 16;
-
-    switch (opcode) {
-    case 0x07:
-	/* This instruction is unusual.  A 0 length means just 1 DWORD instead of
-	 * 2.  The 0 length is specified in one place to be unsupported, but
-	 * stated to be required in another, and 0 length LOAD_INDIRECTs appear
-	 * to cause no harm at least.
-	 */
-	instr_out(data, hw_offset, 0, "3DSTATE_LOAD_INDIRECT\n");
-	len = (data[0] & 0x000000ff) + 1;
-	i = 1;
-	if (data[0] & (0x01 << 8)) {
-	    if (i + 2 >= count)
-		BUFFER_FAIL(count, len, "3DSTATE_LOAD_INDIRECT");
-	    instr_out(data, hw_offset, i++, "SIS.0\n");
-	    instr_out(data, hw_offset, i++, "SIS.1\n");
-	}
-	if (data[0] & (0x02 << 8)) {
-	    if (i + 1 >= count)
-		BUFFER_FAIL(count, len, "3DSTATE_LOAD_INDIRECT");
-	    instr_out(data, hw_offset, i++, "DIS.0\n");
-	}
-	if (data[0] & (0x04 << 8)) {
-	    if (i + 2 >= count)
-		BUFFER_FAIL(count, len, "3DSTATE_LOAD_INDIRECT");
-	    instr_out(data, hw_offset, i++, "SSB.0\n");
-	    instr_out(data, hw_offset, i++, "SSB.1\n");
-	}
-	if (data[0] & (0x08 << 8)) {
-	    if (i + 2 >= count)
-		BUFFER_FAIL(count, len, "3DSTATE_LOAD_INDIRECT");
-	    instr_out(data, hw_offset, i++, "MSB.0\n");
-	    instr_out(data, hw_offset, i++, "MSB.1\n");
-	}
-	if (data[0] & (0x10 << 8)) {
-	    if (i + 2 >= count)
-		BUFFER_FAIL(count, len, "3DSTATE_LOAD_INDIRECT");
-	    instr_out(data, hw_offset, i++, "PSP.0\n");
-	    instr_out(data, hw_offset, i++, "PSP.1\n");
-	}
-	if (data[0] & (0x20 << 8)) {
-	    if (i + 2 >= count)
-		BUFFER_FAIL(count, len, "3DSTATE_LOAD_INDIRECT");
-	    instr_out(data, hw_offset, i++, "PSC.0\n");
-	    instr_out(data, hw_offset, i++, "PSC.1\n");
-	}
-	if (len != i) {
-	    fprintf(out, "Bad count in 3DSTATE_LOAD_INDIRECT\n");
-	    (*failures)++;
-	    return len;
-	}
-	return len;
-    case 0x04:
-	instr_out(data, hw_offset, 0, "3DSTATE_LOAD_STATE_IMMEDIATE_1\n");
-	len = (data[0] & 0x0000000f) + 2;
-	i = 1;
-	for (word = 0; word <= 8; word++) {
-	    if (data[0] & (1 << (4 + word))) {
-		if (i >= count)
-		    BUFFER_FAIL(count, len, "3DSTATE_LOAD_STATE_IMMEDIATE_1");
-
-		/* save vertex state for decode */
-		if (!IS_GEN2(devid)) {
-			if (word == 2) {
-				saved_s2_set = 1;
-				saved_s2 = data[i];
-			}
-			if (word == 4) {
-				saved_s4_set = 1;
-				saved_s4 = data[i];
-			}
 
-			switch (word) {
-			case 0:
-				instr_out(data, hw_offset, i, "S0: vbo offset: 0x%08x%s\n",
-					  data[i]&(~1),data[i]&1?", auto cache invalidate disabled":"");
-				break;
-			case 1:
-				instr_out(data, hw_offset, i, "S1: vertex width: %i, vertex pitch: %i\n",
-					  (data[i]>>24)&0x3f,(data[i]>>16)&0x3f);
-				break;
-			case 2:
-				instr_out(data, hw_offset, i, "S2: texcoord formats: ");
-				for (int tex_num = 0; tex_num < 8; tex_num++) {
-					switch((data[i]>>tex_num*4)&0xf) {
-					case 0: fprintf(out, "%i=2D ", tex_num); break;
-					case 1: fprintf(out, "%i=3D ", tex_num); break;
-					case 2: fprintf(out, "%i=4D ", tex_num); break;
-					case 3: fprintf(out, "%i=1D ", tex_num); break;
-					case 4: fprintf(out, "%i=2D_16 ", tex_num); break;
-					case 5: fprintf(out, "%i=4D_16 ", tex_num); break;
-					case 0xf: fprintf(out, "%i=NP ", tex_num); break;
+	struct {
+		uint32_t opcode;
+		int i830_only;
+		int min_len;
+		int max_len;
+		char *name;
+	} opcodes_3d_1d[] = {
+		{
+		0x86, 0, 4, 4, "3DSTATE_CHROMA_KEY"}, {
+		0x88, 0, 2, 2, "3DSTATE_CONSTANT_BLEND_COLOR"}, {
+		0x99, 0, 2, 2, "3DSTATE_DEFAULT_DIFFUSE"}, {
+		0x9a, 0, 2, 2, "3DSTATE_DEFAULT_SPECULAR"}, {
+		0x98, 0, 2, 2, "3DSTATE_DEFAULT_Z"}, {
+		0x97, 0, 2, 2, "3DSTATE_DEPTH_OFFSET_SCALE"}, {
+		0x9d, 0, 65, 65, "3DSTATE_FILTER_COEFFICIENTS_4X4"}, {
+		0x9e, 0, 4, 4, "3DSTATE_MONO_FILTER"}, {
+		0x89, 0, 4, 4, "3DSTATE_FOG_MODE"}, {
+		0x8f, 0, 2, 16, "3DSTATE_MAP_PALLETE_LOAD_32"}, {
+		0x83, 0, 2, 2, "3DSTATE_SPAN_STIPPLE"}, {
+		0x8c, 1, 2, 2, "3DSTATE_MAP_COORD_TRANSFORM_I830"}, {
+		0x8b, 1, 2, 2, "3DSTATE_MAP_VERTEX_TRANSFORM_I830"}, {
+		0x8d, 1, 3, 3, "3DSTATE_W_STATE_I830"}, {
+		0x01, 1, 2, 2, "3DSTATE_COLOR_FACTOR_I830"}, {
+	0x02, 1, 2, 2, "3DSTATE_MAP_COORD_SETBIND_I830"},}, *opcode_3d_1d;
+
+	opcode = (data[0] & 0x00ff0000) >> 16;
+
+	switch (opcode) {
+	case 0x07:
+		/* This instruction is unusual.  A 0 length means just 1 DWORD instead of
+		 * 2.  The 0 length is specified in one place to be unsupported, but
+		 * stated to be required in another, and 0 length LOAD_INDIRECTs appear
+		 * to cause no harm at least.
+		 */
+		instr_out(data, hw_offset, 0, "3DSTATE_LOAD_INDIRECT\n");
+		len = (data[0] & 0x000000ff) + 1;
+		i = 1;
+		if (data[0] & (0x01 << 8)) {
+			if (i + 2 >= count)
+				BUFFER_FAIL(count, len,
+					    "3DSTATE_LOAD_INDIRECT");
+			instr_out(data, hw_offset, i++, "SIS.0\n");
+			instr_out(data, hw_offset, i++, "SIS.1\n");
+		}
+		if (data[0] & (0x02 << 8)) {
+			if (i + 1 >= count)
+				BUFFER_FAIL(count, len,
+					    "3DSTATE_LOAD_INDIRECT");
+			instr_out(data, hw_offset, i++, "DIS.0\n");
+		}
+		if (data[0] & (0x04 << 8)) {
+			if (i + 2 >= count)
+				BUFFER_FAIL(count, len,
+					    "3DSTATE_LOAD_INDIRECT");
+			instr_out(data, hw_offset, i++, "SSB.0\n");
+			instr_out(data, hw_offset, i++, "SSB.1\n");
+		}
+		if (data[0] & (0x08 << 8)) {
+			if (i + 2 >= count)
+				BUFFER_FAIL(count, len,
+					    "3DSTATE_LOAD_INDIRECT");
+			instr_out(data, hw_offset, i++, "MSB.0\n");
+			instr_out(data, hw_offset, i++, "MSB.1\n");
+		}
+		if (data[0] & (0x10 << 8)) {
+			if (i + 2 >= count)
+				BUFFER_FAIL(count, len,
+					    "3DSTATE_LOAD_INDIRECT");
+			instr_out(data, hw_offset, i++, "PSP.0\n");
+			instr_out(data, hw_offset, i++, "PSP.1\n");
+		}
+		if (data[0] & (0x20 << 8)) {
+			if (i + 2 >= count)
+				BUFFER_FAIL(count, len,
+					    "3DSTATE_LOAD_INDIRECT");
+			instr_out(data, hw_offset, i++, "PSC.0\n");
+			instr_out(data, hw_offset, i++, "PSC.1\n");
+		}
+		if (len != i) {
+			fprintf(out, "Bad count in 3DSTATE_LOAD_INDIRECT\n");
+			(*failures)++;
+			return len;
+		}
+		return len;
+	case 0x04:
+		instr_out(data, hw_offset, 0,
+			  "3DSTATE_LOAD_STATE_IMMEDIATE_1\n");
+		len = (data[0] & 0x0000000f) + 2;
+		i = 1;
+		for (word = 0; word <= 8; word++) {
+			if (data[0] & (1 << (4 + word))) {
+				if (i >= count)
+					BUFFER_FAIL(count, len,
+						    "3DSTATE_LOAD_STATE_IMMEDIATE_1");
+
+				/* save vertex state for decode */
+				if (!IS_GEN2(devid)) {
+					if (word == 2) {
+						saved_s2_set = 1;
+						saved_s2 = data[i];
 					}
-				}
-				fprintf(out, "\n");
-
-				break;
-			case 3:
-				instr_out(data, hw_offset, i, "S3: not documented\n", word);
-				break;
-			case 4:
-				{
-					char *cullmode = "";
-					char *vfmt_xyzw = "";
-					switch((data[i]>>13)&0x3) {
-					case 0: cullmode = "both"; break;
-					case 1: cullmode = "none"; break;
-					case 2: cullmode = "cw"; break;
-					case 3: cullmode = "ccw"; break;
+					if (word == 4) {
+						saved_s4_set = 1;
+						saved_s4 = data[i];
 					}
-					switch(data[i] & (7<<6 | 1<<2)) {
-					case 1<<6: vfmt_xyzw = "XYZ,"; break;
-					case 2<<6: vfmt_xyzw = "XYZW,"; break;
-					case 3<<6: vfmt_xyzw = "XY,"; break;
-					case 4<<6: vfmt_xyzw = "XYW,"; break;
-					case 1<<6 | 1<<2: vfmt_xyzw = "XYZF,"; break;
-					case 2<<6 | 1<<2: vfmt_xyzw = "XYZWF,"; break;
-					case 3<<6 | 1<<2: vfmt_xyzw = "XYF,"; break;
-					case 4<<6 | 1<<2: vfmt_xyzw = "XYWF,"; break;
+
+					switch (word) {
+					case 0:
+						instr_out(data, hw_offset, i,
+							  "S0: vbo offset: 0x%08x%s\n",
+							  data[i] & (~1),
+							  data[i] & 1 ?
+							  ", auto cache invalidate disabled"
+							  : "");
+						break;
+					case 1:
+						instr_out(data, hw_offset, i,
+							  "S1: vertex width: %i, vertex pitch: %i\n",
+							  (data[i] >> 24) &
+							  0x3f,
+							  (data[i] >> 16) &
+							  0x3f);
+						break;
+					case 2:
+						instr_out(data, hw_offset, i,
+							  "S2: texcoord formats: ");
+						for (int tex_num = 0;
+						     tex_num < 8; tex_num++) {
+							switch ((data[i] >>
+								 tex_num *
+								 4) & 0xf) {
+							case 0:
+								fprintf(out,
+									"%i=2D ",
+									tex_num);
+								break;
+							case 1:
+								fprintf(out,
+									"%i=3D ",
+									tex_num);
+								break;
+							case 2:
+								fprintf(out,
+									"%i=4D ",
+									tex_num);
+								break;
+							case 3:
+								fprintf(out,
+									"%i=1D ",
+									tex_num);
+								break;
+							case 4:
+								fprintf(out,
+									"%i=2D_16 ",
+									tex_num);
+								break;
+							case 5:
+								fprintf(out,
+									"%i=4D_16 ",
+									tex_num);
+								break;
+							case 0xf:
+								fprintf(out,
+									"%i=NP ",
+									tex_num);
+								break;
+							}
+						}
+						fprintf(out, "\n");
+
+						break;
+					case 3:
+						instr_out(data, hw_offset, i,
+							  "S3: not documented\n",
+							  word);
+						break;
+					case 4:
+						{
+							char *cullmode = "";
+							char *vfmt_xyzw = "";
+							switch ((data[i] >> 13)
+								& 0x3) {
+							case 0:
+								cullmode =
+								    "both";
+								break;
+							case 1:
+								cullmode =
+								    "none";
+								break;
+							case 2:
+								cullmode = "cw";
+								break;
+							case 3:
+								cullmode =
+								    "ccw";
+								break;
+							}
+							switch (data[i] &
+								(7 << 6 | 1 <<
+								 2)) {
+							case 1 << 6:
+								vfmt_xyzw =
+								    "XYZ,";
+								break;
+							case 2 << 6:
+								vfmt_xyzw =
+								    "XYZW,";
+								break;
+							case 3 << 6:
+								vfmt_xyzw =
+								    "XY,";
+								break;
+							case 4 << 6:
+								vfmt_xyzw =
+								    "XYW,";
+								break;
+							case 1 << 6 | 1 << 2:
+								vfmt_xyzw =
+								    "XYZF,";
+								break;
+							case 2 << 6 | 1 << 2:
+								vfmt_xyzw =
+								    "XYZWF,";
+								break;
+							case 3 << 6 | 1 << 2:
+								vfmt_xyzw =
+								    "XYF,";
+								break;
+							case 4 << 6 | 1 << 2:
+								vfmt_xyzw =
+								    "XYWF,";
+								break;
+							}
+							instr_out(data,
+								  hw_offset, i,
+								  "S4: point_width=%i, line_width=%.1f,"
+								  "%s%s%s%s%s cullmode=%s, vfmt=%s%s%s%s%s%s "
+								  "%s%s\n",
+								  (data[i] >>
+								   23) & 0x1ff,
+								  ((data[i] >>
+								    19) & 0xf) /
+								  2.0,
+								  data[i] & (0xf
+									     <<
+									     15)
+								  ?
+								  " flatshade="
+								  : "",
+								  data[i] & (1
+									     <<
+									     18)
+								  ? "Alpha," :
+								  "",
+								  data[i] & (1
+									     <<
+									     17)
+								  ? "Fog," : "",
+								  data[i] & (1
+									     <<
+									     16)
+								  ? "Specular,"
+								  : "",
+								  data[i] & (1
+									     <<
+									     15)
+								  ? "Color," :
+								  "", cullmode,
+								  data[i] & (1
+									     <<
+									     12)
+								  ?
+								  "PointWidth,"
+								  : "",
+								  data[i] & (1
+									     <<
+									     11)
+								  ? "SpecFog," :
+								  "",
+								  data[i] & (1
+									     <<
+									     10)
+								  ? "Color," :
+								  "",
+								  data[i] & (1
+									     <<
+									     9)
+								  ? "DepthOfs,"
+								  : "",
+								  vfmt_xyzw,
+								  data[i] & (1
+									     <<
+									     9)
+								  ? "FogParam,"
+								  : "",
+								  data[i] & (1
+									     <<
+									     5)
+								  ?
+								  "force default diffuse, "
+								  : "",
+								  data[i] & (1
+									     <<
+									     4)
+								  ?
+								  "force default specular, "
+								  : "",
+								  data[i] & (1
+									     <<
+									     3)
+								  ?
+								  "local depth ofs enable, "
+								  : "",
+								  data[i] & (1
+									     <<
+									     1)
+								  ?
+								  "point sprite enable, "
+								  : "",
+								  data[i] & (1
+									     <<
+									     0)
+								  ?
+								  "line AA enable, "
+								  : "");
+							break;
+						}
+					case 5:
+						{
+							instr_out(data,
+								  hw_offset, i,
+								  "S5:%s%s%s%s%s"
+								  "%s%s%s%s stencil_ref=0x%x, stencil_test=%s, "
+								  "stencil_fail=%s, stencil_pass_z_fail=%s, "
+								  "stencil_pass_z_pass=%s, %s%s%s%s\n",
+								  data[i] & (0xf
+									     <<
+									     28)
+								  ?
+								  " write_disable="
+								  : "",
+								  data[i] & (1
+									     <<
+									     31)
+								  ? "Alpha," :
+								  "",
+								  data[i] & (1
+									     <<
+									     30)
+								  ? "Red," : "",
+								  data[i] & (1
+									     <<
+									     29)
+								  ? "Green," :
+								  "",
+								  data[i] & (1
+									     <<
+									     28)
+								  ? "Blue," :
+								  "",
+								  data[i] & (1
+									     <<
+									     27)
+								  ?
+								  " force default point size,"
+								  : "",
+								  data[i] & (1
+									     <<
+									     26)
+								  ?
+								  " last pixel enable,"
+								  : "",
+								  data[i] & (1
+									     <<
+									     25)
+								  ?
+								  " global depth ofs enable,"
+								  : "",
+								  data[i] & (1
+									     <<
+									     24)
+								  ?
+								  " fog enable,"
+								  : "",
+								  (data[i] >>
+								   16) & 0xff,
+								  decode_compare_func
+								  (data[i] >>
+								   13),
+								  decode_stencil_op
+								  (data[i] >>
+								   10),
+								  decode_stencil_op
+								  (data[i] >>
+								   7),
+								  decode_stencil_op
+								  (data[i] >>
+								   4),
+								  data[i] & (1
+									     <<
+									     3)
+								  ?
+								  "stencil write enable, "
+								  : "",
+								  data[i] & (1
+									     <<
+									     2)
+								  ?
+								  "stencil test enable, "
+								  : "",
+								  data[i] & (1
+									     <<
+									     1)
+								  ?
+								  "color dither enable, "
+								  : "",
+								  data[i] & (1
+									     <<
+									     0)
+								  ?
+								  "logicop enable, "
+								  : "");
+						}
+						break;
+					case 6:
+						instr_out(data, hw_offset, i,
+							  "S6: %salpha_test=%s, alpha_ref=0x%x, "
+							  "depth_test=%s, %ssrc_blnd_fct=%s, dst_blnd_fct=%s, "
+							  "%s%stristrip_provoking_vertex=%i\n",
+							  data[i] & (1 << 31) ?
+							  "alpha test enable, "
+							  : "",
+							  decode_compare_func
+							  (data[i] >> 28),
+							  data[i] & (0xff <<
+								     20),
+							  decode_compare_func
+							  (data[i] >> 16),
+							  data[i] & (1 << 15) ?
+							  "cbuf blend enable, "
+							  : "",
+							  decode_blend_fact(data
+									    [i]
+									    >>
+									    8),
+							  decode_blend_fact(data
+									    [i]
+									    >>
+									    4),
+							  data[i] & (1 << 3) ?
+							  "depth write enable, "
+							  : "",
+							  data[i] & (1 << 2) ?
+							  "cbuf write enable, "
+							  : "",
+							  data[i] & (0x3));
+						break;
+					case 7:
+						instr_out(data, hw_offset, i,
+							  "S7: depth offset constant: 0x%08x\n",
+							  data[i]);
+						break;
 					}
-					instr_out(data, hw_offset, i, "S4: point_width=%i, line_width=%.1f,"
-						  "%s%s%s%s%s cullmode=%s, vfmt=%s%s%s%s%s%s "
-						  "%s%s\n",
-						  (data[i]>>23)&0x1ff,
-						  ((data[i]>>19)&0xf) / 2.0,
-						  data[i]&(0xf<<15)?" flatshade=":"",
-						  data[i]&(1<<18)?"Alpha,":"",
-						  data[i]&(1<<17)?"Fog,":"",
-						  data[i]&(1<<16)?"Specular,":"",
-						  data[i]&(1<<15)?"Color,":"",
-						  cullmode,
-						  data[i]&(1<<12)?"PointWidth,":"",
-						  data[i]&(1<<11)?"SpecFog,":"",
-						  data[i]&(1<<10)?"Color,":"",
-						  data[i]&(1<<9)?"DepthOfs,":"",
-						  vfmt_xyzw,
-						  data[i]&(1<<9)?"FogParam,":"",
-						  data[i]&(1<<5)?"force default diffuse, ":"",
-						  data[i]&(1<<4)?"force default specular, ":"",
-						  data[i]&(1<<3)?"local depth ofs enable, ":"",
-						  data[i]&(1<<1)?"point sprite enable, ":"",
-						  data[i]&(1<<0)?"line AA enable, ":"");
-					break;
-				}
-			case 5:
-				{
-					instr_out(data, hw_offset, i, "S5:%s%s%s%s%s"
-						  "%s%s%s%s stencil_ref=0x%x, stencil_test=%s, "
-						  "stencil_fail=%s, stencil_pass_z_fail=%s, "
-						  "stencil_pass_z_pass=%s, %s%s%s%s\n",
-						  data[i]&(0xf<<28)?" write_disable=":"",
-						  data[i]&(1<<31)?"Alpha,":"",
-						  data[i]&(1<<30)?"Red,":"",
-						  data[i]&(1<<29)?"Green,":"",
-						  data[i]&(1<<28)?"Blue,":"",
-						  data[i]&(1<<27)?" force default point size,":"",
-						  data[i]&(1<<26)?" last pixel enable,":"",
-						  data[i]&(1<<25)?" global depth ofs enable,":"",
-						  data[i]&(1<<24)?" fog enable,":"",
-						  (data[i]>>16)&0xff,
-						  decode_compare_func(data[i]>>13),
-						  decode_stencil_op(data[i]>>10),
-						  decode_stencil_op(data[i]>>7),
-						  decode_stencil_op(data[i]>>4),
-						  data[i]&(1<<3)?"stencil write enable, ":"",
-						  data[i]&(1<<2)?"stencil test enable, ":"",
-						  data[i]&(1<<1)?"color dither enable, ":"",
-						  data[i]&(1<<0)?"logicop enable, ":"");
+				} else {
+					instr_out(data, hw_offset, i,
+						  "S%d: 0x%08x\n", i, data[i]);
 				}
-				break;
-			case 6:
-				instr_out(data, hw_offset, i, "S6: %salpha_test=%s, alpha_ref=0x%x, "
-					  "depth_test=%s, %ssrc_blnd_fct=%s, dst_blnd_fct=%s, "
-					  "%s%stristrip_provoking_vertex=%i\n",
-					  data[i]&(1<<31)?"alpha test enable, ":"",
-					  decode_compare_func(data[i]>>28),
-					  data[i]&(0xff<<20),
-					  decode_compare_func(data[i]>>16),
-					  data[i]&(1<<15)?"cbuf blend enable, ":"",
-					  decode_blend_fact(data[i]>>8),
-					  decode_blend_fact(data[i]>>4),
-					  data[i]&(1<<3)?"depth write enable, ":"",
-					  data[i]&(1<<2)?"cbuf write enable, ":"",
-					  data[i]&(0x3));
-				break;
-			case 7:
-				instr_out(data, hw_offset, i, "S7: depth offset constant: 0x%08x\n", data[i]);
-				break;
+				i++;
 			}
-		} else {
-			instr_out(data, hw_offset, i, "S%d: 0x%08x\n", i, data[i]);
 		}
-		i++;
-	    }
-	}
-	if (len != i) {
-	    fprintf(out, "Bad count in 3DSTATE_LOAD_STATE_IMMEDIATE_1\n");
-	    (*failures)++;
-	}
-	return len;
-    case 0x03:
-	instr_out(data, hw_offset, 0, "3DSTATE_LOAD_STATE_IMMEDIATE_2\n");
-	len = (data[0] & 0x0000000f) + 2;
-	i = 1;
-	for (word = 6; word <= 14; word++) {
-	    if (data[0] & (1 << word)) {
-		if (i >= count)
-		    BUFFER_FAIL(count, len, "3DSTATE_LOAD_STATE_IMMEDIATE_2");
-
-		if (word == 6)
-		    instr_out(data, hw_offset, i++, "TBCF\n");
-		else if (word >= 7 && word <= 10) {
-		    instr_out(data, hw_offset, i++, "TB%dC\n", word - 7);
-		    instr_out(data, hw_offset, i++, "TB%dA\n", word - 7);
-		} else if (word >= 11 && word <= 14) {
-		    instr_out(data, hw_offset, i, "TM%dS0: offset=0x%08x, %s\n",
-			      word - 11,
-			      data[i]&0xfffffffe,
-			      data[i]&1?"use fence":"");
-		    i++;
-		    instr_out(data, hw_offset, i, "TM%dS1: height=%i, width=%i, %s\n",
-			      word - 11,
-			      data[i]>>21, (data[i]>>10)&0x3ff,
-			      data[i]&2?(data[i]&1?"y-tiled":"x-tiled"):"");
-		    i++;
-		    instr_out(data, hw_offset, i, "TM%dS2: pitch=%i, \n",
-			      word - 11,
-			      ((data[i]>>21) + 1)*4);
-		    i++;
-		    instr_out(data, hw_offset, i++, "TM%dS3\n", word - 11);
-		    instr_out(data, hw_offset, i++, "TM%dS4: dflt color\n", word - 11);
+		if (len != i) {
+			fprintf(out,
+				"Bad count in 3DSTATE_LOAD_STATE_IMMEDIATE_1\n");
+			(*failures)++;
 		}
-	    }
-	}
-	if (len != i) {
-	    fprintf(out, "Bad count in 3DSTATE_LOAD_STATE_IMMEDIATE_2\n");
-	    (*failures)++;
-	}
-	return len;
-    case 0x00:
-	instr_out(data, hw_offset, 0, "3DSTATE_MAP_STATE\n");
-	len = (data[0] & 0x0000003f) + 2;
-	instr_out(data, hw_offset, 1, "mask\n");
-
-	i = 2;
-	for (map = 0; map <= 15; map++) {
-	    if (data[1] & (1 << map)) {
-		int width, height, pitch, dword;
-		const char *tiling;
-
-		if (i + 3 >= count)
-		    BUFFER_FAIL(count, len, "3DSTATE_MAP_STATE");
-
-		dword = data[i];
-		instr_out(data, hw_offset, i++, "map %d MS2 %s%s%s\n", map,
-			  dword&(1<<31)?"untrusted surface, ":"",
-			  dword&(1<<1)?"vertical line stride enable, ":"",
-			  dword&(1<<0)?"vertical ofs enable, ":"");
-
-		dword = data[i];
-		width = ((dword >> 10) & ((1 << 11) - 1))+1;
-		height = ((dword >> 21) & ((1 << 11) - 1))+1;
-
-		tiling = "none";
-		if (dword & (1 << 2))
-			tiling = "fenced";
-		else if (dword & (1 << 1))
-			tiling = dword & (1 << 0) ? "Y" : "X";
-		type = " BAD";
-		format = "BAD";
-		switch ((dword>>7) & 0x7) {
-		case 1:
-		    type = "8b";
-		    switch ((dword>>3) & 0xf) {
-		    case 0: format = "I"; break;
-		    case 1: format = "L"; break;
-		    case 4: format = "A"; break;
-		    case 5: format = " mono"; break; }
-		    break;
-		case 2:
-		    type = "16b";
-		    switch ((dword>>3) & 0xf) {
-		    case 0: format = " rgb565"; break;
-		    case 1: format = " argb1555"; break;
-		    case 2: format = " argb4444"; break;
-		    case 5: format = " ay88"; break;
-		    case 6: format = " bump655"; break;
-		    case 7: format = "I"; break;
-		    case 8: format = "L"; break;
-		    case 9: format = "A"; break; }
-		    break;
-		case 3:
-		    type = "32b";
-		    switch ((dword>>3) & 0xf) {
-		    case 0: format = " argb8888"; break;
-		    case 1: format = " abgr8888"; break;
-		    case 2: format = " xrgb8888"; break;
-		    case 3: format = " xbgr8888"; break;
-		    case 4: format = " qwvu8888"; break;
-		    case 5: format = " axvu8888"; break;
-		    case 6: format = " lxvu8888"; break;
-		    case 7: format = " xlvu8888"; break;
-		    case 8: format = " argb2101010"; break;
-		    case 9: format = " abgr2101010"; break;
-		    case 10: format = " awvu2101010"; break;
-		    case 11: format = " gr1616"; break;
-		    case 12: format = " vu1616"; break;
-		    case 13: format = " xI824"; break;
-		    case 14: format = " xA824"; break;
-		    case 15: format = " xL824"; break; }
-		    break;
-		case 5:
-		    type = "422";
-		    switch ((dword>>3) & 0xf) {
-		    case 0: format = " yuv_swapy"; break;
-		    case 1: format = " yuv"; break;
-		    case 2: format = " yuv_swapuv"; break;
-		    case 3: format = " yuv_swapuvy"; break; }
-		    break;
-		case 6:
-		    type = "compressed";
-		    switch ((dword>>3) & 0x7) {
-		    case 0: format = " dxt1"; break;
-		    case 1: format = " dxt2_3"; break;
-		    case 2: format = " dxt4_5"; break;
-		    case 3: format = " fxt1"; break;
-		    case 4: format = " dxt1_rb"; break; }
-		    break;
-		case 7:
-		    type = "4b indexed";
-		    switch ((dword>>3) & 0xf) {
-		    case 7: format = " argb8888"; break; }
-		    break;
+		return len;
+	case 0x03:
+		instr_out(data, hw_offset, 0,
+			  "3DSTATE_LOAD_STATE_IMMEDIATE_2\n");
+		len = (data[0] & 0x0000000f) + 2;
+		i = 1;
+		for (word = 6; word <= 14; word++) {
+			if (data[0] & (1 << word)) {
+				if (i >= count)
+					BUFFER_FAIL(count, len,
+						    "3DSTATE_LOAD_STATE_IMMEDIATE_2");
+
+				if (word == 6)
+					instr_out(data, hw_offset, i++,
+						  "TBCF\n");
+				else if (word >= 7 && word <= 10) {
+					instr_out(data, hw_offset, i++,
+						  "TB%dC\n", word - 7);
+					instr_out(data, hw_offset, i++,
+						  "TB%dA\n", word - 7);
+				} else if (word >= 11 && word <= 14) {
+					instr_out(data, hw_offset, i,
+						  "TM%dS0: offset=0x%08x, %s\n",
+						  word - 11,
+						  data[i] & 0xfffffffe,
+						  data[i] & 1 ? "use fence" :
+						  "");
+					i++;
+					instr_out(data, hw_offset, i,
+						  "TM%dS1: height=%i, width=%i, %s\n",
+						  word - 11, data[i] >> 21,
+						  (data[i] >> 10) & 0x3ff,
+						  data[i] & 2 ? (data[i] & 1 ?
+								 "y-tiled" :
+								 "x-tiled") :
+						  "");
+					i++;
+					instr_out(data, hw_offset, i,
+						  "TM%dS2: pitch=%i, \n",
+						  word - 11,
+						  ((data[i] >> 21) + 1) * 4);
+					i++;
+					instr_out(data, hw_offset, i++,
+						  "TM%dS3\n", word - 11);
+					instr_out(data, hw_offset, i++,
+						  "TM%dS4: dflt color\n",
+						  word - 11);
+				}
+			}
 		}
-		dword = data[i];
-		instr_out(data, hw_offset, i++, "map %d MS3 [width=%d, height=%d, format=%s%s, tiling=%s%s]\n",
-			  map, width, height, type, format, tiling,
-			  dword&(1<<9)?" palette select":"");
-
-		dword = data[i];
-		pitch = 4*(((dword >> 21) & ((1 << 11) - 1))+1);
-		instr_out(data, hw_offset, i++, "map %d MS4 [pitch=%d, max_lod=%i, vol_depth=%i, cube_face_ena=%x, %s]\n",
-			  map, pitch,
-			  (dword>>9)&0x3f, dword&0xff, (dword>>15)&0x3f,
-			  dword&(1<<8)?"miplayout legacy":"miplayout right");
-	    }
-	}
-	if (len != i) {
-	    fprintf(out, "Bad count in 3DSTATE_MAP_STATE\n");
-	    (*failures)++;
-	    return len;
-	}
-	return len;
-    case 0x06:
-	instr_out(data, hw_offset, 0, "3DSTATE_PIXEL_SHADER_CONSTANTS\n");
-	len = (data[0] & 0x000000ff) + 2;
-
-	i = 2;
-	for (c = 0; c <= 31; c++) {
-	    if (data[1] & (1 << c)) {
-		if (i + 4 >= count)
-		    BUFFER_FAIL(count, len, "3DSTATE_PIXEL_SHADER_CONSTANTS");
-		instr_out(data, hw_offset, i, "C%d.X = %f\n",
-			  c, int_as_float(data[i]));
-		i++;
-		instr_out(data, hw_offset, i, "C%d.Y = %f\n",
-			  c, int_as_float(data[i]));
-		i++;
-		instr_out(data, hw_offset, i, "C%d.Z = %f\n",
-			  c, int_as_float(data[i]));
-		i++;
-		instr_out(data, hw_offset, i, "C%d.W = %f\n",
-			  c, int_as_float(data[i]));
-		i++;
-	    }
-	}
-	if (len != i) {
-	    fprintf(out, "Bad count in 3DSTATE_PIXEL_SHADER_CONSTANTS\n");
-	    (*failures)++;
-	}
-	return len;
-    case 0x05:
-	instr_out(data, hw_offset, 0, "3DSTATE_PIXEL_SHADER_PROGRAM\n");
-	len = (data[0] & 0x000000ff) + 2;
-	if ((len - 1) % 3 != 0 || len > 370) {
-	    fprintf(out, "Bad count in 3DSTATE_PIXEL_SHADER_PROGRAM\n");
-	    (*failures)++;
-	}
-	i = 1;
-	for (instr = 0; instr < (len - 1) / 3; instr++) {
-	    char instr_prefix[10];
-
-	    if (i + 3 >= count)
-		BUFFER_FAIL(count, len, "3DSTATE_PIXEL_SHADER_PROGRAM");
-	    sprintf(instr_prefix, "PS%03d", instr);
-	    i915_decode_instruction(data, hw_offset, i, instr_prefix);
-	    i += 3;
-	}
-	return len;
-    case 0x01:
-	if (IS_GEN2(devid))
-		break;
-	instr_out(data, hw_offset, 0, "3DSTATE_SAMPLER_STATE\n");
-	instr_out(data, hw_offset, 1, "mask\n");
-	len = (data[0] & 0x0000003f) + 2;
-	i = 2;
-	for (sampler = 0; sampler <= 15; sampler++) {
-	    if (data[1] & (1 << sampler)) {
-		uint32_t dword;
-		char *mip_filter = "";
-		if (i + 3 >= count)
-		    BUFFER_FAIL(count, len, "3DSTATE_SAMPLER_STATE");
-		dword = data[i];
-		switch ((dword>>20)&0x3) {
-		case 0: mip_filter = "none"; break;
-		case 1: mip_filter = "nearest"; break;
-		case 3: mip_filter = "linear"; break;
+		if (len != i) {
+			fprintf(out,
+				"Bad count in 3DSTATE_LOAD_STATE_IMMEDIATE_2\n");
+			(*failures)++;
 		}
-		instr_out(data, hw_offset, i++, "sampler %d SS2:%s%s%s "
-			  "base_mip_level=%i, mip_filter=%s, mag_filter=%s, min_filter=%s "
-			  "lod_bias=%.2f,%s max_aniso=%i, shadow_func=%s\n", sampler,
-			  dword&(1<<31)?" reverse gamma,":"",
-			  dword&(1<<30)?" packed2planar,":"",
-			  dword&(1<<29)?" colorspace conversion,":"",
-			  (dword>>22)&0x1f,
-			  mip_filter,
-			  decode_sample_filter(dword>>17),
-			  decode_sample_filter(dword>>14),
-			  ((dword>>5)&0x1ff)/(0x10*1.0),
-			  dword&(1<<4)?" shadow,":"",
-			  dword&(1<<3)?4:2,
-			  decode_compare_func(dword));
-		dword = data[i];
-		instr_out(data, hw_offset, i++, "sampler %d SS3: min_lod=%.2f,%s "
-			  "tcmode_x=%s, tcmode_y=%s, tcmode_z=%s,%s texmap_idx=%i,%s\n",
-			  sampler, ((dword>>24)&0xff)/(0x10*1.0),
-			  dword&(1<<17)?" kill pixel enable,":"",
-			  decode_tex_coord_mode(dword>>12),
-			  decode_tex_coord_mode(dword>>9),
-			  decode_tex_coord_mode(dword>>6),
-			  dword&(1<<5)?" normalized coords,":"",
-			  (dword>>1)&0xf,
-			  dword&(1<<0)?" deinterlacer,":"");
-		dword = data[i];
-		instr_out(data, hw_offset, i++, "sampler %d SS4: border color\n",
-			  sampler, ((dword>>24)&0xff)/(0x10*1.0),
-			  dword);
-	    }
-	}
-	if (len != i) {
-	    fprintf(out, "Bad count in 3DSTATE_SAMPLER_STATE\n");
-	    (*failures)++;
-	}
-	return len;
-    case 0x85:
-	len = (data[0] & 0x0000000f) + 2;
+		return len;
+	case 0x00:
+		instr_out(data, hw_offset, 0, "3DSTATE_MAP_STATE\n");
+		len = (data[0] & 0x0000003f) + 2;
+		instr_out(data, hw_offset, 1, "mask\n");
+
+		i = 2;
+		for (map = 0; map <= 15; map++) {
+			if (data[1] & (1 << map)) {
+				int width, height, pitch, dword;
+				const char *tiling;
+
+				if (i + 3 >= count)
+					BUFFER_FAIL(count, len,
+						    "3DSTATE_MAP_STATE");
+
+				dword = data[i];
+				instr_out(data, hw_offset, i++,
+					  "map %d MS2 %s%s%s\n", map,
+					  dword & (1 << 31) ?
+					  "untrusted surface, " : "",
+					  dword & (1 << 1) ?
+					  "vertical line stride enable, " : "",
+					  dword & (1 << 0) ?
+					  "vertical ofs enable, " : "");
+
+				dword = data[i];
+				width = ((dword >> 10) & ((1 << 11) - 1)) + 1;
+				height = ((dword >> 21) & ((1 << 11) - 1)) + 1;
+
+				tiling = "none";
+				if (dword & (1 << 2))
+					tiling = "fenced";
+				else if (dword & (1 << 1))
+					tiling = dword & (1 << 0) ? "Y" : "X";
+				type = " BAD";
+				format = "BAD";
+				switch ((dword >> 7) & 0x7) {
+				case 1:
+					type = "8b";
+					switch ((dword >> 3) & 0xf) {
+					case 0:
+						format = "I";
+						break;
+					case 1:
+						format = "L";
+						break;
+					case 4:
+						format = "A";
+						break;
+					case 5:
+						format = " mono";
+						break;
+					}
+					break;
+				case 2:
+					type = "16b";
+					switch ((dword >> 3) & 0xf) {
+					case 0:
+						format = " rgb565";
+						break;
+					case 1:
+						format = " argb1555";
+						break;
+					case 2:
+						format = " argb4444";
+						break;
+					case 5:
+						format = " ay88";
+						break;
+					case 6:
+						format = " bump655";
+						break;
+					case 7:
+						format = "I";
+						break;
+					case 8:
+						format = "L";
+						break;
+					case 9:
+						format = "A";
+						break;
+					}
+					break;
+				case 3:
+					type = "32b";
+					switch ((dword >> 3) & 0xf) {
+					case 0:
+						format = " argb8888";
+						break;
+					case 1:
+						format = " abgr8888";
+						break;
+					case 2:
+						format = " xrgb8888";
+						break;
+					case 3:
+						format = " xbgr8888";
+						break;
+					case 4:
+						format = " qwvu8888";
+						break;
+					case 5:
+						format = " axvu8888";
+						break;
+					case 6:
+						format = " lxvu8888";
+						break;
+					case 7:
+						format = " xlvu8888";
+						break;
+					case 8:
+						format = " argb2101010";
+						break;
+					case 9:
+						format = " abgr2101010";
+						break;
+					case 10:
+						format = " awvu2101010";
+						break;
+					case 11:
+						format = " gr1616";
+						break;
+					case 12:
+						format = " vu1616";
+						break;
+					case 13:
+						format = " xI824";
+						break;
+					case 14:
+						format = " xA824";
+						break;
+					case 15:
+						format = " xL824";
+						break;
+					}
+					break;
+				case 5:
+					type = "422";
+					switch ((dword >> 3) & 0xf) {
+					case 0:
+						format = " yuv_swapy";
+						break;
+					case 1:
+						format = " yuv";
+						break;
+					case 2:
+						format = " yuv_swapuv";
+						break;
+					case 3:
+						format = " yuv_swapuvy";
+						break;
+					}
+					break;
+				case 6:
+					type = "compressed";
+					switch ((dword >> 3) & 0x7) {
+					case 0:
+						format = " dxt1";
+						break;
+					case 1:
+						format = " dxt2_3";
+						break;
+					case 2:
+						format = " dxt4_5";
+						break;
+					case 3:
+						format = " fxt1";
+						break;
+					case 4:
+						format = " dxt1_rb";
+						break;
+					}
+					break;
+				case 7:
+					type = "4b indexed";
+					switch ((dword >> 3) & 0xf) {
+					case 7:
+						format = " argb8888";
+						break;
+					}
+					break;
+				}
+				dword = data[i];
+				instr_out(data, hw_offset, i++,
+					  "map %d MS3 [width=%d, height=%d, format=%s%s, tiling=%s%s]\n",
+					  map, width, height, type, format,
+					  tiling,
+					  dword & (1 << 9) ? " palette select" :
+					  "");
+
+				dword = data[i];
+				pitch =
+				    4 * (((dword >> 21) & ((1 << 11) - 1)) + 1);
+				instr_out(data, hw_offset, i++,
+					  "map %d MS4 [pitch=%d, max_lod=%i, vol_depth=%i, cube_face_ena=%x, %s]\n",
+					  map, pitch, (dword >> 9) & 0x3f,
+					  dword & 0xff, (dword >> 15) & 0x3f,
+					  dword & (1 << 8) ? "miplayout legacy"
+					  : "miplayout right");
+			}
+		}
+		if (len != i) {
+			fprintf(out, "Bad count in 3DSTATE_MAP_STATE\n");
+			(*failures)++;
+			return len;
+		}
+		return len;
+	case 0x06:
+		instr_out(data, hw_offset, 0,
+			  "3DSTATE_PIXEL_SHADER_CONSTANTS\n");
+		len = (data[0] & 0x000000ff) + 2;
 
-	if (len != 2)
-	    fprintf(out, "Bad count in 3DSTATE_DEST_BUFFER_VARIABLES\n");
-	if (count < 2)
-	    BUFFER_FAIL(count, len, "3DSTATE_DEST_BUFFER_VARIABLES");
+		i = 2;
+		for (c = 0; c <= 31; c++) {
+			if (data[1] & (1 << c)) {
+				if (i + 4 >= count)
+					BUFFER_FAIL(count, len,
+						    "3DSTATE_PIXEL_SHADER_CONSTANTS");
+				instr_out(data, hw_offset, i, "C%d.X = %f\n", c,
+					  int_as_float(data[i]));
+				i++;
+				instr_out(data, hw_offset, i, "C%d.Y = %f\n",
+					  c, int_as_float(data[i]));
+				i++;
+				instr_out(data, hw_offset, i, "C%d.Z = %f\n",
+					  c, int_as_float(data[i]));
+				i++;
+				instr_out(data, hw_offset, i, "C%d.W = %f\n",
+					  c, int_as_float(data[i]));
+				i++;
+			}
+		}
+		if (len != i) {
+			fprintf(out,
+				"Bad count in 3DSTATE_PIXEL_SHADER_CONSTANTS\n");
+			(*failures)++;
+		}
+		return len;
+	case 0x05:
+		instr_out(data, hw_offset, 0, "3DSTATE_PIXEL_SHADER_PROGRAM\n");
+		len = (data[0] & 0x000000ff) + 2;
+		if ((len - 1) % 3 != 0 || len > 370) {
+			fprintf(out,
+				"Bad count in 3DSTATE_PIXEL_SHADER_PROGRAM\n");
+			(*failures)++;
+		}
+		i = 1;
+		for (instr = 0; instr < (len - 1) / 3; instr++) {
+			char instr_prefix[10];
+
+			if (i + 3 >= count)
+				BUFFER_FAIL(count, len,
+					    "3DSTATE_PIXEL_SHADER_PROGRAM");
+			sprintf(instr_prefix, "PS%03d", instr);
+			i915_decode_instruction(data, hw_offset, i,
+						instr_prefix);
+			i += 3;
+		}
+		return len;
+	case 0x01:
+		if (IS_GEN2(devid))
+			break;
+		instr_out(data, hw_offset, 0, "3DSTATE_SAMPLER_STATE\n");
+		instr_out(data, hw_offset, 1, "mask\n");
+		len = (data[0] & 0x0000003f) + 2;
+		i = 2;
+		for (sampler = 0; sampler <= 15; sampler++) {
+			if (data[1] & (1 << sampler)) {
+				uint32_t dword;
+				char *mip_filter = "";
+				if (i + 3 >= count)
+					BUFFER_FAIL(count, len,
+						    "3DSTATE_SAMPLER_STATE");
+				dword = data[i];
+				switch ((dword >> 20) & 0x3) {
+				case 0:
+					mip_filter = "none";
+					break;
+				case 1:
+					mip_filter = "nearest";
+					break;
+				case 3:
+					mip_filter = "linear";
+					break;
+				}
+				instr_out(data, hw_offset, i++,
+					  "sampler %d SS2:%s%s%s "
+					  "base_mip_level=%i, mip_filter=%s, mag_filter=%s, min_filter=%s "
+					  "lod_bias=%.2f,%s max_aniso=%i, shadow_func=%s\n",
+					  sampler,
+					  dword & (1 << 31) ? " reverse gamma,"
+					  : "",
+					  dword & (1 << 30) ? " packed2planar,"
+					  : "",
+					  dword & (1 << 29) ?
+					  " colorspace conversion," : "",
+					  (dword >> 22) & 0x1f, mip_filter,
+					  decode_sample_filter(dword >> 17),
+					  decode_sample_filter(dword >> 14),
+					  ((dword >> 5) & 0x1ff) / (0x10 * 1.0),
+					  dword & (1 << 4) ? " shadow," : "",
+					  dword & (1 << 3) ? 4 : 2,
+					  decode_compare_func(dword));
+				dword = data[i];
+				instr_out(data, hw_offset, i++,
+					  "sampler %d SS3: min_lod=%.2f,%s "
+					  "tcmode_x=%s, tcmode_y=%s, tcmode_z=%s,%s texmap_idx=%i,%s\n",
+					  sampler,
+					  ((dword >> 24) & 0xff) / (0x10 * 1.0),
+					  dword & (1 << 17) ?
+					  " kill pixel enable," : "",
+					  decode_tex_coord_mode(dword >> 12),
+					  decode_tex_coord_mode(dword >> 9),
+					  decode_tex_coord_mode(dword >> 6),
+					  dword & (1 << 5) ?
+					  " normalized coords," : "",
+					  (dword >> 1) & 0xf,
+					  dword & (1 << 0) ? " deinterlacer," :
+					  "");
+				dword = data[i];
+				instr_out(data, hw_offset, i++,
+					  "sampler %d SS4: border color\n",
+					  sampler,
+					  ((dword >> 24) & 0xff) / (0x10 * 1.0),
+					  dword);
+			}
+		}
+		if (len != i) {
+			fprintf(out, "Bad count in 3DSTATE_SAMPLER_STATE\n");
+			(*failures)++;
+		}
+		return len;
+	case 0x85:
+		len = (data[0] & 0x0000000f) + 2;
 
-	instr_out(data, hw_offset, 0,
-		  "3DSTATE_DEST_BUFFER_VARIABLES\n");
-
-	switch ((data[1] >> 8) & 0xf) {
-	case 0x0: format = "g8"; break;
-	case 0x1: format = "x1r5g5b5"; break;
-	case 0x2: format = "r5g6b5"; break;
-	case 0x3: format = "a8r8g8b8"; break;
-	case 0x4: format = "ycrcb_swapy"; break;
-	case 0x5: format = "ycrcb_normal"; break;
-	case 0x6: format = "ycrcb_swapuv"; break;
-	case 0x7: format = "ycrcb_swapuvy"; break;
-	case 0x8: format = "a4r4g4b4"; break;
-	case 0x9: format = "a1r5g5b5"; break;
-	case 0xa: format = "a2r10g10b10"; break;
-	default: format = "BAD"; break;
-	}
-	switch ((data[1] >> 2) & 0x3) {
-	case 0x0: zformat = "u16"; break;
-	case 0x1: zformat = "f16"; break;
-	case 0x2: zformat = "u24x8"; break;
-	default: zformat = "BAD"; break;
-	}
-	instr_out(data, hw_offset, 1, "%s format, %s depth format, early Z %sabled\n",
-		  format, zformat,
-		  (data[1] & (1 << 31)) ? "en" : "dis");
-	return len;
+		if (len != 2)
+			fprintf(out,
+				"Bad count in 3DSTATE_DEST_BUFFER_VARIABLES\n");
+		if (count < 2)
+			BUFFER_FAIL(count, len,
+				    "3DSTATE_DEST_BUFFER_VARIABLES");
 
-    case 0x8e:
-	{
-	    const char *name, *tiling;
-
-	    len = (data[0] & 0x0000000f) + 2;
-	    if (len != 3)
-		fprintf(out, "Bad count in 3DSTATE_BUFFER_INFO\n");
-	    if (count < 3)
-		BUFFER_FAIL(count, len, "3DSTATE_BUFFER_INFO");
-
-	    switch((data[1] >> 24) & 0x7) {
-	    case 0x3: name = "color"; break;
-	    case 0x7: name = "depth"; break;
-	    default: name = "unknown"; break;
-	    }
-
-	    tiling = "none";
-	    if (data[1] & (1 << 23))
-		tiling = "fenced";
-	    else if (data[1] & (1 << 22))
-		tiling = data[1] & (1 << 21) ? "Y" : "X";
-
-	    instr_out(data, hw_offset, 0, "3DSTATE_BUFFER_INFO\n");
-	    instr_out(data, hw_offset, 1, "%s, tiling = %s, pitch=%d\n", name, tiling, data[1]&0xffff);
-
-	    instr_out(data, hw_offset, 2, "address\n");
-	    return len;
-	}
-    case 0x81:
-	len = (data[0] & 0x0000000f) + 2;
+		instr_out(data, hw_offset, 0,
+			  "3DSTATE_DEST_BUFFER_VARIABLES\n");
 
-	if (len != 3)
-	    fprintf(out, "Bad count in 3DSTATE_SCISSOR_RECTANGLE\n");
-	if (count < 3)
-	    BUFFER_FAIL(count, len, "3DSTATE_SCISSOR_RECTANGLE");
+		switch ((data[1] >> 8) & 0xf) {
+		case 0x0:
+			format = "g8";
+			break;
+		case 0x1:
+			format = "x1r5g5b5";
+			break;
+		case 0x2:
+			format = "r5g6b5";
+			break;
+		case 0x3:
+			format = "a8r8g8b8";
+			break;
+		case 0x4:
+			format = "ycrcb_swapy";
+			break;
+		case 0x5:
+			format = "ycrcb_normal";
+			break;
+		case 0x6:
+			format = "ycrcb_swapuv";
+			break;
+		case 0x7:
+			format = "ycrcb_swapuvy";
+			break;
+		case 0x8:
+			format = "a4r4g4b4";
+			break;
+		case 0x9:
+			format = "a1r5g5b5";
+			break;
+		case 0xa:
+			format = "a2r10g10b10";
+			break;
+		default:
+			format = "BAD";
+			break;
+		}
+		switch ((data[1] >> 2) & 0x3) {
+		case 0x0:
+			zformat = "u16";
+			break;
+		case 0x1:
+			zformat = "f16";
+			break;
+		case 0x2:
+			zformat = "u24x8";
+			break;
+		default:
+			zformat = "BAD";
+			break;
+		}
+		instr_out(data, hw_offset, 1,
+			  "%s format, %s depth format, early Z %sabled\n",
+			  format, zformat,
+			  (data[1] & (1 << 31)) ? "en" : "dis");
+		return len;
 
-	instr_out(data, hw_offset, 0,
-		  "3DSTATE_SCISSOR_RECTANGLE\n");
-	instr_out(data, hw_offset, 1, "(%d,%d)\n",
-		  data[1] & 0xffff, data[1] >> 16);
-	instr_out(data, hw_offset, 2, "(%d,%d)\n",
-		  data[2] & 0xffff, data[2] >> 16);
+	case 0x8e:
+		{
+			const char *name, *tiling;
+
+			len = (data[0] & 0x0000000f) + 2;
+			if (len != 3)
+				fprintf(out,
+					"Bad count in 3DSTATE_BUFFER_INFO\n");
+			if (count < 3)
+				BUFFER_FAIL(count, len, "3DSTATE_BUFFER_INFO");
+
+			switch ((data[1] >> 24) & 0x7) {
+			case 0x3:
+				name = "color";
+				break;
+			case 0x7:
+				name = "depth";
+				break;
+			default:
+				name = "unknown";
+				break;
+			}
 
-	return len;
-    case 0x80:
-	len = (data[0] & 0x0000000f) + 2;
+			tiling = "none";
+			if (data[1] & (1 << 23))
+				tiling = "fenced";
+			else if (data[1] & (1 << 22))
+				tiling = data[1] & (1 << 21) ? "Y" : "X";
 
-	if (len != 5)
-	    fprintf(out, "Bad count in 3DSTATE_DRAWING_RECTANGLE\n");
-	if (count < 5)
-	    BUFFER_FAIL(count, len, "3DSTATE_DRAWING_RECTANGLE");
+			instr_out(data, hw_offset, 0, "3DSTATE_BUFFER_INFO\n");
+			instr_out(data, hw_offset, 1,
+				  "%s, tiling = %s, pitch=%d\n", name, tiling,
+				  data[1] & 0xffff);
 
-	instr_out(data, hw_offset, 0,
-		  "3DSTATE_DRAWING_RECTANGLE\n");
-	instr_out(data, hw_offset, 1, "%s\n",
-		  data[1]&(1<<30)?"depth ofs disabled ":"");
-	instr_out(data, hw_offset, 2, "(%d,%d)\n",
-		  data[2] & 0xffff, data[2] >> 16);
-	instr_out(data, hw_offset, 3, "(%d,%d)\n",
-		  data[3] & 0xffff, data[3] >> 16);
-	instr_out(data, hw_offset, 4, "(%d,%d)\n",
-		  data[4] & 0xffff, data[4] >> 16);
+			instr_out(data, hw_offset, 2, "address\n");
+			return len;
+		}
+	case 0x81:
+		len = (data[0] & 0x0000000f) + 2;
 
-	return len;
-    case 0x9c:
-	len = (data[0] & 0x0000000f) + 2;
+		if (len != 3)
+			fprintf(out,
+				"Bad count in 3DSTATE_SCISSOR_RECTANGLE\n");
+		if (count < 3)
+			BUFFER_FAIL(count, len, "3DSTATE_SCISSOR_RECTANGLE");
 
-	if (len != 7)
-	    fprintf(out, "Bad count in 3DSTATE_CLEAR_PARAMETERS\n");
-	if (count < 7)
-	    BUFFER_FAIL(count, len, "3DSTATE_CLEAR_PARAMETERS");
+		instr_out(data, hw_offset, 0, "3DSTATE_SCISSOR_RECTANGLE\n");
+		instr_out(data, hw_offset, 1, "(%d,%d)\n",
+			  data[1] & 0xffff, data[1] >> 16);
+		instr_out(data, hw_offset, 2, "(%d,%d)\n",
+			  data[2] & 0xffff, data[2] >> 16);
 
-	instr_out(data, hw_offset, 0,
-		  "3DSTATE_CLEAR_PARAMETERS\n");
-	instr_out(data, hw_offset, 1, "prim_type=%s, clear=%s%s%s\n",
-		  data[1]&(1<<16)?"CLEAR_RECT":"ZONE_INIT",
-		  data[1]&(1<<2)?"color,":"",
-		  data[1]&(1<<1)?"depth,":"",
-		  data[1]&(1<<0)?"stencil,":"");
-	instr_out(data, hw_offset, 2, "clear color\n");
-	instr_out(data, hw_offset, 3, "clear depth/stencil\n");
-	instr_out(data, hw_offset, 4, "color value (rgba8888)\n");
-	instr_out(data, hw_offset, 5, "depth value %f\n",
-		  int_as_float(data[5]));
-	instr_out(data, hw_offset, 6, "clear stencil\n");
-	return len;
-    }
-
-    for (idx = 0; idx < ARRAY_SIZE(opcodes_3d_1d); idx++)
-    {
-	opcode_3d_1d = &opcodes_3d_1d[idx];
-	if (opcode_3d_1d->i830_only && !IS_GEN2(devid))
-	    continue;
-
-	if (((data[0] & 0x00ff0000) >> 16) == opcode_3d_1d->opcode) {
-	    len = 1;
-
-	    instr_out(data, hw_offset, 0, "%s\n", opcode_3d_1d->name);
-	    if (opcode_3d_1d->max_len > 1) {
-		len = (data[0] & 0x0000ffff) + 2;
-		if (len < opcode_3d_1d->min_len ||
-		    len > opcode_3d_1d->max_len)
-		{
-		    fprintf(out, "Bad count in %s\n",
-			    opcode_3d_1d->name);
-		    (*failures)++;
-		}
-	    }
+		return len;
+	case 0x80:
+		len = (data[0] & 0x0000000f) + 2;
+
+		if (len != 5)
+			fprintf(out,
+				"Bad count in 3DSTATE_DRAWING_RECTANGLE\n");
+		if (count < 5)
+			BUFFER_FAIL(count, len, "3DSTATE_DRAWING_RECTANGLE");
+
+		instr_out(data, hw_offset, 0, "3DSTATE_DRAWING_RECTANGLE\n");
+		instr_out(data, hw_offset, 1, "%s\n",
+			  data[1] & (1 << 30) ? "depth ofs disabled " : "");
+		instr_out(data, hw_offset, 2, "(%d,%d)\n",
+			  data[2] & 0xffff, data[2] >> 16);
+		instr_out(data, hw_offset, 3, "(%d,%d)\n",
+			  data[3] & 0xffff, data[3] >> 16);
+		instr_out(data, hw_offset, 4, "(%d,%d)\n",
+			  data[4] & 0xffff, data[4] >> 16);
 
-	    for (i = 1; i < len; i++) {
-		if (i >= count)
-		    BUFFER_FAIL(count, len,  opcode_3d_1d->name);
-		instr_out(data, hw_offset, i, "dword %d\n", i);
-	    }
+		return len;
+	case 0x9c:
+		len = (data[0] & 0x0000000f) + 2;
+
+		if (len != 7)
+			fprintf(out, "Bad count in 3DSTATE_CLEAR_PARAMETERS\n");
+		if (count < 7)
+			BUFFER_FAIL(count, len, "3DSTATE_CLEAR_PARAMETERS");
+
+		instr_out(data, hw_offset, 0, "3DSTATE_CLEAR_PARAMETERS\n");
+		instr_out(data, hw_offset, 1, "prim_type=%s, clear=%s%s%s\n",
+			  data[1] & (1 << 16) ? "CLEAR_RECT" : "ZONE_INIT",
+			  data[1] & (1 << 2) ? "color," : "",
+			  data[1] & (1 << 1) ? "depth," : "",
+			  data[1] & (1 << 0) ? "stencil," : "");
+		instr_out(data, hw_offset, 2, "clear color\n");
+		instr_out(data, hw_offset, 3, "clear depth/stencil\n");
+		instr_out(data, hw_offset, 4, "color value (rgba8888)\n");
+		instr_out(data, hw_offset, 5, "depth value %f\n",
+			  int_as_float(data[5]));
+		instr_out(data, hw_offset, 6, "clear stencil\n");
+		return len;
+	}
 
-	    return len;
+	for (idx = 0; idx < ARRAY_SIZE(opcodes_3d_1d); idx++) {
+		opcode_3d_1d = &opcodes_3d_1d[idx];
+		if (opcode_3d_1d->i830_only && !IS_GEN2(devid))
+			continue;
+
+		if (((data[0] & 0x00ff0000) >> 16) == opcode_3d_1d->opcode) {
+			len = 1;
+
+			instr_out(data, hw_offset, 0, "%s\n",
+				  opcode_3d_1d->name);
+			if (opcode_3d_1d->max_len > 1) {
+				len = (data[0] & 0x0000ffff) + 2;
+				if (len < opcode_3d_1d->min_len ||
+				    len > opcode_3d_1d->max_len) {
+					fprintf(out, "Bad count in %s\n",
+						opcode_3d_1d->name);
+					(*failures)++;
+				}
+			}
+
+			for (i = 1; i < len; i++) {
+				if (i >= count)
+					BUFFER_FAIL(count, len,
+						    opcode_3d_1d->name);
+				instr_out(data, hw_offset, i, "dword %d\n", i);
+			}
+
+			return len;
+		}
 	}
-    }
 
-    instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d_1d opcode = 0x%x\n", opcode);
-    (*failures)++;
-    return 1;
+	instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d_1d opcode = 0x%x\n",
+		  opcode);
+	(*failures)++;
+	return 1;
 }
 
 static int
-decode_3d_primitive(uint32_t *data, int count, uint32_t hw_offset,
+decode_3d_primitive(uint32_t * data, int count, uint32_t hw_offset,
 		    int *failures)
 {
-    char immediate = (data[0] & (1 << 23)) == 0;
-    unsigned int len, i, j, ret;
-    char *primtype;
-    int original_s2 = saved_s2;
-    int original_s4 = saved_s4;
-
-    switch ((data[0] >> 18) & 0xf) {
-    case 0x0: primtype = "TRILIST"; break;
-    case 0x1: primtype = "TRISTRIP"; break;
-    case 0x2: primtype = "TRISTRIP_REVERSE"; break;
-    case 0x3: primtype = "TRIFAN"; break;
-    case 0x4: primtype = "POLYGON"; break;
-    case 0x5: primtype = "LINELIST"; break;
-    case 0x6: primtype = "LINESTRIP"; break;
-    case 0x7: primtype = "RECTLIST"; break;
-    case 0x8: primtype = "POINTLIST"; break;
-    case 0x9: primtype = "DIB"; break;
-    case 0xa: primtype = "CLEAR_RECT"; saved_s4 = 3 << 6; saved_s2 = ~0; break;
-    default: primtype = "unknown"; break;
-    }
-
-    /* XXX: 3DPRIM_DIB not supported */
-    if (immediate) {
-	len = (data[0] & 0x0003ffff) + 2;
-	instr_out(data, hw_offset, 0, "3DPRIMITIVE inline %s\n", primtype);
-	if (count < len)
-	    BUFFER_FAIL(count, len,  "3DPRIMITIVE inline");
-	if (!saved_s2_set || !saved_s4_set) {
-	    fprintf(out, "unknown vertex format\n");
-	    for (i = 1; i < len; i++) {
-		instr_out(data, hw_offset, i,
-			  "           vertex data (%f float)\n",
-			  int_as_float(data[i]));
-	    }
-	} else {
-	    unsigned int vertex = 0;
-	    for (i = 1; i < len;) {
-		unsigned int tc;
+	char immediate = (data[0] & (1 << 23)) == 0;
+	unsigned int len, i, j, ret;
+	char *primtype;
+	int original_s2 = saved_s2;
+	int original_s4 = saved_s4;
+
+	switch ((data[0] >> 18) & 0xf) {
+	case 0x0:
+		primtype = "TRILIST";
+		break;
+	case 0x1:
+		primtype = "TRISTRIP";
+		break;
+	case 0x2:
+		primtype = "TRISTRIP_REVERSE";
+		break;
+	case 0x3:
+		primtype = "TRIFAN";
+		break;
+	case 0x4:
+		primtype = "POLYGON";
+		break;
+	case 0x5:
+		primtype = "LINELIST";
+		break;
+	case 0x6:
+		primtype = "LINESTRIP";
+		break;
+	case 0x7:
+		primtype = "RECTLIST";
+		break;
+	case 0x8:
+		primtype = "POINTLIST";
+		break;
+	case 0x9:
+		primtype = "DIB";
+		break;
+	case 0xa:
+		primtype = "CLEAR_RECT";
+		saved_s4 = 3 << 6;
+		saved_s2 = ~0;
+		break;
+	default:
+		primtype = "unknown";
+		break;
+	}
+
+	/* XXX: 3DPRIM_DIB not supported */
+	if (immediate) {
+		len = (data[0] & 0x0003ffff) + 2;
+		instr_out(data, hw_offset, 0, "3DPRIMITIVE inline %s\n",
+			  primtype);
+		if (count < len)
+			BUFFER_FAIL(count, len, "3DPRIMITIVE inline");
+		if (!saved_s2_set || !saved_s4_set) {
+			fprintf(out, "unknown vertex format\n");
+			for (i = 1; i < len; i++) {
+				instr_out(data, hw_offset, i,
+					  "           vertex data (%f float)\n",
+					  int_as_float(data[i]));
+			}
+		} else {
+			unsigned int vertex = 0;
+			for (i = 1; i < len;) {
+				unsigned int tc;
 
 #define VERTEX_OUT(fmt, ...) do {					\
     if (i < len)							\
@@ -1746,312 +2275,385 @@ decode_3d_primitive(uint32_t *data, int count, uint32_t hw_offset,
     i++;								\
 } while (0)
 
-		VERTEX_OUT("X = %f", int_as_float(data[i]));
-		VERTEX_OUT("Y = %f", int_as_float(data[i]));
-	        switch (saved_s4 >> 6 & 0x7) {
-		case 0x1:
-		    VERTEX_OUT("Z = %f", int_as_float(data[i]));
-		    break;
-		case 0x2:
-		    VERTEX_OUT("Z = %f", int_as_float(data[i]));
-		    VERTEX_OUT("W = %f", int_as_float(data[i]));
-		    break;
-		case 0x3:
-		    break;
-		case 0x4:
-		    VERTEX_OUT("W = %f", int_as_float(data[i]));
-		    break;
-		default:
-		    fprintf(out, "bad S4 position mask\n");
-		}
+				VERTEX_OUT("X = %f", int_as_float(data[i]));
+				VERTEX_OUT("Y = %f", int_as_float(data[i]));
+				switch (saved_s4 >> 6 & 0x7) {
+				case 0x1:
+					VERTEX_OUT("Z = %f",
+						   int_as_float(data[i]));
+					break;
+				case 0x2:
+					VERTEX_OUT("Z = %f",
+						   int_as_float(data[i]));
+					VERTEX_OUT("W = %f",
+						   int_as_float(data[i]));
+					break;
+				case 0x3:
+					break;
+				case 0x4:
+					VERTEX_OUT("W = %f",
+						   int_as_float(data[i]));
+					break;
+				default:
+					fprintf(out, "bad S4 position mask\n");
+				}
 
-		if (saved_s4 & (1 << 10)) {
-		    VERTEX_OUT("color = (A=0x%02x, R=0x%02x, G=0x%02x, "
-			       "B=0x%02x)",
-			       data[i] >> 24,
-			       (data[i] >> 16) & 0xff,
-			       (data[i] >> 8) & 0xff,
-			       data[i] & 0xff);
-		}
-		if (saved_s4 & (1 << 11)) {
-		    VERTEX_OUT("spec = (A=0x%02x, R=0x%02x, G=0x%02x, "
-			       "B=0x%02x)",
-			       data[i] >> 24,
-			       (data[i] >> 16) & 0xff,
-			       (data[i] >> 8) & 0xff,
-			       data[i] & 0xff);
-		}
-		if (saved_s4 & (1 << 12))
-		    VERTEX_OUT("width = 0x%08x)", data[i]);
-
-		for (tc = 0; tc <= 7; tc++) {
-		    switch ((saved_s2 >> (tc * 4)) & 0xf) {
-		    case 0x0:
-			VERTEX_OUT("T%d.X = %f", tc, int_as_float(data[i]));
-			VERTEX_OUT("T%d.Y = %f", tc, int_as_float(data[i]));
-			break;
-		    case 0x1:
-			VERTEX_OUT("T%d.X = %f", tc, int_as_float(data[i]));
-			VERTEX_OUT("T%d.Y = %f", tc, int_as_float(data[i]));
-			VERTEX_OUT("T%d.Z = %f", tc, int_as_float(data[i]));
-			break;
-		    case 0x2:
-			VERTEX_OUT("T%d.X = %f", tc, int_as_float(data[i]));
-			VERTEX_OUT("T%d.Y = %f", tc, int_as_float(data[i]));
-			VERTEX_OUT("T%d.Z = %f", tc, int_as_float(data[i]));
-			VERTEX_OUT("T%d.W = %f", tc, int_as_float(data[i]));
-			break;
-		    case 0x3:
-			VERTEX_OUT("T%d.X = %f", tc, int_as_float(data[i]));
-			break;
-		    case 0x4:
-			VERTEX_OUT("T%d.XY = 0x%08x half-float", tc, data[i]);
-			break;
-		    case 0x5:
-			VERTEX_OUT("T%d.XY = 0x%08x half-float", tc, data[i]);
-			VERTEX_OUT("T%d.ZW = 0x%08x half-float", tc, data[i]);
-			break;
-		    case 0xf:
-			break;
-		    default:
-			fprintf(out, "bad S2.T%d format\n", tc);
-		    }
+				if (saved_s4 & (1 << 10)) {
+					VERTEX_OUT
+					    ("color = (A=0x%02x, R=0x%02x, G=0x%02x, "
+					     "B=0x%02x)", data[i] >> 24,
+					     (data[i] >> 16) & 0xff,
+					     (data[i] >> 8) & 0xff,
+					     data[i] & 0xff);
+				}
+				if (saved_s4 & (1 << 11)) {
+					VERTEX_OUT
+					    ("spec = (A=0x%02x, R=0x%02x, G=0x%02x, "
+					     "B=0x%02x)", data[i] >> 24,
+					     (data[i] >> 16) & 0xff,
+					     (data[i] >> 8) & 0xff,
+					     data[i] & 0xff);
+				}
+				if (saved_s4 & (1 << 12))
+					VERTEX_OUT("width = 0x%08x)", data[i]);
+
+				for (tc = 0; tc <= 7; tc++) {
+					switch ((saved_s2 >> (tc * 4)) & 0xf) {
+					case 0x0:
+						VERTEX_OUT("T%d.X = %f", tc,
+							   int_as_float(data
+									[i]));
+						VERTEX_OUT("T%d.Y = %f", tc,
+							   int_as_float(data
+									[i]));
+						break;
+					case 0x1:
+						VERTEX_OUT("T%d.X = %f", tc,
+							   int_as_float(data
+									[i]));
+						VERTEX_OUT("T%d.Y = %f", tc,
+							   int_as_float(data
+									[i]));
+						VERTEX_OUT("T%d.Z = %f", tc,
+							   int_as_float(data
+									[i]));
+						break;
+					case 0x2:
+						VERTEX_OUT("T%d.X = %f", tc,
+							   int_as_float(data
+									[i]));
+						VERTEX_OUT("T%d.Y = %f", tc,
+							   int_as_float(data
+									[i]));
+						VERTEX_OUT("T%d.Z = %f", tc,
+							   int_as_float(data
+									[i]));
+						VERTEX_OUT("T%d.W = %f", tc,
+							   int_as_float(data
+									[i]));
+						break;
+					case 0x3:
+						VERTEX_OUT("T%d.X = %f", tc,
+							   int_as_float(data
+									[i]));
+						break;
+					case 0x4:
+						VERTEX_OUT
+						    ("T%d.XY = 0x%08x half-float",
+						     tc, data[i]);
+						break;
+					case 0x5:
+						VERTEX_OUT
+						    ("T%d.XY = 0x%08x half-float",
+						     tc, data[i]);
+						VERTEX_OUT
+						    ("T%d.ZW = 0x%08x half-float",
+						     tc, data[i]);
+						break;
+					case 0xf:
+						break;
+					default:
+						fprintf(out,
+							"bad S2.T%d format\n",
+							tc);
+					}
+				}
+				vertex++;
+			}
 		}
-		vertex++;
-	    }
-	}
 
-	ret = len;
-    } else {
-	/* indirect vertices */
-	len = data[0] & 0x0000ffff; /* index count */
-	if (data[0] & (1 << 17)) {
-	    /* random vertex access */
-	    if (count < (len + 1) / 2 + 1) {
-		BUFFER_FAIL(count, (len + 1) / 2 + 1,
-			    "3DPRIMITIVE random indirect");
-	    }
-	    instr_out(data, hw_offset, 0,
-		      "3DPRIMITIVE random indirect %s (%d)\n", primtype, len);
-	    if (len == 0) {
-		/* vertex indices continue until 0xffff is found */
-		for (i = 1; i < count; i++) {
-		    if ((data[i] & 0xffff) == 0xffff) {
-			instr_out(data, hw_offset, i,
-				  "    indices: (terminator)\n");
-			ret = i;
+		ret = len;
+	} else {
+		/* indirect vertices */
+		len = data[0] & 0x0000ffff;	/* index count */
+		if (data[0] & (1 << 17)) {
+			/* random vertex access */
+			if (count < (len + 1) / 2 + 1) {
+				BUFFER_FAIL(count, (len + 1) / 2 + 1,
+					    "3DPRIMITIVE random indirect");
+			}
+			instr_out(data, hw_offset, 0,
+				  "3DPRIMITIVE random indirect %s (%d)\n",
+				  primtype, len);
+			if (len == 0) {
+				/* vertex indices continue until 0xffff is found */
+				for (i = 1; i < count; i++) {
+					if ((data[i] & 0xffff) == 0xffff) {
+						instr_out(data, hw_offset, i,
+							  "    indices: (terminator)\n");
+						ret = i;
+						goto out;
+					} else if ((data[i] >> 16) == 0xffff) {
+						instr_out(data, hw_offset, i,
+							  "    indices: 0x%04x, (terminator)\n",
+							  data[i] & 0xffff);
+						ret = i;
+						goto out;
+					} else {
+						instr_out(data, hw_offset, i,
+							  "    indices: 0x%04x, 0x%04x\n",
+							  data[i] & 0xffff,
+							  data[i] >> 16);
+					}
+				}
+				fprintf(out,
+					"3DPRIMITIVE: no terminator found in index buffer\n");
+				(*failures)++;
+				ret = count;
+				goto out;
+			} else {
+				/* fixed size vertex index buffer */
+				for (j = 1, i = 0; i < len; i += 2, j++) {
+					if (i * 2 == len - 1) {
+						instr_out(data, hw_offset, j,
+							  "    indices: 0x%04x\n",
+							  data[j] & 0xffff);
+					} else {
+						instr_out(data, hw_offset, j,
+							  "    indices: 0x%04x, 0x%04x\n",
+							  data[j] & 0xffff,
+							  data[j] >> 16);
+					}
+				}
+			}
+			ret = (len + 1) / 2 + 1;
 			goto out;
-		    } else if ((data[i] >> 16) == 0xffff) {
-			instr_out(data, hw_offset, i,
-				  "    indices: 0x%04x, (terminator)\n",
-				  data[i] & 0xffff);
-			ret = i;
+		} else {
+			/* sequential vertex access */
+			if (count < 2)
+				BUFFER_FAIL(count, 2,
+					    "3DPRIMITIVE seq indirect");
+			instr_out(data, hw_offset, 0,
+				  "3DPRIMITIVE sequential indirect %s, %d starting from "
+				  "%d\n", primtype, len, data[1] & 0xffff);
+			instr_out(data, hw_offset, 1, "           start\n");
+			ret = 2;
 			goto out;
-		    } else {
-			instr_out(data, hw_offset, i,
-				  "    indices: 0x%04x, 0x%04x\n",
-				  data[i] & 0xffff, data[i] >> 16);
-		    }
-		}
-		fprintf(out,
-			"3DPRIMITIVE: no terminator found in index buffer\n");
-		(*failures)++;
-		ret = count;
-		goto out;
-	    } else {
-		/* fixed size vertex index buffer */
-		for (j = 1, i = 0; i < len; i += 2, j++) {
-		    if (i * 2 == len - 1) {
-			instr_out(data, hw_offset, j,
-				  "    indices: 0x%04x\n",
-				  data[j] & 0xffff);
-		    } else {
-			instr_out(data, hw_offset, j,
-				  "    indices: 0x%04x, 0x%04x\n",
-				  data[j] & 0xffff, data[j] >> 16);
-		    }
 		}
-	    }
-	    ret = (len + 1) / 2 + 1;
-	    goto out;
-	} else {
-	    /* sequential vertex access */
-	    if (count < 2)
-		BUFFER_FAIL(count, 2, "3DPRIMITIVE seq indirect");
-	    instr_out(data, hw_offset, 0,
-		      "3DPRIMITIVE sequential indirect %s, %d starting from "
-		      "%d\n", primtype, len, data[1] & 0xffff);
-	    instr_out(data, hw_offset, 1, "           start\n");
-	    ret = 2;
-	    goto out;
 	}
-    }
 
 out:
-    saved_s2 = original_s2;
-    saved_s4 = original_s4;
-    return ret;
+	saved_s2 = original_s2;
+	saved_s4 = original_s4;
+	return ret;
 }
 
 static int
-decode_3d(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid, int *failures)
+decode_3d(uint32_t * data, int count, uint32_t hw_offset, uint32_t devid,
+	  int *failures)
 {
-    uint32_t opcode;
-    unsigned int idx;
-
-    struct {
 	uint32_t opcode;
-	int min_len;
-	int max_len;
-	char *name;
-    } opcodes_3d[] = {
-	{ 0x06, 1, 1, "3DSTATE_ANTI_ALIASING" },
-	{ 0x08, 1, 1, "3DSTATE_BACKFACE_STENCIL_OPS" },
-	{ 0x09, 1, 1, "3DSTATE_BACKFACE_STENCIL_MASKS" },
-	{ 0x16, 1, 1, "3DSTATE_COORD_SET_BINDINGS" },
-	{ 0x15, 1, 1, "3DSTATE_FOG_COLOR" },
-	{ 0x0b, 1, 1, "3DSTATE_INDEPENDENT_ALPHA_BLEND" },
-	{ 0x0d, 1, 1, "3DSTATE_MODES_4" },
-	{ 0x0c, 1, 1, "3DSTATE_MODES_5" },
-	{ 0x07, 1, 1, "3DSTATE_RASTERIZATION_RULES" },
-    }, *opcode_3d;
-
-    opcode = (data[0] & 0x1f000000) >> 24;
-
-    switch (opcode) {
-    case 0x1f:
-	return decode_3d_primitive(data, count, hw_offset, failures);
-    case 0x1d:
-	return decode_3d_1d(data, count, hw_offset, devid, failures);
-    case 0x1c:
-	return decode_3d_1c(data, count, hw_offset, failures);
-    }
-
-    for (idx = 0; idx < ARRAY_SIZE(opcodes_3d); idx++) {
-	opcode_3d = &opcodes_3d[idx];
-	if (opcode == opcode_3d->opcode) {
-	    unsigned int len = 1, i;
-
-	    instr_out(data, hw_offset, 0, "%s\n", opcode_3d->name);
-	    if (opcode_3d->max_len > 1) {
-		len = (data[0] & 0xff) + 2;
-		if (len < opcode_3d->min_len ||
-		    len > opcode_3d->max_len)
+	unsigned int idx;
+
+	struct {
+		uint32_t opcode;
+		int min_len;
+		int max_len;
+		char *name;
+	} opcodes_3d[] = {
 		{
-		    fprintf(out, "Bad count in %s\n", opcode_3d->name);
+		0x06, 1, 1, "3DSTATE_ANTI_ALIASING"}, {
+		0x08, 1, 1, "3DSTATE_BACKFACE_STENCIL_OPS"}, {
+		0x09, 1, 1, "3DSTATE_BACKFACE_STENCIL_MASKS"}, {
+		0x16, 1, 1, "3DSTATE_COORD_SET_BINDINGS"}, {
+		0x15, 1, 1, "3DSTATE_FOG_COLOR"}, {
+		0x0b, 1, 1, "3DSTATE_INDEPENDENT_ALPHA_BLEND"}, {
+		0x0d, 1, 1, "3DSTATE_MODES_4"}, {
+		0x0c, 1, 1, "3DSTATE_MODES_5"}, {
+	0x07, 1, 1, "3DSTATE_RASTERIZATION_RULES"},}, *opcode_3d;
+
+	opcode = (data[0] & 0x1f000000) >> 24;
+
+	switch (opcode) {
+	case 0x1f:
+		return decode_3d_primitive(data, count, hw_offset, failures);
+	case 0x1d:
+		return decode_3d_1d(data, count, hw_offset, devid, failures);
+	case 0x1c:
+		return decode_3d_1c(data, count, hw_offset, failures);
+	}
+
+	for (idx = 0; idx < ARRAY_SIZE(opcodes_3d); idx++) {
+		opcode_3d = &opcodes_3d[idx];
+		if (opcode == opcode_3d->opcode) {
+			unsigned int len = 1, i;
+
+			instr_out(data, hw_offset, 0, "%s\n", opcode_3d->name);
+			if (opcode_3d->max_len > 1) {
+				len = (data[0] & 0xff) + 2;
+				if (len < opcode_3d->min_len ||
+				    len > opcode_3d->max_len) {
+					fprintf(out, "Bad count in %s\n",
+						opcode_3d->name);
+				}
+			}
+
+			for (i = 1; i < len; i++) {
+				if (i >= count)
+					BUFFER_FAIL(count, len,
+						    opcode_3d->name);
+				instr_out(data, hw_offset, i, "dword %d\n", i);
+			}
+			return len;
 		}
-	    }
-
-	    for (i = 1; i < len; i++) {
-		if (i >= count)
-		    BUFFER_FAIL(count, len, opcode_3d->name);
-		instr_out(data, hw_offset, i, "dword %d\n", i);
-	    }
-	    return len;
 	}
-    }
 
-    instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d opcode = 0x%x\n", opcode);
-    (*failures)++;
-    return 1;
+	instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d opcode = 0x%x\n", opcode);
+	(*failures)++;
+	return 1;
 }
 
-static const char *
-get_965_surfacetype(unsigned int surfacetype)
+static const char *get_965_surfacetype(unsigned int surfacetype)
 {
-    switch (surfacetype) {
-    case 0: return "1D";
-    case 1: return "2D";
-    case 2: return "3D";
-    case 3: return "CUBE";
-    case 4: return "BUFFER";
-    case 7: return "NULL";
-    default: return "unknown";
-    }
+	switch (surfacetype) {
+	case 0:
+		return "1D";
+	case 1:
+		return "2D";
+	case 2:
+		return "3D";
+	case 3:
+		return "CUBE";
+	case 4:
+		return "BUFFER";
+	case 7:
+		return "NULL";
+	default:
+		return "unknown";
+	}
 }
 
-static const char *
-get_965_depthformat(unsigned int depthformat)
+static const char *get_965_depthformat(unsigned int depthformat)
 {
-    switch (depthformat) {
-    case 0: return "s8_z24float";
-    case 1: return "z32float";
-    case 2: return "z24s8";
-    case 5: return "z16";
-    default: return "unknown";
-    }
+	switch (depthformat) {
+	case 0:
+		return "s8_z24float";
+	case 1:
+		return "z32float";
+	case 2:
+		return "z24s8";
+	case 5:
+		return "z16";
+	default:
+		return "unknown";
+	}
 }
 
-static const char *
-get_965_element_component(uint32_t data, int component)
+static const char *get_965_element_component(uint32_t data, int component)
 {
-    uint32_t component_control = (data >> (16 + (3 - component) * 4)) & 0x7;
-
-    switch (component_control) {
-    case 0:
-	return "nostore";
-    case 1:
-	switch (component) {
-	case 0: return "X";
-	case 1: return "Y";
-	case 2: return "Z";
-	case 3: return "W";
-	default: return "fail";
+	uint32_t component_control = (data >> (16 + (3 - component) * 4)) & 0x7;
+
+	switch (component_control) {
+	case 0:
+		return "nostore";
+	case 1:
+		switch (component) {
+		case 0:
+			return "X";
+		case 1:
+			return "Y";
+		case 2:
+			return "Z";
+		case 3:
+			return "W";
+		default:
+			return "fail";
+		}
+	case 2:
+		return "0.0";
+	case 3:
+		return "1.0";
+	case 4:
+		return "0x1";
+	case 5:
+		return "VID";
+	default:
+		return "fail";
 	}
-    case 2:
-	return "0.0";
-    case 3:
-	return "1.0";
-    case 4:
-	return "0x1";
-    case 5:
-	return "VID";
-    default:
-	return "fail";
-    }
 }
 
-static const char *
-get_965_prim_type(uint32_t data)
+static const char *get_965_prim_type(uint32_t data)
 {
-    uint32_t primtype = (data >> 10) & 0x1f;
-
-    switch (primtype) {
-    case 0x01: return "point list";
-    case 0x02: return "line list";
-    case 0x03: return "line strip";
-    case 0x04: return "tri list";
-    case 0x05: return "tri strip";
-    case 0x06: return "tri fan";
-    case 0x07: return "quad list";
-    case 0x08: return "quad strip";
-    case 0x09: return "line list adj";
-    case 0x0a: return "line strip adj";
-    case 0x0b: return "tri list adj";
-    case 0x0c: return "tri strip adj";
-    case 0x0d: return "tri strip reverse";
-    case 0x0e: return "polygon";
-    case 0x0f: return "rect list";
-    case 0x10: return "line loop";
-    case 0x11: return "point list bf";
-    case 0x12: return "line strip cont";
-    case 0x13: return "line strip bf";
-    case 0x14: return "line strip cont bf";
-    case 0x15: return "tri fan no stipple";
-    default: return "fail";
-    }
+	uint32_t primtype = (data >> 10) & 0x1f;
+
+	switch (primtype) {
+	case 0x01:
+		return "point list";
+	case 0x02:
+		return "line list";
+	case 0x03:
+		return "line strip";
+	case 0x04:
+		return "tri list";
+	case 0x05:
+		return "tri strip";
+	case 0x06:
+		return "tri fan";
+	case 0x07:
+		return "quad list";
+	case 0x08:
+		return "quad strip";
+	case 0x09:
+		return "line list adj";
+	case 0x0a:
+		return "line strip adj";
+	case 0x0b:
+		return "tri list adj";
+	case 0x0c:
+		return "tri strip adj";
+	case 0x0d:
+		return "tri strip reverse";
+	case 0x0e:
+		return "polygon";
+	case 0x0f:
+		return "rect list";
+	case 0x10:
+		return "line loop";
+	case 0x11:
+		return "point list bf";
+	case 0x12:
+		return "line strip cont";
+	case 0x13:
+		return "line strip bf";
+	case 0x14:
+		return "line strip cont bf";
+	case 0x15:
+		return "tri fan no stipple";
+	default:
+		return "fail";
+	}
 }
 
 static int
-i965_decode_urb_fence(uint32_t *data, uint32_t hw_offset, int len, int count,
+i965_decode_urb_fence(uint32_t * data, uint32_t hw_offset, int len, int count,
 		      int *failures)
 {
 	uint32_t vs_fence, clip_fence, gs_fence, sf_fence, vfe_fence, cs_fence;
 
 	if (len != 3)
-	    fprintf(out, "Bad count in URB_FENCE\n");
+		fprintf(out, "Bad count in URB_FENCE\n");
 	if (count < 3)
-	    BUFFER_FAIL(count, len, "URB_FENCE");
+		BUFFER_FAIL(count, len, "URB_FENCE");
 
 	vs_fence = data[1] & 0x3ff;
 	gs_fence = (data[1] >> 10) & 0x3ff;
@@ -2061,12 +2663,12 @@ i965_decode_urb_fence(uint32_t *data, uint32_t hw_offset, int len, int count,
 	cs_fence = (data[2] >> 20) & 0x7ff;
 
 	instr_out(data, hw_offset, 0, "URB_FENCE: %s%s%s%s%s%s\n",
-			(data[0] >> 13) & 1 ? "cs " : "",
-			(data[0] >> 12) & 1 ? "vfe " : "",
-			(data[0] >> 11) & 1 ? "sf " : "",
-			(data[0] >> 10) & 1 ? "clip " : "",
-			(data[0] >> 9)  & 1 ? "gs " : "",
-			(data[0] >> 8)  & 1 ? "vs " : "");
+		  (data[0] >> 13) & 1 ? "cs " : "",
+		  (data[0] >> 12) & 1 ? "vfe " : "",
+		  (data[0] >> 11) & 1 ? "sf " : "",
+		  (data[0] >> 10) & 1 ? "clip " : "",
+		  (data[0] >> 9) & 1 ? "gs " : "",
+		  (data[0] >> 8) & 1 ? "vs " : "");
 	instr_out(data, hw_offset, 1,
 		  "vs fence: %d, clip_fence: %d, gs_fence: %d\n",
 		  vs_fence, clip_fence, gs_fence);
@@ -2074,777 +2676,830 @@ i965_decode_urb_fence(uint32_t *data, uint32_t hw_offset, int len, int count,
 		  "sf fence: %d, vfe_fence: %d, cs_fence: %d\n",
 		  sf_fence, vfe_fence, cs_fence);
 	if (gs_fence < vs_fence)
-	    fprintf(out, "gs fence < vs fence!\n");
+		fprintf(out, "gs fence < vs fence!\n");
 	if (clip_fence < gs_fence)
-	    fprintf(out, "clip fence < gs fence!\n");
+		fprintf(out, "clip fence < gs fence!\n");
 	if (sf_fence < clip_fence)
-	    fprintf(out, "sf fence < clip fence!\n");
+		fprintf(out, "sf fence < clip fence!\n");
 	if (cs_fence < sf_fence)
-	    fprintf(out, "cs fence < sf fence!\n");
+		fprintf(out, "cs fence < sf fence!\n");
 
 	return len;
 }
 
 static void
-state_base_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
+state_base_out(uint32_t * data, uint32_t hw_offset, unsigned int index,
 	       char *name)
 {
-    if (data[index] & 1) {
-	instr_out(data, hw_offset, index, "%s state base address 0x%08x\n",
-		  name, data[index] & ~1);
-    } else {
-	instr_out(data, hw_offset, index, "%s state base not updated\n",
-		  name);
-    }
+	if (data[index] & 1) {
+		instr_out(data, hw_offset, index,
+			  "%s state base address 0x%08x\n", name,
+			  data[index] & ~1);
+	} else {
+		instr_out(data, hw_offset, index, "%s state base not updated\n",
+			  name);
+	}
 }
 
 static void
-state_max_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
+state_max_out(uint32_t * data, uint32_t hw_offset, unsigned int index,
 	      char *name)
 {
-    if (data[index] & 1) {
-	if (data[index] == 1) {
-	    instr_out(data, hw_offset, index,
-		      "%s state upper bound disabled\n", name);
+	if (data[index] & 1) {
+		if (data[index] == 1) {
+			instr_out(data, hw_offset, index,
+				  "%s state upper bound disabled\n", name);
+		} else {
+			instr_out(data, hw_offset, index,
+				  "%s state upper bound 0x%08x\n", name,
+				  data[index] & ~1);
+		}
 	} else {
-	    instr_out(data, hw_offset, index, "%s state upper bound 0x%08x\n",
-		      name, data[index] & ~1);
+		instr_out(data, hw_offset, index,
+			  "%s state upper bound not updated\n", name);
 	}
-    } else {
-	instr_out(data, hw_offset, index, "%s state upper bound not updated\n",
-		  name);
-    }
 }
 
 static int
-decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid, int *failures)
+decode_3d_965(uint32_t * data, int count, uint32_t hw_offset, uint32_t devid,
+	      int *failures)
 {
-    uint32_t opcode;
-    unsigned int idx, len;
-    int i, sba_len;
-    char *desc1 = NULL;
-
-    struct {
 	uint32_t opcode;
-	int min_len;
-	int max_len;
-	char *name;
-    } opcodes_3d[] = {
-	{ 0x6000, 3, 3, "URB_FENCE" },
-	{ 0x6001, 2, 2, "CS_URB_STATE" },
-	{ 0x6002, 2, 2, "CONSTANT_BUFFER" },
-	{ 0x6101, 6, 6, "STATE_BASE_ADDRESS" },
-	{ 0x6102, 2, 2 , "STATE_SIP" },
-	{ 0x6104, 1, 1, "3DSTATE_PIPELINE_SELECT" },
-	{ 0x680b, 1, 1, "3DSTATE_VF_STATISTICS" },
-	{ 0x6904, 1, 1, "3DSTATE_PIPELINE_SELECT" },
-	{ 0x7800, 7, 7, "3DSTATE_PIPELINED_POINTERS" },
-	{ 0x7801, 6, 6, "3DSTATE_BINDING_TABLE_POINTERS" },
-	{ 0x7808, 5, 257, "3DSTATE_VERTEX_BUFFERS" },
-	{ 0x7809, 3, 256, "3DSTATE_VERTEX_ELEMENTS" },
-	{ 0x780a, 3, 3, "3DSTATE_INDEX_BUFFER" },
-	{ 0x780b, 1, 1, "3DSTATE_VF_STATISTICS" },
-	{ 0x7900, 4, 4, "3DSTATE_DRAWING_RECTANGLE" },
-	{ 0x7901, 5, 5, "3DSTATE_CONSTANT_COLOR" },
-	{ 0x7905, 5, 7, "3DSTATE_DEPTH_BUFFER" },
-	{ 0x7906, 2, 2, "3DSTATE_POLY_STIPPLE_OFFSET" },
-	{ 0x7907, 33, 33, "3DSTATE_POLY_STIPPLE_PATTERN" },
-	{ 0x7908, 3, 3, "3DSTATE_LINE_STIPPLE" },
-	{ 0x7909, 2, 2, "3DSTATE_GLOBAL_DEPTH_OFFSET_CLAMP" },
-	{ 0x7909, 2, 2, "3DSTATE_CLEAR_PARAMS" },
-	{ 0x790a, 3, 3, "3DSTATE_AA_LINE_PARAMETERS" },
-	{ 0x790b, 4, 4, "3DSTATE_GS_SVB_INDEX" },
-	{ 0x790d, 3, 3, "3DSTATE_MULTISAMPLE" },
-	{ 0x7910, 2, 2, "3DSTATE_CLEAR_PARAMS" },
-	{ 0x7b00, 6, 6, "3DPRIMITIVE" },
-	{ 0x7802, 4, 4, "3DSTATE_SAMPLER_STATE_POINTERS" },
-	{ 0x7805, 3, 3, "3DSTATE_URB" },
-	{ 0x780d, 4, 4, "3DSTATE_VIEWPORT_STATE_POINTERS" },
-	{ 0x780e, 4, 4, "3DSTATE_CC_STATE_POINTERS" },
-	{ 0x780f, 2, 2, "3DSTATE_SCISSOR_STATE_POINTERS" },
-	{ 0x7810, 6, 6, "3DSTATE_VS_STATE" },
-	{ 0x7811, 7, 7, "3DSTATE_GS_STATE" },
-	{ 0x7812, 4, 4, "3DSTATE_CLIP_STATE" },
-	{ 0x7813, 20, 20, "3DSTATE_SF_STATE" },
-	{ 0x7814, 9, 9, "3DSTATE_WM_STATE" },
-	{ 0x7815, 5, 5, "3DSTATE_CONSTANT_VS_STATE" },
-	{ 0x7816, 5, 5, "3DSTATE_CONSTANT_GS_STATE" },
-	{ 0x7817, 5, 5, "3DSTATE_CONSTANT_PS_STATE" },
-	{ 0x7818, 2, 2, "3DSTATE_SAMPLE_MASK" },
-   }, *opcode_3d;
-
-    len = (data[0] & 0x0000ffff) + 2;
-
-    opcode = (data[0] & 0xffff0000) >> 16;
-    switch (opcode) {
-    case 0x6000:
-	len = (data[0] & 0x000000ff) + 2;
-	return i965_decode_urb_fence(data, hw_offset, len, count, failures);
-    case 0x6001:
-	instr_out(data, hw_offset, 0, "CS_URB_STATE\n");
-	instr_out(data, hw_offset, 1, "entry_size: %d [%d bytes], n_entries: %d\n",
-			(data[1] >> 4) & 0x1f,
-			(((data[1] >> 4) & 0x1f) + 1) * 64,
-			data[1] & 0x7);
-	return len;
-    case 0x6002:
-	len = (data[0] & 0x000000ff) + 2;
-	instr_out(data, hw_offset, 0, "CONSTANT_BUFFER: %s\n",
-			(data[0] >> 8) & 1 ? "valid" : "invalid");
-	instr_out(data, hw_offset, 1, "offset: 0x%08x, length: %d bytes\n",
-			data[1] & ~0x3f, ((data[1] & 0x3f) + 1) * 64);
-	return len;
-    case 0x6101:
-	i = 0;
-	instr_out(data, hw_offset, 0,
-		  "STATE_BASE_ADDRESS\n");
-	i++;
+	unsigned int idx, len;
+	int i, sba_len;
+	char *desc1 = NULL;
+
+	struct {
+		uint32_t opcode;
+		int min_len;
+		int max_len;
+		char *name;
+	} opcodes_3d[] = {
+		{
+		0x6000, 3, 3, "URB_FENCE"}, {
+		0x6001, 2, 2, "CS_URB_STATE"}, {
+		0x6002, 2, 2, "CONSTANT_BUFFER"}, {
+		0x6101, 6, 6, "STATE_BASE_ADDRESS"}, {
+		0x6102, 2, 2, "STATE_SIP"}, {
+		0x6104, 1, 1, "3DSTATE_PIPELINE_SELECT"}, {
+		0x680b, 1, 1, "3DSTATE_VF_STATISTICS"}, {
+		0x6904, 1, 1, "3DSTATE_PIPELINE_SELECT"}, {
+		0x7800, 7, 7, "3DSTATE_PIPELINED_POINTERS"}, {
+		0x7801, 6, 6, "3DSTATE_BINDING_TABLE_POINTERS"}, {
+		0x7808, 5, 257, "3DSTATE_VERTEX_BUFFERS"}, {
+		0x7809, 3, 256, "3DSTATE_VERTEX_ELEMENTS"}, {
+		0x780a, 3, 3, "3DSTATE_INDEX_BUFFER"}, {
+		0x780b, 1, 1, "3DSTATE_VF_STATISTICS"}, {
+		0x7900, 4, 4, "3DSTATE_DRAWING_RECTANGLE"}, {
+		0x7901, 5, 5, "3DSTATE_CONSTANT_COLOR"}, {
+		0x7905, 5, 7, "3DSTATE_DEPTH_BUFFER"}, {
+		0x7906, 2, 2, "3DSTATE_POLY_STIPPLE_OFFSET"}, {
+		0x7907, 33, 33, "3DSTATE_POLY_STIPPLE_PATTERN"}, {
+		0x7908, 3, 3, "3DSTATE_LINE_STIPPLE"}, {
+		0x7909, 2, 2, "3DSTATE_GLOBAL_DEPTH_OFFSET_CLAMP"}, {
+		0x7909, 2, 2, "3DSTATE_CLEAR_PARAMS"}, {
+		0x790a, 3, 3, "3DSTATE_AA_LINE_PARAMETERS"}, {
+		0x790b, 4, 4, "3DSTATE_GS_SVB_INDEX"}, {
+		0x790d, 3, 3, "3DSTATE_MULTISAMPLE"}, {
+		0x7910, 2, 2, "3DSTATE_CLEAR_PARAMS"}, {
+		0x7b00, 6, 6, "3DPRIMITIVE"}, {
+		0x7802, 4, 4, "3DSTATE_SAMPLER_STATE_POINTERS"}, {
+		0x7805, 3, 3, "3DSTATE_URB"}, {
+		0x780d, 4, 4, "3DSTATE_VIEWPORT_STATE_POINTERS"}, {
+		0x780e, 4, 4, "3DSTATE_CC_STATE_POINTERS"}, {
+		0x780f, 2, 2, "3DSTATE_SCISSOR_STATE_POINTERS"}, {
+		0x7810, 6, 6, "3DSTATE_VS_STATE"}, {
+		0x7811, 7, 7, "3DSTATE_GS_STATE"}, {
+		0x7812, 4, 4, "3DSTATE_CLIP_STATE"}, {
+		0x7813, 20, 20, "3DSTATE_SF_STATE"}, {
+		0x7814, 9, 9, "3DSTATE_WM_STATE"}, {
+		0x7815, 5, 5, "3DSTATE_CONSTANT_VS_STATE"}, {
+		0x7816, 5, 5, "3DSTATE_CONSTANT_GS_STATE"}, {
+		0x7817, 5, 5, "3DSTATE_CONSTANT_PS_STATE"}, {
+	0x7818, 2, 2, "3DSTATE_SAMPLE_MASK"},}, *opcode_3d;
+
+	len = (data[0] & 0x0000ffff) + 2;
+
+	opcode = (data[0] & 0xffff0000) >> 16;
+	switch (opcode) {
+	case 0x6000:
+		len = (data[0] & 0x000000ff) + 2;
+		return i965_decode_urb_fence(data, hw_offset, len, count,
+					     failures);
+	case 0x6001:
+		instr_out(data, hw_offset, 0, "CS_URB_STATE\n");
+		instr_out(data, hw_offset, 1,
+			  "entry_size: %d [%d bytes], n_entries: %d\n",
+			  (data[1] >> 4) & 0x1f,
+			  (((data[1] >> 4) & 0x1f) + 1) * 64, data[1] & 0x7);
+		return len;
+	case 0x6002:
+		len = (data[0] & 0x000000ff) + 2;
+		instr_out(data, hw_offset, 0, "CONSTANT_BUFFER: %s\n",
+			  (data[0] >> 8) & 1 ? "valid" : "invalid");
+		instr_out(data, hw_offset, 1,
+			  "offset: 0x%08x, length: %d bytes\n", data[1] & ~0x3f,
+			  ((data[1] & 0x3f) + 1) * 64);
+		return len;
+	case 0x6101:
+		i = 0;
+		instr_out(data, hw_offset, 0, "STATE_BASE_ADDRESS\n");
+		i++;
 
-	if (IS_GEN6(devid) || IS_GEN7(devid))
-	    sba_len = 10;
-	else if (IS_GEN5(devid))
-	    sba_len = 8;
-	else
-	    sba_len = 6;
-	if (len != sba_len)
-	    fprintf(out, "Bad count in STATE_BASE_ADDRESS\n");
-	if (len != sba_len)
-	    BUFFER_FAIL(count, len, "STATE_BASE_ADDRESS");
-
-	state_base_out(data, hw_offset, i++, "general");
-	state_base_out(data, hw_offset, i++, "surface");
-	if (IS_GEN6(devid) || IS_GEN7(devid))
-	    state_base_out(data, hw_offset, i++, "dynamic");
-	state_base_out(data, hw_offset, i++, "indirect");
-	if (IS_GEN5(devid) || IS_GEN6(devid) || IS_GEN7(devid))
-	    state_base_out(data, hw_offset, i++, "instruction");
-
-	state_max_out(data, hw_offset, i++, "general");
-	if (IS_GEN6(devid) || IS_GEN7(devid))
-	    state_max_out(data, hw_offset, i++, "dynamic");
-	state_max_out(data, hw_offset, i++, "indirect");
-	if (IS_GEN5(devid) || IS_GEN6(devid) || IS_GEN7(devid))
-	    state_max_out(data, hw_offset, i++, "instruction");
+		if (IS_GEN6(devid) || IS_GEN7(devid))
+			sba_len = 10;
+		else if (IS_GEN5(devid))
+			sba_len = 8;
+		else
+			sba_len = 6;
+		if (len != sba_len)
+			fprintf(out, "Bad count in STATE_BASE_ADDRESS\n");
+		if (len != sba_len)
+			BUFFER_FAIL(count, len, "STATE_BASE_ADDRESS");
+
+		state_base_out(data, hw_offset, i++, "general");
+		state_base_out(data, hw_offset, i++, "surface");
+		if (IS_GEN6(devid) || IS_GEN7(devid))
+			state_base_out(data, hw_offset, i++, "dynamic");
+		state_base_out(data, hw_offset, i++, "indirect");
+		if (IS_GEN5(devid) || IS_GEN6(devid) || IS_GEN7(devid))
+			state_base_out(data, hw_offset, i++, "instruction");
+
+		state_max_out(data, hw_offset, i++, "general");
+		if (IS_GEN6(devid) || IS_GEN7(devid))
+			state_max_out(data, hw_offset, i++, "dynamic");
+		state_max_out(data, hw_offset, i++, "indirect");
+		if (IS_GEN5(devid) || IS_GEN6(devid) || IS_GEN7(devid))
+			state_max_out(data, hw_offset, i++, "instruction");
 
-	return len;
-    case 0x7800:
-	if (len != 7)
-	    fprintf(out, "Bad count in 3DSTATE_PIPELINED_POINTERS\n");
-	if (count < 7)
-	    BUFFER_FAIL(count, len, "3DSTATE_PIPELINED_POINTERS");
+		return len;
+	case 0x7800:
+		if (len != 7)
+			fprintf(out,
+				"Bad count in 3DSTATE_PIPELINED_POINTERS\n");
+		if (count < 7)
+			BUFFER_FAIL(count, len, "3DSTATE_PIPELINED_POINTERS");
+
+		instr_out(data, hw_offset, 0, "3DSTATE_PIPELINED_POINTERS\n");
+		instr_out(data, hw_offset, 1, "VS state\n");
+		instr_out(data, hw_offset, 2, "GS state\n");
+		instr_out(data, hw_offset, 3, "Clip state\n");
+		instr_out(data, hw_offset, 4, "SF state\n");
+		instr_out(data, hw_offset, 5, "WM state\n");
+		instr_out(data, hw_offset, 6, "CC state\n");
+		return len;
+	case 0x7801:
+		len = (data[0] & 0x000000ff) + 2;
+		if (len != 6 && len != 4)
+			fprintf(out,
+				"Bad count in 3DSTATE_BINDING_TABLE_POINTERS\n");
+		if (len == 6) {
+			if (count < 6)
+				BUFFER_FAIL(count, len,
+					    "3DSTATE_BINDING_TABLE_POINTERS");
+			instr_out(data, hw_offset, 0,
+				  "3DSTATE_BINDING_TABLE_POINTERS\n");
+			instr_out(data, hw_offset, 1, "VS binding table\n");
+			instr_out(data, hw_offset, 2, "GS binding table\n");
+			instr_out(data, hw_offset, 3, "Clip binding table\n");
+			instr_out(data, hw_offset, 4, "SF binding table\n");
+			instr_out(data, hw_offset, 5, "WM binding table\n");
+		} else {
+			if (count < 4)
+				BUFFER_FAIL(count, len,
+					    "3DSTATE_BINDING_TABLE_POINTERS");
+
+			instr_out(data, hw_offset, 0,
+				  "3DSTATE_BINDING_TABLE_POINTERS: VS mod %d, "
+				  "GS mod %d, PS mod %d\n",
+				  (data[0] & (1 << 8)) != 0,
+				  (data[0] & (1 << 9)) != 0,
+				  (data[0] & (1 << 12)) != 0);
+			instr_out(data, hw_offset, 1, "VS binding table\n");
+			instr_out(data, hw_offset, 2, "GS binding table\n");
+			instr_out(data, hw_offset, 3, "WM binding table\n");
+		}
 
-	instr_out(data, hw_offset, 0,
-		  "3DSTATE_PIPELINED_POINTERS\n");
-	instr_out(data, hw_offset, 1, "VS state\n");
-	instr_out(data, hw_offset, 2, "GS state\n");
-	instr_out(data, hw_offset, 3, "Clip state\n");
-	instr_out(data, hw_offset, 4, "SF state\n");
-	instr_out(data, hw_offset, 5, "WM state\n");
-	instr_out(data, hw_offset, 6, "CC state\n");
-	return len;
-    case 0x7801:
-	len = (data[0] & 0x000000ff) + 2;
-	if (len != 6 && len != 4)
-	    fprintf(out, "Bad count in 3DSTATE_BINDING_TABLE_POINTERS\n");
-	if (len == 6) {
-	    if (count < 6)
-		BUFFER_FAIL(count, len, "3DSTATE_BINDING_TABLE_POINTERS");
-	    instr_out(data, hw_offset, 0,
-		      "3DSTATE_BINDING_TABLE_POINTERS\n");
-	    instr_out(data, hw_offset, 1, "VS binding table\n");
-	    instr_out(data, hw_offset, 2, "GS binding table\n");
-	    instr_out(data, hw_offset, 3, "Clip binding table\n");
-	    instr_out(data, hw_offset, 4, "SF binding table\n");
-	    instr_out(data, hw_offset, 5, "WM binding table\n");
-	} else {
-	    if (count < 4)
-		BUFFER_FAIL(count, len, "3DSTATE_BINDING_TABLE_POINTERS");
-
-	    instr_out(data, hw_offset, 0,
-		      "3DSTATE_BINDING_TABLE_POINTERS: VS mod %d, "
-		      "GS mod %d, PS mod %d\n",
-		      (data[0] & (1 << 8)) != 0,
-		      (data[0] & (1 << 9)) != 0,
-		      (data[0] & (1 << 12)) != 0);
-	    instr_out(data, hw_offset, 1, "VS binding table\n");
-	    instr_out(data, hw_offset, 2, "GS binding table\n");
-	    instr_out(data, hw_offset, 3, "WM binding table\n");
-	}
+		return len;
+	case 0x7802:
+		len = (data[0] & 0xff) + 2;
+		if (len != 4)
+			fprintf(out,
+				"Bad count in 3DSTATE_SAMPLER_STATE_POINTERS\n");
+		if (count < 4)
+			BUFFER_FAIL(count, len,
+				    "3DSTATE_SAMPLER_STATE_POINTERS");
+		instr_out(data, hw_offset, 0,
+			  "3DSTATE_SAMPLER_STATE_POINTERS: VS mod %d, "
+			  "GS mod %d, PS mod %d\n", (data[0] & (1 << 8)) != 0,
+			  (data[0] & (1 << 9)) != 0,
+			  (data[0] & (1 << 12)) != 0);
+		instr_out(data, hw_offset, 1, "VS sampler state\n");
+		instr_out(data, hw_offset, 2, "GS sampler state\n");
+		instr_out(data, hw_offset, 3, "WM sampler state\n");
+		return len;
+	case 0x7805:
+		len = (data[0] & 0xff) + 2;
+		if (len != 3)
+			fprintf(out, "Bad count in 3DSTATE_URB\n");
+		if (count < 3)
+			BUFFER_FAIL(count, len, "3DSTATE_URB");
+		instr_out(data, hw_offset, 0, "3DSTATE_URB\n");
+		instr_out(data, hw_offset, 1,
+			  "VS entries %d, alloc size %d (1024bit row)\n",
+			  data[1] & 0xffff, ((data[1] >> 16) & 0x07f) + 1);
+		instr_out(data, hw_offset, 2,
+			  "GS entries %d, alloc size %d (1024bit row)\n",
+			  (data[2] >> 8) & 0x3ff, (data[2] & 7) + 1);
+		return len;
 
-	return len;
-    case 0x7802:
-        len = (data[0] & 0xff) + 2;
-        if (len != 4)
-            fprintf(out, "Bad count in 3DSTATE_SAMPLER_STATE_POINTERS\n");
-	if (count < 4)
-	    BUFFER_FAIL(count, len, "3DSTATE_SAMPLER_STATE_POINTERS");
-        instr_out(data, hw_offset, 0, "3DSTATE_SAMPLER_STATE_POINTERS: VS mod %d, "
-                  "GS mod %d, PS mod %d\n",
-                  (data[0] & (1 << 8)) != 0,
-                  (data[0] & (1 << 9)) != 0,
-                  (data[0] & (1 << 12)) != 0);
-        instr_out(data, hw_offset, 1, "VS sampler state\n");
-        instr_out(data, hw_offset, 2, "GS sampler state\n");
-        instr_out(data, hw_offset, 3, "WM sampler state\n");
-        return len;
-    case 0x7805:
-        len = (data[0] & 0xff) + 2;
-        if (len != 3)
-            fprintf(out, "Bad count in 3DSTATE_URB\n");
-	if (count < 3)
-	    BUFFER_FAIL(count, len, "3DSTATE_URB");
-        instr_out(data, hw_offset, 0, "3DSTATE_URB\n");
-        instr_out(data, hw_offset, 1, "VS entries %d, alloc size %d (1024bit row)\n",
-                        data[1] & 0xffff, ((data[1] >> 16) & 0x07f) + 1);
-        instr_out(data, hw_offset, 2, "GS entries %d, alloc size %d (1024bit row)\n",
-                        (data[2] >> 8) & 0x3ff, (data[2] & 7) + 1);
-        return len;
-
-    case 0x7808:
-	len = (data[0] & 0xff) + 2;
-	if ((len - 1) % 4 != 0)
-	    fprintf(out, "Bad count in 3DSTATE_VERTEX_BUFFERS\n");
-	if (count < len)
-	    BUFFER_FAIL(count, len, "3DSTATE_VERTEX_BUFFERS");
-	instr_out(data, hw_offset, 0, "3DSTATE_VERTEX_BUFFERS\n");
-
-	for (i = 1; i < len;) {
-	    int idx, access;
-	    if (IS_GEN6(devid)) {
-                idx = 26;
-                access = 20;
-            } else {
-                idx = 27;
-                access = 26;
-            }
-	    instr_out(data, hw_offset, i, "buffer %d: %s, pitch %db\n",
-		      data[i] >> idx,
-		      data[i] & (1 << access) ? "random" : "sequential",
-		      data[i] & 0x07ff);
-	    i++;
-	    instr_out(data, hw_offset, i++, "buffer address\n");
-	    instr_out(data, hw_offset, i++, "max index\n");
-	    instr_out(data, hw_offset, i++, "mbz\n");
-	}
-	return len;
+	case 0x7808:
+		len = (data[0] & 0xff) + 2;
+		if ((len - 1) % 4 != 0)
+			fprintf(out, "Bad count in 3DSTATE_VERTEX_BUFFERS\n");
+		if (count < len)
+			BUFFER_FAIL(count, len, "3DSTATE_VERTEX_BUFFERS");
+		instr_out(data, hw_offset, 0, "3DSTATE_VERTEX_BUFFERS\n");
+
+		for (i = 1; i < len;) {
+			int idx, access;
+			if (IS_GEN6(devid)) {
+				idx = 26;
+				access = 20;
+			} else {
+				idx = 27;
+				access = 26;
+			}
+			instr_out(data, hw_offset, i,
+				  "buffer %d: %s, pitch %db\n", data[i] >> idx,
+				  data[i] & (1 << access) ? "random" :
+				  "sequential", data[i] & 0x07ff);
+			i++;
+			instr_out(data, hw_offset, i++, "buffer address\n");
+			instr_out(data, hw_offset, i++, "max index\n");
+			instr_out(data, hw_offset, i++, "mbz\n");
+		}
+		return len;
 
-    case 0x7809:
-	len = (data[0] & 0xff) + 2;
-	if ((len + 1) % 2 != 0)
-	    fprintf(out, "Bad count in 3DSTATE_VERTEX_ELEMENTS\n");
-	if (count < len)
-	    BUFFER_FAIL(count, len, "3DSTATE_VERTEX_ELEMENTS");
-	instr_out(data, hw_offset, 0, "3DSTATE_VERTEX_ELEMENTS\n");
-
-	for (i = 1; i < len;) {
-	    instr_out(data, hw_offset, i, "buffer %d: %svalid, type 0x%04x, "
-		      "src offset 0x%04x bytes\n",
-		      data[i] >> (IS_GEN6(devid) ? 26 : 27),
-		      data[i] & (1 << (IS_GEN6(devid) ? 25 : 26)) ? "" : "in",
-		      (data[i] >> 16) & 0x1ff,
-		      data[i] & 0x07ff);
-	    i++;
-	    instr_out(data, hw_offset, i, "(%s, %s, %s, %s), "
-		      "dst offset 0x%02x bytes\n",
-		      get_965_element_component(data[i], 0),
-		      get_965_element_component(data[i], 1),
-		      get_965_element_component(data[i], 2),
-		      get_965_element_component(data[i], 3),
-		      (data[i] & 0xff) * 4);
-	    i++;
-	}
-	return len;
+	case 0x7809:
+		len = (data[0] & 0xff) + 2;
+		if ((len + 1) % 2 != 0)
+			fprintf(out, "Bad count in 3DSTATE_VERTEX_ELEMENTS\n");
+		if (count < len)
+			BUFFER_FAIL(count, len, "3DSTATE_VERTEX_ELEMENTS");
+		instr_out(data, hw_offset, 0, "3DSTATE_VERTEX_ELEMENTS\n");
 
-    case 0x780d:
-	len = (data[0] & 0xff) + 2;
-	if (len != 4)
-	    fprintf(out, "Bad count in 3DSTATE_VIEWPORT_STATE_POINTERS\n");
-	if (count < len)
-	    BUFFER_FAIL(count, len, "3DSTATE_VIEWPORT_STATE_POINTERS");
-	instr_out(data, hw_offset, 0, "3DSTATE_VIEWPORT_STATE_POINTERS\n");
-	instr_out(data, hw_offset, 1, "clip\n");
-	instr_out(data, hw_offset, 2, "sf\n");
-	instr_out(data, hw_offset, 3, "cc\n");
-	return len;
+		for (i = 1; i < len;) {
+			instr_out(data, hw_offset, i,
+				  "buffer %d: %svalid, type 0x%04x, "
+				  "src offset 0x%04x bytes\n",
+				  data[i] >> (IS_GEN6(devid) ? 26 : 27),
+				  data[i] & (1 << (IS_GEN6(devid) ? 25 : 26)) ?
+				  "" : "in", (data[i] >> 16) & 0x1ff,
+				  data[i] & 0x07ff);
+			i++;
+			instr_out(data, hw_offset, i, "(%s, %s, %s, %s), "
+				  "dst offset 0x%02x bytes\n",
+				  get_965_element_component(data[i], 0),
+				  get_965_element_component(data[i], 1),
+				  get_965_element_component(data[i], 2),
+				  get_965_element_component(data[i], 3),
+				  (data[i] & 0xff) * 4);
+			i++;
+		}
+		return len;
 
-    case 0x780a:
-	len = (data[0] & 0xff) + 2;
-	if (len != 3)
-	    fprintf(out, "Bad count in 3DSTATE_INDEX_BUFFER\n");
-	if (count < len)
-	    BUFFER_FAIL(count, len, "3DSTATE_INDEX_BUFFER");
-	instr_out(data, hw_offset, 0, "3DSTATE_INDEX_BUFFER\n");
-	instr_out(data, hw_offset, 1, "beginning buffer address\n");
-	instr_out(data, hw_offset, 2, "ending buffer address\n");
-	return len;
+	case 0x780d:
+		len = (data[0] & 0xff) + 2;
+		if (len != 4)
+			fprintf(out,
+				"Bad count in 3DSTATE_VIEWPORT_STATE_POINTERS\n");
+		if (count < len)
+			BUFFER_FAIL(count, len,
+				    "3DSTATE_VIEWPORT_STATE_POINTERS");
+		instr_out(data, hw_offset, 0,
+			  "3DSTATE_VIEWPORT_STATE_POINTERS\n");
+		instr_out(data, hw_offset, 1, "clip\n");
+		instr_out(data, hw_offset, 2, "sf\n");
+		instr_out(data, hw_offset, 3, "cc\n");
+		return len;
 
-    case 0x780e:
-        len = (data[0] & 0xff) + 2;
-        if (len != 4)
-            fprintf(out, "Bad count in 3DSTATE_CC_STATE_POINTERS\n");
-	if (count < 4)
-	    BUFFER_FAIL(count, len, "3DSTATE_CC_STATE_POINTERS");
-        instr_out(data, hw_offset, 0, "3DSTATE_CC_STATE_POINTERS\n");
-        instr_out(data, hw_offset, 1, "blend change %d\n", data[1] & 1);
-        instr_out(data, hw_offset, 2, "depth stencil change %d\n", data[2] & 1);
-        instr_out(data, hw_offset, 3, "cc change %d\n", data[3] & 1);
-        return len;
-
-    case 0x780f:
-        len = (data[0] & 0xff) + 2;
-        if (len != 2)
-            fprintf(out, "Bad count in 3DSTATE_SCISSOR_POINTERS\n");
-	if (count < 2)
-	    BUFFER_FAIL(count, len, "3DSTATE_SCISSOR_POINTERS");
-        instr_out(data, hw_offset, 0, "3DSTATE_SCISSOR_POINTERS\n");
-        instr_out(data, hw_offset, 1, "scissor rect offset\n");
-        return len;
-
-    case 0x7810:
-        len = (data[0] & 0xff) + 2;
-        if (len != 6)
-            fprintf(out, "Bad count in 3DSTATE_VS\n");
-	if (count < 6)
-	    BUFFER_FAIL(count, len, "3DSTATE_VS");
-        instr_out(data, hw_offset, 0, "3DSTATE_VS\n");
-        instr_out(data, hw_offset, 1, "kernel pointer\n");
-        instr_out(data, hw_offset, 2, "SPF=%d, VME=%d, Sampler Count %d, "
-                  "Binding table count %d\n",
-                  (data[2] >> 31) & 1,
-                  (data[2] >> 30) & 1,
-                  (data[2] >> 27) & 7,
-                  (data[2] >> 18) & 0xff);
-        instr_out(data, hw_offset, 3, "scratch offset\n");
-        instr_out(data, hw_offset, 4, "Dispatch GRF start %d, VUE read length %d, "
-                  "VUE read offset %d\n",
-                  (data[4] >> 20) & 0x1f,
-                  (data[4] >> 11) & 0x3f,
-                  (data[4] >> 4) & 0x3f);
-        instr_out(data, hw_offset, 5, "Max Threads %d, Vertex Cache %sable, "
-                  "VS func %sable\n",
-                  ((data[5] >> 25) & 0x7f) + 1,
-                  (data[5] & (1 << 1)) != 0 ? "dis" : "en",
-                  (data[5] & 1) != 0 ? "en" : "dis");
-        return len;
-
-    case 0x7811:
-        len = (data[0] & 0xff) + 2;
-        if (len != 7)
-            fprintf(out, "Bad count in 3DSTATE_GS\n");
-	if (count < 7)
-	    BUFFER_FAIL(count, len, "3DSTATE_GS");
-        instr_out(data, hw_offset, 0, "3DSTATE_GS\n");
-        instr_out(data, hw_offset, 1, "kernel pointer\n");
-        instr_out(data, hw_offset, 2, "SPF=%d, VME=%d, Sampler Count %d, "
-                  "Binding table count %d\n",
-                  (data[2] >> 31) & 1,
-                  (data[2] >> 30) & 1,
-                  (data[2] >> 27) & 7,
-                  (data[2] >> 18) & 0xff);
-        instr_out(data, hw_offset, 3, "scratch offset\n");
-        instr_out(data, hw_offset, 4, "Dispatch GRF start %d, VUE read length %d, "
-                  "VUE read offset %d\n",
-                  (data[4] & 0xf),
-                  (data[4] >> 11) & 0x3f,
-                  (data[4] >> 4) & 0x3f);
-        instr_out(data, hw_offset, 5, "Max Threads %d, Rendering %sable\n",
-                  ((data[5] >> 25) & 0x7f) + 1,
-                  (data[5] & (1 << 8)) != 0 ? "en" : "dis");
-        instr_out(data, hw_offset, 6, "Reorder %sable, Discard Adjaceny %sable, "
-                  "GS %sable\n",
-                  (data[6] & (1 << 30)) != 0 ? "en" : "dis",
-                  (data[6] & (1 << 29)) != 0 ? "en" : "dis",
-                  (data[6] & (1 << 15)) != 0 ? "en" : "dis");
-        return len;
-
-    case 0x7812:
-        len = (data[0] & 0xff) + 2;
-        if (len != 4)
-            fprintf(out, "Bad count in 3DSTATE_CLIP\n");
-	if (count < 4)
-	    BUFFER_FAIL(count, len, "3DSTATE_CLIP");
-        instr_out(data, hw_offset, 0, "3DSTATE_CLIP\n");
-        instr_out(data, hw_offset, 1, "UserClip distance cull test mask 0x%x\n",
-                  data[1] & 0xff);
-        instr_out(data, hw_offset, 2, "Clip %sable, API mode %s, Viewport XY test %sable, "
-                  "Viewport Z test %sable, Guardband test %sable, Clip mode %d, "
-                  "Perspective Divide %sable, Non-Perspective Barycentric %sable, "
-                  "Tri Provoking %d, Line Provoking %d, Trifan Provoking %d\n",
-                  (data[2] & (1 << 31)) != 0 ? "en" : "dis",
-                  (data[2] & (1 << 30)) != 0 ? "D3D" : "OGL",
-                  (data[2] & (1 << 28)) != 0 ? "en" : "dis",
-                  (data[2] & (1 << 27)) != 0 ? "en" : "dis",
-                  (data[2] & (1 << 26)) != 0 ? "en" : "dis",
-                  (data[2] >> 13) & 7,
-                  (data[2] & (1 << 9)) != 0 ? "dis" : "en",
-                  (data[2] & (1 << 8)) != 0 ? "en" : "dis",
-                  (data[2] >> 4) & 3,
-                  (data[2] >> 2) & 3,
-                  (data[2] & 3));
-        instr_out(data, hw_offset, 3, "Min PointWidth %d, Max PointWidth %d, "
-                  "Force Zero RTAIndex %sable, Max VPIndex %d\n",
-                  (data[3] >> 17) & 0x7ff,
-                  (data[3] >> 6) & 0x7ff,
-                  (data[3] & (1 << 5)) != 0 ? "en" : "dis",
-                  (data[3] & 0xf));
-        return len;
-
-    case 0x7813:
-        len = (data[0] & 0xff) + 2;
-        if (len != 20)
-            fprintf(out, "Bad count in 3DSTATE_SF\n");
-	if (count < 20)
-	    BUFFER_FAIL(count, len, "3DSTATE_SF");
-        instr_out(data, hw_offset, 0, "3DSTATE_SF\n");
-        instr_out(data, hw_offset, 1, "Attrib Out %d, Attrib Swizzle %sable, VUE read length %d, "
-                  "VUE read offset %d\n",
-                  (data[1] >> 22) & 0x3f,
-                  (data[1] & (1 << 21)) != 0 ? "en" : "dis",
-                  (data[1] >> 11) & 0x1f,
-                  (data[1] >> 4) & 0x3f);
-        instr_out(data, hw_offset, 2, "Legacy Global DepthBias %sable, FrontFace fill %d, BF fill %d, "
-                  "VP transform %sable, FrontWinding_%s\n",
-                  (data[2] & (1 << 11)) != 0 ? "en" : "dis",
-                  (data[2] >> 5) & 3,
-                  (data[2] >> 3) & 3,
-                  (data[2] & (1 << 1)) != 0 ? "en" : "dis",
-                  (data[2] & 1) != 0 ? "CCW" : "CW");
-        instr_out(data, hw_offset, 3, "AA %sable, CullMode %d, Scissor %sable, Multisample m ode %d\n",
-                  (data[3] & (1 << 31)) != 0 ? "en" : "dis",
-                  (data[3] >> 29) & 3,
-                  (data[3] & (1 << 11)) != 0 ? "en" : "dis",
-                  (data[3] >> 8) & 3);
-        instr_out(data, hw_offset, 4, "Last Pixel %sable, SubPixel Precision %d, Use PixelWidth %d\n",
-                  (data[4] & (1 << 31)) != 0 ? "en" : "dis",
-                  (data[4] & (1 << 12)) != 0 ? 4 : 8,
-                  (data[4] & (1 << 11)) != 0);
-        instr_out(data, hw_offset, 5, "Global Depth Offset Constant %f\n", data[5]);
-        instr_out(data, hw_offset, 6, "Global Depth Offset Scale %f\n", data[6]);
-        instr_out(data, hw_offset, 7, "Global Depth Offset Clamp %f\n", data[7]);
-        int i, j;
-        for (i = 0, j = 0; i < 8; i++, j+=2)
-            instr_out(data, hw_offset, i+8, "Attrib %d (Override %s%s%s%s, Const Source %d, Swizzle Select %d, "
-                  "Source %d); Attrib %d (Override %s%s%s%s, Const Source %d, Swizzle Select %d, Source %d)\n",
-                  j+1,
-                  (data[8+i] & (1 << 31)) != 0 ? "W":"",
-                  (data[8+i] & (1 << 30)) != 0 ? "Z":"",
-                  (data[8+i] & (1 << 29)) != 0 ? "Y":"",
-                  (data[8+i] & (1 << 28)) != 0 ? "X":"",
-                  (data[8+i] >> 25) & 3, (data[8+i] >> 22) & 3,
-                  (data[8+i] >> 16) & 0x1f,
-                  j,
-                  (data[8+i] & (1 << 15)) != 0 ? "W":"",
-                  (data[8+i] & (1 << 14)) != 0 ? "Z":"",
-                  (data[8+i] & (1 << 13)) != 0 ? "Y":"",
-                  (data[8+i] & (1 << 12)) != 0 ? "X":"",
-                  (data[8+i] >> 9) & 3, (data[8+i] >> 6) & 3,
-                  (data[8+i] & 0x1f));
-	instr_out(data, hw_offset, 16, "Point Sprite TexCoord Enable\n");
-        instr_out(data, hw_offset, 17, "Const Interp Enable\n");
-        instr_out(data, hw_offset, 18, "Attrib 7-0 WrapShortest Enable\n");
-        instr_out(data, hw_offset, 19, "Attrib 15-8 WrapShortest Enable\n");
-
-        return len;
-
-    case 0x7814:
-        len = (data[0] & 0xff) + 2;
-        if (len != 9)
-            fprintf(out, "Bad count in 3DSTATE_WM\n");
-	if (count < 9)
-	    BUFFER_FAIL(count, len, "3DSTATE_WM");
-        instr_out(data, hw_offset, 0, "3DSTATE_WM\n");
-        instr_out(data, hw_offset, 1, "kernel start pointer 0\n");
-        instr_out(data, hw_offset, 2, "SPF=%d, VME=%d, Sampler Count %d, "
-                  "Binding table count %d\n",
-                  (data[2] >> 31) & 1,
-                  (data[2] >> 30) & 1,
-                  (data[2] >> 27) & 7,
-                  (data[2] >> 18) & 0xff);
-        instr_out(data, hw_offset, 3, "scratch offset\n");
-        instr_out(data, hw_offset, 4, "Depth Clear %d, Depth Resolve %d, HiZ Resolve %d, "
-                  "Dispatch GRF start[0] %d, start[1] %d, start[2] %d\n",
-                  (data[4] & (1 << 30)) != 0,
-                  (data[4] & (1 << 28)) != 0,
-                  (data[4] & (1 << 27)) != 0,
-                  (data[4] >> 16) & 0x7f,
-                  (data[4] >> 8) & 0x7f,
-                  (data[4] & 0x7f));
-        instr_out(data, hw_offset, 5, "MaxThreads %d, PS KillPixel %d, PS computed Z %d, "
-                  "PS use sourceZ %d, Thread Dispatch %d, PS use sourceW %d, Dispatch32 %d, "
-                  "Dispatch16 %d, Dispatch8 %d\n",
-                  ((data[5] >> 25) & 0x7f) + 1,
-                  (data[5] & (1 << 22)) != 0,
-                  (data[5] & (1 << 21)) != 0,
-                  (data[5] & (1 << 20)) != 0,
-                  (data[5] & (1 << 19)) != 0,
-                  (data[5] & (1 << 8)) != 0,
-                  (data[5] & (1 << 2)) != 0,
-                  (data[5] & (1 << 1)) != 0,
-                  (data[5] & (1 << 0)) != 0);
-        instr_out(data, hw_offset, 6, "Num SF output %d, Pos XY offset %d, ZW interp mode %d , "
-                  "Barycentric interp mode 0x%x, Point raster rule %d, Multisample mode %d, "
-                  "Multisample Dispatch mode %d\n",
-                  (data[6] >> 20) & 0x3f,
-                  (data[6] >> 18) & 3,
-                  (data[6] >> 16) & 3,
-                  (data[6] >> 10) & 0x3f,
-                  (data[6] & (1 << 9)) != 0,
-                  (data[6] >> 1) & 3,
-                  (data[6] & 1));
-        instr_out(data, hw_offset, 7, "kernel start pointer 1\n");
-        instr_out(data, hw_offset, 8, "kernel start pointer 2\n");
-
-        return len;
-
-    case 0x7900:
-	if (len != 4)
-	    fprintf(out, "Bad count in 3DSTATE_DRAWING_RECTANGLE\n");
-	if (count < 4)
-	    BUFFER_FAIL(count, len, "3DSTATE_DRAWING_RECTANGLE");
+	case 0x780a:
+		len = (data[0] & 0xff) + 2;
+		if (len != 3)
+			fprintf(out, "Bad count in 3DSTATE_INDEX_BUFFER\n");
+		if (count < len)
+			BUFFER_FAIL(count, len, "3DSTATE_INDEX_BUFFER");
+		instr_out(data, hw_offset, 0, "3DSTATE_INDEX_BUFFER\n");
+		instr_out(data, hw_offset, 1, "beginning buffer address\n");
+		instr_out(data, hw_offset, 2, "ending buffer address\n");
+		return len;
 
-	instr_out(data, hw_offset, 0,
-		  "3DSTATE_DRAWING_RECTANGLE\n");
-	instr_out(data, hw_offset, 1, "top left: %d,%d\n",
-		  data[1] & 0xffff,
-		  (data[1] >> 16) & 0xffff);
-	instr_out(data, hw_offset, 2, "bottom right: %d,%d\n",
-		  data[2] & 0xffff,
-		  (data[2] >> 16) & 0xffff);
-	instr_out(data, hw_offset, 3, "origin: %d,%d\n",
-		  (int)data[3] & 0xffff,
-		  ((int)data[3] >> 16) & 0xffff);
+	case 0x780e:
+		len = (data[0] & 0xff) + 2;
+		if (len != 4)
+			fprintf(out,
+				"Bad count in 3DSTATE_CC_STATE_POINTERS\n");
+		if (count < 4)
+			BUFFER_FAIL(count, len, "3DSTATE_CC_STATE_POINTERS");
+		instr_out(data, hw_offset, 0, "3DSTATE_CC_STATE_POINTERS\n");
+		instr_out(data, hw_offset, 1, "blend change %d\n", data[1] & 1);
+		instr_out(data, hw_offset, 2, "depth stencil change %d\n",
+			  data[2] & 1);
+		instr_out(data, hw_offset, 3, "cc change %d\n", data[3] & 1);
+		return len;
 
-	return len;
+	case 0x780f:
+		len = (data[0] & 0xff) + 2;
+		if (len != 2)
+			fprintf(out, "Bad count in 3DSTATE_SCISSOR_POINTERS\n");
+		if (count < 2)
+			BUFFER_FAIL(count, len, "3DSTATE_SCISSOR_POINTERS");
+		instr_out(data, hw_offset, 0, "3DSTATE_SCISSOR_POINTERS\n");
+		instr_out(data, hw_offset, 1, "scissor rect offset\n");
+		return len;
 
-    case 0x7905:
-	if (len < 5 || len > 7)
-	    fprintf(out, "Bad count in 3DSTATE_DEPTH_BUFFER\n");
-	if (count < len)
-	    BUFFER_FAIL(count, len, "3DSTATE_DEPTH_BUFFER");
+	case 0x7810:
+		len = (data[0] & 0xff) + 2;
+		if (len != 6)
+			fprintf(out, "Bad count in 3DSTATE_VS\n");
+		if (count < 6)
+			BUFFER_FAIL(count, len, "3DSTATE_VS");
+		instr_out(data, hw_offset, 0, "3DSTATE_VS\n");
+		instr_out(data, hw_offset, 1, "kernel pointer\n");
+		instr_out(data, hw_offset, 2,
+			  "SPF=%d, VME=%d, Sampler Count %d, "
+			  "Binding table count %d\n", (data[2] >> 31) & 1,
+			  (data[2] >> 30) & 1, (data[2] >> 27) & 7,
+			  (data[2] >> 18) & 0xff);
+		instr_out(data, hw_offset, 3, "scratch offset\n");
+		instr_out(data, hw_offset, 4,
+			  "Dispatch GRF start %d, VUE read length %d, "
+			  "VUE read offset %d\n", (data[4] >> 20) & 0x1f,
+			  (data[4] >> 11) & 0x3f, (data[4] >> 4) & 0x3f);
+		instr_out(data, hw_offset, 5,
+			  "Max Threads %d, Vertex Cache %sable, "
+			  "VS func %sable\n", ((data[5] >> 25) & 0x7f) + 1,
+			  (data[5] & (1 << 1)) != 0 ? "dis" : "en",
+			  (data[5] & 1) != 0 ? "en" : "dis");
+		return len;
 
-	instr_out(data, hw_offset, 0,
-		  "3DSTATE_DEPTH_BUFFER\n");
-	if (IS_GEN5(devid) || IS_GEN6(devid))
-            instr_out(data, hw_offset, 1, "%s, %s, pitch = %d bytes, %stiled, HiZ %d, Seperate Stencil %d\n",
-                    get_965_surfacetype(data[1] >> 29),
-                    get_965_depthformat((data[1] >> 18) & 0x7),
-                    (data[1] & 0x0001ffff) + 1,
-                    data[1] & (1 << 27) ? "" : "not ",
-                    (data[1] & (1 << 22)) != 0,
-                    (data[1] & (1 << 21)) != 0);
-        else
-            instr_out(data, hw_offset, 1, "%s, %s, pitch = %d bytes, %stiled\n",
-                    get_965_surfacetype(data[1] >> 29),
-                    get_965_depthformat((data[1] >> 18) & 0x7),
-                    (data[1] & 0x0001ffff) + 1,
-                    data[1] & (1 << 27) ? "" : "not ");
-	instr_out(data, hw_offset, 2, "depth offset\n");
-	instr_out(data, hw_offset, 3, "%dx%d\n",
-		  ((data[3] & 0x0007ffc0) >> 6) + 1,
-		  ((data[3] & 0xfff80000) >> 19) + 1);
-	instr_out(data, hw_offset, 4, "volume depth\n");
-	if (len >= 6)
-	    instr_out(data, hw_offset, 5, "\n");
-	if (len >= 7) {
-            if (IS_GEN6(devid))
-                instr_out(data, hw_offset, 6, "\n");
-            else
-                instr_out(data, hw_offset, 6, "render target view extent\n");
-        }
+	case 0x7811:
+		len = (data[0] & 0xff) + 2;
+		if (len != 7)
+			fprintf(out, "Bad count in 3DSTATE_GS\n");
+		if (count < 7)
+			BUFFER_FAIL(count, len, "3DSTATE_GS");
+		instr_out(data, hw_offset, 0, "3DSTATE_GS\n");
+		instr_out(data, hw_offset, 1, "kernel pointer\n");
+		instr_out(data, hw_offset, 2,
+			  "SPF=%d, VME=%d, Sampler Count %d, "
+			  "Binding table count %d\n", (data[2] >> 31) & 1,
+			  (data[2] >> 30) & 1, (data[2] >> 27) & 7,
+			  (data[2] >> 18) & 0xff);
+		instr_out(data, hw_offset, 3, "scratch offset\n");
+		instr_out(data, hw_offset, 4,
+			  "Dispatch GRF start %d, VUE read length %d, "
+			  "VUE read offset %d\n", (data[4] & 0xf),
+			  (data[4] >> 11) & 0x3f, (data[4] >> 4) & 0x3f);
+		instr_out(data, hw_offset, 5,
+			  "Max Threads %d, Rendering %sable\n",
+			  ((data[5] >> 25) & 0x7f) + 1,
+			  (data[5] & (1 << 8)) != 0 ? "en" : "dis");
+		instr_out(data, hw_offset, 6,
+			  "Reorder %sable, Discard Adjaceny %sable, "
+			  "GS %sable\n",
+			  (data[6] & (1 << 30)) != 0 ? "en" : "dis",
+			  (data[6] & (1 << 29)) != 0 ? "en" : "dis",
+			  (data[6] & (1 << 15)) != 0 ? "en" : "dis");
+		return len;
+
+	case 0x7812:
+		len = (data[0] & 0xff) + 2;
+		if (len != 4)
+			fprintf(out, "Bad count in 3DSTATE_CLIP\n");
+		if (count < 4)
+			BUFFER_FAIL(count, len, "3DSTATE_CLIP");
+		instr_out(data, hw_offset, 0, "3DSTATE_CLIP\n");
+		instr_out(data, hw_offset, 1,
+			  "UserClip distance cull test mask 0x%x\n",
+			  data[1] & 0xff);
+		instr_out(data, hw_offset, 2,
+			  "Clip %sable, API mode %s, Viewport XY test %sable, "
+			  "Viewport Z test %sable, Guardband test %sable, Clip mode %d, "
+			  "Perspective Divide %sable, Non-Perspective Barycentric %sable, "
+			  "Tri Provoking %d, Line Provoking %d, Trifan Provoking %d\n",
+			  (data[2] & (1 << 31)) != 0 ? "en" : "dis",
+			  (data[2] & (1 << 30)) != 0 ? "D3D" : "OGL",
+			  (data[2] & (1 << 28)) != 0 ? "en" : "dis",
+			  (data[2] & (1 << 27)) != 0 ? "en" : "dis",
+			  (data[2] & (1 << 26)) != 0 ? "en" : "dis",
+			  (data[2] >> 13) & 7,
+			  (data[2] & (1 << 9)) != 0 ? "dis" : "en",
+			  (data[2] & (1 << 8)) != 0 ? "en" : "dis",
+			  (data[2] >> 4) & 3, (data[2] >> 2) & 3,
+			  (data[2] & 3));
+		instr_out(data, hw_offset, 3,
+			  "Min PointWidth %d, Max PointWidth %d, "
+			  "Force Zero RTAIndex %sable, Max VPIndex %d\n",
+			  (data[3] >> 17) & 0x7ff, (data[3] >> 6) & 0x7ff,
+			  (data[3] & (1 << 5)) != 0 ? "en" : "dis",
+			  (data[3] & 0xf));
+		return len;
 
+	case 0x7813:
+		len = (data[0] & 0xff) + 2;
+		if (len != 20)
+			fprintf(out, "Bad count in 3DSTATE_SF\n");
+		if (count < 20)
+			BUFFER_FAIL(count, len, "3DSTATE_SF");
+		instr_out(data, hw_offset, 0, "3DSTATE_SF\n");
+		instr_out(data, hw_offset, 1,
+			  "Attrib Out %d, Attrib Swizzle %sable, VUE read length %d, "
+			  "VUE read offset %d\n", (data[1] >> 22) & 0x3f,
+			  (data[1] & (1 << 21)) != 0 ? "en" : "dis",
+			  (data[1] >> 11) & 0x1f, (data[1] >> 4) & 0x3f);
+		instr_out(data, hw_offset, 2,
+			  "Legacy Global DepthBias %sable, FrontFace fill %d, BF fill %d, "
+			  "VP transform %sable, FrontWinding_%s\n",
+			  (data[2] & (1 << 11)) != 0 ? "en" : "dis",
+			  (data[2] >> 5) & 3, (data[2] >> 3) & 3,
+			  (data[2] & (1 << 1)) != 0 ? "en" : "dis",
+			  (data[2] & 1) != 0 ? "CCW" : "CW");
+		instr_out(data, hw_offset, 3,
+			  "AA %sable, CullMode %d, Scissor %sable, Multisample m ode %d\n",
+			  (data[3] & (1 << 31)) != 0 ? "en" : "dis",
+			  (data[3] >> 29) & 3,
+			  (data[3] & (1 << 11)) != 0 ? "en" : "dis",
+			  (data[3] >> 8) & 3);
+		instr_out(data, hw_offset, 4,
+			  "Last Pixel %sable, SubPixel Precision %d, Use PixelWidth %d\n",
+			  (data[4] & (1 << 31)) != 0 ? "en" : "dis",
+			  (data[4] & (1 << 12)) != 0 ? 4 : 8,
+			  (data[4] & (1 << 11)) != 0);
+		instr_out(data, hw_offset, 5,
+			  "Global Depth Offset Constant %f\n", data[5]);
+		instr_out(data, hw_offset, 6, "Global Depth Offset Scale %f\n",
+			  data[6]);
+		instr_out(data, hw_offset, 7, "Global Depth Offset Clamp %f\n",
+			  data[7]);
+		int i, j;
+		for (i = 0, j = 0; i < 8; i++, j += 2)
+			instr_out(data, hw_offset, i + 8,
+				  "Attrib %d (Override %s%s%s%s, Const Source %d, Swizzle Select %d, "
+				  "Source %d); Attrib %d (Override %s%s%s%s, Const Source %d, Swizzle Select %d, Source %d)\n",
+				  j + 1,
+				  (data[8 + i] & (1 << 31)) != 0 ? "W" : "",
+				  (data[8 + i] & (1 << 30)) != 0 ? "Z" : "",
+				  (data[8 + i] & (1 << 29)) != 0 ? "Y" : "",
+				  (data[8 + i] & (1 << 28)) != 0 ? "X" : "",
+				  (data[8 + i] >> 25) & 3,
+				  (data[8 + i] >> 22) & 3,
+				  (data[8 + i] >> 16) & 0x1f, j,
+				  (data[8 + i] & (1 << 15)) != 0 ? "W" : "",
+				  (data[8 + i] & (1 << 14)) != 0 ? "Z" : "",
+				  (data[8 + i] & (1 << 13)) != 0 ? "Y" : "",
+				  (data[8 + i] & (1 << 12)) != 0 ? "X" : "",
+				  (data[8 + i] >> 9) & 3,
+				  (data[8 + i] >> 6) & 3, (data[8 + i] & 0x1f));
+		instr_out(data, hw_offset, 16,
+			  "Point Sprite TexCoord Enable\n");
+		instr_out(data, hw_offset, 17, "Const Interp Enable\n");
+		instr_out(data, hw_offset, 18,
+			  "Attrib 7-0 WrapShortest Enable\n");
+		instr_out(data, hw_offset, 19,
+			  "Attrib 15-8 WrapShortest Enable\n");
 
-	return len;
+		return len;
 
-    case 0x7a00:
-	if (intel_gen(devid) >= 6) {
-		int i;
+	case 0x7814:
 		len = (data[0] & 0xff) + 2;
-		if (len != 4 && len != 5)
-			fprintf(out, "Bad count in PIPE_CONTROL\n");
-		if (count < len)
-			BUFFER_FAIL(count, len, "PIPE_CONTROL");
+		if (len != 9)
+			fprintf(out, "Bad count in 3DSTATE_WM\n");
+		if (count < 9)
+			BUFFER_FAIL(count, len, "3DSTATE_WM");
+		instr_out(data, hw_offset, 0, "3DSTATE_WM\n");
+		instr_out(data, hw_offset, 1, "kernel start pointer 0\n");
+		instr_out(data, hw_offset, 2,
+			  "SPF=%d, VME=%d, Sampler Count %d, "
+			  "Binding table count %d\n", (data[2] >> 31) & 1,
+			  (data[2] >> 30) & 1, (data[2] >> 27) & 7,
+			  (data[2] >> 18) & 0xff);
+		instr_out(data, hw_offset, 3, "scratch offset\n");
+		instr_out(data, hw_offset, 4,
+			  "Depth Clear %d, Depth Resolve %d, HiZ Resolve %d, "
+			  "Dispatch GRF start[0] %d, start[1] %d, start[2] %d\n",
+			  (data[4] & (1 << 30)) != 0,
+			  (data[4] & (1 << 28)) != 0,
+			  (data[4] & (1 << 27)) != 0, (data[4] >> 16) & 0x7f,
+			  (data[4] >> 8) & 0x7f, (data[4] & 0x7f));
+		instr_out(data, hw_offset, 5,
+			  "MaxThreads %d, PS KillPixel %d, PS computed Z %d, "
+			  "PS use sourceZ %d, Thread Dispatch %d, PS use sourceW %d, Dispatch32 %d, "
+			  "Dispatch16 %d, Dispatch8 %d\n",
+			  ((data[5] >> 25) & 0x7f) + 1,
+			  (data[5] & (1 << 22)) != 0,
+			  (data[5] & (1 << 21)) != 0,
+			  (data[5] & (1 << 20)) != 0,
+			  (data[5] & (1 << 19)) != 0, (data[5] & (1 << 8)) != 0,
+			  (data[5] & (1 << 2)) != 0, (data[5] & (1 << 1)) != 0,
+			  (data[5] & (1 << 0)) != 0);
+		instr_out(data, hw_offset, 6,
+			  "Num SF output %d, Pos XY offset %d, ZW interp mode %d , "
+			  "Barycentric interp mode 0x%x, Point raster rule %d, Multisample mode %d, "
+			  "Multisample Dispatch mode %d\n",
+			  (data[6] >> 20) & 0x3f, (data[6] >> 18) & 3,
+			  (data[6] >> 16) & 3, (data[6] >> 10) & 0x3f,
+			  (data[6] & (1 << 9)) != 0, (data[6] >> 1) & 3,
+			  (data[6] & 1));
+		instr_out(data, hw_offset, 7, "kernel start pointer 1\n");
+		instr_out(data, hw_offset, 8, "kernel start pointer 2\n");
 
-		switch ((data[1] >> 14) & 0x3) {
-		case 0: desc1 = "no write"; break;
-		case 1: desc1 = "qword write"; break;
-		case 2: desc1 = "PS_DEPTH_COUNT write"; break;
-		case 3: desc1 = "TIMESTAMP write"; break;
+		return len;
+
+	case 0x7900:
+		if (len != 4)
+			fprintf(out,
+				"Bad count in 3DSTATE_DRAWING_RECTANGLE\n");
+		if (count < 4)
+			BUFFER_FAIL(count, len, "3DSTATE_DRAWING_RECTANGLE");
+
+		instr_out(data, hw_offset, 0, "3DSTATE_DRAWING_RECTANGLE\n");
+		instr_out(data, hw_offset, 1, "top left: %d,%d\n",
+			  data[1] & 0xffff, (data[1] >> 16) & 0xffff);
+		instr_out(data, hw_offset, 2, "bottom right: %d,%d\n",
+			  data[2] & 0xffff, (data[2] >> 16) & 0xffff);
+		instr_out(data, hw_offset, 3, "origin: %d,%d\n",
+			  (int)data[3] & 0xffff, ((int)data[3] >> 16) & 0xffff);
+
+		return len;
+
+	case 0x7905:
+		if (len < 5 || len > 7)
+			fprintf(out, "Bad count in 3DSTATE_DEPTH_BUFFER\n");
+		if (count < len)
+			BUFFER_FAIL(count, len, "3DSTATE_DEPTH_BUFFER");
+
+		instr_out(data, hw_offset, 0, "3DSTATE_DEPTH_BUFFER\n");
+		if (IS_GEN5(devid) || IS_GEN6(devid))
+			instr_out(data, hw_offset, 1,
+				  "%s, %s, pitch = %d bytes, %stiled, HiZ %d, Seperate Stencil %d\n",
+				  get_965_surfacetype(data[1] >> 29),
+				  get_965_depthformat((data[1] >> 18) & 0x7),
+				  (data[1] & 0x0001ffff) + 1,
+				  data[1] & (1 << 27) ? "" : "not ",
+				  (data[1] & (1 << 22)) != 0,
+				  (data[1] & (1 << 21)) != 0);
+		else
+			instr_out(data, hw_offset, 1,
+				  "%s, %s, pitch = %d bytes, %stiled\n",
+				  get_965_surfacetype(data[1] >> 29),
+				  get_965_depthformat((data[1] >> 18) & 0x7),
+				  (data[1] & 0x0001ffff) + 1,
+				  data[1] & (1 << 27) ? "" : "not ");
+		instr_out(data, hw_offset, 2, "depth offset\n");
+		instr_out(data, hw_offset, 3, "%dx%d\n",
+			  ((data[3] & 0x0007ffc0) >> 6) + 1,
+			  ((data[3] & 0xfff80000) >> 19) + 1);
+		instr_out(data, hw_offset, 4, "volume depth\n");
+		if (len >= 6)
+			instr_out(data, hw_offset, 5, "\n");
+		if (len >= 7) {
+			if (IS_GEN6(devid))
+				instr_out(data, hw_offset, 6, "\n");
+			else
+				instr_out(data, hw_offset, 6,
+					  "render target view extent\n");
 		}
-		instr_out(data, hw_offset, 0, "PIPE_CONTROL\n");
-		instr_out(data, hw_offset, 1,
-			  "%s, %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
-			  desc1,
-			  data[1] & (1 << 20) ? "cs stall, " : "",
-			  data[1] & (1 << 19) ? "global snapshot count reset, " : "",
-			  data[1] & (1 << 18) ? "tlb invalidate, " : "",
-			  data[1] & (1 << 17) ? "gfdt flush, " : "",
-			  data[1] & (1 << 17) ? "media state clear, " : "",
-			  data[1] & (1 << 13) ? "depth stall, " : "",
-			  data[1] & (1 << 12) ? "render target cache flush, " : "",
-			  data[1] & (1 << 11) ? "instruction cache invalidate, " : "",
-			  data[1] & (1 << 10) ? "texture cache invalidate, " : "",
-			  data[1] & (1 << 9) ? "indirect state invalidate, " : "",
-			  data[1] & (1 << 8) ? "notify irq, " : "",
-			  data[1] & (1 << 7) ? "PIPE_CONTROL flush, " : "",
-			  data[1] & (1 << 6) ? "protect mem app_id, " : "",
-			  data[1] & (1 << 5) ? "DC flush, " : "",
-			  data[1] & (1 << 4) ? "vf fetch invalidate, " : "",
-			  data[1] & (1 << 3) ? "constant cache invalidate, " : "",
-			  data[1] & (1 << 2) ? "state cache invalidate, " : "",
-			  data[1] & (1 << 1) ? "stall at scoreboard, " : "",
-			  data[1] & (1 << 0) ? "depth cache flush, " : "");
-		if (len == 5) {
-		    instr_out(data, hw_offset, 2, "destination address\n");
-		    instr_out(data, hw_offset, 3, "immediate dword low\n");
-		    instr_out(data, hw_offset, 4, "immediate dword high\n");
+
+		return len;
+
+	case 0x7a00:
+		if (intel_gen(devid) >= 6) {
+			int i;
+			len = (data[0] & 0xff) + 2;
+			if (len != 4 && len != 5)
+				fprintf(out, "Bad count in PIPE_CONTROL\n");
+			if (count < len)
+				BUFFER_FAIL(count, len, "PIPE_CONTROL");
+
+			switch ((data[1] >> 14) & 0x3) {
+			case 0:
+				desc1 = "no write";
+				break;
+			case 1:
+				desc1 = "qword write";
+				break;
+			case 2:
+				desc1 = "PS_DEPTH_COUNT write";
+				break;
+			case 3:
+				desc1 = "TIMESTAMP write";
+				break;
+			}
+			instr_out(data, hw_offset, 0, "PIPE_CONTROL\n");
+			instr_out(data, hw_offset, 1,
+				  "%s, %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
+				  desc1,
+				  data[1] & (1 << 20) ? "cs stall, " : "",
+				  data[1] & (1 << 19) ?
+				  "global snapshot count reset, " : "",
+				  data[1] & (1 << 18) ? "tlb invalidate, " : "",
+				  data[1] & (1 << 17) ? "gfdt flush, " : "",
+				  data[1] & (1 << 17) ? "media state clear, " :
+				  "",
+				  data[1] & (1 << 13) ? "depth stall, " : "",
+				  data[1] & (1 << 12) ?
+				  "render target cache flush, " : "",
+				  data[1] & (1 << 11) ?
+				  "instruction cache invalidate, " : "",
+				  data[1] & (1 << 10) ?
+				  "texture cache invalidate, " : "",
+				  data[1] & (1 << 9) ?
+				  "indirect state invalidate, " : "",
+				  data[1] & (1 << 8) ? "notify irq, " : "",
+				  data[1] & (1 << 7) ? "PIPE_CONTROL flush, " :
+				  "",
+				  data[1] & (1 << 6) ? "protect mem app_id, " :
+				  "", data[1] & (1 << 5) ? "DC flush, " : "",
+				  data[1] & (1 << 4) ? "vf fetch invalidate, " :
+				  "",
+				  data[1] & (1 << 3) ?
+				  "constant cache invalidate, " : "",
+				  data[1] & (1 << 2) ?
+				  "state cache invalidate, " : "",
+				  data[1] & (1 << 1) ? "stall at scoreboard, " :
+				  "",
+				  data[1] & (1 << 0) ? "depth cache flush, " :
+				  "");
+			if (len == 5) {
+				instr_out(data, hw_offset, 2,
+					  "destination address\n");
+				instr_out(data, hw_offset, 3,
+					  "immediate dword low\n");
+				instr_out(data, hw_offset, 4,
+					  "immediate dword high\n");
+			} else {
+				for (i = 2; i < len; i++) {
+					instr_out(data, hw_offset, i, "\n");
+				}
+			}
+			return len;
 		} else {
-		    for (i = 2; i < len; i++) {
-			instr_out(data, hw_offset, i, "\n");
-		    }
+			len = (data[0] & 0xff) + 2;
+			if (len != 4)
+				fprintf(out, "Bad count in PIPE_CONTROL\n");
+			if (count < len)
+				BUFFER_FAIL(count, len, "PIPE_CONTROL");
+
+			switch ((data[0] >> 14) & 0x3) {
+			case 0:
+				desc1 = "no write";
+				break;
+			case 1:
+				desc1 = "qword write";
+				break;
+			case 2:
+				desc1 = "PS_DEPTH_COUNT write";
+				break;
+			case 3:
+				desc1 = "TIMESTAMP write";
+				break;
+			}
+			instr_out(data, hw_offset, 0,
+				  "PIPE_CONTROL: %s, %sdepth stall, %sRC write flush, "
+				  "%sinst flush\n",
+				  desc1,
+				  data[0] & (1 << 13) ? "" : "no ",
+				  data[0] & (1 << 12) ? "" : "no ",
+				  data[0] & (1 << 11) ? "" : "no ");
+			instr_out(data, hw_offset, 1, "destination address\n");
+			instr_out(data, hw_offset, 2, "immediate dword low\n");
+			instr_out(data, hw_offset, 3, "immediate dword high\n");
+			return len;
 		}
-		return len;
-	} else {
+	case 0x7b00:
 		len = (data[0] & 0xff) + 2;
-		if (len != 4)
-			fprintf(out, "Bad count in PIPE_CONTROL\n");
+		if (len != 6)
+			fprintf(out, "Bad count in 3DPRIMITIVE\n");
 		if (count < len)
-			BUFFER_FAIL(count, len, "PIPE_CONTROL");
+			BUFFER_FAIL(count, len, "3DPRIMITIVE");
 
-		switch ((data[0] >> 14) & 0x3) {
-		case 0: desc1 = "no write"; break;
-		case 1: desc1 = "qword write"; break;
-		case 2: desc1 = "PS_DEPTH_COUNT write"; break;
-		case 3: desc1 = "TIMESTAMP write"; break;
-		}
 		instr_out(data, hw_offset, 0,
-			  "PIPE_CONTROL: %s, %sdepth stall, %sRC write flush, "
-			  "%sinst flush\n",
-			  desc1,
-			  data[0] & (1 << 13) ? "" : "no ",
-			  data[0] & (1 << 12) ? "" : "no ",
-			  data[0] & (1 << 11) ? "" : "no ");
-		instr_out(data, hw_offset, 1, "destination address\n");
-		instr_out(data, hw_offset, 2, "immediate dword low\n");
-		instr_out(data, hw_offset, 3, "immediate dword high\n");
+			  "3DPRIMITIVE: %s %s\n",
+			  get_965_prim_type(data[0]),
+			  (data[0] & (1 << 15)) ? "random" : "sequential");
+		instr_out(data, hw_offset, 1, "vertex count\n");
+		instr_out(data, hw_offset, 2, "start vertex\n");
+		instr_out(data, hw_offset, 3, "instance count\n");
+		instr_out(data, hw_offset, 4, "start instance\n");
+		instr_out(data, hw_offset, 5, "index bias\n");
 		return len;
 	}
-    case 0x7b00:
-	len = (data[0] & 0xff) + 2;
-	if (len != 6)
-	    fprintf(out, "Bad count in 3DPRIMITIVE\n");
-	if (count < len)
-	    BUFFER_FAIL(count, len, "3DPRIMITIVE");
-
-	instr_out(data, hw_offset, 0,
-		  "3DPRIMITIVE: %s %s\n",
-		  get_965_prim_type(data[0]),
-		  (data[0] & (1 << 15)) ? "random" : "sequential");
-	instr_out(data, hw_offset, 1, "vertex count\n");
-	instr_out(data, hw_offset, 2, "start vertex\n");
-	instr_out(data, hw_offset, 3, "instance count\n");
-	instr_out(data, hw_offset, 4, "start instance\n");
-	instr_out(data, hw_offset, 5, "index bias\n");
-	return len;
-    }
 
-    for (idx = 0; idx < ARRAY_SIZE(opcodes_3d); idx++) {
-	opcode_3d = &opcodes_3d[idx];
-	if ((data[0] & 0xffff0000) >> 16 == opcode_3d->opcode) {
-	    unsigned int i;
-	    len = 1;
+	for (idx = 0; idx < ARRAY_SIZE(opcodes_3d); idx++) {
+		opcode_3d = &opcodes_3d[idx];
+		if ((data[0] & 0xffff0000) >> 16 == opcode_3d->opcode) {
+			unsigned int i;
+			len = 1;
+
+			instr_out(data, hw_offset, 0, "%s\n", opcode_3d->name);
+			if (opcode_3d->max_len > 1) {
+				len = (data[0] & 0xff) + 2;
+				if (len < opcode_3d->min_len ||
+				    len > opcode_3d->max_len) {
+					fprintf(out, "Bad count in %s\n",
+						opcode_3d->name);
+				}
+			}
 
-	    instr_out(data, hw_offset, 0, "%s\n", opcode_3d->name);
-	    if (opcode_3d->max_len > 1) {
-		len = (data[0] & 0xff) + 2;
-		if (len < opcode_3d->min_len ||
-		    len > opcode_3d->max_len)
-		{
-		    fprintf(out, "Bad count in %s\n", opcode_3d->name);
+			for (i = 1; i < len; i++) {
+				if (i >= count)
+					BUFFER_FAIL(count, len,
+						    opcode_3d->name);
+				instr_out(data, hw_offset, i, "dword %d\n", i);
+			}
+			return len;
 		}
-	    }
-
-	    for (i = 1; i < len; i++) {
-		if (i >= count)
-		    BUFFER_FAIL(count, len, opcode_3d->name);
-		instr_out(data, hw_offset, i, "dword %d\n", i);
-	    }
-	    return len;
 	}
-    }
 
-    instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d_965 opcode = 0x%x\n", opcode);
-    (*failures)++;
-    return 1;
+	instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d_965 opcode = 0x%x\n",
+		  opcode);
+	(*failures)++;
+	return 1;
 }
 
 static int
-decode_3d_i830(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid, int *failures)
+decode_3d_i830(uint32_t * data, int count, uint32_t hw_offset, uint32_t devid,
+	       int *failures)
 {
-    unsigned int idx;
-    uint32_t opcode;
-
-    struct {
+	unsigned int idx;
 	uint32_t opcode;
-	int min_len;
-	int max_len;
-	char *name;
-    } opcodes_3d[] = {
-	{ 0x02, 1, 1, "3DSTATE_MODES_3" },
-	{ 0x03, 1, 1, "3DSTATE_ENABLES_1"},
-	{ 0x04, 1, 1, "3DSTATE_ENABLES_2"},
-	{ 0x05, 1, 1, "3DSTATE_VFT0"},
-	{ 0x06, 1, 1, "3DSTATE_AA"},
-	{ 0x07, 1, 1, "3DSTATE_RASTERIZATION_RULES" },
-	{ 0x08, 1, 1, "3DSTATE_MODES_1" },
-	{ 0x09, 1, 1, "3DSTATE_STENCIL_TEST" },
-	{ 0x0a, 1, 1, "3DSTATE_VFT1"},
-	{ 0x0b, 1, 1, "3DSTATE_INDPT_ALPHA_BLEND" },
-	{ 0x0c, 1, 1, "3DSTATE_MODES_5" },
-	{ 0x0d, 1, 1, "3DSTATE_MAP_BLEND_OP" },
-	{ 0x0e, 1, 1, "3DSTATE_MAP_BLEND_ARG" },
-	{ 0x0f, 1, 1, "3DSTATE_MODES_2" },
-	{ 0x15, 1, 1, "3DSTATE_FOG_COLOR" },
-	{ 0x16, 1, 1, "3DSTATE_MODES_4" },
-    }, *opcode_3d;
-
-    opcode = (data[0] & 0x1f000000) >> 24;
-
-    switch (opcode) {
-    case 0x1f:
-	return decode_3d_primitive(data, count, hw_offset, failures);
-    case 0x1d:
-	return decode_3d_1d(data, count, hw_offset, devid, failures);
-    case 0x1c:
-	return decode_3d_1c(data, count, hw_offset, failures);
-    }
-
-    for (idx = 0; idx < ARRAY_SIZE(opcodes_3d); idx++) {
-	opcode_3d = &opcodes_3d[idx];
-	if ((data[0] & 0x1f000000) >> 24 == opcode_3d->opcode) {
-	    unsigned int len = 1, i;
-
-	    instr_out(data, hw_offset, 0, "%s\n", opcode_3d->name);
-	    if (opcode_3d->max_len > 1) {
-		len = (data[0] & 0xff) + 2;
-		if (len < opcode_3d->min_len ||
-		    len > opcode_3d->max_len)
+
+	struct {
+		uint32_t opcode;
+		int min_len;
+		int max_len;
+		char *name;
+	} opcodes_3d[] = {
 		{
-		    fprintf(out, "Bad count in %s\n", opcode_3d->name);
+		0x02, 1, 1, "3DSTATE_MODES_3"}, {
+		0x03, 1, 1, "3DSTATE_ENABLES_1"}, {
+		0x04, 1, 1, "3DSTATE_ENABLES_2"}, {
+		0x05, 1, 1, "3DSTATE_VFT0"}, {
+		0x06, 1, 1, "3DSTATE_AA"}, {
+		0x07, 1, 1, "3DSTATE_RASTERIZATION_RULES"}, {
+		0x08, 1, 1, "3DSTATE_MODES_1"}, {
+		0x09, 1, 1, "3DSTATE_STENCIL_TEST"}, {
+		0x0a, 1, 1, "3DSTATE_VFT1"}, {
+		0x0b, 1, 1, "3DSTATE_INDPT_ALPHA_BLEND"}, {
+		0x0c, 1, 1, "3DSTATE_MODES_5"}, {
+		0x0d, 1, 1, "3DSTATE_MAP_BLEND_OP"}, {
+		0x0e, 1, 1, "3DSTATE_MAP_BLEND_ARG"}, {
+		0x0f, 1, 1, "3DSTATE_MODES_2"}, {
+		0x15, 1, 1, "3DSTATE_FOG_COLOR"}, {
+	0x16, 1, 1, "3DSTATE_MODES_4"},}, *opcode_3d;
+
+	opcode = (data[0] & 0x1f000000) >> 24;
+
+	switch (opcode) {
+	case 0x1f:
+		return decode_3d_primitive(data, count, hw_offset, failures);
+	case 0x1d:
+		return decode_3d_1d(data, count, hw_offset, devid, failures);
+	case 0x1c:
+		return decode_3d_1c(data, count, hw_offset, failures);
+	}
+
+	for (idx = 0; idx < ARRAY_SIZE(opcodes_3d); idx++) {
+		opcode_3d = &opcodes_3d[idx];
+		if ((data[0] & 0x1f000000) >> 24 == opcode_3d->opcode) {
+			unsigned int len = 1, i;
+
+			instr_out(data, hw_offset, 0, "%s\n", opcode_3d->name);
+			if (opcode_3d->max_len > 1) {
+				len = (data[0] & 0xff) + 2;
+				if (len < opcode_3d->min_len ||
+				    len > opcode_3d->max_len) {
+					fprintf(out, "Bad count in %s\n",
+						opcode_3d->name);
+				}
+			}
+
+			for (i = 1; i < len; i++) {
+				if (i >= count)
+					BUFFER_FAIL(count, len,
+						    opcode_3d->name);
+				instr_out(data, hw_offset, i, "dword %d\n", i);
+			}
+			return len;
 		}
-	    }
-
-	    for (i = 1; i < len; i++) {
-		if (i >= count)
-		    BUFFER_FAIL(count, len, opcode_3d->name);
-		instr_out(data, hw_offset, i, "dword %d\n", i);
-	    }
-	    return len;
 	}
-    }
 
-    instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d_i830 opcode = 0x%x\n", opcode);
-    (*failures)++;
-    return 1;
+	instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d_i830 opcode = 0x%x\n",
+		  opcode);
+	(*failures)++;
+	return 1;
 }
 
 /**
@@ -2855,73 +3510,76 @@ decode_3d_i830(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid, in
  * \param hw_offset hardware address for the buffer
  */
 int
-intel_decode(uint32_t *data, int count,
+intel_decode(uint32_t * data, int count,
 	     uint32_t hw_offset,
-	     uint32_t devid,
-	     uint32_t ignore_end_of_batchbuffer)
+	     uint32_t devid, uint32_t ignore_end_of_batchbuffer)
 {
-    int ret;
-    int index = 0;
-    int failures = 0;
-
-    out = stdout;
-
-    while (index < count) {
-	switch ((data[index] & 0xe0000000) >> 29) {
-	case 0x0:
-	    ret = decode_mi(data + index, count - index,
-			       hw_offset + index * 4, &failures);
-
-	    /* If MI_BATCHBUFFER_END happened, then dump the rest of the
-	     * output in case we some day want it in debugging, but don't
-	     * decode it since it'll just confuse in the common case.
-	     */
-	    if (ret == -1) {
-		if (ignore_end_of_batchbuffer) {
-		    index++;
-		} else {
-		    for (index = index + 1; index < count; index++) {
-			instr_out(data, hw_offset, index, "\n");
-		    }
+	int ret;
+	int index = 0;
+	int failures = 0;
+
+	out = stdout;
+
+	while (index < count) {
+		switch ((data[index] & 0xe0000000) >> 29) {
+		case 0x0:
+			ret = decode_mi(data + index, count - index,
+					hw_offset + index * 4, &failures);
+
+			/* If MI_BATCHBUFFER_END happened, then dump the rest of the
+			 * output in case we some day want it in debugging, but don't
+			 * decode it since it'll just confuse in the common case.
+			 */
+			if (ret == -1) {
+				if (ignore_end_of_batchbuffer) {
+					index++;
+				} else {
+					for (index = index + 1; index < count;
+					     index++) {
+						instr_out(data, hw_offset,
+							  index, "\n");
+					}
+				}
+			} else
+				index += ret;
+			break;
+		case 0x2:
+			index += decode_2d(data + index, count - index,
+					   hw_offset + index * 4, &failures);
+			break;
+		case 0x3:
+			if (IS_965(devid)) {
+				index +=
+				    decode_3d_965(data + index, count - index,
+						  hw_offset + index * 4, devid,
+						  &failures);
+			} else if (IS_GEN3(devid)) {
+				index += decode_3d(data + index, count - index,
+						   hw_offset + index * 4,
+						   devid, &failures);
+			} else {
+				index +=
+				    decode_3d_i830(data + index, count - index,
+						   hw_offset + index * 4, devid,
+						   &failures);
+			}
+			break;
+		default:
+			instr_out(data, hw_offset, index, "UNKNOWN\n");
+			failures++;
+			index++;
+			break;
 		}
-	    } else
-		index += ret;
-	    break;
-	case 0x2:
-	    index += decode_2d(data + index, count - index,
-			       hw_offset + index * 4, &failures);
-	    break;
-	case 0x3:
-	    if (IS_965(devid)) {
-		index += decode_3d_965(data + index, count - index,
-				       hw_offset + index * 4,
-				       devid, &failures);
-	    } else if (IS_GEN3(devid)) {
-		index += decode_3d(data + index, count - index,
-				   hw_offset + index * 4,
-				   devid, &failures);
-	    } else {
-		index += decode_3d_i830(data + index, count - index,
-					hw_offset + index * 4,
-					devid, &failures);
-	    }
-	    break;
-	default:
-	    instr_out(data, hw_offset, index, "UNKNOWN\n");
-	    failures++;
-	    index++;
-	    break;
+		fflush(out);
 	}
-	fflush(out);
-    }
 
-    return failures;
+	return failures;
 }
 
 void intel_decode_context_reset(void)
 {
-    saved_s2_set = 0;
-    saved_s4_set = 1;
+	saved_s2_set = 0;
+	saved_s4_set = 1;
 }
 
 void intel_decode_context_set_head_tail(uint32_t head, uint32_t tail)
-- 
1.7.7.3

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 05/13] intel: Minor style tweaks after Lindent.
  2011-12-21 18:09 Moving intel_decode.c to libdrm Eric Anholt
                   ` (3 preceding siblings ...)
  2011-12-21 18:09 ` [PATCH 04/13] intel: Reformat intel_decode.c from intel-gpu-tools using Lindent Eric Anholt
@ 2011-12-21 18:09 ` Eric Anholt
  2011-12-21 18:09 ` [PATCH 06/13] intel: Get intel_decode.c minimally building Eric Anholt
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Eric Anholt @ 2011-12-21 18:09 UTC (permalink / raw)
  To: intel-gfx

Some comments weren't wrapped, and for some reason uint32_t *data got
an extra space (while other instances of "type *identifier" didn't),
and the indentation of the opcode-list structs got trashed.
---
 intel/intel_decode.c |  339 +++++++++++++++++++++++++-------------------------
 1 files changed, 172 insertions(+), 167 deletions(-)

diff --git a/intel/intel_decode.c b/intel/intel_decode.c
index 85e8f37..e06142c 100644
--- a/intel/intel_decode.c
+++ b/intel/intel_decode.c
@@ -59,7 +59,7 @@ static float int_as_float(uint32_t intval)
 }
 
 static void
-instr_out(uint32_t * data, uint32_t hw_offset, unsigned int index,
+instr_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
 	  char *fmt, ...)
 {
 	va_list va;
@@ -81,7 +81,7 @@ instr_out(uint32_t * data, uint32_t hw_offset, unsigned int index,
 }
 
 static int
-decode_mi(uint32_t * data, int count, uint32_t hw_offset, int *failures)
+decode_mi(uint32_t *data, int count, uint32_t hw_offset, int *failures)
 {
 	unsigned int opcode, len = -1;
 	char *post_sync_op = "";
@@ -93,28 +93,28 @@ decode_mi(uint32_t * data, int count, uint32_t hw_offset, int *failures)
 		int max_len;
 		char *name;
 	} opcodes_mi[] = {
-		{
-		0x08, 0, 1, 1, "MI_ARB_ON_OFF"}, {
-		0x0a, 0, 1, 1, "MI_BATCH_BUFFER_END"}, {
-		0x30, 0x3f, 3, 3, "MI_BATCH_BUFFER"}, {
-		0x31, 0x3f, 2, 2, "MI_BATCH_BUFFER_START"}, {
-		0x14, 0x3f, 3, 3, "MI_DISPLAY_BUFFER_INFO"}, {
-		0x04, 0, 1, 1, "MI_FLUSH"}, {
-		0x22, 0x1f, 3, 3, "MI_LOAD_REGISTER_IMM"}, {
-		0x13, 0x3f, 2, 2, "MI_LOAD_SCAN_LINES_EXCL"}, {
-		0x12, 0x3f, 2, 2, "MI_LOAD_SCAN_LINES_INCL"}, {
-		0x00, 0, 1, 1, "MI_NOOP"}, {
-		0x11, 0x3f, 2, 2, "MI_OVERLAY_FLIP"}, {
-		0x07, 0, 1, 1, "MI_REPORT_HEAD"}, {
-		0x18, 0x3f, 2, 2, "MI_SET_CONTEXT"}, {
-		0x20, 0x3f, 3, 4, "MI_STORE_DATA_IMM"}, {
-		0x21, 0x3f, 3, 4, "MI_STORE_DATA_INDEX"}, {
-		0x24, 0x3f, 3, 3, "MI_STORE_REGISTER_MEM"}, {
-		0x02, 0, 1, 1, "MI_USER_INTERRUPT"}, {
-		0x03, 0, 1, 1, "MI_WAIT_FOR_EVENT"}, {
-		0x16, 0x7f, 3, 3, "MI_SEMAPHORE_MBOX"}, {
-		0x26, 0x1f, 3, 4, "MI_FLUSH_DW"}, {
-	0x0b, 0, 1, 1, "MI_SUSPEND_FLUSH"},};
+		{ 0x08, 0, 1, 1, "MI_ARB_ON_OFF" },
+		{ 0x0a, 0, 1, 1, "MI_BATCH_BUFFER_END" },
+		{ 0x30, 0x3f, 3, 3, "MI_BATCH_BUFFER" },
+		{ 0x31, 0x3f, 2, 2, "MI_BATCH_BUFFER_START" },
+		{ 0x14, 0x3f, 3, 3, "MI_DISPLAY_BUFFER_INFO" },
+		{ 0x04, 0, 1, 1, "MI_FLUSH" },
+		{ 0x22, 0x1f, 3, 3, "MI_LOAD_REGISTER_IMM" },
+		{ 0x13, 0x3f, 2, 2, "MI_LOAD_SCAN_LINES_EXCL" },
+		{ 0x12, 0x3f, 2, 2, "MI_LOAD_SCAN_LINES_INCL" },
+		{ 0x00, 0, 1, 1, "MI_NOOP" },
+		{ 0x11, 0x3f, 2, 2, "MI_OVERLAY_FLIP" },
+		{ 0x07, 0, 1, 1, "MI_REPORT_HEAD" },
+		{ 0x18, 0x3f, 2, 2, "MI_SET_CONTEXT" },
+		{ 0x20, 0x3f, 3, 4, "MI_STORE_DATA_IMM" },
+		{ 0x21, 0x3f, 3, 4, "MI_STORE_DATA_INDEX" },
+		{ 0x24, 0x3f, 3, 3, "MI_STORE_REGISTER_MEM" },
+		{ 0x02, 0, 1, 1, "MI_USER_INTERRUPT" },
+		{ 0x03, 0, 1, 1, "MI_WAIT_FOR_EVENT" },
+		{ 0x16, 0x7f, 3, 3, "MI_SEMAPHORE_MBOX" },
+		{ 0x26, 0x1f, 3, 4, "MI_FLUSH_DW" },
+		{ 0x0b, 0, 1, 1, "MI_SUSPEND_FLUSH"},
+	};
 
 	/* check instruction length */
 	for (opcode = 0; opcode < sizeof(opcodes_mi) / sizeof(opcodes_mi[0]);
@@ -226,7 +226,7 @@ decode_mi(uint32_t * data, int count, uint32_t hw_offset, int *failures)
 }
 
 static void
-decode_2d_br00(uint32_t * data, int count, uint32_t hw_offset, char *cmd)
+decode_2d_br00(uint32_t *data, int count, uint32_t hw_offset, char *cmd)
 {
 	instr_out(data, hw_offset, 0,
 		  "%s (rgb %sabled, alpha %sabled, src tile %d, dst tile %d)\n",
@@ -236,7 +236,7 @@ decode_2d_br00(uint32_t * data, int count, uint32_t hw_offset, char *cmd)
 		  (data[count] >> 15) & 1, (data[count] >> 11) & 1);
 }
 
-static void decode_2d_br01(uint32_t * data, int count, uint32_t hw_offset)
+static void decode_2d_br01(uint32_t *data, int count, uint32_t hw_offset)
 {
 	char *format;
 	switch ((data[count] >> 24) & 0x3) {
@@ -267,7 +267,7 @@ static void decode_2d_br01(uint32_t * data, int count, uint32_t hw_offset)
 }
 
 static int
-decode_2d(uint32_t * data, int count, uint32_t hw_offset, int *failures)
+decode_2d(uint32_t *data, int count, uint32_t hw_offset, int *failures)
 {
 	unsigned int opcode, len;
 
@@ -277,32 +277,32 @@ decode_2d(uint32_t * data, int count, uint32_t hw_offset, int *failures)
 		int max_len;
 		char *name;
 	} opcodes_2d[] = {
-		{
-		0x40, 5, 5, "COLOR_BLT"}, {
-		0x43, 6, 6, "SRC_COPY_BLT"}, {
-		0x01, 8, 8, "XY_SETUP_BLT"}, {
-		0x11, 9, 9, "XY_SETUP_MONO_PATTERN_SL_BLT"}, {
-		0x03, 3, 3, "XY_SETUP_CLIP_BLT"}, {
-		0x24, 2, 2, "XY_PIXEL_BLT"}, {
-		0x25, 3, 3, "XY_SCANLINES_BLT"}, {
-		0x26, 4, 4, "Y_TEXT_BLT"}, {
-		0x31, 5, 134, "XY_TEXT_IMMEDIATE_BLT"}, {
-		0x50, 6, 6, "XY_COLOR_BLT"}, {
-		0x51, 6, 6, "XY_PAT_BLT"}, {
-		0x76, 8, 8, "XY_PAT_CHROMA_BLT"}, {
-		0x72, 7, 135, "XY_PAT_BLT_IMMEDIATE"}, {
-		0x77, 9, 137, "XY_PAT_CHROMA_BLT_IMMEDIATE"}, {
-		0x52, 9, 9, "XY_MONO_PAT_BLT"}, {
-		0x59, 7, 7, "XY_MONO_PAT_FIXED_BLT"}, {
-		0x53, 8, 8, "XY_SRC_COPY_BLT"}, {
-		0x54, 8, 8, "XY_MONO_SRC_COPY_BLT"}, {
-		0x71, 9, 137, "XY_MONO_SRC_COPY_IMMEDIATE_BLT"}, {
-		0x55, 9, 9, "XY_FULL_BLT"}, {
-		0x55, 9, 137, "XY_FULL_IMMEDIATE_PATTERN_BLT"}, {
-		0x56, 9, 9, "XY_FULL_MONO_SRC_BLT"}, {
-		0x75, 10, 138, "XY_FULL_MONO_SRC_IMMEDIATE_PATTERN_BLT"}, {
-		0x57, 12, 12, "XY_FULL_MONO_PATTERN_BLT"}, {
-	0x58, 12, 12, "XY_FULL_MONO_PATTERN_MONO_SRC_BLT"},};
+		{ 0x40, 5, 5, "COLOR_BLT" },
+		{ 0x43, 6, 6, "SRC_COPY_BLT" },
+		{ 0x01, 8, 8, "XY_SETUP_BLT" },
+		{ 0x11, 9, 9, "XY_SETUP_MONO_PATTERN_SL_BLT" },
+		{ 0x03, 3, 3, "XY_SETUP_CLIP_BLT" },
+		{ 0x24, 2, 2, "XY_PIXEL_BLT" },
+		{ 0x25, 3, 3, "XY_SCANLINES_BLT" },
+		{ 0x26, 4, 4, "Y_TEXT_BLT" },
+		{ 0x31, 5, 134, "XY_TEXT_IMMEDIATE_BLT" },
+		{ 0x50, 6, 6, "XY_COLOR_BLT" },
+		{ 0x51, 6, 6, "XY_PAT_BLT" },
+		{ 0x76, 8, 8, "XY_PAT_CHROMA_BLT" },
+		{ 0x72, 7, 135, "XY_PAT_BLT_IMMEDIATE" },
+		{ 0x77, 9, 137, "XY_PAT_CHROMA_BLT_IMMEDIATE" },
+		{ 0x52, 9, 9, "XY_MONO_PAT_BLT" },
+		{ 0x59, 7, 7, "XY_MONO_PAT_FIXED_BLT" },
+		{ 0x53, 8, 8, "XY_SRC_COPY_BLT" },
+		{ 0x54, 8, 8, "XY_MONO_SRC_COPY_BLT" },
+		{ 0x71, 9, 137, "XY_MONO_SRC_COPY_IMMEDIATE_BLT" },
+		{ 0x55, 9, 9, "XY_FULL_BLT" },
+		{ 0x55, 9, 137, "XY_FULL_IMMEDIATE_PATTERN_BLT" },
+		{ 0x56, 9, 9, "XY_FULL_MONO_SRC_BLT" },
+		{ 0x75, 10, 138, "XY_FULL_MONO_SRC_IMMEDIATE_PATTERN_BLT" },
+		{ 0x57, 12, 12, "XY_FULL_MONO_PATTERN_BLT" },
+		{ 0x58, 12, 12, "XY_FULL_MONO_PATTERN_MONO_SRC_BLT"},
+	};
 
 	switch ((data[0] & 0x1fc00000) >> 22) {
 	case 0x25:
@@ -453,7 +453,7 @@ decode_2d(uint32_t * data, int count, uint32_t hw_offset, int *failures)
 }
 
 static int
-decode_3d_1c(uint32_t * data, int count, uint32_t hw_offset, int *failures)
+decode_3d_1c(uint32_t *data, int count, uint32_t hw_offset, int *failures)
 {
 	uint32_t opcode;
 
@@ -487,7 +487,7 @@ decode_3d_1c(uint32_t * data, int count, uint32_t hw_offset, int *failures)
 
 /** Sets the string dstname to describe the destination of the PS instruction */
 static void
-i915_get_instruction_dst(uint32_t * data, int i, char *dstname, int do_mask)
+i915_get_instruction_dst(uint32_t *data, int i, char *dstname, int do_mask)
 {
 	uint32_t a0 = data[i];
 	int dst_nr = (a0 >> 14) & 0xf;
@@ -618,7 +618,7 @@ i915_get_instruction_src_name(uint32_t src_type, uint32_t src_nr, char *name)
 	}
 }
 
-static void i915_get_instruction_src0(uint32_t * data, int i, char *srcname)
+static void i915_get_instruction_src0(uint32_t *data, int i, char *srcname)
 {
 	uint32_t a0 = data[i];
 	uint32_t a1 = data[i + 1];
@@ -636,7 +636,7 @@ static void i915_get_instruction_src0(uint32_t * data, int i, char *srcname)
 		strcat(srcname, swizzle);
 }
 
-static void i915_get_instruction_src1(uint32_t * data, int i, char *srcname)
+static void i915_get_instruction_src1(uint32_t *data, int i, char *srcname)
 {
 	uint32_t a1 = data[i + 1];
 	uint32_t a2 = data[i + 2];
@@ -654,7 +654,7 @@ static void i915_get_instruction_src1(uint32_t * data, int i, char *srcname)
 		strcat(srcname, swizzle);
 }
 
-static void i915_get_instruction_src2(uint32_t * data, int i, char *srcname)
+static void i915_get_instruction_src2(uint32_t *data, int i, char *srcname)
 {
 	uint32_t a2 = data[i + 2];
 	int src_nr = (a2 >> 16) & 0x1f;
@@ -712,7 +712,7 @@ i915_get_instruction_addr(uint32_t src_type, uint32_t src_nr, char *name)
 }
 
 static void
-i915_decode_alu1(uint32_t * data, uint32_t hw_offset,
+i915_decode_alu1(uint32_t *data, uint32_t hw_offset,
 		 int i, char *instr_prefix, char *op_name)
 {
 	char dst[100], src0[100];
@@ -727,7 +727,7 @@ i915_decode_alu1(uint32_t * data, uint32_t hw_offset,
 }
 
 static void
-i915_decode_alu2(uint32_t * data, uint32_t hw_offset,
+i915_decode_alu2(uint32_t *data, uint32_t hw_offset,
 		 int i, char *instr_prefix, char *op_name)
 {
 	char dst[100], src0[100], src1[100];
@@ -743,7 +743,7 @@ i915_decode_alu2(uint32_t * data, uint32_t hw_offset,
 }
 
 static void
-i915_decode_alu3(uint32_t * data, uint32_t hw_offset,
+i915_decode_alu3(uint32_t *data, uint32_t hw_offset,
 		 int i, char *instr_prefix, char *op_name)
 {
 	char dst[100], src0[100], src1[100], src2[100];
@@ -760,7 +760,7 @@ i915_decode_alu3(uint32_t * data, uint32_t hw_offset,
 }
 
 static void
-i915_decode_tex(uint32_t * data, uint32_t hw_offset, int i, char *instr_prefix,
+i915_decode_tex(uint32_t *data, uint32_t hw_offset, int i, char *instr_prefix,
 		char *tex_name)
 {
 	uint32_t t0 = data[i];
@@ -781,7 +781,7 @@ i915_decode_tex(uint32_t * data, uint32_t hw_offset, int i, char *instr_prefix,
 }
 
 static void
-i915_decode_dcl(uint32_t * data, uint32_t hw_offset, int i, char *instr_prefix)
+i915_decode_dcl(uint32_t *data, uint32_t hw_offset, int i, char *instr_prefix)
 {
 	uint32_t d0 = data[i];
 	char *sampletype;
@@ -870,7 +870,7 @@ i915_decode_dcl(uint32_t * data, uint32_t hw_offset, int i, char *instr_prefix)
 }
 
 static void
-i915_decode_instruction(uint32_t * data, uint32_t hw_offset,
+i915_decode_instruction(uint32_t *data, uint32_t hw_offset,
 			int i, char *instr_prefix)
 {
 	switch ((data[i] >> 24) & 0x1f) {
@@ -1122,7 +1122,7 @@ static char *decode_sample_filter(uint32_t mode)
 }
 
 static int
-decode_3d_1d(uint32_t * data, int count,
+decode_3d_1d(uint32_t *data, int count,
 	     uint32_t hw_offset, uint32_t devid, int *failures)
 {
 	unsigned int len, i, c, idx, word, map, sampler, instr;
@@ -1136,32 +1136,33 @@ decode_3d_1d(uint32_t * data, int count,
 		int max_len;
 		char *name;
 	} opcodes_3d_1d[] = {
-		{
-		0x86, 0, 4, 4, "3DSTATE_CHROMA_KEY"}, {
-		0x88, 0, 2, 2, "3DSTATE_CONSTANT_BLEND_COLOR"}, {
-		0x99, 0, 2, 2, "3DSTATE_DEFAULT_DIFFUSE"}, {
-		0x9a, 0, 2, 2, "3DSTATE_DEFAULT_SPECULAR"}, {
-		0x98, 0, 2, 2, "3DSTATE_DEFAULT_Z"}, {
-		0x97, 0, 2, 2, "3DSTATE_DEPTH_OFFSET_SCALE"}, {
-		0x9d, 0, 65, 65, "3DSTATE_FILTER_COEFFICIENTS_4X4"}, {
-		0x9e, 0, 4, 4, "3DSTATE_MONO_FILTER"}, {
-		0x89, 0, 4, 4, "3DSTATE_FOG_MODE"}, {
-		0x8f, 0, 2, 16, "3DSTATE_MAP_PALLETE_LOAD_32"}, {
-		0x83, 0, 2, 2, "3DSTATE_SPAN_STIPPLE"}, {
-		0x8c, 1, 2, 2, "3DSTATE_MAP_COORD_TRANSFORM_I830"}, {
-		0x8b, 1, 2, 2, "3DSTATE_MAP_VERTEX_TRANSFORM_I830"}, {
-		0x8d, 1, 3, 3, "3DSTATE_W_STATE_I830"}, {
-		0x01, 1, 2, 2, "3DSTATE_COLOR_FACTOR_I830"}, {
-	0x02, 1, 2, 2, "3DSTATE_MAP_COORD_SETBIND_I830"},}, *opcode_3d_1d;
+		{ 0x86, 0, 4, 4, "3DSTATE_CHROMA_KEY" },
+		{ 0x88, 0, 2, 2, "3DSTATE_CONSTANT_BLEND_COLOR" },
+		{ 0x99, 0, 2, 2, "3DSTATE_DEFAULT_DIFFUSE" },
+		{ 0x9a, 0, 2, 2, "3DSTATE_DEFAULT_SPECULAR" },
+		{ 0x98, 0, 2, 2, "3DSTATE_DEFAULT_Z" },
+		{ 0x97, 0, 2, 2, "3DSTATE_DEPTH_OFFSET_SCALE" },
+		{ 0x9d, 0, 65, 65, "3DSTATE_FILTER_COEFFICIENTS_4X4" },
+		{ 0x9e, 0, 4, 4, "3DSTATE_MONO_FILTER" },
+		{ 0x89, 0, 4, 4, "3DSTATE_FOG_MODE" },
+		{ 0x8f, 0, 2, 16, "3DSTATE_MAP_PALLETE_LOAD_32" },
+		{ 0x83, 0, 2, 2, "3DSTATE_SPAN_STIPPLE" },
+		{ 0x8c, 1, 2, 2, "3DSTATE_MAP_COORD_TRANSFORM_I830" },
+		{ 0x8b, 1, 2, 2, "3DSTATE_MAP_VERTEX_TRANSFORM_I830" },
+		{ 0x8d, 1, 3, 3, "3DSTATE_W_STATE_I830" },
+		{ 0x01, 1, 2, 2, "3DSTATE_COLOR_FACTOR_I830" },
+		{ 0x02, 1, 2, 2, "3DSTATE_MAP_COORD_SETBIND_I830"},
+	}, *opcode_3d_1d;
 
 	opcode = (data[0] & 0x00ff0000) >> 16;
 
 	switch (opcode) {
 	case 0x07:
-		/* This instruction is unusual.  A 0 length means just 1 DWORD instead of
-		 * 2.  The 0 length is specified in one place to be unsupported, but
-		 * stated to be required in another, and 0 length LOAD_INDIRECTs appear
-		 * to cause no harm at least.
+		/* This instruction is unusual.  A 0 length means just
+		 * 1 DWORD instead of 2.  The 0 length is specified in
+		 * one place to be unsupported, but stated to be
+		 * required in another, and 0 length LOAD_INDIRECTs
+		 * appear to cause no harm at least.
 		 */
 		instr_out(data, hw_offset, 0, "3DSTATE_LOAD_INDIRECT\n");
 		len = (data[0] & 0x000000ff) + 1;
@@ -2198,7 +2199,7 @@ decode_3d_1d(uint32_t * data, int count,
 }
 
 static int
-decode_3d_primitive(uint32_t * data, int count, uint32_t hw_offset,
+decode_3d_primitive(uint32_t *data, int count, uint32_t hw_offset,
 		    int *failures)
 {
 	char immediate = (data[0] & (1 << 23)) == 0;
@@ -2396,7 +2397,9 @@ decode_3d_primitive(uint32_t * data, int count, uint32_t hw_offset,
 				  "3DPRIMITIVE random indirect %s (%d)\n",
 				  primtype, len);
 			if (len == 0) {
-				/* vertex indices continue until 0xffff is found */
+				/* vertex indices continue until 0xffff is
+				 * found
+				 */
 				for (i = 1; i < count; i++) {
 					if ((data[i] & 0xffff) == 0xffff) {
 						instr_out(data, hw_offset, i,
@@ -2459,7 +2462,7 @@ out:
 }
 
 static int
-decode_3d(uint32_t * data, int count, uint32_t hw_offset, uint32_t devid,
+decode_3d(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid,
 	  int *failures)
 {
 	uint32_t opcode;
@@ -2471,16 +2474,16 @@ decode_3d(uint32_t * data, int count, uint32_t hw_offset, uint32_t devid,
 		int max_len;
 		char *name;
 	} opcodes_3d[] = {
-		{
-		0x06, 1, 1, "3DSTATE_ANTI_ALIASING"}, {
-		0x08, 1, 1, "3DSTATE_BACKFACE_STENCIL_OPS"}, {
-		0x09, 1, 1, "3DSTATE_BACKFACE_STENCIL_MASKS"}, {
-		0x16, 1, 1, "3DSTATE_COORD_SET_BINDINGS"}, {
-		0x15, 1, 1, "3DSTATE_FOG_COLOR"}, {
-		0x0b, 1, 1, "3DSTATE_INDEPENDENT_ALPHA_BLEND"}, {
-		0x0d, 1, 1, "3DSTATE_MODES_4"}, {
-		0x0c, 1, 1, "3DSTATE_MODES_5"}, {
-	0x07, 1, 1, "3DSTATE_RASTERIZATION_RULES"},}, *opcode_3d;
+		{ 0x06, 1, 1, "3DSTATE_ANTI_ALIASING" },
+		{ 0x08, 1, 1, "3DSTATE_BACKFACE_STENCIL_OPS" },
+		{ 0x09, 1, 1, "3DSTATE_BACKFACE_STENCIL_MASKS" },
+		{ 0x16, 1, 1, "3DSTATE_COORD_SET_BINDINGS" },
+		{ 0x15, 1, 1, "3DSTATE_FOG_COLOR" },
+		{ 0x0b, 1, 1, "3DSTATE_INDEPENDENT_ALPHA_BLEND" },
+		{ 0x0d, 1, 1, "3DSTATE_MODES_4" },
+		{ 0x0c, 1, 1, "3DSTATE_MODES_5" },
+		{ 0x07, 1, 1, "3DSTATE_RASTERIZATION_RULES"},
+	}, *opcode_3d;
 
 	opcode = (data[0] & 0x1f000000) >> 24;
 
@@ -2645,7 +2648,7 @@ static const char *get_965_prim_type(uint32_t data)
 }
 
 static int
-i965_decode_urb_fence(uint32_t * data, uint32_t hw_offset, int len, int count,
+i965_decode_urb_fence(uint32_t *data, uint32_t hw_offset, int len, int count,
 		      int *failures)
 {
 	uint32_t vs_fence, clip_fence, gs_fence, sf_fence, vfe_fence, cs_fence;
@@ -2688,7 +2691,7 @@ i965_decode_urb_fence(uint32_t * data, uint32_t hw_offset, int len, int count,
 }
 
 static void
-state_base_out(uint32_t * data, uint32_t hw_offset, unsigned int index,
+state_base_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
 	       char *name)
 {
 	if (data[index] & 1) {
@@ -2702,7 +2705,7 @@ state_base_out(uint32_t * data, uint32_t hw_offset, unsigned int index,
 }
 
 static void
-state_max_out(uint32_t * data, uint32_t hw_offset, unsigned int index,
+state_max_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
 	      char *name)
 {
 	if (data[index] & 1) {
@@ -2721,7 +2724,7 @@ state_max_out(uint32_t * data, uint32_t hw_offset, unsigned int index,
 }
 
 static int
-decode_3d_965(uint32_t * data, int count, uint32_t hw_offset, uint32_t devid,
+decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid,
 	      int *failures)
 {
 	uint32_t opcode;
@@ -2735,48 +2738,48 @@ decode_3d_965(uint32_t * data, int count, uint32_t hw_offset, uint32_t devid,
 		int max_len;
 		char *name;
 	} opcodes_3d[] = {
-		{
-		0x6000, 3, 3, "URB_FENCE"}, {
-		0x6001, 2, 2, "CS_URB_STATE"}, {
-		0x6002, 2, 2, "CONSTANT_BUFFER"}, {
-		0x6101, 6, 6, "STATE_BASE_ADDRESS"}, {
-		0x6102, 2, 2, "STATE_SIP"}, {
-		0x6104, 1, 1, "3DSTATE_PIPELINE_SELECT"}, {
-		0x680b, 1, 1, "3DSTATE_VF_STATISTICS"}, {
-		0x6904, 1, 1, "3DSTATE_PIPELINE_SELECT"}, {
-		0x7800, 7, 7, "3DSTATE_PIPELINED_POINTERS"}, {
-		0x7801, 6, 6, "3DSTATE_BINDING_TABLE_POINTERS"}, {
-		0x7808, 5, 257, "3DSTATE_VERTEX_BUFFERS"}, {
-		0x7809, 3, 256, "3DSTATE_VERTEX_ELEMENTS"}, {
-		0x780a, 3, 3, "3DSTATE_INDEX_BUFFER"}, {
-		0x780b, 1, 1, "3DSTATE_VF_STATISTICS"}, {
-		0x7900, 4, 4, "3DSTATE_DRAWING_RECTANGLE"}, {
-		0x7901, 5, 5, "3DSTATE_CONSTANT_COLOR"}, {
-		0x7905, 5, 7, "3DSTATE_DEPTH_BUFFER"}, {
-		0x7906, 2, 2, "3DSTATE_POLY_STIPPLE_OFFSET"}, {
-		0x7907, 33, 33, "3DSTATE_POLY_STIPPLE_PATTERN"}, {
-		0x7908, 3, 3, "3DSTATE_LINE_STIPPLE"}, {
-		0x7909, 2, 2, "3DSTATE_GLOBAL_DEPTH_OFFSET_CLAMP"}, {
-		0x7909, 2, 2, "3DSTATE_CLEAR_PARAMS"}, {
-		0x790a, 3, 3, "3DSTATE_AA_LINE_PARAMETERS"}, {
-		0x790b, 4, 4, "3DSTATE_GS_SVB_INDEX"}, {
-		0x790d, 3, 3, "3DSTATE_MULTISAMPLE"}, {
-		0x7910, 2, 2, "3DSTATE_CLEAR_PARAMS"}, {
-		0x7b00, 6, 6, "3DPRIMITIVE"}, {
-		0x7802, 4, 4, "3DSTATE_SAMPLER_STATE_POINTERS"}, {
-		0x7805, 3, 3, "3DSTATE_URB"}, {
-		0x780d, 4, 4, "3DSTATE_VIEWPORT_STATE_POINTERS"}, {
-		0x780e, 4, 4, "3DSTATE_CC_STATE_POINTERS"}, {
-		0x780f, 2, 2, "3DSTATE_SCISSOR_STATE_POINTERS"}, {
-		0x7810, 6, 6, "3DSTATE_VS_STATE"}, {
-		0x7811, 7, 7, "3DSTATE_GS_STATE"}, {
-		0x7812, 4, 4, "3DSTATE_CLIP_STATE"}, {
-		0x7813, 20, 20, "3DSTATE_SF_STATE"}, {
-		0x7814, 9, 9, "3DSTATE_WM_STATE"}, {
-		0x7815, 5, 5, "3DSTATE_CONSTANT_VS_STATE"}, {
-		0x7816, 5, 5, "3DSTATE_CONSTANT_GS_STATE"}, {
-		0x7817, 5, 5, "3DSTATE_CONSTANT_PS_STATE"}, {
-	0x7818, 2, 2, "3DSTATE_SAMPLE_MASK"},}, *opcode_3d;
+		{ 0x6000, 3, 3, "URB_FENCE" },
+		{ 0x6001, 2, 2, "CS_URB_STATE" },
+		{ 0x6002, 2, 2, "CONSTANT_BUFFER" },
+		{ 0x6101, 6, 6, "STATE_BASE_ADDRESS" },
+		{ 0x6102, 2, 2, "STATE_SIP" },
+		{ 0x6104, 1, 1, "3DSTATE_PIPELINE_SELECT" },
+		{ 0x680b, 1, 1, "3DSTATE_VF_STATISTICS" },
+		{ 0x6904, 1, 1, "3DSTATE_PIPELINE_SELECT" },
+		{ 0x7800, 7, 7, "3DSTATE_PIPELINED_POINTERS" },
+		{ 0x7801, 6, 6, "3DSTATE_BINDING_TABLE_POINTERS" },
+		{ 0x7808, 5, 257, "3DSTATE_VERTEX_BUFFERS" },
+		{ 0x7809, 3, 256, "3DSTATE_VERTEX_ELEMENTS" },
+		{ 0x780a, 3, 3, "3DSTATE_INDEX_BUFFER" },
+		{ 0x780b, 1, 1, "3DSTATE_VF_STATISTICS" },
+		{ 0x7900, 4, 4, "3DSTATE_DRAWING_RECTANGLE" },
+		{ 0x7901, 5, 5, "3DSTATE_CONSTANT_COLOR" },
+		{ 0x7905, 5, 7, "3DSTATE_DEPTH_BUFFER" },
+		{ 0x7906, 2, 2, "3DSTATE_POLY_STIPPLE_OFFSET" },
+		{ 0x7907, 33, 33, "3DSTATE_POLY_STIPPLE_PATTERN" },
+		{ 0x7908, 3, 3, "3DSTATE_LINE_STIPPLE" },
+		{ 0x7909, 2, 2, "3DSTATE_GLOBAL_DEPTH_OFFSET_CLAMP" },
+		{ 0x7909, 2, 2, "3DSTATE_CLEAR_PARAMS" },
+		{ 0x790a, 3, 3, "3DSTATE_AA_LINE_PARAMETERS" },
+		{ 0x790b, 4, 4, "3DSTATE_GS_SVB_INDEX" },
+		{ 0x790d, 3, 3, "3DSTATE_MULTISAMPLE" },
+		{ 0x7910, 2, 2, "3DSTATE_CLEAR_PARAMS" },
+		{ 0x7b00, 6, 6, "3DPRIMITIVE" },
+		{ 0x7802, 4, 4, "3DSTATE_SAMPLER_STATE_POINTERS" },
+		{ 0x7805, 3, 3, "3DSTATE_URB" },
+		{ 0x780d, 4, 4, "3DSTATE_VIEWPORT_STATE_POINTERS" },
+		{ 0x780e, 4, 4, "3DSTATE_CC_STATE_POINTERS" },
+		{ 0x780f, 2, 2, "3DSTATE_SCISSOR_STATE_POINTERS" },
+		{ 0x7810, 6, 6, "3DSTATE_VS_STATE" },
+		{ 0x7811, 7, 7, "3DSTATE_GS_STATE" },
+		{ 0x7812, 4, 4, "3DSTATE_CLIP_STATE" },
+		{ 0x7813, 20, 20, "3DSTATE_SF_STATE" },
+		{ 0x7814, 9, 9, "3DSTATE_WM_STATE" },
+		{ 0x7815, 5, 5, "3DSTATE_CONSTANT_VS_STATE" },
+		{ 0x7816, 5, 5, "3DSTATE_CONSTANT_GS_STATE" },
+		{ 0x7817, 5, 5, "3DSTATE_CONSTANT_PS_STATE" },
+		{ 0x7818, 2, 2, "3DSTATE_SAMPLE_MASK"},
+	}, *opcode_3d;
 
 	len = (data[0] & 0x0000ffff) + 2;
 
@@ -3430,7 +3433,7 @@ decode_3d_965(uint32_t * data, int count, uint32_t hw_offset, uint32_t devid,
 }
 
 static int
-decode_3d_i830(uint32_t * data, int count, uint32_t hw_offset, uint32_t devid,
+decode_3d_i830(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid,
 	       int *failures)
 {
 	unsigned int idx;
@@ -3442,23 +3445,23 @@ decode_3d_i830(uint32_t * data, int count, uint32_t hw_offset, uint32_t devid,
 		int max_len;
 		char *name;
 	} opcodes_3d[] = {
-		{
-		0x02, 1, 1, "3DSTATE_MODES_3"}, {
-		0x03, 1, 1, "3DSTATE_ENABLES_1"}, {
-		0x04, 1, 1, "3DSTATE_ENABLES_2"}, {
-		0x05, 1, 1, "3DSTATE_VFT0"}, {
-		0x06, 1, 1, "3DSTATE_AA"}, {
-		0x07, 1, 1, "3DSTATE_RASTERIZATION_RULES"}, {
-		0x08, 1, 1, "3DSTATE_MODES_1"}, {
-		0x09, 1, 1, "3DSTATE_STENCIL_TEST"}, {
-		0x0a, 1, 1, "3DSTATE_VFT1"}, {
-		0x0b, 1, 1, "3DSTATE_INDPT_ALPHA_BLEND"}, {
-		0x0c, 1, 1, "3DSTATE_MODES_5"}, {
-		0x0d, 1, 1, "3DSTATE_MAP_BLEND_OP"}, {
-		0x0e, 1, 1, "3DSTATE_MAP_BLEND_ARG"}, {
-		0x0f, 1, 1, "3DSTATE_MODES_2"}, {
-		0x15, 1, 1, "3DSTATE_FOG_COLOR"}, {
-	0x16, 1, 1, "3DSTATE_MODES_4"},}, *opcode_3d;
+		{ 0x02, 1, 1, "3DSTATE_MODES_3" },
+		{ 0x03, 1, 1, "3DSTATE_ENABLES_1" },
+		{ 0x04, 1, 1, "3DSTATE_ENABLES_2" },
+		{ 0x05, 1, 1, "3DSTATE_VFT0" },
+		{ 0x06, 1, 1, "3DSTATE_AA" },
+		{ 0x07, 1, 1, "3DSTATE_RASTERIZATION_RULES" },
+		{ 0x08, 1, 1, "3DSTATE_MODES_1" },
+		{ 0x09, 1, 1, "3DSTATE_STENCIL_TEST" },
+		{ 0x0a, 1, 1, "3DSTATE_VFT1" },
+		{ 0x0b, 1, 1, "3DSTATE_INDPT_ALPHA_BLEND" },
+		{ 0x0c, 1, 1, "3DSTATE_MODES_5" },
+		{ 0x0d, 1, 1, "3DSTATE_MAP_BLEND_OP" },
+		{ 0x0e, 1, 1, "3DSTATE_MAP_BLEND_ARG" },
+		{ 0x0f, 1, 1, "3DSTATE_MODES_2" },
+		{ 0x15, 1, 1, "3DSTATE_FOG_COLOR" },
+		{ 0x16, 1, 1, "3DSTATE_MODES_4"},
+	}, *opcode_3d;
 
 	opcode = (data[0] & 0x1f000000) >> 24;
 
@@ -3510,7 +3513,7 @@ decode_3d_i830(uint32_t * data, int count, uint32_t hw_offset, uint32_t devid,
  * \param hw_offset hardware address for the buffer
  */
 int
-intel_decode(uint32_t * data, int count,
+intel_decode(uint32_t *data, int count,
 	     uint32_t hw_offset,
 	     uint32_t devid, uint32_t ignore_end_of_batchbuffer)
 {
@@ -3526,9 +3529,11 @@ intel_decode(uint32_t * data, int count,
 			ret = decode_mi(data + index, count - index,
 					hw_offset + index * 4, &failures);
 
-			/* If MI_BATCHBUFFER_END happened, then dump the rest of the
-			 * output in case we some day want it in debugging, but don't
-			 * decode it since it'll just confuse in the common case.
+			/* If MI_BATCHBUFFER_END happened, then dump
+			 * the rest of the output in case we some day
+			 * want it in debugging, but don't decode it
+			 * since it'll just confuse in the common
+			 * case.
 			 */
 			if (ret == -1) {
 				if (ignore_end_of_batchbuffer) {
-- 
1.7.7.3

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 06/13] intel: Get intel_decode.c minimally building.
  2011-12-21 18:09 Moving intel_decode.c to libdrm Eric Anholt
                   ` (4 preceding siblings ...)
  2011-12-21 18:09 ` [PATCH 05/13] intel: Minor style tweaks after Lindent Eric Anholt
@ 2011-12-21 18:09 ` Eric Anholt
  2011-12-21 18:09 ` [PATCH 07/13] intel: Fix Wsigned-compare warnings (soon to be enabled) Eric Anholt
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Eric Anholt @ 2011-12-21 18:09 UTC (permalink / raw)
  To: intel-gfx

My plan is to use this drm_intel_dump_batchbuffer() interface for the
current GPU tools, and the current Mesa batch dumping usage, while
eventually building more interesting interfaces for other uses.

Warnings are currently suppressed by using a helper lib with CFLAGS
set manually, because the code is totally not ready for libdrm's warnings
setup.
---
 intel/Makefile.am    |   17 +++++++-
 intel/intel_bufmgr.h |   12 +++++
 intel/intel_decode.c |  117 ++++++++++++++++++++++++++++++++++++++++---------
 3 files changed, 123 insertions(+), 23 deletions(-)

diff --git a/intel/Makefile.am b/intel/Makefile.am
index 7a44aaf..1af0187 100644
--- a/intel/Makefile.am
+++ b/intel/Makefile.am
@@ -33,7 +33,20 @@ AM_CFLAGS = \
 libdrm_intel_la_LTLIBRARIES = libdrm_intel.la
 libdrm_intel_ladir = $(libdir)
 libdrm_intel_la_LDFLAGS = -version-number 1:0:0 -no-undefined
-libdrm_intel_la_LIBADD = ../libdrm.la @PTHREADSTUBS_LIBS@ @PCIACCESS_LIBS@ @CLOCK_LIB@
+libdrm_intel_la_LIBADD = ../libdrm.la \
+	@PTHREADSTUBS_LIBS@ \
+	@PCIACCESS_LIBS@ \
+	@CLOCK_LIB@ \
+	libintel_decode.la
+
+
+noinst_LTLIBRARIES = libintel_decode.la
+
+libintel_decode_la_SOURCES = intel_decode.c
+libintel_decode_la_CFLAGS = \
+	-I$(top_srcdir) \
+	-I$(top_srcdir)/intel \
+	-std=c99
 
 libdrm_intel_la_SOURCES = \
 	intel_bufmgr.c \
@@ -44,6 +57,8 @@ libdrm_intel_la_SOURCES = \
 	mm.c \
 	mm.h
 
+intel_bufmgr_gem_o_CFLAGS = $(AM_CFLAGS) -c99
+
 libdrm_intelincludedir = ${includedir}/libdrm
 libdrm_intelinclude_HEADERS = intel_bufmgr.h \
 			      intel_debug.h
diff --git a/intel/intel_bufmgr.h b/intel/intel_bufmgr.h
index 808e5df..68017a5 100644
--- a/intel/intel_bufmgr.h
+++ b/intel/intel_bufmgr.h
@@ -190,6 +190,18 @@ void drm_intel_bo_fake_disable_backing_store(drm_intel_bo *bo,
 void drm_intel_bufmgr_fake_contended_lock_take(drm_intel_bufmgr *bufmgr);
 void drm_intel_bufmgr_fake_evict_all(drm_intel_bufmgr *bufmgr);
 
+struct drm_intel_decode *drm_intel_decode_context_alloc(uint32_t devid);
+void drm_intel_decode_context_free(struct drm_intel_decode *ctx);
+void drm_intel_decode_set_batch_pointer(struct drm_intel_decode *ctx,
+					void *data, uint32_t hw_offset,
+					int count);
+void drm_intel_decode_set_dump_past_end(struct drm_intel_decode *ctx,
+					int dump_past_end);
+void drm_intel_decode_set_head_tail(struct drm_intel_decode *ctx,
+				    uint32_t head, uint32_t tail);
+void drm_intel_decode(struct drm_intel_decode *ctx);
+
+
 /** @{ Compatibility defines to keep old code building despite the symbol rename
  * from dri_* to drm_intel_*
  */
diff --git a/intel/intel_decode.c b/intel/intel_decode.c
index e06142c..e61d5ed 100644
--- a/intel/intel_decode.c
+++ b/intel/intel_decode.c
@@ -22,13 +22,42 @@
  */
 
 #include <stdint.h>
+#include <stdlib.h>
 #include <stdio.h>
+#include <stdbool.h>
 #include <stdarg.h>
 #include <string.h>
 
 #include "intel_decode.h"
 #include "intel_chipset.h"
-#include "intel_gpu_tools.h"
+#include "intel_bufmgr.h"
+
+/* Struct for tracking drm_intel_decode state. */
+struct drm_intel_decode {
+	/** PCI device ID. */
+	uint32_t devid;
+
+	/** GPU address of the start of the batchbuffer data. */
+	uint32_t hw_offset;
+	/** CPU Virtual address of the start of the batchbuffer data. */
+	uint32_t *data;
+	/** Number of DWORDs of batchbuffer data. */
+	uint32_t count;
+
+	/** @{
+	 * GPU head and tail pointers, which will be noted in the dump, or ~0.
+	 */
+	uint32_t head, tail;
+	/** @} */
+
+	/**
+	 * Whether to dump the dwords after MI_BATCHBUFFER_END.
+	 *
+	 * This sometimes provides clues in corrupted batchbuffers,
+	 * and is used by the intel-gpu-tools.
+	 */
+	bool dump_past_end;
+};
 
 static FILE *out;
 static uint32_t saved_s2 = 0, saved_s4 = 0;
@@ -3278,7 +3307,7 @@ decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid,
 		return len;
 
 	case 0x7a00:
-		if (intel_gen(devid) >= 6) {
+		if (IS_GEN6(devid) || IS_GEN7(devid)) {
 			int i;
 			len = (data[0] & 0xff) + 2;
 			if (len != 4 && len != 5)
@@ -3505,6 +3534,50 @@ decode_3d_i830(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid,
 	return 1;
 }
 
+struct drm_intel_decode *
+drm_intel_decode_context_alloc(uint32_t devid)
+{
+	struct drm_intel_decode *ctx;
+
+	ctx = calloc(1, sizeof(struct drm_intel_decode));
+	if (!ctx)
+		return NULL;
+
+	ctx->devid = devid;
+
+	return ctx;
+}
+
+void
+drm_intel_decode_context_free(struct drm_intel_decode *ctx)
+{
+	free(ctx);
+}
+
+void
+drm_intel_decode_set_dump_past_end(struct drm_intel_decode *ctx,
+				   int dump_past_end)
+{
+	ctx->dump_past_end = !!dump_past_end;
+}
+
+void
+drm_intel_decode_set_batch_pointer(struct drm_intel_decode *ctx,
+				   void *data, uint32_t hw_offset, int count)
+{
+	ctx->data = data;
+	ctx->hw_offset = hw_offset;
+	ctx->count = count;
+}
+
+void
+drm_intel_decode_set_head_tail(struct drm_intel_decode *ctx,
+			       uint32_t head, uint32_t tail)
+{
+	ctx->head = head;
+	ctx->tail = tail;
+}
+
 /**
  * Decodes an i830-i915 batch buffer, writing the output to stdout.
  *
@@ -3512,14 +3585,28 @@ decode_3d_i830(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid,
  * \param count number of DWORDs to decode in the batch buffer
  * \param hw_offset hardware address for the buffer
  */
-int
-intel_decode(uint32_t *data, int count,
-	     uint32_t hw_offset,
-	     uint32_t devid, uint32_t ignore_end_of_batchbuffer)
+void
+drm_intel_decode(struct drm_intel_decode *ctx)
 {
 	int ret;
 	int index = 0;
 	int failures = 0;
+	uint32_t *data;
+	uint32_t count, hw_offset;
+	uint32_t devid;
+
+	if (!ctx)
+		return;
+
+	data = ctx->data;
+	count = ctx->count;
+	hw_offset = ctx->hw_offset;
+	devid = ctx->devid;
+	head_offset = ctx->head;
+	tail_offset = ctx->tail;
+
+	saved_s2_set = 0;
+	saved_s4_set = 1;
 
 	out = stdout;
 
@@ -3536,7 +3623,7 @@ intel_decode(uint32_t *data, int count,
 			 * case.
 			 */
 			if (ret == -1) {
-				if (ignore_end_of_batchbuffer) {
+				if (ctx->dump_past_end) {
 					index++;
 				} else {
 					for (index = index + 1; index < count;
@@ -3553,7 +3640,7 @@ intel_decode(uint32_t *data, int count,
 					   hw_offset + index * 4, &failures);
 			break;
 		case 0x3:
-			if (IS_965(devid)) {
+			if (IS_9XX(devid) && !IS_GEN3(devid)) {
 				index +=
 				    decode_3d_965(data + index, count - index,
 						  hw_offset + index * 4, devid,
@@ -3577,18 +3664,4 @@ intel_decode(uint32_t *data, int count,
 		}
 		fflush(out);
 	}
-
-	return failures;
-}
-
-void intel_decode_context_reset(void)
-{
-	saved_s2_set = 0;
-	saved_s4_set = 1;
-}
-
-void intel_decode_context_set_head_tail(uint32_t head, uint32_t tail)
-{
-	head_offset = head;
-	tail_offset = tail;
 }
-- 
1.7.7.3

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 07/13] intel: Fix Wsigned-compare warnings (soon to be enabled).
  2011-12-21 18:09 Moving intel_decode.c to libdrm Eric Anholt
                   ` (5 preceding siblings ...)
  2011-12-21 18:09 ` [PATCH 06/13] intel: Get intel_decode.c minimally building Eric Anholt
@ 2011-12-21 18:09 ` Eric Anholt
  2011-12-21 18:09 ` [PATCH 08/13] intel: Fix a ton of signed vs unsigned and const char *warnings Eric Anholt
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Eric Anholt @ 2011-12-21 18:09 UTC (permalink / raw)
  To: intel-gfx

---
 intel/intel_decode.c |   55 +++++++++++++++++++++++++------------------------
 1 files changed, 28 insertions(+), 27 deletions(-)

diff --git a/intel/intel_decode.c b/intel/intel_decode.c
index e61d5ed..f7ce205 100644
--- a/intel/intel_decode.c
+++ b/intel/intel_decode.c
@@ -110,7 +110,7 @@ instr_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
 }
 
 static int
-decode_mi(uint32_t *data, int count, uint32_t hw_offset, int *failures)
+decode_mi(uint32_t *data, uint32_t count, uint32_t hw_offset, int *failures)
 {
 	unsigned int opcode, len = -1;
 	char *post_sync_op = "";
@@ -118,8 +118,8 @@ decode_mi(uint32_t *data, int count, uint32_t hw_offset, int *failures)
 	struct {
 		uint32_t opcode;
 		int len_mask;
-		int min_len;
-		int max_len;
+		unsigned int min_len;
+		unsigned int max_len;
 		char *name;
 	} opcodes_mi[] = {
 		{ 0x08, 0, 1, 1, "MI_ARB_ON_OFF" },
@@ -235,10 +235,11 @@ decode_mi(uint32_t *data, int count, uint32_t hw_offset, int *failures)
 	for (opcode = 0; opcode < sizeof(opcodes_mi) / sizeof(opcodes_mi[0]);
 	     opcode++) {
 		if ((data[0] & 0x1f800000) >> 23 == opcodes_mi[opcode].opcode) {
+			unsigned int i;
 
 			instr_out(data, hw_offset, 0, "%s\n",
 				  opcodes_mi[opcode].name);
-			for (int i = 1; i < len; i++) {
+			for (i = 1; i < len; i++) {
 				if (i >= count)
 					BUFFER_FAIL(count, len,
 						    opcodes_mi[opcode].name);
@@ -255,7 +256,7 @@ decode_mi(uint32_t *data, int count, uint32_t hw_offset, int *failures)
 }
 
 static void
-decode_2d_br00(uint32_t *data, int count, uint32_t hw_offset, char *cmd)
+decode_2d_br00(uint32_t *data, uint32_t count, uint32_t hw_offset, char *cmd)
 {
 	instr_out(data, hw_offset, 0,
 		  "%s (rgb %sabled, alpha %sabled, src tile %d, dst tile %d)\n",
@@ -265,7 +266,7 @@ decode_2d_br00(uint32_t *data, int count, uint32_t hw_offset, char *cmd)
 		  (data[count] >> 15) & 1, (data[count] >> 11) & 1);
 }
 
-static void decode_2d_br01(uint32_t *data, int count, uint32_t hw_offset)
+static void decode_2d_br01(uint32_t *data, uint32_t count, uint32_t hw_offset)
 {
 	char *format;
 	switch ((data[count] >> 24) & 0x3) {
@@ -296,14 +297,14 @@ static void decode_2d_br01(uint32_t *data, int count, uint32_t hw_offset)
 }
 
 static int
-decode_2d(uint32_t *data, int count, uint32_t hw_offset, int *failures)
+decode_2d(uint32_t *data, uint32_t count, uint32_t hw_offset, int *failures)
 {
 	unsigned int opcode, len;
 
 	struct {
 		uint32_t opcode;
-		int min_len;
-		int max_len;
+		unsigned int min_len;
+		unsigned int max_len;
 		char *name;
 	} opcodes_2d[] = {
 		{ 0x40, 5, 5, "COLOR_BLT" },
@@ -482,7 +483,7 @@ decode_2d(uint32_t *data, int count, uint32_t hw_offset, int *failures)
 }
 
 static int
-decode_3d_1c(uint32_t *data, int count, uint32_t hw_offset, int *failures)
+decode_3d_1c(uint32_t *data, uint32_t count, uint32_t hw_offset, int *failures)
 {
 	uint32_t opcode;
 
@@ -1151,7 +1152,7 @@ static char *decode_sample_filter(uint32_t mode)
 }
 
 static int
-decode_3d_1d(uint32_t *data, int count,
+decode_3d_1d(uint32_t *data, uint32_t count,
 	     uint32_t hw_offset, uint32_t devid, int *failures)
 {
 	unsigned int len, i, c, idx, word, map, sampler, instr;
@@ -1161,8 +1162,8 @@ decode_3d_1d(uint32_t *data, int count,
 	struct {
 		uint32_t opcode;
 		int i830_only;
-		int min_len;
-		int max_len;
+		unsigned int min_len;
+		unsigned int max_len;
 		char *name;
 	} opcodes_3d_1d[] = {
 		{ 0x86, 0, 4, 4, "3DSTATE_CHROMA_KEY" },
@@ -2228,7 +2229,7 @@ decode_3d_1d(uint32_t *data, int count,
 }
 
 static int
-decode_3d_primitive(uint32_t *data, int count, uint32_t hw_offset,
+decode_3d_primitive(uint32_t *data, uint32_t count, uint32_t hw_offset,
 		    int *failures)
 {
 	char immediate = (data[0] & (1 << 23)) == 0;
@@ -2491,7 +2492,7 @@ out:
 }
 
 static int
-decode_3d(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid,
+decode_3d(uint32_t *data, uint32_t count, uint32_t hw_offset, uint32_t devid,
 	  int *failures)
 {
 	uint32_t opcode;
@@ -2499,8 +2500,8 @@ decode_3d(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid,
 
 	struct {
 		uint32_t opcode;
-		int min_len;
-		int max_len;
+		unsigned int min_len;
+		unsigned int max_len;
 		char *name;
 	} opcodes_3d[] = {
 		{ 0x06, 1, 1, "3DSTATE_ANTI_ALIASING" },
@@ -2677,7 +2678,7 @@ static const char *get_965_prim_type(uint32_t data)
 }
 
 static int
-i965_decode_urb_fence(uint32_t *data, uint32_t hw_offset, int len, int count,
+i965_decode_urb_fence(uint32_t *data, uint32_t hw_offset, int len, uint32_t count,
 		      int *failures)
 {
 	uint32_t vs_fence, clip_fence, gs_fence, sf_fence, vfe_fence, cs_fence;
@@ -2753,18 +2754,18 @@ state_max_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
 }
 
 static int
-decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid,
+decode_3d_965(uint32_t *data, uint32_t count, uint32_t hw_offset, uint32_t devid,
 	      int *failures)
 {
 	uint32_t opcode;
 	unsigned int idx, len;
-	int i, sba_len;
+	unsigned int i, sba_len;
 	char *desc1 = NULL;
 
 	struct {
 		uint32_t opcode;
-		int min_len;
-		int max_len;
+		int unsigned min_len;
+		int unsigned max_len;
 		char *name;
 	} opcodes_3d[] = {
 		{ 0x6000, 3, 3, "URB_FENCE" },
@@ -3308,7 +3309,7 @@ decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid,
 
 	case 0x7a00:
 		if (IS_GEN6(devid) || IS_GEN7(devid)) {
-			int i;
+			unsigned int i;
 			len = (data[0] & 0xff) + 2;
 			if (len != 4 && len != 5)
 				fprintf(out, "Bad count in PIPE_CONTROL\n");
@@ -3462,7 +3463,7 @@ decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid,
 }
 
 static int
-decode_3d_i830(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid,
+decode_3d_i830(uint32_t *data, uint32_t count, uint32_t hw_offset, uint32_t devid,
 	       int *failures)
 {
 	unsigned int idx;
@@ -3470,8 +3471,8 @@ decode_3d_i830(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid,
 
 	struct {
 		uint32_t opcode;
-		int min_len;
-		int max_len;
+		unsigned int min_len;
+		unsigned int max_len;
 		char *name;
 	} opcodes_3d[] = {
 		{ 0x02, 1, 1, "3DSTATE_MODES_3" },
@@ -3589,7 +3590,7 @@ void
 drm_intel_decode(struct drm_intel_decode *ctx)
 {
 	int ret;
-	int index = 0;
+	unsigned int index = 0;
 	int failures = 0;
 	uint32_t *data;
 	uint32_t count, hw_offset;
-- 
1.7.7.3

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 08/13] intel: Fix a ton of signed vs unsigned and const char *warnings
  2011-12-21 18:09 Moving intel_decode.c to libdrm Eric Anholt
                   ` (6 preceding siblings ...)
  2011-12-21 18:09 ` [PATCH 07/13] intel: Fix Wsigned-compare warnings (soon to be enabled) Eric Anholt
@ 2011-12-21 18:09 ` Eric Anholt
  2011-12-21 18:09 ` [PATCH 09/13] intel: Add printflike warnings for instr_out Eric Anholt
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Eric Anholt @ 2011-12-21 18:09 UTC (permalink / raw)
  To: intel-gfx

We've got a different (better) set of warning flags in place in this
tree.
---
 intel/intel_decode.c |  106 +++++++++++++++++++++++++++-----------------------
 1 files changed, 57 insertions(+), 49 deletions(-)

diff --git a/intel/intel_decode.c b/intel/intel_decode.c
index f7ce205..1e63295 100644
--- a/intel/intel_decode.c
+++ b/intel/intel_decode.c
@@ -89,10 +89,10 @@ static float int_as_float(uint32_t intval)
 
 static void
 instr_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
-	  char *fmt, ...)
+	  const char *fmt, ...)
 {
 	va_list va;
-	char *parseinfo;
+	const char *parseinfo;
 	uint32_t offset = hw_offset + index * 4;
 
 	if (offset == head_offset)
@@ -113,14 +113,14 @@ static int
 decode_mi(uint32_t *data, uint32_t count, uint32_t hw_offset, int *failures)
 {
 	unsigned int opcode, len = -1;
-	char *post_sync_op = "";
+	const char *post_sync_op = "";
 
 	struct {
 		uint32_t opcode;
 		int len_mask;
 		unsigned int min_len;
 		unsigned int max_len;
-		char *name;
+		const char *name;
 	} opcodes_mi[] = {
 		{ 0x08, 0, 1, 1, "MI_ARB_ON_OFF" },
 		{ 0x0a, 0, 1, 1, "MI_BATCH_BUFFER_END" },
@@ -256,7 +256,8 @@ decode_mi(uint32_t *data, uint32_t count, uint32_t hw_offset, int *failures)
 }
 
 static void
-decode_2d_br00(uint32_t *data, uint32_t count, uint32_t hw_offset, char *cmd)
+decode_2d_br00(uint32_t *data, uint32_t count, uint32_t hw_offset,
+	       const char *cmd)
 {
 	instr_out(data, hw_offset, 0,
 		  "%s (rgb %sabled, alpha %sabled, src tile %d, dst tile %d)\n",
@@ -268,7 +269,7 @@ decode_2d_br00(uint32_t *data, uint32_t count, uint32_t hw_offset, char *cmd)
 
 static void decode_2d_br01(uint32_t *data, uint32_t count, uint32_t hw_offset)
 {
-	char *format;
+	const char *format;
 	switch ((data[count] >> 24) & 0x3) {
 	case 0:
 		format = "8";
@@ -305,7 +306,7 @@ decode_2d(uint32_t *data, uint32_t count, uint32_t hw_offset, int *failures)
 		uint32_t opcode;
 		unsigned int min_len;
 		unsigned int max_len;
-		char *name;
+		const char *name;
 	} opcodes_2d[] = {
 		{ 0x40, 5, 5, "COLOR_BLT" },
 		{ 0x43, 6, 6, "SRC_COPY_BLT" },
@@ -522,7 +523,7 @@ i915_get_instruction_dst(uint32_t *data, int i, char *dstname, int do_mask)
 	uint32_t a0 = data[i];
 	int dst_nr = (a0 >> 14) & 0xf;
 	char dstmask[8];
-	char *sat;
+	const char *sat;
 
 	if (do_mask) {
 		if (((a0 >> 10) & 0xf) == 0xf) {
@@ -578,7 +579,8 @@ i915_get_instruction_dst(uint32_t *data, int i, char *dstname, int do_mask)
 	}
 }
 
-static char *i915_get_channel_swizzle(uint32_t select)
+static const char *
+i915_get_channel_swizzle(uint32_t select)
 {
 	switch (select & 0x7) {
 	case 0:
@@ -653,10 +655,10 @@ static void i915_get_instruction_src0(uint32_t *data, int i, char *srcname)
 	uint32_t a0 = data[i];
 	uint32_t a1 = data[i + 1];
 	int src_nr = (a0 >> 2) & 0x1f;
-	char *swizzle_x = i915_get_channel_swizzle((a1 >> 28) & 0xf);
-	char *swizzle_y = i915_get_channel_swizzle((a1 >> 24) & 0xf);
-	char *swizzle_z = i915_get_channel_swizzle((a1 >> 20) & 0xf);
-	char *swizzle_w = i915_get_channel_swizzle((a1 >> 16) & 0xf);
+	const char *swizzle_x = i915_get_channel_swizzle((a1 >> 28) & 0xf);
+	const char *swizzle_y = i915_get_channel_swizzle((a1 >> 24) & 0xf);
+	const char *swizzle_z = i915_get_channel_swizzle((a1 >> 20) & 0xf);
+	const char *swizzle_w = i915_get_channel_swizzle((a1 >> 16) & 0xf);
 	char swizzle[100];
 
 	i915_get_instruction_src_name((a0 >> 7) & 0x7, src_nr, srcname);
@@ -671,10 +673,10 @@ static void i915_get_instruction_src1(uint32_t *data, int i, char *srcname)
 	uint32_t a1 = data[i + 1];
 	uint32_t a2 = data[i + 2];
 	int src_nr = (a1 >> 8) & 0x1f;
-	char *swizzle_x = i915_get_channel_swizzle((a1 >> 4) & 0xf);
-	char *swizzle_y = i915_get_channel_swizzle((a1 >> 0) & 0xf);
-	char *swizzle_z = i915_get_channel_swizzle((a2 >> 28) & 0xf);
-	char *swizzle_w = i915_get_channel_swizzle((a2 >> 24) & 0xf);
+	const char *swizzle_x = i915_get_channel_swizzle((a1 >> 4) & 0xf);
+	const char *swizzle_y = i915_get_channel_swizzle((a1 >> 0) & 0xf);
+	const char *swizzle_z = i915_get_channel_swizzle((a2 >> 28) & 0xf);
+	const char *swizzle_w = i915_get_channel_swizzle((a2 >> 24) & 0xf);
 	char swizzle[100];
 
 	i915_get_instruction_src_name((a1 >> 13) & 0x7, src_nr, srcname);
@@ -688,10 +690,10 @@ static void i915_get_instruction_src2(uint32_t *data, int i, char *srcname)
 {
 	uint32_t a2 = data[i + 2];
 	int src_nr = (a2 >> 16) & 0x1f;
-	char *swizzle_x = i915_get_channel_swizzle((a2 >> 12) & 0xf);
-	char *swizzle_y = i915_get_channel_swizzle((a2 >> 8) & 0xf);
-	char *swizzle_z = i915_get_channel_swizzle((a2 >> 4) & 0xf);
-	char *swizzle_w = i915_get_channel_swizzle((a2 >> 0) & 0xf);
+	const char *swizzle_x = i915_get_channel_swizzle((a2 >> 12) & 0xf);
+	const char *swizzle_y = i915_get_channel_swizzle((a2 >> 8) & 0xf);
+	const char *swizzle_z = i915_get_channel_swizzle((a2 >> 4) & 0xf);
+	const char *swizzle_w = i915_get_channel_swizzle((a2 >> 0) & 0xf);
 	char swizzle[100];
 
 	i915_get_instruction_src_name((a2 >> 21) & 0x7, src_nr, srcname);
@@ -743,7 +745,7 @@ i915_get_instruction_addr(uint32_t src_type, uint32_t src_nr, char *name)
 
 static void
 i915_decode_alu1(uint32_t *data, uint32_t hw_offset,
-		 int i, char *instr_prefix, char *op_name)
+		 int i, char *instr_prefix, const char *op_name)
 {
 	char dst[100], src0[100];
 
@@ -758,7 +760,7 @@ i915_decode_alu1(uint32_t *data, uint32_t hw_offset,
 
 static void
 i915_decode_alu2(uint32_t *data, uint32_t hw_offset,
-		 int i, char *instr_prefix, char *op_name)
+		 int i, char *instr_prefix, const char *op_name)
 {
 	char dst[100], src0[100], src1[100];
 
@@ -774,7 +776,7 @@ i915_decode_alu2(uint32_t *data, uint32_t hw_offset,
 
 static void
 i915_decode_alu3(uint32_t *data, uint32_t hw_offset,
-		 int i, char *instr_prefix, char *op_name)
+		 int i, char *instr_prefix, const char *op_name)
 {
 	char dst[100], src0[100], src1[100], src2[100];
 
@@ -790,8 +792,8 @@ i915_decode_alu3(uint32_t *data, uint32_t hw_offset,
 }
 
 static void
-i915_decode_tex(uint32_t *data, uint32_t hw_offset, int i, char *instr_prefix,
-		char *tex_name)
+i915_decode_tex(uint32_t *data, uint32_t hw_offset, int i,
+		const char *instr_prefix, const char *tex_name)
 {
 	uint32_t t0 = data[i];
 	uint32_t t1 = data[i + 1];
@@ -814,12 +816,12 @@ static void
 i915_decode_dcl(uint32_t *data, uint32_t hw_offset, int i, char *instr_prefix)
 {
 	uint32_t d0 = data[i];
-	char *sampletype;
+	const char *sampletype;
 	int dcl_nr = (d0 >> 14) & 0xf;
-	char *dcl_x = d0 & (1 << 10) ? "x" : "";
-	char *dcl_y = d0 & (1 << 11) ? "y" : "";
-	char *dcl_z = d0 & (1 << 12) ? "z" : "";
-	char *dcl_w = d0 & (1 << 13) ? "w" : "";
+	const char *dcl_x = d0 & (1 << 10) ? "x" : "";
+	const char *dcl_y = d0 & (1 << 11) ? "y" : "";
+	const char *dcl_z = d0 & (1 << 12) ? "z" : "";
+	const char *dcl_w = d0 & (1 << 13) ? "w" : "";
 	char dcl_mask[10];
 
 	switch ((d0 >> 19) & 0x3) {
@@ -989,7 +991,8 @@ i915_decode_instruction(uint32_t *data, uint32_t hw_offset,
 	}
 }
 
-static char *decode_compare_func(uint32_t op)
+static const char *
+decode_compare_func(uint32_t op)
 {
 	switch (op & 0x7) {
 	case 0:
@@ -1012,7 +1015,8 @@ static char *decode_compare_func(uint32_t op)
 	return "";
 }
 
-static char *decode_stencil_op(uint32_t op)
+static const char *
+decode_stencil_op(uint32_t op)
 {
 	switch (op & 0x7) {
 	case 0:
@@ -1035,7 +1039,8 @@ static char *decode_stencil_op(uint32_t op)
 	return "";
 }
 
-static char *decode_logic_op(uint32_t op)
+static const char *
+decode_logic_op(uint32_t op)
 {
 	switch (op & 0xf) {
 	case 0:
@@ -1074,7 +1079,8 @@ static char *decode_logic_op(uint32_t op)
 	return "";
 }
 
-static char *decode_blend_fact(uint32_t op)
+static const char *
+decode_blend_fact(uint32_t op)
 {
 	switch (op & 0xf) {
 	case 1:
@@ -1111,7 +1117,8 @@ static char *decode_blend_fact(uint32_t op)
 	return "";
 }
 
-static char *decode_tex_coord_mode(uint32_t mode)
+static const char *
+decode_tex_coord_mode(uint32_t mode)
 {
 	switch (mode & 0x7) {
 	case 0:
@@ -1130,7 +1137,8 @@ static char *decode_tex_coord_mode(uint32_t mode)
 	return "";
 }
 
-static char *decode_sample_filter(uint32_t mode)
+static const char *
+decode_sample_filter(uint32_t mode)
 {
 	switch (mode & 0x7) {
 	case 0:
@@ -1156,7 +1164,7 @@ decode_3d_1d(uint32_t *data, uint32_t count,
 	     uint32_t hw_offset, uint32_t devid, int *failures)
 {
 	unsigned int len, i, c, idx, word, map, sampler, instr;
-	char *format, *zformat, *type;
+	const char *format, *zformat, *type;
 	uint32_t opcode;
 
 	struct {
@@ -1164,7 +1172,7 @@ decode_3d_1d(uint32_t *data, uint32_t count,
 		int i830_only;
 		unsigned int min_len;
 		unsigned int max_len;
-		char *name;
+		const char *name;
 	} opcodes_3d_1d[] = {
 		{ 0x86, 0, 4, 4, "3DSTATE_CHROMA_KEY" },
 		{ 0x88, 0, 2, 2, "3DSTATE_CONSTANT_BLEND_COLOR" },
@@ -1338,8 +1346,8 @@ decode_3d_1d(uint32_t *data, uint32_t count,
 						break;
 					case 4:
 						{
-							char *cullmode = "";
-							char *vfmt_xyzw = "";
+							const char *cullmode = "";
+							const char *vfmt_xyzw = "";
 							switch ((data[i] >> 13)
 								& 0x3) {
 							case 0:
@@ -1961,7 +1969,7 @@ decode_3d_1d(uint32_t *data, uint32_t count,
 		for (sampler = 0; sampler <= 15; sampler++) {
 			if (data[1] & (1 << sampler)) {
 				uint32_t dword;
-				char *mip_filter = "";
+				const char *mip_filter = "";
 				if (i + 3 >= count)
 					BUFFER_FAIL(count, len,
 						    "3DSTATE_SAMPLER_STATE");
@@ -2234,7 +2242,7 @@ decode_3d_primitive(uint32_t *data, uint32_t count, uint32_t hw_offset,
 {
 	char immediate = (data[0] & (1 << 23)) == 0;
 	unsigned int len, i, j, ret;
-	char *primtype;
+	const char *primtype;
 	int original_s2 = saved_s2;
 	int original_s4 = saved_s4;
 
@@ -2502,7 +2510,7 @@ decode_3d(uint32_t *data, uint32_t count, uint32_t hw_offset, uint32_t devid,
 		uint32_t opcode;
 		unsigned int min_len;
 		unsigned int max_len;
-		char *name;
+		const char *name;
 	} opcodes_3d[] = {
 		{ 0x06, 1, 1, "3DSTATE_ANTI_ALIASING" },
 		{ 0x08, 1, 1, "3DSTATE_BACKFACE_STENCIL_OPS" },
@@ -2722,7 +2730,7 @@ i965_decode_urb_fence(uint32_t *data, uint32_t hw_offset, int len, uint32_t coun
 
 static void
 state_base_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
-	       char *name)
+	       const char *name)
 {
 	if (data[index] & 1) {
 		instr_out(data, hw_offset, index,
@@ -2736,7 +2744,7 @@ state_base_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
 
 static void
 state_max_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
-	      char *name)
+	      const char *name)
 {
 	if (data[index] & 1) {
 		if (data[index] == 1) {
@@ -2760,13 +2768,13 @@ decode_3d_965(uint32_t *data, uint32_t count, uint32_t hw_offset, uint32_t devid
 	uint32_t opcode;
 	unsigned int idx, len;
 	unsigned int i, sba_len;
-	char *desc1 = NULL;
+	const char *desc1 = NULL;
 
 	struct {
 		uint32_t opcode;
 		int unsigned min_len;
 		int unsigned max_len;
-		char *name;
+		const char *name;
 	} opcodes_3d[] = {
 		{ 0x6000, 3, 3, "URB_FENCE" },
 		{ 0x6001, 2, 2, "CS_URB_STATE" },
@@ -3473,7 +3481,7 @@ decode_3d_i830(uint32_t *data, uint32_t count, uint32_t hw_offset, uint32_t devi
 		uint32_t opcode;
 		unsigned int min_len;
 		unsigned int max_len;
-		char *name;
+		const char *name;
 	} opcodes_3d[] = {
 		{ 0x02, 1, 1, "3DSTATE_MODES_3" },
 		{ 0x03, 1, 1, "3DSTATE_ENABLES_1" },
-- 
1.7.7.3

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 09/13] intel: Add printflike warnings for instr_out.
  2011-12-21 18:09 Moving intel_decode.c to libdrm Eric Anholt
                   ` (7 preceding siblings ...)
  2011-12-21 18:09 ` [PATCH 08/13] intel: Fix a ton of signed vs unsigned and const char *warnings Eric Anholt
@ 2011-12-21 18:09 ` Eric Anholt
  2011-12-21 18:09 ` [PATCH 10/13] intel: Fix printf format warnings for intel_decode Eric Anholt
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Eric Anholt @ 2011-12-21 18:09 UTC (permalink / raw)
  To: intel-gfx

---
 intel/intel_decode.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/intel/intel_decode.c b/intel/intel_decode.c
index 1e63295..1b5f858 100644
--- a/intel/intel_decode.c
+++ b/intel/intel_decode.c
@@ -89,6 +89,10 @@ static float int_as_float(uint32_t intval)
 
 static void
 instr_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
+	  const char *fmt, ...) __attribute__((format(__printf__, 4, 5)));
+
+static void
+instr_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
 	  const char *fmt, ...)
 {
 	va_list va;
-- 
1.7.7.3

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 10/13] intel: Fix printf format warnings for intel_decode.
  2011-12-21 18:09 Moving intel_decode.c to libdrm Eric Anholt
                   ` (8 preceding siblings ...)
  2011-12-21 18:09 ` [PATCH 09/13] intel: Add printflike warnings for instr_out Eric Anholt
@ 2011-12-21 18:09 ` Eric Anholt
  2011-12-21 18:09 ` [PATCH 11/13] intel: Remove c99ish variable declarations Eric Anholt
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Eric Anholt @ 2011-12-21 18:09 UTC (permalink / raw)
  To: intel-gfx

There was plenty of dropped useful data, and some horribly
mis-formatted data.
---
 intel/intel_decode.c |   16 +++++++---------
 1 files changed, 7 insertions(+), 9 deletions(-)

diff --git a/intel/intel_decode.c b/intel/intel_decode.c
index 1b5f858..8d6ea55 100644
--- a/intel/intel_decode.c
+++ b/intel/intel_decode.c
@@ -1345,8 +1345,7 @@ decode_3d_1d(uint32_t *data, uint32_t count,
 						break;
 					case 3:
 						instr_out(data, hw_offset, i,
-							  "S3: not documented\n",
-							  word);
+							  "S3: not documented\n");
 						break;
 					case 4:
 						{
@@ -1410,7 +1409,7 @@ decode_3d_1d(uint32_t *data, uint32_t count,
 								  hw_offset, i,
 								  "S4: point_width=%i, line_width=%.1f,"
 								  "%s%s%s%s%s cullmode=%s, vfmt=%s%s%s%s%s%s "
-								  "%s%s\n",
+								  "%s%s%s%s%s\n",
 								  (data[i] >>
 								   23) & 0x1ff,
 								  ((data[i] >>
@@ -2026,9 +2025,7 @@ decode_3d_1d(uint32_t *data, uint32_t count,
 				dword = data[i];
 				instr_out(data, hw_offset, i++,
 					  "sampler %d SS4: border color\n",
-					  sampler,
-					  ((dword >> 24) & 0xff) / (0x10 * 1.0),
-					  dword);
+					  sampler);
 			}
 		}
 		if (len != i) {
@@ -3183,11 +3180,12 @@ decode_3d_965(uint32_t *data, uint32_t count, uint32_t hw_offset, uint32_t devid
 			  (data[4] & (1 << 12)) != 0 ? 4 : 8,
 			  (data[4] & (1 << 11)) != 0);
 		instr_out(data, hw_offset, 5,
-			  "Global Depth Offset Constant %f\n", data[5]);
+			  "Global Depth Offset Constant %f\n",
+			  *(float *)(&data[5]));
 		instr_out(data, hw_offset, 6, "Global Depth Offset Scale %f\n",
-			  data[6]);
+			  *(float *)(&data[6]));
 		instr_out(data, hw_offset, 7, "Global Depth Offset Clamp %f\n",
-			  data[7]);
+			  *(float *)(&data[7]));
 		int i, j;
 		for (i = 0, j = 0; i < 8; i++, j += 2)
 			instr_out(data, hw_offset, i + 8,
-- 
1.7.7.3

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 11/13] intel: Remove c99ish variable declarations.
  2011-12-21 18:09 Moving intel_decode.c to libdrm Eric Anholt
                   ` (9 preceding siblings ...)
  2011-12-21 18:09 ` [PATCH 10/13] intel: Fix printf format warnings for intel_decode Eric Anholt
@ 2011-12-21 18:09 ` Eric Anholt
  2011-12-21 18:09 ` [PATCH 12/13] intel: Turn on normal warnings for intel_decode.c build Eric Anholt
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Eric Anholt @ 2011-12-21 18:09 UTC (permalink / raw)
  To: intel-gfx

I'd rather be able to use c99 variable declarations (there's a lot of
awful code layout due to being c90ish), but I'll leave that for later.
---
 intel/intel_decode.c |    8 +++++---
 1 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/intel/intel_decode.c b/intel/intel_decode.c
index 8d6ea55..e8410d0 100644
--- a/intel/intel_decode.c
+++ b/intel/intel_decode.c
@@ -1269,6 +1269,8 @@ decode_3d_1d(uint32_t *data, uint32_t count,
 
 				/* save vertex state for decode */
 				if (!IS_GEN2(devid)) {
+					int tex_num;
+
 					if (word == 2) {
 						saved_s2_set = 1;
 						saved_s2 = data[i];
@@ -1298,7 +1300,7 @@ decode_3d_1d(uint32_t *data, uint32_t count,
 					case 2:
 						instr_out(data, hw_offset, i,
 							  "S2: texcoord formats: ");
-						for (int tex_num = 0;
+						for (tex_num = 0;
 						     tex_num < 8; tex_num++) {
 							switch ((data[i] >>
 								 tex_num *
@@ -2768,7 +2770,7 @@ decode_3d_965(uint32_t *data, uint32_t count, uint32_t hw_offset, uint32_t devid
 {
 	uint32_t opcode;
 	unsigned int idx, len;
-	unsigned int i, sba_len;
+	unsigned int i, j, sba_len;
 	const char *desc1 = NULL;
 
 	struct {
@@ -3186,7 +3188,7 @@ decode_3d_965(uint32_t *data, uint32_t count, uint32_t hw_offset, uint32_t devid
 			  *(float *)(&data[6]));
 		instr_out(data, hw_offset, 7, "Global Depth Offset Clamp %f\n",
 			  *(float *)(&data[7]));
-		int i, j;
+
 		for (i = 0, j = 0; i < 8; i++, j += 2)
 			instr_out(data, hw_offset, i + 8,
 				  "Attrib %d (Override %s%s%s%s, Const Source %d, Swizzle Select %d, "
-- 
1.7.7.3

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 12/13] intel: Turn on normal warnings for intel_decode.c build.
  2011-12-21 18:09 Moving intel_decode.c to libdrm Eric Anholt
                   ` (10 preceding siblings ...)
  2011-12-21 18:09 ` [PATCH 11/13] intel: Remove c99ish variable declarations Eric Anholt
@ 2011-12-21 18:09 ` Eric Anholt
  2011-12-21 18:09 ` [PATCH 13/13] intel: Disable unused decode_logic_op() Eric Anholt
  2011-12-21 18:46 ` Moving intel_decode.c to libdrm Daniel Vetter
  13 siblings, 0 replies; 16+ messages in thread
From: Eric Anholt @ 2011-12-21 18:09 UTC (permalink / raw)
  To: intel-gfx

---
 intel/Makefile.am |   13 ++-----------
 1 files changed, 2 insertions(+), 11 deletions(-)

diff --git a/intel/Makefile.am b/intel/Makefile.am
index 1af0187..801210f 100644
--- a/intel/Makefile.am
+++ b/intel/Makefile.am
@@ -36,23 +36,14 @@ libdrm_intel_la_LDFLAGS = -version-number 1:0:0 -no-undefined
 libdrm_intel_la_LIBADD = ../libdrm.la \
 	@PTHREADSTUBS_LIBS@ \
 	@PCIACCESS_LIBS@ \
-	@CLOCK_LIB@ \
-	libintel_decode.la
-
-
-noinst_LTLIBRARIES = libintel_decode.la
-
-libintel_decode_la_SOURCES = intel_decode.c
-libintel_decode_la_CFLAGS = \
-	-I$(top_srcdir) \
-	-I$(top_srcdir)/intel \
-	-std=c99
+	@CLOCK_LIB@
 
 libdrm_intel_la_SOURCES = \
 	intel_bufmgr.c \
 	intel_bufmgr_priv.h \
 	intel_bufmgr_fake.c \
 	intel_bufmgr_gem.c \
+	intel_decode.c \
 	intel_chipset.h \
 	mm.c \
 	mm.h
-- 
1.7.7.3

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 13/13] intel: Disable unused decode_logic_op().
  2011-12-21 18:09 Moving intel_decode.c to libdrm Eric Anholt
                   ` (11 preceding siblings ...)
  2011-12-21 18:09 ` [PATCH 12/13] intel: Turn on normal warnings for intel_decode.c build Eric Anholt
@ 2011-12-21 18:09 ` Eric Anholt
  2011-12-21 18:46 ` Moving intel_decode.c to libdrm Daniel Vetter
  13 siblings, 0 replies; 16+ messages in thread
From: Eric Anholt @ 2011-12-21 18:09 UTC (permalink / raw)
  To: intel-gfx

It was producing an unused code warning.  I'm tempted to just remove
it, since it's unused, but I *might* use it soon.
---
 intel/intel_decode.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/intel/intel_decode.c b/intel/intel_decode.c
index e8410d0..dbbcd38 100644
--- a/intel/intel_decode.c
+++ b/intel/intel_decode.c
@@ -1043,6 +1043,7 @@ decode_stencil_op(uint32_t op)
 	return "";
 }
 
+#if 0
 static const char *
 decode_logic_op(uint32_t op)
 {
@@ -1082,6 +1083,7 @@ decode_logic_op(uint32_t op)
 	}
 	return "";
 }
+#endif
 
 static const char *
 decode_blend_fact(uint32_t op)
-- 
1.7.7.3

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: Moving intel_decode.c to libdrm
  2011-12-21 18:09 Moving intel_decode.c to libdrm Eric Anholt
                   ` (12 preceding siblings ...)
  2011-12-21 18:09 ` [PATCH 13/13] intel: Disable unused decode_logic_op() Eric Anholt
@ 2011-12-21 18:46 ` Daniel Vetter
  2011-12-21 20:00   ` Eugeni Dodonov
  13 siblings, 1 reply; 16+ messages in thread
From: Daniel Vetter @ 2011-12-21 18:46 UTC (permalink / raw)
  To: Eric Anholt; +Cc: intel-gfx

On Wed, Dec 21, 2011 at 10:09:30AM -0800, Eric Anholt wrote:
> I was once again embarassed while explaining to either Ken or Paul
> about how we handle reusing the intel_decode.c file in two trees.
> Here's my attempt at a solution to the problem: Move the code into
> libdrm, and try to give it an API that we won't have to continually
> rev as we throw the kitchen sink into the intel_decode() function
> arguments.
> 
> One of the things I'm interested in is doing a version that directly
> pokes at BOs instead of just a pointer, which would let us decode
> associated blocks as we see the various state pointers to them.
> There's also room for some interesting validation in that case.
> 
> Further patches (mostly fixing up style) are in my libdrm tree on the
> intel-decode branch.  I've tested it with Mesa on gen7 (I have further
> code to land to make gen7 decode more reasonable).

I've only done a high-level cruise review of this series, but this is
awesome (and has been sitting on my todo list for way to long).

Very-Much-Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-- 
Daniel Vetter
Mail: daniel@ffwll.ch
Mobile: +41 (0)79 365 57 48

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Moving intel_decode.c to libdrm
  2011-12-21 18:46 ` Moving intel_decode.c to libdrm Daniel Vetter
@ 2011-12-21 20:00   ` Eugeni Dodonov
  0 siblings, 0 replies; 16+ messages in thread
From: Eugeni Dodonov @ 2011-12-21 20:00 UTC (permalink / raw)
  To: Daniel Vetter; +Cc: intel-gfx


[-- Attachment #1.1: Type: text/plain, Size: 1334 bytes --]

On Wed, Dec 21, 2011 at 16:46, Daniel Vetter <daniel@ffwll.ch> wrote:

> On Wed, Dec 21, 2011 at 10:09:30AM -0800, Eric Anholt wrote:
> > I was once again embarassed while explaining to either Ken or Paul
> > about how we handle reusing the intel_decode.c file in two trees.
> > Here's my attempt at a solution to the problem: Move the code into
> > libdrm, and try to give it an API that we won't have to continually
> > rev as we throw the kitchen sink into the intel_decode() function
> > arguments.
> >
> > One of the things I'm interested in is doing a version that directly
> > pokes at BOs instead of just a pointer, which would let us decode
> > associated blocks as we see the various state pointers to them.
> > There's also room for some interesting validation in that case.
> >
> > Further patches (mostly fixing up style) are in my libdrm tree on the
> > intel-decode branch.  I've tested it with Mesa on gen7 (I have further
> > code to land to make gen7 decode more reasonable).
>
> I've only done a high-level cruise review of this series, but this is
> awesome (and has been sitting on my todo list for way to long).
>
> Very-Much-Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
>

Yeah, I agree with Daniel - I'll be very happy to have this in libdrm.
Thanks a lot!

-- 
Eugeni Dodonov
<http://eugeni.dodonov.net/>

[-- Attachment #1.2: Type: text/html, Size: 1823 bytes --]

[-- Attachment #2: Type: text/plain, Size: 159 bytes --]

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2011-12-21 20:00 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-12-21 18:09 Moving intel_decode.c to libdrm Eric Anholt
2011-12-21 18:09 ` [PATCH 01/13] intel: Import intel_decode.c from intel-gpu-tools Eric Anholt
2011-12-21 18:09 ` [PATCH 02/13] intel: Make intel_chipset handle devid directly Eric Anholt
2011-12-21 18:09 ` [PATCH 03/13] intel: intel: Add IS_GEN[567] macros Eric Anholt
2011-12-21 18:09 ` [PATCH 04/13] intel: Reformat intel_decode.c from intel-gpu-tools using Lindent Eric Anholt
2011-12-21 18:09 ` [PATCH 05/13] intel: Minor style tweaks after Lindent Eric Anholt
2011-12-21 18:09 ` [PATCH 06/13] intel: Get intel_decode.c minimally building Eric Anholt
2011-12-21 18:09 ` [PATCH 07/13] intel: Fix Wsigned-compare warnings (soon to be enabled) Eric Anholt
2011-12-21 18:09 ` [PATCH 08/13] intel: Fix a ton of signed vs unsigned and const char *warnings Eric Anholt
2011-12-21 18:09 ` [PATCH 09/13] intel: Add printflike warnings for instr_out Eric Anholt
2011-12-21 18:09 ` [PATCH 10/13] intel: Fix printf format warnings for intel_decode Eric Anholt
2011-12-21 18:09 ` [PATCH 11/13] intel: Remove c99ish variable declarations Eric Anholt
2011-12-21 18:09 ` [PATCH 12/13] intel: Turn on normal warnings for intel_decode.c build Eric Anholt
2011-12-21 18:09 ` [PATCH 13/13] intel: Disable unused decode_logic_op() Eric Anholt
2011-12-21 18:46 ` Moving intel_decode.c to libdrm Daniel Vetter
2011-12-21 20:00   ` Eugeni Dodonov

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.