@@ -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