diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2020-08-18 16:52:43 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2020-08-19 18:23:52 +0200 |
commit | 2da2e24bbc9511776c0d4ad5c60d0de5dff54e4b (patch) | |
tree | d068ddfc7da368da66323cb89a5be520e03c577a /src/gui | |
parent | 7773f7f90ebd806c5890de944f27957411583f82 (diff) |
rhi: d3d11: Enable setting xxxColor as an alpha src/dst blend factor
Fixes: QTBUG-86111
Pick-to: 5.15
Change-Id: Iabcf1708ea65e9f05f39caf9df9b45c25ac5dbb8
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/rhi/qrhid3d11.cpp | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/src/gui/rhi/qrhid3d11.cpp b/src/gui/rhi/qrhid3d11.cpp index 0ebd190ca6..f105d01e4f 100644 --- a/src/gui/rhi/qrhid3d11.cpp +++ b/src/gui/rhi/qrhid3d11.cpp @@ -3616,21 +3616,27 @@ static inline UINT8 toD3DColorWriteMask(QRhiGraphicsPipeline::ColorMask c) return f; } -static inline D3D11_BLEND toD3DBlendFactor(QRhiGraphicsPipeline::BlendFactor f) +static inline D3D11_BLEND toD3DBlendFactor(QRhiGraphicsPipeline::BlendFactor f, bool rgb) { + // SrcBlendAlpha and DstBlendAlpha do not accept *_COLOR. With other APIs + // this is handled internally (so that e.g. VK_BLEND_FACTOR_SRC_COLOR is + // accepted and is in effect equivalent to VK_BLEND_FACTOR_SRC_ALPHA when + // set as an alpha src/dest factor), but for D3D we have to take care of it + // ourselves. Hence the rgb argument. + switch (f) { case QRhiGraphicsPipeline::Zero: return D3D11_BLEND_ZERO; case QRhiGraphicsPipeline::One: return D3D11_BLEND_ONE; case QRhiGraphicsPipeline::SrcColor: - return D3D11_BLEND_SRC_COLOR; + return rgb ? D3D11_BLEND_SRC_COLOR : D3D11_BLEND_SRC_ALPHA; case QRhiGraphicsPipeline::OneMinusSrcColor: - return D3D11_BLEND_INV_SRC_COLOR; + return rgb ? D3D11_BLEND_INV_SRC_COLOR : D3D11_BLEND_INV_SRC_ALPHA; case QRhiGraphicsPipeline::DstColor: - return D3D11_BLEND_DEST_COLOR; + return rgb ? D3D11_BLEND_DEST_COLOR : D3D11_BLEND_DEST_ALPHA; case QRhiGraphicsPipeline::OneMinusDstColor: - return D3D11_BLEND_INV_DEST_COLOR; + return rgb ? D3D11_BLEND_INV_DEST_COLOR : D3D11_BLEND_INV_DEST_ALPHA; case QRhiGraphicsPipeline::SrcAlpha: return D3D11_BLEND_SRC_ALPHA; case QRhiGraphicsPipeline::OneMinusSrcAlpha: @@ -3648,9 +3654,9 @@ static inline D3D11_BLEND toD3DBlendFactor(QRhiGraphicsPipeline::BlendFactor f) case QRhiGraphicsPipeline::SrcAlphaSaturate: return D3D11_BLEND_SRC_ALPHA_SAT; case QRhiGraphicsPipeline::Src1Color: - return D3D11_BLEND_SRC1_COLOR; + return rgb ? D3D11_BLEND_SRC1_COLOR : D3D11_BLEND_SRC1_ALPHA; case QRhiGraphicsPipeline::OneMinusSrc1Color: - return D3D11_BLEND_INV_SRC1_COLOR; + return rgb ? D3D11_BLEND_INV_SRC1_COLOR : D3D11_BLEND_INV_SRC1_ALPHA; case QRhiGraphicsPipeline::Src1Alpha: return D3D11_BLEND_SRC1_ALPHA; case QRhiGraphicsPipeline::OneMinusSrc1Alpha: @@ -3822,11 +3828,11 @@ bool QD3D11GraphicsPipeline::create() D3D11_RENDER_TARGET_BLEND_DESC blend; memset(&blend, 0, sizeof(blend)); blend.BlendEnable = b.enable; - blend.SrcBlend = toD3DBlendFactor(b.srcColor); - blend.DestBlend = toD3DBlendFactor(b.dstColor); + blend.SrcBlend = toD3DBlendFactor(b.srcColor, true); + blend.DestBlend = toD3DBlendFactor(b.dstColor, true); blend.BlendOp = toD3DBlendOp(b.opColor); - blend.SrcBlendAlpha = toD3DBlendFactor(b.srcAlpha); - blend.DestBlendAlpha = toD3DBlendFactor(b.dstAlpha); + blend.SrcBlendAlpha = toD3DBlendFactor(b.srcAlpha, false); + blend.DestBlendAlpha = toD3DBlendFactor(b.dstAlpha, false); blend.BlendOpAlpha = toD3DBlendOp(b.opAlpha); blend.RenderTargetWriteMask = toD3DColorWriteMask(b.colorWrite); blendDesc.RenderTarget[i] = blend; |