summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_vulkan/vk_descriptor_pool.h
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2021-04-25 05:15:32 +0200
committerameerj <52414509+ameerj@users.noreply.github.com>2021-07-23 03:51:29 +0200
commit2f3c3dfc10a318f63862c4976f0608ea50c19387 (patch)
tree243109289cc347fe1e8d3ea8adee8e32c791af3b /src/video_core/renderer_vulkan/vk_descriptor_pool.h
parentvk_graphics_pipeline: Generate specialized pipeline config functions and improve code (diff)
downloadyuzu-2f3c3dfc10a318f63862c4976f0608ea50c19387.tar
yuzu-2f3c3dfc10a318f63862c4976f0608ea50c19387.tar.gz
yuzu-2f3c3dfc10a318f63862c4976f0608ea50c19387.tar.bz2
yuzu-2f3c3dfc10a318f63862c4976f0608ea50c19387.tar.lz
yuzu-2f3c3dfc10a318f63862c4976f0608ea50c19387.tar.xz
yuzu-2f3c3dfc10a318f63862c4976f0608ea50c19387.tar.zst
yuzu-2f3c3dfc10a318f63862c4976f0608ea50c19387.zip
Diffstat (limited to 'src/video_core/renderer_vulkan/vk_descriptor_pool.h')
-rw-r--r--src/video_core/renderer_vulkan/vk_descriptor_pool.h62
1 files changed, 43 insertions, 19 deletions
diff --git a/src/video_core/renderer_vulkan/vk_descriptor_pool.h b/src/video_core/renderer_vulkan/vk_descriptor_pool.h
index 2501f9967..59466aac5 100644
--- a/src/video_core/renderer_vulkan/vk_descriptor_pool.h
+++ b/src/video_core/renderer_vulkan/vk_descriptor_pool.h
@@ -4,21 +4,38 @@
#pragma once
+#include <shared_mutex>
+#include <span>
#include <vector>
+#include "shader_recompiler/shader_info.h"
#include "video_core/renderer_vulkan/vk_resource_pool.h"
#include "video_core/vulkan_common/vulkan_wrapper.h"
namespace Vulkan {
class Device;
-class VKDescriptorPool;
class VKScheduler;
+struct DescriptorBank;
+
+struct DescriptorBankInfo {
+ [[nodiscard]] bool IsSuperset(const DescriptorBankInfo& subset) const noexcept;
+
+ u32 uniform_buffers{}; ///< Number of uniform buffer descriptors
+ u32 storage_buffers{}; ///< Number of storage buffer descriptors
+ u32 texture_buffers{}; ///< Number of texture buffer descriptors
+ u32 image_buffers{}; ///< Number of image buffer descriptors
+ u32 textures{}; ///< Number of texture descriptors
+ u32 images{}; ///< Number of image descriptors
+ s32 score{}; ///< Number of descriptors in total
+};
+
class DescriptorAllocator final : public ResourcePool {
+ friend class DescriptorPool;
+
public:
explicit DescriptorAllocator() = default;
- explicit DescriptorAllocator(VKDescriptorPool& descriptor_pool, VkDescriptorSetLayout layout);
~DescriptorAllocator() override = default;
DescriptorAllocator& operator=(DescriptorAllocator&&) noexcept = default;
@@ -29,36 +46,43 @@ public:
VkDescriptorSet Commit();
-protected:
- void Allocate(std::size_t begin, std::size_t end) override;
-
private:
- VKDescriptorPool* descriptor_pool{};
+ explicit DescriptorAllocator(const Device& device_, MasterSemaphore& master_semaphore_,
+ DescriptorBank& bank_, VkDescriptorSetLayout layout_);
+
+ void Allocate(size_t begin, size_t end) override;
+
+ vk::DescriptorSets AllocateDescriptors(size_t count);
+
+ const Device* device{};
+ DescriptorBank* bank{};
VkDescriptorSetLayout layout{};
- std::vector<vk::DescriptorSets> descriptors_allocations;
+ std::vector<vk::DescriptorSets> sets;
};
-class VKDescriptorPool final {
- friend DescriptorAllocator;
-
+class DescriptorPool {
public:
- explicit VKDescriptorPool(const Device& device, VKScheduler& scheduler);
- ~VKDescriptorPool();
+ explicit DescriptorPool(const Device& device, VKScheduler& scheduler);
+ ~DescriptorPool();
- VKDescriptorPool(const VKDescriptorPool&) = delete;
- VKDescriptorPool& operator=(const VKDescriptorPool&) = delete;
+ DescriptorPool& operator=(const DescriptorPool&) = delete;
+ DescriptorPool(const DescriptorPool&) = delete;
-private:
- vk::DescriptorPool* AllocateNewPool();
+ DescriptorAllocator Allocator(VkDescriptorSetLayout layout,
+ std::span<const Shader::Info> infos);
+ DescriptorAllocator Allocator(VkDescriptorSetLayout layout, const Shader::Info& info);
+ DescriptorAllocator Allocator(VkDescriptorSetLayout layout, const DescriptorBankInfo& info);
- vk::DescriptorSets AllocateDescriptors(VkDescriptorSetLayout layout, std::size_t count);
+private:
+ DescriptorBank& Bank(const DescriptorBankInfo& reqs);
const Device& device;
MasterSemaphore& master_semaphore;
- std::vector<vk::DescriptorPool> pools;
- vk::DescriptorPool* active_pool;
+ std::shared_mutex banks_mutex;
+ std::vector<DescriptorBankInfo> bank_infos;
+ std::vector<std::unique_ptr<DescriptorBank>> banks;
};
} // namespace Vulkan \ No newline at end of file