42 lines
1.5 KiB
C++
42 lines
1.5 KiB
C++
|
// 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
|