From 76dc8be95dfdb5b7cd7e8a5fdd3a2b7e220f758a Mon Sep 17 00:00:00 2001 From: Tobias Frisch <tfrisch@uni-koblenz.de> Date: Mon, 31 May 2021 00:01:44 +0200 Subject: [PATCH] [#53] Works on my machine! (with texture) Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de> --- src/vkcv/DescriptorManager.cpp | 151 +++++++++++++++++++++------------ 1 file changed, 99 insertions(+), 52 deletions(-) diff --git a/src/vkcv/DescriptorManager.cpp b/src/vkcv/DescriptorManager.cpp index 5cb05f7a..cf689b44 100644 --- a/src/vkcv/DescriptorManager.cpp +++ b/src/vkcv/DescriptorManager.cpp @@ -85,6 +85,13 @@ namespace vkcv m_ResourceDescriptions.emplace_back(vk_sets, vk_setLayouts); return ResourcesHandle(m_NextResourceDescriptionID++); } + + struct WriteDescriptorSetInfo { + size_t imageInfoIndex; + size_t bufferInfoIndex; + uint32_t binding; + vk::DescriptorType type; + }; void DescriptorManager::writeResourceDescription( ResourcesHandle handle, @@ -96,84 +103,124 @@ namespace vkcv vk::DescriptorSet set = m_ResourceDescriptions[handle.getId()].descriptorSets[setIndex]; - std::vector<vk::WriteDescriptorSet> vulkanWrites; + std::vector<vk::DescriptorImageInfo> imageInfos; + std::vector<vk::DescriptorBufferInfo> bufferInfos; + + std::vector<WriteDescriptorSetInfo> writeInfos; for (const auto& write : writes.sampledImageWrites) { - vk::DescriptorImageInfo imageInfo( + const vk::DescriptorImageInfo imageInfo( nullptr, imageManager.getVulkanImageView(write.image), - vk::ImageLayout::eShaderReadOnlyOptimal); - - vk::WriteDescriptorSet vulkanWrite( - set, - write.binding, - (uint32_t)0, - vk::DescriptorType::eSampledImage, - imageInfo); - vulkanWrites.push_back(vulkanWrite); + vk::ImageLayout::eShaderReadOnlyOptimal + ); + + imageInfos.push_back(imageInfo); + + WriteDescriptorSetInfo vulkanWrite = { + imageInfos.size(), + 0, + write.binding, + vk::DescriptorType::eSampledImage, + }; + + writeInfos.push_back(vulkanWrite); } for (const auto& write : writes.storageImageWrites) { - vk::DescriptorImageInfo imageInfo( + const vk::DescriptorImageInfo imageInfo( nullptr, imageManager.getVulkanImageView(write.image), - vk::ImageLayout::eGeneral); - - vk::WriteDescriptorSet vulkanWrite( - set, - write.binding, - (uint32_t)0, - vk::DescriptorType::eStorageImage, - imageInfo); - vulkanWrites.push_back(vulkanWrite); + vk::ImageLayout::eGeneral + ); + + imageInfos.push_back(imageInfo); + + WriteDescriptorSetInfo vulkanWrite = { + imageInfos.size(), + 0, + write.binding, + vk::DescriptorType::eStorageImage + }; + + writeInfos.push_back(vulkanWrite); } for (const auto& write : writes.uniformBufferWrites) { - vk::DescriptorBufferInfo bufferInfo( + const vk::DescriptorBufferInfo bufferInfo( bufferManager.getBuffer(write.buffer), - (uint32_t)0, - bufferManager.getBufferSize(write.buffer)); + static_cast<uint32_t>(0), + bufferManager.getBufferSize(write.buffer) + ); + + bufferInfos.push_back(bufferInfo); - vk::WriteDescriptorSet vulkanWrite( - set, - write.binding, - (uint32_t)0, - vk::DescriptorType::eUniformBuffer, - nullptr, - bufferInfo); - vulkanWrites.push_back(vulkanWrite); + WriteDescriptorSetInfo vulkanWrite = { + 0, + bufferInfos.size(), + write.binding, + vk::DescriptorType::eUniformBuffer + }; + + writeInfos.push_back(vulkanWrite); } for (const auto& write : writes.storageBufferWrites) { - vk::DescriptorBufferInfo bufferInfo( + const vk::DescriptorBufferInfo bufferInfo( bufferManager.getBuffer(write.buffer), - (uint32_t)0, - bufferManager.getBufferSize(write.buffer)); - - vk::WriteDescriptorSet vulkanWrite( - set, - write.binding, - (uint32_t)0, - vk::DescriptorType::eStorageBuffer, - nullptr, - bufferInfo); - vulkanWrites.push_back(vulkanWrite); + static_cast<uint32_t>(0), + bufferManager.getBufferSize(write.buffer) + ); + + bufferInfos.push_back(bufferInfo); + + WriteDescriptorSetInfo vulkanWrite = { + 0, + bufferInfos.size(), + write.binding, + vk::DescriptorType::eStorageBuffer + }; + + writeInfos.push_back(vulkanWrite); } for (const auto& write : writes.samplerWrites) { - vk::DescriptorImageInfo imageInfo( - samplerManager.getVulkanSampler(write.sampler), + const vk::Sampler& sampler = samplerManager.getVulkanSampler(write.sampler); + + const vk::DescriptorImageInfo imageInfo( + sampler, nullptr, - vk::ImageLayout::eGeneral); + vk::ImageLayout::eGeneral + ); + + imageInfos.push_back(imageInfo); + WriteDescriptorSetInfo vulkanWrite = { + imageInfos.size(), + 0, + write.binding, + vk::DescriptorType::eSampler + }; + + writeInfos.push_back(vulkanWrite); + } + + std::vector<vk::WriteDescriptorSet> vulkanWrites; + + for (const auto& write : writeInfos) { vk::WriteDescriptorSet vulkanWrite( - set, - write.binding, - (uint32_t)0, - vk::DescriptorType::eSampler, - imageInfo); + set, + write.binding, + static_cast<uint32_t>(0), + 1, + write.type, + (write.imageInfoIndex > 0? &(imageInfos[write.imageInfoIndex - 1]) : nullptr), + (write.bufferInfoIndex > 0? &(bufferInfos[write.bufferInfoIndex - 1]) : nullptr) + ); + vulkanWrites.push_back(vulkanWrite); } + m_Device.updateDescriptorSets(vulkanWrites, nullptr); } -- GitLab