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()