From 2263841ced88a397a7ebfb882ee47c5fc8d21975 Mon Sep 17 00:00:00 2001 From: squidbus <1249084-squidbus@users.noreply.gitlab.freedesktop.org> Date: Fri, 29 May 2026 00:14:15 -0700 Subject: [PATCH] kk: Support VK_EXT_blend_operation_advanced Already supported by blend lowering, just needs to be wired up. Reviewed-by: Aitor Camacho Part-of: --- docs/features.txt | 2 +- src/kosmickrisp/vulkan/kk_physical_device.c | 12 +++++ src/kosmickrisp/vulkan/kk_shader.c | 59 ++++++++++----------- 3 files changed, 41 insertions(+), 32 deletions(-) diff --git a/docs/features.txt b/docs/features.txt index 78540863ab0..73f757af1aa 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -607,7 +607,7 @@ Khronos extensions that are not part of any Vulkan version: VK_EXT_astc_decode_mode DONE (panvk) VK_EXT_attachment_feedback_loop_dynamic_state DONE (anv, kk, lvp, panvk, radv, tu, vn) VK_EXT_attachment_feedback_loop_layout DONE (anv, hk, kk, lvp, nvk, panvk, radv, tu, v3dv, vn) - VK_EXT_blend_operation_advanced DONE (hk, lvp, vn) + VK_EXT_blend_operation_advanced DONE (hk, kk, lvp, vn) VK_EXT_border_color_swizzle DONE (anv, hasvk, hk, lvp, nvk, panvk, pvr, radv/gfx10+, tu, v3dv, vn) VK_EXT_buffer_device_address DONE (anv, dzn/sm6.6+, hasvk, hk, kk, nvk, panvk, radv, vn) VK_EXT_calibrated_timestamps DONE (anv, hasvk, hk, kk, nvk, panvk/v10+, lvp, radv, vn, tu/a750+) diff --git a/src/kosmickrisp/vulkan/kk_physical_device.c b/src/kosmickrisp/vulkan/kk_physical_device.c index 3b5725abe2b..c7687637996 100644 --- a/src/kosmickrisp/vulkan/kk_physical_device.c +++ b/src/kosmickrisp/vulkan/kk_physical_device.c @@ -156,6 +156,7 @@ kk_get_device_extensions(const struct kk_instance *instance, .EXT_attachment_feedback_loop_layout = true, .EXT_attachment_feedback_loop_dynamic_state = true, + .EXT_blend_operation_advanced = true, .EXT_calibrated_timestamps = true, .EXT_conditional_rendering = true, .EXT_debug_marker = true, @@ -380,6 +381,9 @@ kk_get_device_features( /* VK_EXT_attachment_feedback_loop_dynamic_state */ .attachmentFeedbackLoopDynamicState = true, + /* VK_EXT_blend_operation_advanced */ + .advancedBlendCoherentOperations = true, + /* VK_EXT_conditional_rendering */ .conditionalRendering = true, .inheritedConditionalRendering = true, @@ -661,6 +665,14 @@ kk_get_device_properties(const struct kk_physical_device *pdev, /* VK_KHR_push_descriptor */ .maxPushDescriptors = KK_MAX_PUSH_DESCRIPTORS, + /* VK_EXT_blend_operation_advanced */ + .advancedBlendMaxColorAttachments = KK_MAX_RTS, + .advancedBlendIndependentBlend = true, + .advancedBlendNonPremultipliedSrcColor = true, + .advancedBlendNonPremultipliedDstColor = true, + .advancedBlendCorrelatedOverlap = true, + .advancedBlendAllOperations = true, + /* VK_EXT_custom_border_color */ .maxCustomBorderColorSamplers = 4000, diff --git a/src/kosmickrisp/vulkan/kk_shader.c b/src/kosmickrisp/vulkan/kk_shader.c index 315617876ef..ca8360ec2d2 100644 --- a/src/kosmickrisp/vulkan/kk_shader.c +++ b/src/kosmickrisp/vulkan/kk_shader.c @@ -352,42 +352,39 @@ kk_lower_fs_blend(nir_shader *nir, static_assert(ARRAY_SIZE(opts.rt) == 8, "max RTs out of sync"); for (unsigned i = 0; i < ARRAY_SIZE(opts.rt); ++i) { - enum pipe_format format = + const struct vk_color_blend_attachment_state *att = + &state->cb->attachments[i]; + nir_lower_blend_rt *rt = &opts.rt[i]; + + rt->format = vk_format_to_pipe_format(state->rp->color_attachment_formats[i]); - if (state->cb->attachments[i].blend_enable) { - opts.rt[i] = (nir_lower_blend_rt){ - .format = format, + rt->colormask = att->write_mask; - .rgb.src_factor = vk_blend_factor_to_pipe( - state->cb->attachments[i].src_color_blend_factor), - .rgb.dst_factor = vk_blend_factor_to_pipe( - state->cb->attachments[i].dst_color_blend_factor), - .rgb.func = - vk_blend_op_to_pipe(state->cb->attachments[i].color_blend_op), + if (!att->blend_enable) { + rt->rgb.src_factor = rt->alpha.src_factor = PIPE_BLENDFACTOR_ONE; + rt->rgb.dst_factor = rt->alpha.dst_factor = PIPE_BLENDFACTOR_ZERO; + rt->rgb.func = rt->alpha.func = PIPE_BLEND_ADD; + } else if (att->color_blend_op >= VK_BLEND_OP_ZERO_EXT) { + rt->advanced_blend = true; + rt->blend_mode = vk_advanced_blend_op_to_pipe(att->color_blend_op); + rt->src_premultiplied = att->src_premultiplied; + rt->dst_premultiplied = att->dst_premultiplied; + rt->overlap = vk_blend_overlap_to_pipe(att->blend_overlap); - .alpha.src_factor = vk_blend_factor_to_pipe( - state->cb->attachments[i].src_alpha_blend_factor), - .alpha.dst_factor = vk_blend_factor_to_pipe( - state->cb->attachments[i].dst_alpha_blend_factor), - .alpha.func = - vk_blend_op_to_pipe(state->cb->attachments[i].alpha_blend_op), - - .colormask = state->cb->attachments[i].write_mask, - }; + /* Unused by runtime and not supported */ + assert(!att->clamp_results); } else { - opts.rt[i] = (nir_lower_blend_rt){ - .format = format, + rt->rgb.src_factor = + vk_blend_factor_to_pipe(att->src_color_blend_factor); + rt->rgb.dst_factor = + vk_blend_factor_to_pipe(att->dst_color_blend_factor); + rt->rgb.func = vk_blend_op_to_pipe(att->color_blend_op); - .rgb.src_factor = PIPE_BLENDFACTOR_ONE, - .rgb.dst_factor = PIPE_BLENDFACTOR_ZERO, - .rgb.func = PIPE_BLEND_ADD, - - .alpha.src_factor = PIPE_BLENDFACTOR_ONE, - .alpha.dst_factor = PIPE_BLENDFACTOR_ZERO, - .alpha.func = PIPE_BLEND_ADD, - - .colormask = state->cb->attachments[i].write_mask, - }; + rt->alpha.src_factor = + vk_blend_factor_to_pipe(att->src_alpha_blend_factor); + rt->alpha.dst_factor = + vk_blend_factor_to_pipe(att->dst_alpha_blend_factor); + rt->alpha.func = vk_blend_op_to_pipe(att->alpha_blend_op); } } /* Fold constant offset srcs for IO. */