2020-01-01 20:44:06 +01:00
|
|
|
// Copyright 2019 yuzu Emulator Project
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
2020-09-10 08:43:30 +02:00
|
|
|
#include "video_core/renderer_vulkan/vk_resource_pool.h"
|
2020-12-25 01:30:11 +01:00
|
|
|
#include "video_core/vulkan_common/vulkan_wrapper.h"
|
2020-01-01 20:44:06 +01:00
|
|
|
|
|
|
|
namespace Vulkan {
|
|
|
|
|
2020-12-26 05:10:53 +01:00
|
|
|
class Device;
|
2020-01-01 20:44:06 +01:00
|
|
|
class VKDescriptorPool;
|
2020-09-10 08:43:30 +02:00
|
|
|
class VKScheduler;
|
2020-01-01 20:44:06 +01:00
|
|
|
|
2020-09-10 08:43:30 +02:00
|
|
|
class DescriptorAllocator final : public ResourcePool {
|
2020-01-01 20:44:06 +01:00
|
|
|
public:
|
2021-02-17 04:59:28 +01:00
|
|
|
explicit DescriptorAllocator() = default;
|
2020-03-27 05:33:21 +01:00
|
|
|
explicit DescriptorAllocator(VKDescriptorPool& descriptor_pool, VkDescriptorSetLayout layout);
|
2021-02-17 04:59:28 +01:00
|
|
|
~DescriptorAllocator() override = default;
|
|
|
|
|
|
|
|
DescriptorAllocator& operator=(DescriptorAllocator&&) noexcept = default;
|
|
|
|
DescriptorAllocator(DescriptorAllocator&&) noexcept = default;
|
2020-01-01 20:44:06 +01:00
|
|
|
|
2020-09-10 08:43:30 +02:00
|
|
|
DescriptorAllocator& operator=(const DescriptorAllocator&) = delete;
|
2020-01-01 20:44:06 +01:00
|
|
|
DescriptorAllocator(const DescriptorAllocator&) = delete;
|
|
|
|
|
2020-09-10 08:43:30 +02:00
|
|
|
VkDescriptorSet Commit();
|
2020-01-01 20:44:06 +01:00
|
|
|
|
|
|
|
protected:
|
|
|
|
void Allocate(std::size_t begin, std::size_t end) override;
|
|
|
|
|
|
|
|
private:
|
2021-02-17 04:59:28 +01:00
|
|
|
VKDescriptorPool* descriptor_pool{};
|
|
|
|
VkDescriptorSetLayout layout{};
|
2020-01-01 20:44:06 +01:00
|
|
|
|
2020-03-27 05:33:21 +01:00
|
|
|
std::vector<vk::DescriptorSets> descriptors_allocations;
|
2020-01-01 20:44:06 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
class VKDescriptorPool final {
|
|
|
|
friend DescriptorAllocator;
|
|
|
|
|
|
|
|
public:
|
2020-12-26 05:10:53 +01:00
|
|
|
explicit VKDescriptorPool(const Device& device, VKScheduler& scheduler);
|
2020-01-01 20:44:06 +01:00
|
|
|
~VKDescriptorPool();
|
|
|
|
|
2020-09-10 08:43:30 +02:00
|
|
|
VKDescriptorPool(const VKDescriptorPool&) = delete;
|
|
|
|
VKDescriptorPool& operator=(const VKDescriptorPool&) = delete;
|
|
|
|
|
2020-01-01 20:44:06 +01:00
|
|
|
private:
|
2020-03-27 05:33:21 +01:00
|
|
|
vk::DescriptorPool* AllocateNewPool();
|
2020-01-01 20:44:06 +01:00
|
|
|
|
2020-03-27 05:33:21 +01:00
|
|
|
vk::DescriptorSets AllocateDescriptors(VkDescriptorSetLayout layout, std::size_t count);
|
2020-01-01 20:44:06 +01:00
|
|
|
|
2020-12-26 05:10:53 +01:00
|
|
|
const Device& device;
|
2020-09-10 08:43:30 +02:00
|
|
|
MasterSemaphore& master_semaphore;
|
2020-01-01 20:44:06 +01:00
|
|
|
|
2020-03-27 05:33:21 +01:00
|
|
|
std::vector<vk::DescriptorPool> pools;
|
|
|
|
vk::DescriptorPool* active_pool;
|
2020-01-01 20:44:06 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace Vulkan
|