From b2164320a06f98b5ab49cbcf9d9929c5dd9c9b14 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Fri, 1 May 2020 11:22:20 +1000 Subject: [PATCH] i965: add support for gen 5 pipelined pointers to dump I wanted to see inside these, so added support to the dumper. Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/common/gen_batch_decoder.c | 169 ++++++++++++++++++++++++++- 1 file changed, 168 insertions(+), 1 deletion(-) diff --git a/src/intel/common/gen_batch_decoder.c b/src/intel/common/gen_batch_decoder.c index 22a084c65fe..3d80b4e6bae 100644 --- a/src/intel/common/gen_batch_decoder.c +++ b/src/intel/common/gen_batch_decoder.c @@ -840,6 +840,172 @@ decode_load_register_imm(struct gen_batch_decode_ctx *ctx, const uint32_t *p) } } +static void +decode_vs_state(struct gen_batch_decode_ctx *ctx, uint32_t offset) +{ + struct gen_group *strct = + gen_spec_find_struct(ctx->spec, "VS_STATE"); + if (strct == NULL) { + fprintf(ctx->fp, "did not find VS_STATE info\n"); + return; + } + + struct gen_batch_decode_bo bind_bo = + ctx_get_bo(ctx, true, offset); + + if (bind_bo.map == NULL) { + fprintf(ctx->fp, " vs state unavailable\n"); + return; + } + + ctx_print_group(ctx, strct, offset, bind_bo.map); +} + + +static void +decode_clip_state(struct gen_batch_decode_ctx *ctx, uint32_t offset) +{ + struct gen_group *strct = + gen_spec_find_struct(ctx->spec, "CLIP_STATE"); + if (strct == NULL) { + fprintf(ctx->fp, "did not find CLIP_STATE info\n"); + return; + } + + struct gen_batch_decode_bo bind_bo = + ctx_get_bo(ctx, true, offset); + + if (bind_bo.map == NULL) { + fprintf(ctx->fp, " clip state unavailable\n"); + return; + } + + ctx_print_group(ctx, strct, offset, bind_bo.map); + + struct gen_group *vp_strct = + gen_spec_find_struct(ctx->spec, "CLIP_VIEWPORT"); + if (vp_strct == NULL) { + fprintf(ctx->fp, "did not find CLIP_VIEWPORT info\n"); + return; + } + uint32_t clip_vp_offset = ((uint32_t *)bind_bo.map)[6] & ~0x3; + struct gen_batch_decode_bo vp_bo = + ctx_get_bo(ctx, true, clip_vp_offset); + if (vp_bo.map == NULL) { + fprintf(ctx->fp, " clip vp state unavailable\n"); + return; + } + ctx_print_group(ctx, vp_strct, clip_vp_offset, vp_bo.map); +} + +static void +decode_sf_state(struct gen_batch_decode_ctx *ctx, uint32_t offset) +{ + struct gen_group *strct = + gen_spec_find_struct(ctx->spec, "SF_STATE"); + if (strct == NULL) { + fprintf(ctx->fp, "did not find SF_STATE info\n"); + return; + } + + struct gen_batch_decode_bo bind_bo = + ctx_get_bo(ctx, true, offset); + + if (bind_bo.map == NULL) { + fprintf(ctx->fp, " sf state unavailable\n"); + return; + } + + ctx_print_group(ctx, strct, offset, bind_bo.map); + + struct gen_group *vp_strct = + gen_spec_find_struct(ctx->spec, "SF_VIEWPORT"); + if (vp_strct == NULL) { + fprintf(ctx->fp, "did not find SF_VIEWPORT info\n"); + return; + } + + uint32_t sf_vp_offset = ((uint32_t *)bind_bo.map)[5] & ~0x3; + struct gen_batch_decode_bo vp_bo = + ctx_get_bo(ctx, true, sf_vp_offset); + if (vp_bo.map == NULL) { + fprintf(ctx->fp, " sf vp state unavailable\n"); + return; + } + ctx_print_group(ctx, vp_strct, sf_vp_offset, vp_bo.map); +} + +static void +decode_wm_state(struct gen_batch_decode_ctx *ctx, uint32_t offset) +{ + struct gen_group *strct = + gen_spec_find_struct(ctx->spec, "WM_STATE"); + if (strct == NULL) { + fprintf(ctx->fp, "did not find WM_STATE info\n"); + return; + } + + struct gen_batch_decode_bo bind_bo = + ctx_get_bo(ctx, true, offset); + + if (bind_bo.map == NULL) { + fprintf(ctx->fp, " wm state unavailable\n"); + return; + } + + ctx_print_group(ctx, strct, offset, bind_bo.map); +} + +static void +decode_cc_state(struct gen_batch_decode_ctx *ctx, uint32_t offset) +{ + struct gen_group *strct = + gen_spec_find_struct(ctx->spec, "COLOR_CALC_STATE"); + if (strct == NULL) { + fprintf(ctx->fp, "did not find COLOR_CALC_STATE info\n"); + return; + } + + struct gen_batch_decode_bo bind_bo = + ctx_get_bo(ctx, true, offset); + + if (bind_bo.map == NULL) { + fprintf(ctx->fp, " cc state unavailable\n"); + return; + } + + ctx_print_group(ctx, strct, offset, bind_bo.map); + + struct gen_group *vp_strct = + gen_spec_find_struct(ctx->spec, "CC_VIEWPORT"); + if (vp_strct == NULL) { + fprintf(ctx->fp, "did not find CC_VIEWPORT info\n"); + return; + } + uint32_t cc_vp_offset = ((uint32_t *)bind_bo.map)[4] & ~0x3; + struct gen_batch_decode_bo vp_bo = + ctx_get_bo(ctx, true, cc_vp_offset); + if (vp_bo.map == NULL) { + fprintf(ctx->fp, " cc vp state unavailable\n"); + return; + } + ctx_print_group(ctx, vp_strct, cc_vp_offset, vp_bo.map); +} +static void +decode_pipelined_pointers(struct gen_batch_decode_ctx *ctx, const uint32_t *p) +{ + fprintf(ctx->fp, "VS State Table:\n"); + decode_vs_state(ctx, p[1]); + fprintf(ctx->fp, "Clip State Table:\n"); + decode_clip_state(ctx, p[3] & ~1); + fprintf(ctx->fp, "SF State Table:\n"); + decode_sf_state(ctx, p[4]); + fprintf(ctx->fp, "WM State Table:\n"); + decode_wm_state(ctx, p[5]); + fprintf(ctx->fp, "CC State Table:\n"); + decode_cc_state(ctx, p[6]); +} + struct custom_decoder { const char *cmd_name; void (*decode)(struct gen_batch_decode_ctx *ctx, const uint32_t *p); @@ -881,7 +1047,8 @@ struct custom_decoder { { "3DSTATE_CC_STATE_POINTERS", decode_3dstate_cc_state_pointers }, { "3DSTATE_SCISSOR_STATE_POINTERS", decode_3dstate_scissor_state_pointers }, { "3DSTATE_SLICE_TABLE_STATE_POINTERS", decode_3dstate_slice_table_state_pointers }, - { "MI_LOAD_REGISTER_IMM", decode_load_register_imm } + { "MI_LOAD_REGISTER_IMM", decode_load_register_imm }, + { "3DSTATE_PIPELINED_POINTERS", decode_pipelined_pointers } }; void -- 2.30.2