summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_vulkan/vk_command_pool.cpp
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2020-09-24 03:24:27 +0200
committerGitHub <noreply@github.com>2020-09-24 03:24:27 +0200
commitd66b897a6d7a2a0bc0a3910fbdb7c1c6028c21d0 (patch)
tree7417466362259dae2d1a690d6aef8dcbc14a0b12 /src/video_core/renderer_vulkan/vk_command_pool.cpp
parentMerge pull request #4618 from german77/GcAdapterAutoMap (diff)
parentvk_query_cache: Hack counter destructor to avoid reserving queries (diff)
downloadyuzu-d66b897a6d7a2a0bc0a3910fbdb7c1c6028c21d0.tar
yuzu-d66b897a6d7a2a0bc0a3910fbdb7c1c6028c21d0.tar.gz
yuzu-d66b897a6d7a2a0bc0a3910fbdb7c1c6028c21d0.tar.bz2
yuzu-d66b897a6d7a2a0bc0a3910fbdb7c1c6028c21d0.tar.lz
yuzu-d66b897a6d7a2a0bc0a3910fbdb7c1c6028c21d0.tar.xz
yuzu-d66b897a6d7a2a0bc0a3910fbdb7c1c6028c21d0.tar.zst
yuzu-d66b897a6d7a2a0bc0a3910fbdb7c1c6028c21d0.zip
Diffstat (limited to 'src/video_core/renderer_vulkan/vk_command_pool.cpp')
-rw-r--r--src/video_core/renderer_vulkan/vk_command_pool.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/video_core/renderer_vulkan/vk_command_pool.cpp b/src/video_core/renderer_vulkan/vk_command_pool.cpp
new file mode 100644
index 000000000..f1abd4b1a
--- /dev/null
+++ b/src/video_core/renderer_vulkan/vk_command_pool.cpp
@@ -0,0 +1,41 @@
+// Copyright 2020 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <cstddef>
+
+#include "video_core/renderer_vulkan/vk_command_pool.h"
+#include "video_core/renderer_vulkan/vk_device.h"
+#include "video_core/renderer_vulkan/wrapper.h"
+
+namespace Vulkan {
+
+constexpr size_t COMMAND_BUFFER_POOL_SIZE = 0x1000;
+
+CommandPool::CommandPool(MasterSemaphore& master_semaphore, const VKDevice& device)
+ : ResourcePool(master_semaphore, COMMAND_BUFFER_POOL_SIZE), device{device} {}
+
+CommandPool::~CommandPool() = default;
+
+void CommandPool::Allocate(size_t begin, size_t end) {
+ // Command buffers are going to be commited, recorded, executed every single usage cycle.
+ // They are also going to be reseted when commited.
+ Pool& pool = pools.emplace_back();
+ pool.handle = device.GetLogical().CreateCommandPool({
+ .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
+ .pNext = nullptr,
+ .flags =
+ VK_COMMAND_POOL_CREATE_TRANSIENT_BIT | VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
+ .queueFamilyIndex = device.GetGraphicsFamily(),
+ });
+ pool.cmdbufs = pool.handle.Allocate(COMMAND_BUFFER_POOL_SIZE);
+}
+
+VkCommandBuffer CommandPool::Commit() {
+ const size_t index = CommitResource();
+ const auto pool_index = index / COMMAND_BUFFER_POOL_SIZE;
+ const auto sub_index = index % COMMAND_BUFFER_POOL_SIZE;
+ return pools[pool_index].cmdbufs[sub_index];
+}
+
+} // namespace Vulkan