[Intel-gfx] [PATCH 12/17] intel: Move the logic for getting 965 3d packet length to the packet table.

Eric Anholt eric at anholt.net
Wed Jan 4 23:54:54 CET 2012


While I'm touching every line of the table, sort it by opcode.
---
 intel/intel_decode.c |  156 +++++++++++++++++++++++--------------------------
 1 files changed, 73 insertions(+), 83 deletions(-)

diff --git a/intel/intel_decode.c b/intel/intel_decode.c
index 1f01b11..1519f6a 100644
--- a/intel/intel_decode.c
+++ b/intel/intel_decode.c
@@ -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++) {
-- 
1.7.7.3




More information about the Intel-gfx mailing list