From bdd4bea6366d2957dad7c760d24964178925a902 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Fri, 28 Nov 2025 17:37:44 -0500 Subject: [PATCH] pan/genxml: Decode blend shaders on CSF In order to decode blend shaders, we need to pass in the fragment binary address because the blend pointer uses the same top 32 bits as the fragment binary. Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/genxml/decode_csf.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/panfrost/genxml/decode_csf.c b/src/panfrost/genxml/decode_csf.c index 5cf240cb09e..b65387a63a2 100644 --- a/src/panfrost/genxml/decode_csf.c +++ b/src/panfrost/genxml/decode_csf.c @@ -760,8 +760,9 @@ pandecode_run_tiling(struct pandecode_context *ctx, FILE *fp, GENX(pandecode_fau)(ctx, lo, hi, "Fragment FAU"); } + uint64_t fs_bin_addr = 0; if (spd) { - GENX(pandecode_shader) + fs_bin_addr = GENX(pandecode_shader) (ctx, spd, "Fragment shader", qctx->gpu_id); } @@ -791,7 +792,8 @@ pandecode_run_tiling(struct pandecode_context *ctx, FILE *fp, cs_get_u64(qctx, 48)); uint64_t blend = cs_get_u64(qctx, 50); - GENX(pandecode_blend_descs)(ctx, blend & ~15, blend & 15, 0, qctx->gpu_id); + GENX(pandecode_blend_descs)(ctx, blend & ~15, blend & 15, + fs_bin_addr, qctx->gpu_id); DUMP_ADDR(ctx, DEPTH_STENCIL, cs_get_u64(qctx, 52), "Depth/stencil"); @@ -872,8 +874,9 @@ pandecode_run_idvs2(struct pandecode_context *ctx, FILE *fp, (ctx, vertex_spd, "Vertex shader", qctx->gpu_id); } + uint64_t fs_bin_addr = 0; if (fragment_spd) { - GENX(pandecode_shader) + fs_bin_addr = GENX(pandecode_shader) (ctx, fragment_spd, "Fragment shader", qctx->gpu_id); } @@ -912,7 +915,8 @@ pandecode_run_idvs2(struct pandecode_context *ctx, FILE *fp, DUMP_ADDR(ctx, DEPTH_STENCIL, zsd_pointer, "Depth/stencil"); - GENX(pandecode_blend_descs)(ctx, blend & ~15, blend & 15, 0, qctx->gpu_id); + GENX(pandecode_blend_descs)(ctx, blend & ~15, blend & 15, + fs_bin_addr, qctx->gpu_id); if (tiler_flags.index_type) { pandecode_log(ctx, "Indices: %" PRIx64 "\n", vertex_index_array_pointer); @@ -1012,8 +1016,9 @@ pandecode_run_idvs(struct pandecode_context *ctx, FILE *fp, GENX(pandecode_shader)(ctx, ptr, "Varying shader", qctx->gpu_id); } + uint64_t fs_bin_addr = 0; if (cs_get_u64(qctx, MALI_IDVS_SR_FRAGMENT_SPD)) { - GENX(pandecode_shader) + fs_bin_addr = GENX(pandecode_shader) (ctx, cs_get_u64(qctx, MALI_IDVS_SR_FRAGMENT_SPD), "Fragment shader", qctx->gpu_id); } @@ -1066,7 +1071,8 @@ pandecode_run_idvs(struct pandecode_context *ctx, FILE *fp, cs_get_u32(qctx, MALI_IDVS_SR_VARY_SIZE)); uint64_t blend = cs_get_u64(qctx, MALI_IDVS_SR_BLEND_DESC); - GENX(pandecode_blend_descs)(ctx, blend & ~15, blend & 15, 0, qctx->gpu_id); + GENX(pandecode_blend_descs)(ctx, blend & ~15, blend & 15, + fs_bin_addr, qctx->gpu_id); DUMP_ADDR(ctx, DEPTH_STENCIL, cs_get_u64(qctx, MALI_IDVS_SR_ZSD), "Depth/stencil");