rpcsx/rpcs3/Emu/RSX/VK/vkutils/descriptors.hpp
kd-11 c2cbc62be6 vk: Refactor some uber-headers
- VKHelpers was the rug everything was swept under for a long time.
  This commit essentially deprecates its usage across most of the backend.
2021-01-10 12:04:31 +03:00

74 lines
1.7 KiB
C++

#pragma once
#include "../VulkanAPI.h"
#include "device.h"
#include <vector>
namespace vk
{
class descriptor_pool
{
const vk::render_device* m_owner = nullptr;
std::vector<VkDescriptorPool> m_device_pools;
VkDescriptorPool m_current_pool_handle = VK_NULL_HANDLE;
u32 m_current_pool_index = 0;
public:
descriptor_pool() = default;
~descriptor_pool() = default;
void create(const vk::render_device& dev, VkDescriptorPoolSize* sizes, u32 size_descriptors_count, u32 max_sets, u8 subpool_count)
{
ensure(subpool_count);
VkDescriptorPoolCreateInfo infos = {};
infos.flags = 0;
infos.maxSets = max_sets;
infos.poolSizeCount = size_descriptors_count;
infos.pPoolSizes = sizes;
infos.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
m_owner = &dev;
m_device_pools.resize(subpool_count);
for (auto& pool : m_device_pools)
{
CHECK_RESULT(vkCreateDescriptorPool(dev, &infos, nullptr, &pool));
}
m_current_pool_handle = m_device_pools[0];
}
void destroy()
{
if (m_device_pools.empty()) return;
for (auto& pool : m_device_pools)
{
vkDestroyDescriptorPool((*m_owner), pool, nullptr);
pool = VK_NULL_HANDLE;
}
m_owner = nullptr;
}
bool valid()
{
return (!m_device_pools.empty());
}
operator VkDescriptorPool()
{
return m_current_pool_handle;
}
void reset(VkDescriptorPoolResetFlags flags)
{
m_current_pool_index = (m_current_pool_index + 1) % u32(m_device_pools.size());
m_current_pool_handle = m_device_pools[m_current_pool_index];
CHECK_RESULT(vkResetDescriptorPool(*m_owner, m_current_pool_handle, flags));
}
};
}