diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2018-11-21 03:38:52 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2018-11-21 03:38:52 +0000 |
| commit | 3d9f381db2749ec19e5f49b9d095da95445cb806 (patch) | |
| tree | 73c50e25aebfc353b348de3edfeb76f3090ac625 /Graphics/GraphicsEngineVulkan | |
| parent | Implemented explicit layout transitions in Vulkan backend (diff) | |
| download | DiligentCore-3d9f381db2749ec19e5f49b9d095da95445cb806.tar.gz DiligentCore-3d9f381db2749ec19e5f49b9d095da95445cb806.zip | |
Implemented explicit state transitions in D3D11 backend (closed https://github.com/DiligentGraphics/DiligentCore/issues/6)
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
| -rw-r--r-- | Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp | 44 |
1 files changed, 15 insertions, 29 deletions
diff --git a/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp index d9cc8bf6..5e2402f7 100644 --- a/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp +++ b/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp @@ -1648,9 +1648,6 @@ namespace Diligent void DeviceContextVkImpl::TransitionBufferState(BufferVkImpl& BufferVk, RESOURCE_STATE OldState, RESOURCE_STATE NewState, bool UpdateBufferState) { - DEV_CHECK_ERR(BufferVk.m_VulkanBuffer != VK_NULL_HANDLE, "Cannot transition suballocated buffer"); - VERIFY_EXPR(BufferVk.GetDynamicOffset(m_ContextId, this) == 0); - EnsureVkCmdBuffer(); if (OldState == RESOURCE_STATE_UNKNOWN) { @@ -1673,15 +1670,20 @@ namespace Diligent " specified by the barrier"); } } - DEV_CHECK_ERR((OldState & NewState) != NewState, "The buffer is already in requested state"); - auto vkBuff = BufferVk.GetVkBuffer(); - auto OldAccessFlags = ResourceStateFlagsToVkAccessFlags(OldState); - auto NewAccessFlags = ResourceStateFlagsToVkAccessFlags(NewState); - m_CommandBuffer.BufferMemoryBarrier(vkBuff, OldAccessFlags, NewAccessFlags); - if (UpdateBufferState) + if ((OldState & NewState) != NewState) { - BufferVk.SetState(NewState); + DEV_CHECK_ERR(BufferVk.m_VulkanBuffer != VK_NULL_HANDLE, "Cannot transition suballocated buffer"); + VERIFY_EXPR(BufferVk.GetDynamicOffset(m_ContextId, this) == 0); + + auto vkBuff = BufferVk.GetVkBuffer(); + auto OldAccessFlags = ResourceStateFlagsToVkAccessFlags(OldState); + auto NewAccessFlags = ResourceStateFlagsToVkAccessFlags(NewState); + m_CommandBuffer.BufferMemoryBarrier(vkBuff, OldAccessFlags, NewAccessFlags); + if (UpdateBufferState) + { + BufferVk.SetState(NewState); + } } } @@ -1704,28 +1706,12 @@ namespace Diligent for(Uint32 i=0; i < BarrierCount; ++i) { const auto& Barrier = pResourceBarriers[i]; - DEV_CHECK_ERR( (Barrier.pTexture != nullptr) ^ (Barrier.pBuffer != nullptr), "Exactly one of pTexture or pBuffer must not be null"); - DEV_CHECK_ERR(Barrier.NewState != RESOURCE_STATE_UNKNOWN, "New resource state can't be unknown"); +#ifdef DEVELOPMENT + DvpVerifyStateTransitionDesc(Barrier); +#endif if (Barrier.pTexture) { auto* pTextureVkImpl = ValidatedCast<TextureVkImpl>(Barrier.pTexture); -#ifdef DEVELOPMENT - { - const auto& TexDesc = pTextureVkImpl->GetDesc(); - DEV_CHECK_ERR(Barrier.FirstMipLevel < TexDesc.MipLevels, "First mip level (", Barrier.FirstMipLevel, ") specified by the barrier is " - "out of range. Texture \'", TexDesc.Name, "\' has only ", TexDesc.MipLevels, " mip level(s)"); - DEV_CHECK_ERR(Barrier.MipLevelsCount == StateTransitionDesc::RemainingMipLevels || Barrier.FirstMipLevel + Barrier.MipLevelsCount < TexDesc.MipLevels, - "Mip level range ", Barrier.FirstMipLevel, "..", Barrier.FirstMipLevel+Barrier.MipLevelsCount-1, " " - "specified by the barrier is out of range. Texture \'", TexDesc.Name, "\' has only ", TexDesc.MipLevels, " mip level(s)"); - - DEV_CHECK_ERR(Barrier.FirstArraySlice < TexDesc.ArraySize, "First array slice (", Barrier.FirstArraySlice, ") specified by the barrier is " - "out of range. Array size of texture \'", TexDesc.Name, "\' is ", TexDesc.ArraySize); - DEV_CHECK_ERR(Barrier.ArraySliceCount == StateTransitionDesc::RemainingArraySlices || Barrier.FirstArraySlice + Barrier.ArraySliceCount < TexDesc.ArraySize, - "Array slice range ", Barrier.FirstArraySlice, "..", Barrier.FirstArraySlice+Barrier.ArraySliceCount-1, " " - "specified by the barrier is out of range. Array size of texture \'", TexDesc.Name, "\' is ", TexDesc.ArraySize); - } -#endif - VkImageSubresourceRange SubResRange; SubResRange.aspectMask = 0; SubResRange.baseMipLevel = Barrier.FirstMipLevel; |
