From f16a7aa9d635829250a959ff8c045ef786e645aa Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Mon, 28 Mar 2022 09:36:29 +0200 Subject: [PATCH] dzn: Fix alpha blend factor translation When VK_BLEND_FACTOR_xxx_COLOR is passed to an alpha equation what we really want is the alpha component replicated on the RGBA channels, which has dedicated enums in D3D12. Let's make sure we use the right definition depending on the equation we're translating. Signed-off-by: Boris Brezillon Reviewed-by: Erik Faye-Lund Part-of: --- src/microsoft/vulkan/dzn_pipeline.cpp | 28 ++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/microsoft/vulkan/dzn_pipeline.cpp b/src/microsoft/vulkan/dzn_pipeline.cpp index f21ff8d00ec..d47663f1aee 100644 --- a/src/microsoft/vulkan/dzn_pipeline.cpp +++ b/src/microsoft/vulkan/dzn_pipeline.cpp @@ -592,15 +592,19 @@ dzn_graphics_pipeline_translate_zsa(dzn_graphics_pipeline *pipeline, } static D3D12_BLEND -translate_blend_factor(VkBlendFactor in) +translate_blend_factor(VkBlendFactor in, bool is_alpha) { switch (in) { case VK_BLEND_FACTOR_ZERO: return D3D12_BLEND_ZERO; case VK_BLEND_FACTOR_ONE: return D3D12_BLEND_ONE; - case VK_BLEND_FACTOR_SRC_COLOR: return D3D12_BLEND_SRC_COLOR; - case VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR: return D3D12_BLEND_INV_SRC_COLOR; - case VK_BLEND_FACTOR_DST_COLOR: return D3D12_BLEND_DEST_COLOR; - case VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR: return D3D12_BLEND_INV_DEST_COLOR; + case VK_BLEND_FACTOR_SRC_COLOR: + return is_alpha ? D3D12_BLEND_SRC_ALPHA : D3D12_BLEND_SRC_COLOR; + case VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR: + return is_alpha ? D3D12_BLEND_INV_SRC_ALPHA : D3D12_BLEND_INV_SRC_COLOR; + case VK_BLEND_FACTOR_DST_COLOR: + return is_alpha ? D3D12_BLEND_DEST_ALPHA : D3D12_BLEND_DEST_COLOR; + case VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR: + return is_alpha ? D3D12_BLEND_INV_DEST_ALPHA : D3D12_BLEND_INV_DEST_COLOR; case VK_BLEND_FACTOR_SRC_ALPHA: return D3D12_BLEND_SRC_ALPHA; case VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA: return D3D12_BLEND_INV_SRC_ALPHA; case VK_BLEND_FACTOR_DST_ALPHA: return D3D12_BLEND_DEST_ALPHA; @@ -612,8 +616,10 @@ translate_blend_factor(VkBlendFactor in) case VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR: case VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA: return D3D12_BLEND_INV_BLEND_FACTOR; - case VK_BLEND_FACTOR_SRC1_COLOR: return D3D12_BLEND_SRC1_COLOR; - case VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR: return D3D12_BLEND_INV_SRC1_COLOR; + case VK_BLEND_FACTOR_SRC1_COLOR: + return is_alpha ? D3D12_BLEND_SRC1_ALPHA : D3D12_BLEND_SRC1_COLOR; + case VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR: + return is_alpha ? D3D12_BLEND_INV_SRC1_ALPHA : D3D12_BLEND_INV_SRC1_COLOR; case VK_BLEND_FACTOR_SRC1_ALPHA: return D3D12_BLEND_SRC1_ALPHA; case VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA: return D3D12_BLEND_INV_SRC1_ALPHA; case VK_BLEND_FACTOR_SRC_ALPHA_SATURATE: return D3D12_BLEND_SRC_ALPHA_SAT; @@ -691,15 +697,15 @@ dzn_graphics_pipeline_translate_blend(dzn_graphics_pipeline *pipeline, out->BlendState.RenderTarget[i].LogicOp = logicop; } else { out->BlendState.RenderTarget[i].SrcBlend = - translate_blend_factor(in_blend->pAttachments[i].srcColorBlendFactor); + translate_blend_factor(in_blend->pAttachments[i].srcColorBlendFactor, false); out->BlendState.RenderTarget[i].DestBlend = - translate_blend_factor(in_blend->pAttachments[i].dstColorBlendFactor); + translate_blend_factor(in_blend->pAttachments[i].dstColorBlendFactor, false); out->BlendState.RenderTarget[i].BlendOp = translate_blend_op(in_blend->pAttachments[i].colorBlendOp); out->BlendState.RenderTarget[i].SrcBlendAlpha = - translate_blend_factor(in_blend->pAttachments[i].srcAlphaBlendFactor); + translate_blend_factor(in_blend->pAttachments[i].srcAlphaBlendFactor, true); out->BlendState.RenderTarget[i].DestBlendAlpha = - translate_blend_factor(in_blend->pAttachments[i].dstAlphaBlendFactor); + translate_blend_factor(in_blend->pAttachments[i].dstAlphaBlendFactor, true); out->BlendState.RenderTarget[i].BlendOpAlpha = translate_blend_op(in_blend->pAttachments[i].alphaBlendOp); }