[WIP] Refactor creation of descriptorsets

This commit is contained in:
2023-08-30 23:11:11 +02:00
parent 5aec41ead4
commit 93c75763c7
19 changed files with 201 additions and 173 deletions

View File

@@ -21,6 +21,7 @@ namespace openVulkanoCpp::Vulkan
ResourceManager::ResourceManager()
{
static_assert(sizeof(DescriptorSetLayoutBinding) == sizeof(vk::DescriptorSetLayoutBinding));
freeFunction = [this](ManagedBuffer* buffer) { this->FreeBuffer(buffer); };
}
@@ -50,6 +51,23 @@ namespace openVulkanoCpp::Vulkan
transferQueue = this->device.getQueue(context->device->queueIndices.transfer, 0);
// Setup descriptor pool
constexpr vk::DescriptorPoolSize sizeInfo[] = {
{ vk::DescriptorType::eSampler, 100000 },
{ vk::DescriptorType::eCombinedImageSampler, 100000 },
{ vk::DescriptorType::eSampledImage, 100000 },
{ vk::DescriptorType::eStorageImage, 100000 },
{ vk::DescriptorType::eUniformTexelBuffer, 100000 },
{ vk::DescriptorType::eStorageTexelBuffer, 100000 },
{ vk::DescriptorType::eUniformBuffer, 100000 },
{ vk::DescriptorType::eStorageBuffer, 100000 },
{ vk::DescriptorType::eUniformBufferDynamic, 100000 },
{ vk::DescriptorType::eStorageBufferDynamic, 100000 },
{ vk::DescriptorType::eInputAttachment, 100000 }
};
const vk::DescriptorPoolCreateInfo poolCreateInfo(vk::DescriptorPoolCreateFlagBits::eFreeDescriptorSet, 100000, std::size(sizeInfo), sizeInfo);
descriptorPool = device.createDescriptorPool(poolCreateInfo);
INSTANCE = this;
}
@@ -61,6 +79,7 @@ namespace openVulkanoCpp::Vulkan
device.freeCommandBuffers(cmdPools[i], 1, &cmdBuffers[i]);
device.destroyCommandPool(cmdPools[i]);
}
device.destroyDescriptorPool(descriptorPool);
shaders.clear();
cmdBuffers = nullptr;
cmdPools = nullptr;
@@ -131,8 +150,10 @@ namespace openVulkanoCpp::Vulkan
ManagedBuffer* buffer;
VulkanNode* vkNode;
const vk::DeviceSize allocSize = Utils::Align(sizeof(Math::Matrix4f), uniformBufferAlignment);
vk::DeviceSize frameSize = 0;
if (node->GetUpdateFrequency() != Scene::UpdateFrequency::Never)
{
frameSize = allocSize;
vkNode = new VulkanNodeDynamic();
const uint32_t imgs = context->swapChain.GetImageCount();
buffer = CreateBuffer(imgs * allocSize, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostVisible);
@@ -143,12 +164,24 @@ namespace openVulkanoCpp::Vulkan
vkNode = new VulkanNode();
buffer = CreateDeviceOnlyBufferWithData(sizeof(Math::Matrix4f), vk::BufferUsageFlagBits::eUniformBuffer, &node->worldMat);
}
uBuffer->Init(buffer, allocSize, &context->pipeline.descriptorSetLayout, context->pipeline.pipelineLayout);
uBuffer->Init(buffer, frameSize, allocSize, GetDescriptorLayoutSet(NODE_LAYOUT_BINDING));
vkNode->Init(node, uBuffer);
node->renderNode = vkNode;
}
}
vk::DescriptorSetLayout* ResourceManager::GetDescriptorLayoutSet(const DescriptorSetLayoutBinding& descriptorSetLayoutBinding)
{
auto& layout = descriptorSetLayoutCache[descriptorSetLayoutBinding];
if (!layout)
{
vk::DescriptorSetLayoutCreateInfo createInfo({}, 1, &reinterpret_cast<const vk::DescriptorSetLayoutBinding&>(descriptorSetLayoutBinding));
layout = device.createDescriptorSetLayout(createInfo);
}
return &layout;
}
ManagedBuffer* ResourceManager::CreateSharedMemoryBuffer(const size_t size)
{
const std::unique_lock lock(mutex);