i965: Add decode of index/vertex buffer and primitive emit.

This commit is contained in:
Eric Anholt
2008-12-10 12:43:58 -08:00
parent bc3b8a39a7
commit 0dfec4ab61

View File

@@ -836,10 +836,71 @@ get_965_depthformat(unsigned int depthformat)
}
}
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
decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, int *failures)
{
unsigned int opcode, len;
int i;
struct {
uint32_t opcode;
@@ -860,8 +921,7 @@ decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, int *failures)
{ 0x780b, 1, 1, "3DSTATE_VF_STATISTICS" },
{ 0x7808, 5, 257, "3DSTATE_VERTEX_BUFFERS" },
{ 0x7809, 3, 256, "3DSTATE_VERTEX_ELEMENTS" },
/* 0x7808: 3DSTATE_VERTEX_BUFFERS */
/* 0x7809: 3DSTATE_VERTEX_ELEMENTS */
{ 0x780a, 3, 3, "3DSTATE_INDEX_BUFFER" },
{ 0x7900, 4, 4, "3DSTATE_DRAWING_RECTANGLE" },
{ 0x7901, 5, 5, "3DSTATE_CONSTANT_COLOR" },
{ 0x7905, 5, 7, "3DSTATE_DEPTH_BUFFER" },
@@ -947,6 +1007,64 @@ decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, int *failures)
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;) {
instr_out(data, hw_offset, i, "buffer %d: %s, pitch %db\n",
data[i] >> 27,
data[i] & (1 << 26) ? "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%04xd bytes\n",
data[i] >> 27,
data[i] & (1 << 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 0x7900:
if (len != 4)
fprintf(out, "Bad count in 3DSTATE_DRAWING_RECTANGLE\n");
@@ -968,9 +1086,9 @@ decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, int *failures)
return len;
case 0x7905:
if (len != 5)
if (len != 5 && len != 6)
fprintf(out, "Bad count in 3DSTATE_DEPTH_BUFFER\n");
if (count < 5)
if (count < len)
BUFFER_FAIL(count, len, "3DSTATE_DEPTH_BUFFER");
instr_out(data, hw_offset, 0,
@@ -985,8 +1103,28 @@ decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, int *failures)
((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");
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, "primitive 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 (opcode = 0; opcode < sizeof(opcodes_3d) / sizeof(opcodes_3d[0]);