Skip to content

Commit fdda503

Browse files
Direct3D: properly use render target write mask when independent blend is disabled
1 parent 67e54ee commit fdda503

File tree

1 file changed

+23
-12
lines changed

1 file changed

+23
-12
lines changed

Graphics/GraphicsEngineD3DBase/include/D3DTypeConversionImpl.hpp

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -303,21 +303,32 @@ void BlendStateDescToD3DBlendDesc(const BlendStateDesc& BSDesc, D3D_BLEND_DESC&
303303
// D3D_BLEND_DESC and D3D11_BLEND_DESC structures are identical
304304
d3d12BlendDesc.AlphaToCoverageEnable = BSDesc.AlphaToCoverageEnable ? TRUE : FALSE;
305305
d3d12BlendDesc.IndependentBlendEnable = BSDesc.IndependentBlendEnable ? TRUE : FALSE;
306+
307+
const RenderTargetBlendDesc& SrcRT0Desc = BSDesc.RenderTargets[0];
308+
306309
VERIFY(MAX_RENDER_TARGETS >= 8, "Number of render targets is expected to be at least 8");
307310
for (int i = 0; i < 8; ++i)
308311
{
309-
const RenderTargetBlendDesc& SrcRTDesc = BSDesc.RenderTargets[i];
310-
auto& DstRTDesc = d3d12BlendDesc.RenderTarget[i];
311-
312-
DstRTDesc.BlendEnable = SrcRTDesc.BlendEnable ? TRUE : FALSE;
313-
314-
DstRTDesc.SrcBlend = BlendFactorToD3DBlend<D3D_BLEND>(SrcRTDesc.SrcBlend);
315-
DstRTDesc.DestBlend = BlendFactorToD3DBlend<D3D_BLEND>(SrcRTDesc.DestBlend);
316-
DstRTDesc.BlendOp = BlendOperationToD3DBlendOp<D3D_BLEND_OP>(SrcRTDesc.BlendOp);
317-
318-
DstRTDesc.SrcBlendAlpha = BlendFactorToD3DBlend<D3D_BLEND>(SrcRTDesc.SrcBlendAlpha);
319-
DstRTDesc.DestBlendAlpha = BlendFactorToD3DBlend<D3D_BLEND>(SrcRTDesc.DestBlendAlpha);
320-
DstRTDesc.BlendOpAlpha = BlendOperationToD3DBlendOp<D3D_BLEND_OP>(SrcRTDesc.BlendOpAlpha);
312+
const RenderTargetBlendDesc& SrcRTDesc = BSDesc.RenderTargets[i];
313+
const RenderTargetBlendDesc& BlendRTDesc = BSDesc.IndependentBlendEnable ? SrcRTDesc : SrcRT0Desc;
314+
auto& DstRTDesc = d3d12BlendDesc.RenderTarget[i];
315+
316+
DstRTDesc.BlendEnable = BlendRTDesc.BlendEnable ? TRUE : FALSE;
317+
318+
DstRTDesc.SrcBlend = BlendFactorToD3DBlend<D3D_BLEND>(BlendRTDesc.SrcBlend);
319+
DstRTDesc.DestBlend = BlendFactorToD3DBlend<D3D_BLEND>(BlendRTDesc.DestBlend);
320+
DstRTDesc.BlendOp = BlendOperationToD3DBlendOp<D3D_BLEND_OP>(BlendRTDesc.BlendOp);
321+
322+
DstRTDesc.SrcBlendAlpha = BlendFactorToD3DBlend<D3D_BLEND>(BlendRTDesc.SrcBlendAlpha);
323+
DstRTDesc.DestBlendAlpha = BlendFactorToD3DBlend<D3D_BLEND>(BlendRTDesc.DestBlendAlpha);
324+
DstRTDesc.BlendOpAlpha = BlendOperationToD3DBlendOp<D3D_BLEND_OP>(BlendRTDesc.BlendOpAlpha);
325+
326+
if (SrcRTDesc.RenderTargetWriteMask != SrcRT0Desc.RenderTargetWriteMask)
327+
{
328+
// When independent blend is disabled, Direct3D only uses the render target 0 settings.
329+
// We, however, want to control the write mask for each render target even when independent blend is disabled.
330+
d3d12BlendDesc.IndependentBlendEnable = TRUE;
331+
}
321332

322333
DstRTDesc.RenderTargetWriteMask =
323334
((SrcRTDesc.RenderTargetWriteMask & COLOR_MASK_RED) ? D3D_COLOR_WRITE_ENABLE_RED : 0) |

0 commit comments

Comments
 (0)