intel: Move the logic for getting 965 3d packet length to the packet table.

While I'm touching every line of the table, sort it by opcode.
main
Eric Anholt 2012-01-04 13:00:29 -08:00
parent 3dcb2d47ee
commit b129e10af2
1 changed files with 73 additions and 83 deletions

View File

@ -2707,7 +2707,7 @@ static int
decode_3d_965(struct drm_intel_decode *ctx)
{
uint32_t opcode;
unsigned int idx, len;
unsigned int len;
unsigned int i, j, sba_len;
const char *desc1 = NULL;
uint32_t *data = ctx->data;
@ -2715,62 +2715,83 @@ decode_3d_965(struct drm_intel_decode *ctx)
struct {
uint32_t opcode;
uint32_t len_mask;
int unsigned min_len;
int unsigned max_len;
const char *name;
int gen;
int (*func)(struct drm_intel_decode *ctx);
} 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", 6 },
{ 0x790d, 4, 4, "3DSTATE_MULTISAMPLE", 7 },
{ 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;
{ 0x6000, 0x00ff, 3, 3, "URB_FENCE" },
{ 0x6001, 0xffff, 2, 2, "CS_URB_STATE" },
{ 0x6002, 0x00ff, 2, 2, "CONSTANT_BUFFER" },
{ 0x6101, 0xffff, 6, 6, "STATE_BASE_ADDRESS" },
{ 0x6102, 0xffff, 2, 2, "STATE_SIP" },
{ 0x6104, 0xffff, 1, 1, "3DSTATE_PIPELINE_SELECT" },
{ 0x680b, 0xffff, 1, 1, "3DSTATE_VF_STATISTICS" },
{ 0x6904, 0xffff, 1, 1, "3DSTATE_PIPELINE_SELECT" },
{ 0x7800, 0xffff, 7, 7, "3DSTATE_PIPELINED_POINTERS" },
{ 0x7801, 0x00ff, 6, 6, "3DSTATE_BINDING_TABLE_POINTERS" },
{ 0x7802, 0x00ff, 4, 4, "3DSTATE_SAMPLER_STATE_POINTERS" },
{ 0x7805, 0x00ff, 3, 3, "3DSTATE_URB" },
{ 0x7808, 0x00ff, 5, 257, "3DSTATE_VERTEX_BUFFERS" },
{ 0x7809, 0x00ff, 3, 256, "3DSTATE_VERTEX_ELEMENTS" },
{ 0x780a, 0x00ff, 3, 3, "3DSTATE_INDEX_BUFFER" },
{ 0x780b, 0xffff, 1, 1, "3DSTATE_VF_STATISTICS" },
{ 0x780d, 0x00ff, 4, 4, "3DSTATE_VIEWPORT_STATE_POINTERS" },
{ 0x780e, 0xffff, 4, 4, "3DSTATE_CC_STATE_POINTERS" },
{ 0x780f, 0x00ff, 2, 2, "3DSTATE_SCISSOR_POINTERS" },
{ 0x7810, 0x00ff, 6, 6, "3DSTATE_VS" },
{ 0x7811, 0x00ff, 7, 7, "3DSTATE_GS" },
{ 0x7812, 0x00ff, 4, 4, "3DSTATE_CLIP" },
{ 0x7813, 0x00ff, 20, 20, "3DSTATE_SF" },
{ 0x7814, 0x00ff, 9, 9, "3DSTATE_WM" },
{ 0x7815, 0x00ff, 5, 5, "3DSTATE_CONSTANT_VS_STATE" },
{ 0x7816, 0x00ff, 5, 5, "3DSTATE_CONSTANT_GS_STATE" },
{ 0x7817, 0x00ff, 5, 5, "3DSTATE_CONSTANT_PS_STATE" },
{ 0x7818, 0xffff, 2, 2, "3DSTATE_SAMPLE_MASK" },
{ 0x7900, 0xffff, 4, 4, "3DSTATE_DRAWING_RECTANGLE" },
{ 0x7901, 0xffff, 5, 5, "3DSTATE_CONSTANT_COLOR" },
{ 0x7905, 0xffff, 5, 7, "3DSTATE_DEPTH_BUFFER" },
{ 0x7906, 0xffff, 2, 2, "3DSTATE_POLY_STIPPLE_OFFSET" },
{ 0x7907, 0xffff, 33, 33, "3DSTATE_POLY_STIPPLE_PATTERN" },
{ 0x7908, 0xffff, 3, 3, "3DSTATE_LINE_STIPPLE" },
{ 0x7909, 0xffff, 2, 2, "3DSTATE_GLOBAL_DEPTH_OFFSET_CLAMP" },
{ 0x7909, 0xffff, 2, 2, "3DSTATE_CLEAR_PARAMS" },
{ 0x790a, 0xffff, 3, 3, "3DSTATE_AA_LINE_PARAMETERS" },
{ 0x790b, 0xffff, 4, 4, "3DSTATE_GS_SVB_INDEX" },
{ 0x790d, 0xffff, 3, 3, "3DSTATE_MULTISAMPLE", 6 },
{ 0x790d, 0xffff, 4, 4, "3DSTATE_MULTISAMPLE", 7 },
{ 0x7910, 0xffff, 2, 2, "3DSTATE_CLEAR_PARAMS" },
{ 0x7a00, 0x00ff, 4, 6, "PIPE_CONTROL" },
{ 0x7b00, 0x00ff, 6, 6, "3DPRIMITIVE" },
}, *opcode_3d = NULL;
opcode = (data[0] & 0xffff0000) >> 16;
for (i = 0; i < ARRAY_SIZE(opcodes_3d); i++) {
if (opcode != opcodes_3d[i].opcode)
continue;
/* If it's marked as not our gen, skip. */
if (opcodes_3d[i].gen && opcodes_3d[i].gen != ctx->gen)
continue;
opcode_3d = &opcodes_3d[i];
break;
}
if (opcode_3d) {
if (opcode_3d->max_len == 1)
len = 1;
else
len = (data[0] & opcode_3d->len_mask) + 2;
} else {
len = (data[0] & 0x0000ffff) + 2;
}
switch (opcode) {
case 0x6000:
len = (data[0] & 0x000000ff) + 2;
return i965_decode_urb_fence(ctx, len);
case 0x6001:
instr_out(ctx, 0, "CS_URB_STATE\n");
@ -2780,7 +2801,6 @@ decode_3d_965(struct drm_intel_decode *ctx)
(((data[1] >> 4) & 0x1f) + 1) * 64, data[1] & 0x7);
return len;
case 0x6002:
len = (data[0] & 0x000000ff) + 2;
instr_out(ctx, 0, "CONSTANT_BUFFER: %s\n",
(data[0] >> 8) & 1 ? "valid" : "invalid");
instr_out(ctx, 1,
@ -2831,7 +2851,6 @@ decode_3d_965(struct drm_intel_decode *ctx)
instr_out(ctx, 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");
@ -2857,7 +2876,6 @@ decode_3d_965(struct drm_intel_decode *ctx)
return len;
case 0x7802:
len = (data[0] & 0xff) + 2;
if (len != 4)
fprintf(out,
"Bad count in 3DSTATE_SAMPLER_STATE_POINTERS\n");
@ -2871,7 +2889,6 @@ decode_3d_965(struct drm_intel_decode *ctx)
instr_out(ctx, 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");
instr_out(ctx, 0, "3DSTATE_URB\n");
@ -2884,7 +2901,6 @@ decode_3d_965(struct drm_intel_decode *ctx)
return len;
case 0x7808:
len = (data[0] & 0xff) + 2;
if ((len - 1) % 4 != 0)
fprintf(out, "Bad count in 3DSTATE_VERTEX_BUFFERS\n");
instr_out(ctx, 0, "3DSTATE_VERTEX_BUFFERS\n");
@ -2910,7 +2926,6 @@ decode_3d_965(struct drm_intel_decode *ctx)
return len;
case 0x7809:
len = (data[0] & 0xff) + 2;
if ((len + 1) % 2 != 0)
fprintf(out, "Bad count in 3DSTATE_VERTEX_ELEMENTS\n");
instr_out(ctx, 0, "3DSTATE_VERTEX_ELEMENTS\n");
@ -2936,7 +2951,6 @@ decode_3d_965(struct drm_intel_decode *ctx)
return len;
case 0x780d:
len = (data[0] & 0xff) + 2;
if (len != 4)
fprintf(out,
"Bad count in 3DSTATE_VIEWPORT_STATE_POINTERS\n");
@ -2948,7 +2962,6 @@ decode_3d_965(struct drm_intel_decode *ctx)
return len;
case 0x780a:
len = (data[0] & 0xff) + 2;
if (len != 3)
fprintf(out, "Bad count in 3DSTATE_INDEX_BUFFER\n");
instr_out(ctx, 0, "3DSTATE_INDEX_BUFFER\n");
@ -2957,7 +2970,6 @@ decode_3d_965(struct drm_intel_decode *ctx)
return len;
case 0x780e:
len = (data[0] & 0xff) + 2;
if (len != 4)
fprintf(out,
"Bad count in 3DSTATE_CC_STATE_POINTERS\n");
@ -2969,7 +2981,6 @@ decode_3d_965(struct drm_intel_decode *ctx)
return len;
case 0x780f:
len = (data[0] & 0xff) + 2;
if (len != 2)
fprintf(out, "Bad count in 3DSTATE_SCISSOR_POINTERS\n");
instr_out(ctx, 0, "3DSTATE_SCISSOR_POINTERS\n");
@ -2977,7 +2988,6 @@ decode_3d_965(struct drm_intel_decode *ctx)
return len;
case 0x7810:
len = (data[0] & 0xff) + 2;
if (len != 6)
fprintf(out, "Bad count in 3DSTATE_VS\n");
instr_out(ctx, 0, "3DSTATE_VS\n");
@ -3000,7 +3010,6 @@ decode_3d_965(struct drm_intel_decode *ctx)
return len;
case 0x7811:
len = (data[0] & 0xff) + 2;
if (len != 7)
fprintf(out, "Bad count in 3DSTATE_GS\n");
instr_out(ctx, 0, "3DSTATE_GS\n");
@ -3028,7 +3037,6 @@ decode_3d_965(struct drm_intel_decode *ctx)
return len;
case 0x7812:
len = (data[0] & 0xff) + 2;
if (len != 4)
fprintf(out, "Bad count in 3DSTATE_CLIP\n");
instr_out(ctx, 0, "3DSTATE_CLIP\n");
@ -3059,7 +3067,6 @@ decode_3d_965(struct drm_intel_decode *ctx)
return len;
case 0x7813:
len = (data[0] & 0xff) + 2;
if (len != 20)
fprintf(out, "Bad count in 3DSTATE_SF\n");
instr_out(ctx, 0, "3DSTATE_SF\n");
@ -3123,7 +3130,6 @@ decode_3d_965(struct drm_intel_decode *ctx)
return len;
case 0x7814:
len = (data[0] & 0xff) + 2;
if (len != 9)
fprintf(out, "Bad count in 3DSTATE_WM\n");
instr_out(ctx, 0, "3DSTATE_WM\n");
@ -3221,7 +3227,6 @@ decode_3d_965(struct drm_intel_decode *ctx)
case 0x7a00:
if (IS_GEN6(devid) || IS_GEN7(devid)) {
unsigned int i;
len = (data[0] & 0xff) + 2;
if (len != 4 && len != 5)
fprintf(out, "Bad count in PIPE_CONTROL\n");
@ -3288,7 +3293,6 @@ decode_3d_965(struct drm_intel_decode *ctx)
}
return len;
} else {
len = (data[0] & 0xff) + 2;
if (len != 4)
fprintf(out, "Bad count in PIPE_CONTROL\n");
@ -3319,7 +3323,6 @@ decode_3d_965(struct drm_intel_decode *ctx)
return len;
}
case 0x7b00:
len = (data[0] & 0xff) + 2;
if (len != 6)
fprintf(out, "Bad count in 3DPRIMITIVE\n");
@ -3335,30 +3338,17 @@ decode_3d_965(struct drm_intel_decode *ctx)
return len;
}
for (idx = 0; idx < ARRAY_SIZE(opcodes_3d); idx++) {
opcode_3d = &opcodes_3d[idx];
/* If it's marked as only for a specific gen, skip. */
if (opcode_3d->gen && opcode_3d->gen != ctx->gen)
continue;
if ((data[0] & 0xffff0000) >> 16 != opcode_3d->opcode)
continue;
if (opcode_3d) {
if (opcode_3d->func) {
return opcode_3d->func(ctx);
} else {
unsigned int i;
len = 1;
instr_out(ctx, 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);
}
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++) {