summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2011-12-20 16:44:08 -0800
committerEric Anholt <eric@anholt.net>2011-12-20 16:44:08 -0800
commitc7a3d4df018fc2751f0492efc16e9e2ce2c5b0e2 (patch)
treec3deba8dd6ec3d0a72839c6926f8c79cae4f51e0
parent01b047a9b616a2dcd44a16b75113cb3223d5fa9b (diff)
intel: Unindent 3DSTATE_LOAD_STATE_IMMEDIATE_1 parsing using helper funcs.intel-decode
-rw-r--r--intel/intel_decode.c796
1 files changed, 407 insertions, 389 deletions
diff --git a/intel/intel_decode.c b/intel/intel_decode.c
index 2d3acca1..65e34c3c 100644
--- a/intel/intel_decode.c
+++ b/intel/intel_decode.c
@@ -1201,6 +1201,408 @@ decode_sample_filter(uint32_t mode)
}
static int
+gen2_3DSTATE_LOAD_STATE_IMMEDIATE_1(struct drm_intel_decode *ctx)
+{
+ uint32_t *data = ctx->data;
+ uint32_t len = (data[0] & 0x0000000f) + 2;
+ unsigned int i, word;
+
+ instr_out(ctx, 0,
+ "3DSTATE_LOAD_STATE_IMMEDIATE_1\n");
+ i = 1;
+
+ for (word = 0; word <= 8; word++) {
+ if (!(data[0] & (1 << (4 + word))))
+ continue;
+
+ if (i >= ctx->count)
+ BUFFER_FAIL(ctx->count, len,
+ "3DSTATE_LOAD_STATE_IMMEDIATE_1");
+
+ instr_out(ctx, i, "S%d: 0x%08x\n", i, data[i]);
+ i++;
+ }
+ if (len != i) {
+ fprintf(out,
+ "Bad count in 3DSTATE_LOAD_STATE_IMMEDIATE_1\n");
+ }
+ return len;
+}
+
+static int
+gen3_3DSTATE_LOAD_STATE_IMMEDIATE_1(struct drm_intel_decode *ctx)
+{
+ uint32_t *data = ctx->data;
+ uint32_t len = (data[0] & 0x0000000f) + 2;
+ unsigned int i, word;
+
+ instr_out(ctx, 0,
+ "3DSTATE_LOAD_STATE_IMMEDIATE_1\n");
+ i = 1;
+
+ for (word = 0; word <= 8; word++) {
+ int tex_num;
+
+ if (!(data[0] & (1 << (4 + word))))
+ continue;
+
+ if (i >= ctx->count)
+ BUFFER_FAIL(ctx->count, len,
+ "3DSTATE_LOAD_STATE_IMMEDIATE_1");
+
+ /* save vertex state for decode */
+ 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(ctx, i,
+ "S0: vbo offset: 0x%08x%s\n",
+ data[i] & (~1),
+ data[i] & 1 ?
+ ", auto cache invalidate disabled"
+ : "");
+ break;
+ case 1:
+ instr_out(ctx, i,
+ "S1: vertex width: %i, vertex pitch: %i\n",
+ (data[i] >> 24) &
+ 0x3f,
+ (data[i] >> 16) &
+ 0x3f);
+ break;
+ case 2:
+ instr_out(ctx, i,
+ "S2: texcoord formats: ");
+ for (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(ctx, i, "S3: not documented\n");
+ break;
+ case 4: {
+ const char *cullmode = "";
+ const 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(ctx, i,
+ "S4: point_width=%i, line_width=%.1f,"
+ "%s%s%s%s%s cullmode=%s, vfmt=%s%s%s%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(ctx, 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(ctx, 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(ctx, i,
+ "S7: depth offset constant: 0x%08x\n",
+ data[i]);
+ break;
+ }
+
+ i++;
+ }
+ if (len != i) {
+ fprintf(out,
+ "Bad count in 3DSTATE_LOAD_STATE_IMMEDIATE_1\n");
+ }
+ return len;
+}
+
+static int
decode_3DSTATE_MAP_STATE(struct drm_intel_decode *ctx)
{
uint32_t len = (ctx->data[0] & 0x0000003f) + 2;
@@ -1503,397 +1905,13 @@ decode_3d_1d(struct drm_intel_decode *ctx)
return len;
}
return len;
- case 0x04:
- instr_out(ctx, 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)) {
- int tex_num;
-
- 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(ctx, i,
- "S0: vbo offset: 0x%08x%s\n",
- data[i] & (~1),
- data[i] & 1 ?
- ", auto cache invalidate disabled"
- : "");
- break;
- case 1:
- instr_out(ctx, i,
- "S1: vertex width: %i, vertex pitch: %i\n",
- (data[i] >> 24) &
- 0x3f,
- (data[i] >> 16) &
- 0x3f);
- break;
- case 2:
- instr_out(ctx, i,
- "S2: texcoord formats: ");
- for (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");
+ case 0x04:
+ if (IS_GEN3(devid))
+ return gen3_3DSTATE_LOAD_STATE_IMMEDIATE_1(ctx);
+ else
+ return gen2_3DSTATE_LOAD_STATE_IMMEDIATE_1(ctx);
- break;
- case 3:
- instr_out(ctx, i,
- "S3: not documented\n");
- break;
- case 4:
- {
- const char *cullmode = "";
- const 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(ctx, i,
- "S4: point_width=%i, line_width=%.1f,"
- "%s%s%s%s%s cullmode=%s, vfmt=%s%s%s%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(ctx, 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(ctx, 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(ctx, i,
- "S7: depth offset constant: 0x%08x\n",
- data[i]);
- break;
- }
- } else {
- instr_out(ctx, i,
- "S%d: 0x%08x\n", i, data[i]);
- }
- i++;
- }
- }
- if (len != i) {
- fprintf(out,
- "Bad count in 3DSTATE_LOAD_STATE_IMMEDIATE_1\n");
- }
- return len;
case 0x03:
instr_out(ctx, 0,
"3DSTATE_LOAD_STATE_IMMEDIATE_2\n");