summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineD3D12
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2019-08-17 03:05:01 +0000
committerEgor Yusov <egor.yusov@gmail.com>2019-08-17 03:05:01 +0000
commitf3497906e017b705e5a3c36bdf3ffbf0e4317f9c (patch)
treeb31cd56e567697e0d54b02cc3518e4ab8d99e2f3 /Graphics/GraphicsEngineD3D12
parentUpdated comments (diff)
downloadDiligentCore-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.cpp56
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)
{