From feeb4789a574ffb04eb53b2722414d571db185b3 Mon Sep 17 00:00:00 2001 From: Artur Wasmut <awasmut@uni-koblenz.de> Date: Fri, 21 May 2021 16:31:26 +0200 Subject: [PATCH] add ToDos for descriptor set management. --- config/Sources.cmake | 6 ++ include/vkcv/Core.hpp | 8 ++ include/vkcv/Descriptor.hpp | 60 ------------ include/vkcv/Handles.hpp | 1 + include/vkcv/ResourcesConfig.hpp | 23 +++++ src/vkcv/Core.cpp | 9 ++ src/vkcv/Descriptor.cpp | 162 ------------------------------- src/vkcv/DescriptorManager.cpp | 14 +++ src/vkcv/DescriptorManager.hpp | 32 ++++++ src/vkcv/ResourcesConfig.cpp | 0 10 files changed, 93 insertions(+), 222 deletions(-) delete mode 100644 include/vkcv/Descriptor.hpp create mode 100644 include/vkcv/ResourcesConfig.hpp delete mode 100644 src/vkcv/Descriptor.cpp create mode 100644 src/vkcv/DescriptorManager.cpp create mode 100644 src/vkcv/DescriptorManager.hpp create mode 100644 src/vkcv/ResourcesConfig.cpp diff --git a/config/Sources.cmake b/config/Sources.cmake index 0d0a3787..7646cf6f 100644 --- a/config/Sources.cmake +++ b/config/Sources.cmake @@ -51,4 +51,10 @@ set(vkcv_sources ${vkcv_source}/vkcv/Framebuffer.hpp ${vkcv_source}/vkcv/Framebuffer.cpp + + ${vkcv_source}/vkcv/DescriptorManager.hpp + ${vkcv_source}/vkcv/DescriptorManager.cpp + + ${vkcv_include}/vkcv/ResourcesConfig.hpp + ${vkcv_source}/vkcv/ResourcesConfig.cpp ) diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp index 45e55515..79a9d29d 100644 --- a/include/vkcv/Core.hpp +++ b/include/vkcv/Core.hpp @@ -17,12 +17,14 @@ #include "CommandResources.hpp" #include "SyncResources.hpp" #include "Result.hpp" +#include "vkcv/ResourcesConfig.hpp" namespace vkcv { // forward declarations class PassManager; class PipelineManager; + class DescriptorManager; class Core final { @@ -147,6 +149,12 @@ namespace vkcv return Buffer<T>::create(m_Context.getDevice(), m_Context.getPhysicalDevice(), bufferType, size); } + /** TODO: + * @param setDescriptions + * @return + */ + ResourcesHandle createResourceDescription(const std::vector<SetDescription> &setDescriptions); + /** * @brief start recording command buffers and increment frame index */ diff --git a/include/vkcv/Descriptor.hpp b/include/vkcv/Descriptor.hpp deleted file mode 100644 index 26a028dd..00000000 --- a/include/vkcv/Descriptor.hpp +++ /dev/null @@ -1,60 +0,0 @@ -#include <vulkan/vulkan.hpp> - -namespace vkcv { - - class Descriptor - { - - - friend class Core; - public: - - //Die verschiedenen Pool Sizes f�r die verschiedenen Arten von Buffern - struct PoolSizes { - std::vector<std::pair<VkDescriptorType, float>> sizes = - { - { VK_DESCRIPTOR_TYPE_SAMPLER, 0.5f }, - { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 4.f }, - { VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 4.f }, - { VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1.f }, - { VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1.f }, - { VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1.f }, - { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2.f }, - { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2.f } - }; - }; - - void createDescriptors(VkDevice device/*, int buffer_size*/); - - const void destroyDescriptor(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, VkDescriptorPool descriptorPool); - - const VkDescriptorPool createDescPool(VkDescriptorPool descriptorPool, VkDevice device, const PoolSizes& poolSizes, int count); - - const VkDescriptorSetLayout createDescSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, VkDescriptorSetLayoutCreateInfo* info); - - struct DescriptorLayoutInfo; - - struct PoolSizes; - - private: - - //Layout Info - struct DescriptorLayoutInfo { - std::vector<VkDescriptorSetLayoutBinding> bindings; - - bool operator==(const DescriptorLayoutInfo& other) const; - - size_t hash() const; - }; - - - //Informationen zum Set Layout - typedef struct VkDescriptorSetLayoutCreateInfo { - VkStructureType sType; - const void* pNext; - VkDescriptorSetLayoutCreateFlags flags; - uint32_t bindingCount; - const VkDescriptorSetLayoutBinding* pBindings; - } VkDescriptorSetLayoutCreateInfo; - }; -} \ No newline at end of file diff --git a/include/vkcv/Handles.hpp b/include/vkcv/Handles.hpp index 4ec2bc05..ad48a1ec 100644 --- a/include/vkcv/Handles.hpp +++ b/include/vkcv/Handles.hpp @@ -13,4 +13,5 @@ namespace vkcv struct BufferHandle {uint64_t id;}; struct PassHandle {uint64_t id;}; struct PipelineHandle {uint64_t id;}; + struct ResourcesHandle {uint64_t id;}; } diff --git a/include/vkcv/ResourcesConfig.hpp b/include/vkcv/ResourcesConfig.hpp new file mode 100644 index 00000000..d9e9a3f8 --- /dev/null +++ b/include/vkcv/ResourcesConfig.hpp @@ -0,0 +1,23 @@ +#pragma once + +namespace vkcv +{ + enum class ResourceType + { + // TODO: + // uniform buffers, samplers, images should be supported for now! + }; + + struct BindingDescription + { + // TODO: + // should contain something like the binding ID, + // and the descriptor/resource type + }; + + struct SetDescription + { + // TODO: + // should contain a collection of BindingDescriptions + }; +} diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp index 1c6c81be..cbf5474b 100644 --- a/src/vkcv/Core.cpp +++ b/src/vkcv/Core.cpp @@ -9,6 +9,7 @@ #include "vkcv/Core.hpp" #include "PassManager.hpp" #include "PipelineManager.hpp" +#include "DescriptorManager.hpp" #include "Surface.hpp" #include "ImageLayoutTransitions.hpp" #include "Framebuffer.hpp" @@ -213,4 +214,12 @@ namespace vkcv vk::Format Core::getSwapchainImageFormat() { return m_swapchain.getSurfaceFormat().format; } + + ResourcesHandle Core::createResourceDescription(const std::vector<SetDescription> &setDescriptions) + { + // TODO: + // call DescriptorManager's createResourceDescription + // let it do the actual work! No vulkan stuff here. + return ResourcesHandle{0}; + } } diff --git a/src/vkcv/Descriptor.cpp b/src/vkcv/Descriptor.cpp deleted file mode 100644 index c59aac1c..00000000 --- a/src/vkcv/Descriptor.cpp +++ /dev/null @@ -1,162 +0,0 @@ -#include "vkcv/Descriptor.hpp" - -namespace vkcv -{ - const VkDescriptorSetLayout createDescSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, VkDescriptorSetLayoutCreateInfo* info) - { - - /* Code, falls nur ein Set mit nur einem Binding erstellt wird - VkDescriptorSetLayoutBinding layoutBinding = {}; - layoutBinding.binding = 0; - layoutBinding.descriptorType = VkDescriptorType::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - layoutBinding.descriptorCount = 1; - layoutBinding.stageFlags = VK_SHADER_STAGE_VERTEX_BIT; - - VkDescriptorSetLayoutCreateInfo layoutInfo = {}; - layoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - layoutInfo.bindingCount = 1; - layoutInfo.pBindings = &layoutBinding;*/ - - //Erstellen von der Layout Info - DescriptorLayoutInfo layoutinfo; - layoutinfo.bindings.reserve(info->bindingCount); - bool isSorted = true; - int lastBinding = -1; - - //Sortieren und pushen von Bindings f�r Ordnung - for (int i = 0; i < info->bindingCount; i++) { - layoutinfo.bindings.push_back(info->pBindings[i]); - - //Bindings m�ssen aufsteigend sortiert sein - if (info->pBindings[i].binding > lastBinding) { - lastBinding = info->pBindings[i].binding; - } - else { - isSorted = false; - } - } - //Sortieren, falls Bindings noch nicht sortiert sind - if (!isSorted) { - std::sort(layoutinfo.bindings.begin(), layoutinfo.bindings.end(), [](VkDescriptorSetLayoutBinding& a, VkDescriptorSetLayoutBinding& b) { - return a.binding < b.binding; - }); - } - - //Test, ob es funktioniert - VkResult result = vkCreateDescriptorSetLayout( - device, - &layoutInfo, - nullptr, - &descriptorSetLayout - ); - assert(result == VK_SUCCESS); - - } - - const VkDescriptorPool createDescPool(VkDescriptorPool descriptorPool, VkDevice device, const PoolSizes& poolSizes, int count) - { - //Gr��e des Pools bestimmen - std::vector<VkDescriptorPoolSize> poolSize; - poolSize.reserve(poolSizes.sizes.size()); - for (auto sz : poolSizes.sizes) { - poolSize.push_back({ sz.first, uint32_t(sz.second * count) }); - } - - //Erstelle das createInfo zu den Pools - VkDescriptorPoolCreateInfo createInfo = {}; - createInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; - createInfo.poolSizeCount = (uint32_t)poolSizes.sizes.size(); - createInfo.pPoolSizes = poolSize.data(); - createInfo.maxSets = count; - - //Teste, ob der Pool erstellt werden kann - VkResult createDescriptorPool = vkCreateDescriptorPool( - device, - &createInfo, - nullptr, - &descriptorPool - ); - assert(createDescriptorPool == VK_SUCCESS); - - } - - const void destroyDescriptor(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, VkDescriptorPool descriptorPool) - { - //Destruktor f�r Layout und Pool - vkDestroyDescriptorSetLayout( - device, - descriptorSetLayout, - nullptr - ); - - vkDestroyDescriptorPool( - device, - descriptorPool, - nullptr - ); - } - - void Descriptor::createDescriptors(VkDevice device/*, int buffer_size*/) - { - //Ben�tigte Variablen - VkDescriptorPool descriptorPool; - VkDescriptorSetLayout descriptorSetLayout; - VkDescriptorSet descriptorSet; - VkWriteDescriptorSet descriptorWriteSet; - PoolSizes descriptorSizes; - int count = 1000; - - //Erstellung des Pools - descriptorPool = createDescPool(descriptorPool, device, descriptorSizes, count); - - //Erstellung der Set Layouts - descriptorSetLayout = createDescSetLayout(device, descriptorSetLayout); - - { - //Sets erstellen - VkDescriptorSetAllocateInfo allocInfo = {}; - allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - allocInfo.descriptorPool = descriptorPool; - allocInfo.descriptorSetCount = count; - allocInfo.pSetLayouts = &descriptorSetLayout; - - //Teste, ob Sets erstellt wurden - VkResult result = vkAllocateDescriptorSets( - device, - &allocInfo, - &descriptorSet - ); - assert (result == VK_SUCCESS); - - } - - - { /*Buffer Date in Descriptor schreiben - VkDescriptorBufferInfo bufferInfo = {}; - bufferInfo.buffer = buffer; - bufferInfo.offset = 0; - bufferInfo.range = buffer_size; - - descriptorWriteSet = {}; - descriptorWriteSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - descriptorWriteSet.dstSet = descriptorSet; - descriptorWriteSet.dstBinding = 0; - descriptorWriteSet.dstArrayElement = 0; - descriptorWriteSet.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - descriptorWriteSet.descriptorCount = 1; - descriptorWriteSet.pBufferInfo = &bufferInfo; - - - vkUpdateDescriptorSets( - device, - 1, - &descriptorWriteSet, - 0, - NULL - );*/ - } - - } - - -} \ No newline at end of file diff --git a/src/vkcv/DescriptorManager.cpp b/src/vkcv/DescriptorManager.cpp new file mode 100644 index 00000000..32e0d031 --- /dev/null +++ b/src/vkcv/DescriptorManager.cpp @@ -0,0 +1,14 @@ +#include "DescriptorManager.hpp" + + +namespace vkcv +{ + ResourcesHandle vkcv::DescriptorManager::createResourceDescription(const std::vector<SetDescription> &setDescriptions) + { + // TODO: create all vk::DescriptorSets and allocate them from the pool + // put them into a ResourceDescription struct + // push that struct into m_Resources; + // return the index into that object as ResourcesHandle; + return ResourcesHandle{0}; + } +} \ No newline at end of file diff --git a/src/vkcv/DescriptorManager.hpp b/src/vkcv/DescriptorManager.hpp new file mode 100644 index 00000000..5a9d4feb --- /dev/null +++ b/src/vkcv/DescriptorManager.hpp @@ -0,0 +1,32 @@ +#include <vulkan/vulkan.hpp> + +#include "vkcv/Handles.hpp" +#include "vkcv/ResourcesConfig.hpp" + +namespace vkcv +{ + class DescriptorManager + { + public: + explicit DescriptorManager(vk::Device) noexcept; + ~DescriptorManager(); + + + // TODO: Interface + // user wishes to create descriptor sets {X,Y,Z} each with different descriptions {A,B,C} + // returns a resource + ResourcesHandle createResourceDescription(const std::vector<SetDescription> &setDescriptions); + + private: + vk::DescriptorPool m_Pool; + + // TODO: container for all resources requested by the user + struct ResourceDescription + { + std::vector<vk::DescriptorSet> descriptorSets; + std::vector<vk::DescriptorSetLayout> descriptorSetLayouts; + }; + + std::vector<ResourceDescription> m_Resources; + }; +} \ No newline at end of file diff --git a/src/vkcv/ResourcesConfig.cpp b/src/vkcv/ResourcesConfig.cpp new file mode 100644 index 00000000..e69de29b -- GitLab