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 <boris.brezillon@collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15608>
This commit is contained in:
Boris Brezillon 2022-03-28 09:36:29 +02:00 committed by Marge Bot
parent 738a6760e3
commit f16a7aa9d6

View file

@ -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);
}