From 53061c63feef3b6ea6d455f6c012195a0e57f226 Mon Sep 17 00:00:00 2001 From: goldislead <69987043+goldislead@users.noreply.github.com> Date: Fri, 7 Aug 2026 19:37:00 -0700 Subject: [PATCH] [Vulkan] Use dedicated alpha blend factor map for alpha srcb/dest blend Matches D3D12. Co-authored-by: Herman S. <429230+has207@users.noreply.github.com> --- src/xenia/gpu/vulkan/vulkan_pipeline_cache.cc | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/xenia/gpu/vulkan/vulkan_pipeline_cache.cc b/src/xenia/gpu/vulkan/vulkan_pipeline_cache.cc index 5c7d01dca..2ac252ba1 100644 --- a/src/xenia/gpu/vulkan/vulkan_pipeline_cache.cc +++ b/src/xenia/gpu/vulkan/vulkan_pipeline_cache.cc @@ -1126,15 +1126,37 @@ void VulkanPipelineCache::WritePipelineRenderTargetDescription( /* 15 */ PipelineBlendFactor::kOneMinusConstantAlpha, /* 16 */ PipelineBlendFactor::kSrcAlphaSaturate, }; + // Like kBlendFactorMap, but with the color factors changed to their alpha + // equivalents. Alpha is scalar, so hardware treats a _COLOR factor in the + // alpha slot as the matching _ALPHA factor. + static constexpr PipelineBlendFactor kBlendFactorAlphaMap[32] = { + /* 0 */ PipelineBlendFactor::kZero, + /* 1 */ PipelineBlendFactor::kOne, + /* 2 */ PipelineBlendFactor::kZero, // ? + /* 3 */ PipelineBlendFactor::kZero, // ? + /* 4 */ PipelineBlendFactor::kSrcAlpha, + /* 5 */ PipelineBlendFactor::kOneMinusSrcAlpha, + /* 6 */ PipelineBlendFactor::kSrcAlpha, + /* 7 */ PipelineBlendFactor::kOneMinusSrcAlpha, + /* 8 */ PipelineBlendFactor::kDstAlpha, + /* 9 */ PipelineBlendFactor::kOneMinusDstAlpha, + /* 10 */ PipelineBlendFactor::kDstAlpha, + /* 11 */ PipelineBlendFactor::kOneMinusDstAlpha, + /* 12 */ PipelineBlendFactor::kConstantAlpha, + /* 13 */ PipelineBlendFactor::kOneMinusConstantAlpha, + /* 14 */ PipelineBlendFactor::kConstantAlpha, + /* 15 */ PipelineBlendFactor::kOneMinusConstantAlpha, + /* 16 */ PipelineBlendFactor::kSrcAlphaSaturate, + }; render_target_out.src_color_blend_factor = kBlendFactorMap[uint32_t(blend_control.color_srcblend)]; render_target_out.dst_color_blend_factor = kBlendFactorMap[uint32_t(blend_control.color_destblend)]; render_target_out.color_blend_op = blend_control.color_comb_fcn; render_target_out.src_alpha_blend_factor = - kBlendFactorMap[uint32_t(blend_control.alpha_srcblend)]; + kBlendFactorAlphaMap[uint32_t(blend_control.alpha_srcblend)]; render_target_out.dst_alpha_blend_factor = - kBlendFactorMap[uint32_t(blend_control.alpha_destblend)]; + kBlendFactorAlphaMap[uint32_t(blend_control.alpha_destblend)]; render_target_out.alpha_blend_op = blend_control.alpha_comb_fcn; if (!command_processor_.GetVulkanDevice() ->properties()