summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineVulkan
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2018-11-21 03:38:52 +0000
committerEgor Yusov <egor.yusov@gmail.com>2018-11-21 03:38:52 +0000
commit3d9f381db2749ec19e5f49b9d095da95445cb806 (patch)
tree73c50e25aebfc353b348de3edfeb76f3090ac625 /Graphics/GraphicsEngineVulkan
parentImplemented explicit layout transitions in Vulkan backend (diff)
downloadDiligentCore-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.cpp44
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;