intel: add lots of i830 engine to intel_decode debug
authorairlied <airlied@unused-12-215.bne.redhat.com>
Thu, 20 Nov 2008 08:18:20 +0000 (18:18 +1000)
committerairlied <airlied@unused-12-215.bne.redhat.com>
Thu, 20 Nov 2008 08:18:20 +0000 (18:18 +1000)
src/mesa/drivers/dri/intel/intel_decode.c

index 9c10501..0e72ca0 100644 (file)
@@ -308,6 +308,15 @@ decode_3d_1c(uint32_t *data, int count, uint32_t hw_offset, int *failures)
     case 0x10:
        instr_out(data, hw_offset, 0, "3DSTATE_SCISSOR_ENABLE\n");
        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\n");
@@ -316,33 +325,39 @@ decode_3d_1c(uint32_t *data, int count, uint32_t hw_offset, int *failures)
 }
 
 static int
-decode_3d_1d(uint32_t *data, int count, uint32_t hw_offset, int *failures)
+decode_3d_1d(uint32_t *data, int count, uint32_t hw_offset, int *failures, int i830)
 {
     unsigned int len, i, c, opcode, word, map, sampler, instr;
 
     struct {
        uint32_t opcode;
+       int i830_only;
        int min_len;
        int max_len;
        char *name;
     } opcodes_3d_1d[] = {
-       { 0x8e, 3, 3, "3DSTATE_BUFFER_INFO" },
-       { 0x86, 4, 4, "3DSTATE_CHROMA_KEY" },
-       { 0x9c, 1, 1, "3DSTATE_CLEAR_PARAMETERS" },
-       { 0x88, 2, 2, "3DSTATE_CONSTANT_BLEND_COLOR" },
-       { 0x99, 2, 2, "3DSTATE_DEFAULT_DIFFUSE" },
-       { 0x9a, 2, 2, "3DSTATE_DEFAULT_SPECULAR" },
-       { 0x98, 2, 2, "3DSTATE_DEFAULT_Z" },
-       { 0x97, 2, 2, "3DSTATE_DEPTH_OFFSET_SCALE" },
-       { 0x85, 2, 2, "3DSTATE_DEST_BUFFER_VARIABLES" },
-       { 0x80, 5, 5, "3DSTATE_DRAWING_RECTANGLE" },
-       { 0x8e, 3, 3, "3DSTATE_BUFFER_INFO" },
-       { 0x9d, 65, 65, "3DSTATE_FILTER_COEFFICIENTS_4X4" },
-       { 0x9e, 4, 4, "3DSTATE_MONO_FILTER" },
-       { 0x89, 4, 4, "3DSTATE_FOG_MODE" },
-       { 0x8f, 2, 16, "3DSTATE_MAP_PALLETE_LOAD_32" },
-       { 0x81, 3, 3, "3DSTATE_SCISSOR_RECTANGLE" },
-       { 0x83, 2, 2, "3DSTATE_SPAN_STIPPLE" },
+       { 0x8e, 0, 3, 3, "3DSTATE_BUFFER_INFO" },
+       { 0x86, 0, 4, 4, "3DSTATE_CHROMA_KEY" },
+       { 0x9c, 0, 1, 1, "3DSTATE_CLEAR_PARAMETERS" },
+       { 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" },
+       { 0x85, 0, 2, 2, "3DSTATE_DEST_BUFFER_VARIABLES" },
+       { 0x80, 0, 5, 5, "3DSTATE_DRAWING_RECTANGLE" },
+       { 0x8e, 0, 3, 3, "3DSTATE_BUFFER_INFO" },
+       { 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" },
+       { 0x81, 0, 3, 3, "3DSTATE_SCISSOR_RECTANGLE" },
+       { 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" },
     };
 
     switch ((data[0] & 0x00ff0000) >> 16) {
@@ -488,6 +503,8 @@ decode_3d_1d(uint32_t *data, int count, uint32_t hw_offset, int *failures)
        }
        return len;
     case 0x01:
+       if (i830)
+           break;
        instr_out(data, hw_offset, 0, "3DSTATE_SAMPLER_STATE\n");
        len = (data[0] & 0x0000003f) + 2;
        i = 1;
@@ -513,6 +530,9 @@ decode_3d_1d(uint32_t *data, int count, uint32_t hw_offset, int *failures)
     for (opcode = 0; opcode < sizeof(opcodes_3d_1d) / sizeof(opcodes_3d_1d[0]);
         opcode++)
     {
+       if (opcodes_3d_1d[opcode].i830_only && !i830)
+           continue;
+
        if (((data[0] & 0x00ff0000) >> 16) == opcodes_3d_1d[opcode].opcode) {
            len = 1;
 
@@ -756,7 +776,7 @@ decode_3d(uint32_t *data, int count, uint32_t hw_offset, int *failures)
     case 0x1f:
        return decode_3d_primitive(data, count, hw_offset, failures);
     case 0x1d:
-       return decode_3d_1d(data, count, hw_offset, failures);
+       return decode_3d_1d(data, count, hw_offset, failures, 0);
     case 0x1c:
        return decode_3d_1c(data, count, hw_offset, failures);
     }
@@ -999,6 +1019,73 @@ decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, int *failures)
     return 1;
 }
 
+static int
+decode_3d_i830(uint32_t *data, int count, uint32_t hw_offset, int *failures)
+{
+    unsigned int 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" },
+    };
+
+    switch ((data[0] & 0x1f000000) >> 24) {
+    case 0x1f:
+       return decode_3d_primitive(data, count, hw_offset, failures);
+    case 0x1d:
+       return decode_3d_1d(data, count, hw_offset, failures, 1);
+    case 0x1c:
+       return decode_3d_1c(data, count, hw_offset, failures);
+    }
+
+    for (opcode = 0; opcode < sizeof(opcodes_3d) / sizeof(opcodes_3d[0]);
+        opcode++) {
+       if ((data[0] & 0x1f000000) >> 24 == opcodes_3d[opcode].opcode) {
+           unsigned int len = 1, i;
+
+           instr_out(data, hw_offset, 0, "%s\n", opcodes_3d[opcode].name);
+           if (opcodes_3d[opcode].max_len > 1) {
+               len = (data[0] & 0xff) + 2;
+               if (len < opcodes_3d[opcode].min_len ||
+                   len > opcodes_3d[opcode].max_len)
+               {
+                   fprintf(out, "Bad count in %s\n", opcodes_3d[opcode].name);
+               }
+           }
+
+           for (i = 1; i < len; i++) {
+               if (i >= count)
+                   BUFFER_FAIL(count, len, opcodes_3d[opcode].name);
+               instr_out(data, hw_offset, i, "dword %d\n", i);
+           }
+           return len;
+       }
+    }
+
+    instr_out(data, hw_offset, 0, "3D UNKNOWN\n");
+    (*failures)++;
+    return 1;
+}
+
 /**
  * Decodes an i830-i915 batch buffer, writing the output to stdout.
  *
@@ -1028,9 +1115,12 @@ intel_decode(uint32_t *data, int count, uint32_t hw_offset, uint32_t devid)
            if (IS_965(devid)) {
                index += decode_3d_965(data + index, count - index,
                                       hw_offset + index * 4, &failures);
-           } else {
+           } else if (IS_9XX(devid)) {
                index += decode_3d(data + index, count - index,
                                   hw_offset + index * 4, &failures);
+           } else {
+               index += decode_3d_i830(data + index, count - index,
+                                       hw_offset + index * 4, &failures);
            }
            break;
        default: