The previous implementation seemed to imply that 3DSTATE_BLEND_STATE_POINTERS had a pointer to an array of BLEND_STATE. This is true on Gen7.5 but not on Gen8+. The actual array is made up of BLEND_STATE_ENTRY elements following BLEND_STATE (which is empty on Gen7.5).
Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@intel.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107544 --- src/intel/common/gen_batch_decoder.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/intel/common/gen_batch_decoder.c b/src/intel/common/gen_batch_decoder.c index f5be0018afc..715eeaa159c 100644 --- a/src/intel/common/gen_batch_decoder.c +++ b/src/intel/common/gen_batch_decoder.c @@ -691,7 +691,31 @@ static void decode_3dstate_blend_state_pointers(struct gen_batch_decode_ctx *ctx, const uint32_t *p) { - decode_dynamic_state_pointers(ctx, "BLEND_STATE", p, 1); + struct gen_group *inst = gen_spec_find_instruction(ctx->spec, p); + struct gen_group *state = gen_spec_find_struct(ctx->spec, "BLEND_STATE"); + struct gen_group *state_entry = gen_spec_find_struct(ctx->spec, "BLEND_STATE_ENTRY"); + uint32_t state_offset = 0; + + struct gen_field_iterator iter; + gen_field_iterator_init(&iter, inst, p, 0, false); + while (gen_field_iterator_next(&iter)) { + if (str_ends_with(iter.name, "Pointer")) { + state_offset = iter.raw_value; + break; + } + } + + uint64_t state_addr = ctx->dynamic_base + state_offset; + struct gen_batch_decode_bo bo = ctx_get_bo(ctx, state_addr); + const void *state_map = bo.map; + + ctx_print_group(ctx, state, state_offset, state_map); + + state_addr += state->dw_length; + state_map += state->dw_length; + + fprintf(ctx->fp, "%s 0\n", state_entry->name); + ctx_print_group(ctx, state_entry, state_offset, state_map); } static void -- 2.18.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev