summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp
diff options
context:
space:
mode:
authorshuffle2 <godisgovernment@gmail.com>2016-10-04 01:47:59 -0700
committerGitHub <noreply@github.com>2016-10-04 01:47:59 -0700
commitea33405febf183058bb30a22f4f627fed4bb8e17 (patch)
tree6222aceb31b2d6d922a8b3e45331b42fa1abba2d /Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp
parent037f0a1803c274ce7e9f97ff9b7baed2955b9004 (diff)
parent28e5fa8d261cd486e9339a66d91b4713e83d9a14 (diff)
Merge pull request #4270 from stenzek/vulkan-defer-fix
Vulkan: Miscellaneous minor fixes
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp')
-rw-r--r--Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp52
1 files changed, 47 insertions, 5 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp b/Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp
index 537c21c514..202c3f6777 100644
--- a/Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp
+++ b/Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp
@@ -73,7 +73,7 @@ void CommandBufferManager::DestroyCommandPool()
if (m_command_pool)
{
vkDestroyCommandPool(g_vulkan_context->GetDevice(), m_command_pool, nullptr);
- m_command_pool = nullptr;
+ m_command_pool = VK_NULL_HANDLE;
}
}
@@ -141,8 +141,8 @@ void CommandBufferManager::DestroyCommandBuffers()
for (FrameResources& resources : m_frame_resources)
{
- for (const auto& it : resources.cleanup_resources)
- it.destroy_callback(device, it.object);
+ for (auto& it : resources.cleanup_resources)
+ it();
resources.cleanup_resources.clear();
if (resources.fence != VK_NULL_HANDLE)
@@ -385,8 +385,8 @@ void CommandBufferManager::OnCommandBufferExecuted(size_t index)
iter.second.second(resources.fence);
// Clean up all objects pending destruction on this command buffer
- for (const auto& it : resources.cleanup_resources)
- it.destroy_callback(g_vulkan_context->GetDevice(), it.object);
+ for (auto& it : resources.cleanup_resources)
+ it();
resources.cleanup_resources.clear();
}
@@ -446,6 +446,48 @@ void CommandBufferManager::ExecuteCommandBuffer(bool submit_off_thread, bool wai
WaitForFence(pending_fence);
}
+void CommandBufferManager::DeferBufferDestruction(VkBuffer object)
+{
+ FrameResources& resources = m_frame_resources[m_current_frame];
+ resources.cleanup_resources.push_back(
+ [object]() { vkDestroyBuffer(g_vulkan_context->GetDevice(), object, nullptr); });
+}
+
+void CommandBufferManager::DeferBufferViewDestruction(VkBufferView object)
+{
+ FrameResources& resources = m_frame_resources[m_current_frame];
+ resources.cleanup_resources.push_back(
+ [object]() { vkDestroyBufferView(g_vulkan_context->GetDevice(), object, nullptr); });
+}
+
+void CommandBufferManager::DeferDeviceMemoryDestruction(VkDeviceMemory object)
+{
+ FrameResources& resources = m_frame_resources[m_current_frame];
+ resources.cleanup_resources.push_back(
+ [object]() { vkFreeMemory(g_vulkan_context->GetDevice(), object, nullptr); });
+}
+
+void CommandBufferManager::DeferFramebufferDestruction(VkFramebuffer object)
+{
+ FrameResources& resources = m_frame_resources[m_current_frame];
+ resources.cleanup_resources.push_back(
+ [object]() { vkDestroyFramebuffer(g_vulkan_context->GetDevice(), object, nullptr); });
+}
+
+void CommandBufferManager::DeferImageDestruction(VkImage object)
+{
+ FrameResources& resources = m_frame_resources[m_current_frame];
+ resources.cleanup_resources.push_back(
+ [object]() { vkDestroyImage(g_vulkan_context->GetDevice(), object, nullptr); });
+}
+
+void CommandBufferManager::DeferImageViewDestruction(VkImageView object)
+{
+ FrameResources& resources = m_frame_resources[m_current_frame];
+ resources.cleanup_resources.push_back(
+ [object]() { vkDestroyImageView(g_vulkan_context->GetDevice(), object, nullptr); });
+}
+
void CommandBufferManager::AddFencePointCallback(
const void* key, const CommandBufferQueuedCallback& queued_callback,
const CommandBufferExecutedCallback& executed_callback)