diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2019-08-17 03:05:01 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2019-08-17 03:05:01 +0000 |
| commit | f3497906e017b705e5a3c36bdf3ffbf0e4317f9c (patch) | |
| tree | b31cd56e567697e0d54b02cc3518e4ab8d99e2f3 /Graphics/GraphicsEngineD3D12 | |
| parent | Updated comments (diff) | |
| download | DiligentCore-f3497906e017b705e5a3c36bdf3ffbf0e4317f9c.tar.gz DiligentCore-f3497906e017b705e5a3c36bdf3ffbf0e4317f9c.zip | |
D3D12 backend: fixed issue with the barriers when old and new states are the same (which may happen if present is called when no other commands were issued)
Diffstat (limited to 'Graphics/GraphicsEngineD3D12')
| -rw-r--r-- | Graphics/GraphicsEngineD3D12/src/CommandContext.cpp | 56 |
1 files changed, 32 insertions, 24 deletions
diff --git a/Graphics/GraphicsEngineD3D12/src/CommandContext.cpp b/Graphics/GraphicsEngineD3D12/src/CommandContext.cpp index e1f0b473..531f4a86 100644 --- a/Graphics/GraphicsEngineD3D12/src/CommandContext.cpp +++ b/Graphics/GraphicsEngineD3D12/src/CommandContext.cpp @@ -203,38 +203,46 @@ void CommandContext::TransitionResource(const StateTransitionDesc& Barrier) BarrierDesc.Transition.StateBefore = ResourceStateFlagsToD3D12ResourceStates(OldState); BarrierDesc.Transition.StateAfter = ResourceStateFlagsToD3D12ResourceStates(NewState); - if (pTextureD3D12Impl) + // Note that RESOURCE_STATE_UNDEFINED != RESOURCE_STATE_PRESENT, but + // D3D12_RESOURCE_STATE_COMMON == D3D12_RESOURCE_STATE_PRESENT + if (BarrierDesc.Transition.StateBefore != BarrierDesc.Transition.StateAfter) { - const auto& TexDesc = pTextureD3D12Impl->GetDesc(); - VERIFY(Barrier.FirstMipLevel < TexDesc.MipLevels, "First mip level is out of range"); - VERIFY(Barrier.MipLevelsCount == StateTransitionDesc::RemainingMipLevels || Barrier.FirstMipLevel + Barrier.MipLevelsCount <= TexDesc.MipLevels, - "Invalid mip level range "); - VERIFY(Barrier.FirstArraySlice < TexDesc.ArraySize, "First array slice is out of range"); - VERIFY(Barrier.ArraySliceCount == StateTransitionDesc::RemainingArraySlices || Barrier.FirstArraySlice + Barrier.ArraySliceCount <= TexDesc.ArraySize, - "Invalid array slice range "); - - if (Barrier.FirstMipLevel == 0 && (Barrier.MipLevelsCount == StateTransitionDesc::RemainingMipLevels || Barrier.MipLevelsCount == TexDesc.MipLevels) && - Barrier.FirstArraySlice == 0 && (Barrier.ArraySliceCount == StateTransitionDesc::RemainingArraySlices || Barrier.ArraySliceCount == TexDesc.ArraySize)) - { - BarrierDesc.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; - m_PendingResourceBarriers.emplace_back(BarrierDesc); - } - else + if (pTextureD3D12Impl) { - Uint32 EndMip = Barrier.MipLevelsCount == StateTransitionDesc::RemainingMipLevels ? TexDesc.MipLevels : Barrier.FirstMipLevel + Barrier.MipLevelsCount; - Uint32 EndSlice = Barrier.ArraySliceCount == StateTransitionDesc::RemainingArraySlices ? TexDesc.ArraySize : Barrier.FirstArraySlice + Barrier.ArraySliceCount; - for(Uint32 mip = Barrier.FirstMipLevel; mip < EndMip; ++mip) + const auto& TexDesc = pTextureD3D12Impl->GetDesc(); + VERIFY(Barrier.FirstMipLevel < TexDesc.MipLevels, "First mip level is out of range"); + VERIFY(Barrier.MipLevelsCount == StateTransitionDesc::RemainingMipLevels || Barrier.FirstMipLevel + Barrier.MipLevelsCount <= TexDesc.MipLevels, + "Invalid mip level range "); + VERIFY(Barrier.FirstArraySlice < TexDesc.ArraySize, "First array slice is out of range"); + VERIFY(Barrier.ArraySliceCount == StateTransitionDesc::RemainingArraySlices || Barrier.FirstArraySlice + Barrier.ArraySliceCount <= TexDesc.ArraySize, + "Invalid array slice range "); + + if (Barrier.FirstMipLevel == 0 && (Barrier.MipLevelsCount == StateTransitionDesc::RemainingMipLevels || Barrier.MipLevelsCount == TexDesc.MipLevels) && + Barrier.FirstArraySlice == 0 && (Barrier.ArraySliceCount == StateTransitionDesc::RemainingArraySlices || Barrier.ArraySliceCount == TexDesc.ArraySize)) + { + BarrierDesc.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; + m_PendingResourceBarriers.emplace_back(BarrierDesc); + } + else { - for(Uint32 slice = Barrier.FirstArraySlice; slice < EndSlice; ++slice) + Uint32 EndMip = Barrier.MipLevelsCount == StateTransitionDesc::RemainingMipLevels ? TexDesc.MipLevels : Barrier.FirstMipLevel + Barrier.MipLevelsCount; + Uint32 EndSlice = Barrier.ArraySliceCount == StateTransitionDesc::RemainingArraySlices ? TexDesc.ArraySize : Barrier.FirstArraySlice + Barrier.ArraySliceCount; + for(Uint32 mip = Barrier.FirstMipLevel; mip < EndMip; ++mip) { - BarrierDesc.Transition.Subresource = D3D12CalcSubresource(mip, slice, 0, TexDesc.MipLevels, TexDesc.ArraySize); - m_PendingResourceBarriers.emplace_back(BarrierDesc); + for(Uint32 slice = Barrier.FirstArraySlice; slice < EndSlice; ++slice) + { + BarrierDesc.Transition.Subresource = D3D12CalcSubresource(mip, slice, 0, TexDesc.MipLevels, TexDesc.ArraySize); + m_PendingResourceBarriers.emplace_back(BarrierDesc); + } } } } + else + { + VERIFY_EXPR(pBufferD3D12Impl); + m_PendingResourceBarriers.emplace_back(BarrierDesc); + } } - else - m_PendingResourceBarriers.emplace_back(BarrierDesc); if (pTextureD3D12Impl) { |
