From cdc1a749778e610710e30b0ddaeda089efb033a4 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Sat, 10 Jan 2026 11:11:21 -0500 Subject: [PATCH] panvk/csf: Stop calling blend_emit_descs() with no FS This is what the JM code is doing and it lets us assume we always have a fragment shader. Right now, we're already making that assumption, we just haven't been bitten by it yet because no one has tried to use a shader-requiring blend configuration with no FS yet. Cc: mesa-stable Reviewed-by: Lars-Ivar Hesselberg Simonsen (cherry picked from commit 9cab0c4bf00508f57623ea8db58e0a709c5ff57f) Part-of: --- .pick_status.json | 2 +- src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 13 ++++++++++++- src/panfrost/vulkan/panvk_vX_blend.c | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 1a750a5b659..d7044e09e1d 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -554,7 +554,7 @@ "description": "panvk/csf: Stop calling blend_emit_descs() with no FS", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index 3f6f26b8c20..ba89ef160fc 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -655,6 +655,8 @@ prepare_blend(struct panvk_cmd_buffer *cmdbuf) if (!dirty) return VK_SUCCESS; + const struct panvk_shader_variant *fs = + panvk_shader_only_variant(get_fs(cmdbuf)); uint32_t bd_count = MAX2(cmdbuf->state.gfx.render.fb.info.rt_count, 1); struct cs_builder *b = panvk_get_cs_builder(cmdbuf, PANVK_SUBQUEUE_VERTEX_TILER); @@ -664,7 +666,16 @@ prepare_blend(struct panvk_cmd_buffer *cmdbuf) if (bd_count && !ptr.gpu) return VK_ERROR_OUT_OF_DEVICE_MEMORY; - panvk_per_arch(blend_emit_descs)(cmdbuf, bds); + if (fs) { + panvk_per_arch(blend_emit_descs)(cmdbuf, bds); + } else { + for (unsigned i = 0; i < bd_count; i++) { + pan_pack(&bds[i], BLEND, cfg) { + cfg.enable = false; + cfg.internal.mode = MALI_BLEND_MODE_OFF; + } + } + } cs_update_vt_ctx(b) cs_move64_to(b, cs_sr_reg64(b, IDVS, BLEND_DESC), ptr.gpu | bd_count); diff --git a/src/panfrost/vulkan/panvk_vX_blend.c b/src/panfrost/vulkan/panvk_vX_blend.c index cc917167d9e..1497410ebfe 100644 --- a/src/panfrost/vulkan/panvk_vX_blend.c +++ b/src/panfrost/vulkan/panvk_vX_blend.c @@ -305,7 +305,7 @@ panvk_per_arch(blend_emit_descs)(struct panvk_cmd_buffer *cmdbuf, const struct vk_color_attachment_location_state *cal = &dyns->cal; const struct panvk_shader_variant *fs = panvk_shader_only_variant(cmdbuf->state.gfx.fs.shader); - const struct pan_shader_info *fs_info = fs ? &fs->info : NULL; + const struct pan_shader_info *fs_info = &fs->info; uint64_t fs_code = panvk_shader_variant_get_dev_addr(fs); const struct panvk_rendering_state *render = &cmdbuf->state.gfx.render; const VkFormat *color_attachment_formats = render->color_attachments.fmts;