kk: Support VK_EXT_blend_operation_advanced

Already supported by blend lowering, just needs to be wired up.

Reviewed-by: Aitor Camacho <aitor@lunarg.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41888>
This commit is contained in:
squidbus 2026-05-29 00:14:15 -07:00 committed by Marge Bot
parent 8a65042bee
commit 2263841ced
3 changed files with 41 additions and 32 deletions

View file

@ -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+)

View file

@ -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,

View file

@ -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. */