[WIP] Refactor creation of descriptorsets
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user