diff --git a/include/vkcv/DescriptorWrites.hpp b/include/vkcv/DescriptorWrites.hpp index caff4cef865c2cfc909e0aa41974a18e5d18a9b3..4bc306bcb3d50bab5683f2599d04807987cc11ae 100644 --- a/include/vkcv/DescriptorWrites.hpp +++ b/include/vkcv/DescriptorWrites.hpp @@ -61,7 +61,7 @@ namespace vkcv { */ struct AccelerationDescriptorWrite { uint32_t binding; - std::vector<vk::AccelerationStructureKHR> structures; + std::vector<AccelerationStructureHandle> structures; }; /** @@ -154,12 +154,12 @@ namespace vkcv { * of a descriptor set. * * @param[in] binding Binding index - * @param[in] structures Acceleration structures + * @param[in] structures Acceleration structure handles * @return Instance of descriptor writes */ DescriptorWrites & writeAcceleration(uint32_t binding, - const std::vector<vk::AccelerationStructureKHR> &structures); + const std::vector<AccelerationStructureHandle> &structures); /** * @brief Returns the list of stored write entries for sampled images. diff --git a/projects/rt_ambient_occlusion/src/main.cpp b/projects/rt_ambient_occlusion/src/main.cpp index 7c77334bf2efd0e80a3aa7cb2f6ffe4ec3611703..c668ce40738984b78f2418869207aa6ef35f0a9f 100644 --- a/projects/rt_ambient_occlusion/src/main.cpp +++ b/projects/rt_ambient_occlusion/src/main.cpp @@ -103,7 +103,7 @@ int main(int argc, const char** argv) { { vkcv::DescriptorWrites writes; - writes.writeAcceleration(1, { core.getVulkanAccelerationStructure(scene_tlas) }); + writes.writeAcceleration(1, { scene_tlas }); writes.writeStorageBuffer(2, geometryData.getVertexBufferBinding().m_buffer); writes.writeStorageBuffer(3, geometryData.getIndexBuffer()); core.writeDescriptorSet(descriptorSetHandles[0], writes); diff --git a/src/vkcv/DescriptorSetManager.cpp b/src/vkcv/DescriptorSetManager.cpp index b33221b15cd430f95ebf70e47bf1a5e83b73ee7b..76f36e4702c996ee770f407d9cf50a73c67342a9 100644 --- a/src/vkcv/DescriptorSetManager.cpp +++ b/src/vkcv/DescriptorSetManager.cpp @@ -147,10 +147,28 @@ namespace vkcv { std::vector<vk::DescriptorImageInfo> imageInfos; std::vector<vk::DescriptorBufferInfo> bufferInfos; + + bufferInfos.reserve( + writes.getUniformBufferWrites().size() + + writes.getStorageBufferWrites().size() + ); + + std::vector<vk::AccelerationStructureKHR> accelerationStructures; + std::vector<size_t> accelerationStructureOffsets; + + accelerationStructureOffsets.reserve(writes.getAccelerationWrites().size()); std::vector<vk::WriteDescriptorSetAccelerationStructureKHR> writeStructures; std::vector<WriteDescriptorSetInfo> writeInfos; + writeInfos.reserve( + writes.getSampledImageWrites().size() + + writes.getStorageImageWrites().size() + + writes.getUniformBufferWrites().size() + + writes.getStorageBufferWrites().size() + + writes.getSamplerWrites().size() + + writes.getAccelerationWrites().size() + ); for (const auto &write : writes.getSampledImageWrites()) { const vk::ImageLayout layout = @@ -209,15 +227,17 @@ namespace vkcv { bufferInfos.push_back(bufferInfo); - WriteDescriptorSetInfo vulkanWrite = { 0, - bufferInfos.size(), - 0, - write.binding, - 0, - 1, - write.dynamic ? - vk::DescriptorType::eUniformBufferDynamic : - vk::DescriptorType::eUniformBuffer }; + WriteDescriptorSetInfo vulkanWrite = { + 0, + bufferInfos.size(), + 0, + write.binding, + 0, + 1, + write.dynamic ? + vk::DescriptorType::eUniformBufferDynamic : + vk::DescriptorType::eUniformBuffer + }; writeInfos.push_back(vulkanWrite); } @@ -232,15 +252,17 @@ namespace vkcv { bufferInfos.push_back(bufferInfo); - WriteDescriptorSetInfo vulkanWrite = { 0, - bufferInfos.size(), - 0, - write.binding, - 0, - 1, - write.dynamic ? - vk::DescriptorType::eStorageBufferDynamic : - vk::DescriptorType::eStorageBuffer }; + WriteDescriptorSetInfo vulkanWrite = { + 0, + bufferInfos.size(), + 0, + write.binding, + 0, + 1, + write.dynamic ? + vk::DescriptorType::eStorageBufferDynamic : + vk::DescriptorType::eStorageBuffer + }; writeInfos.push_back(vulkanWrite); } @@ -258,25 +280,40 @@ namespace vkcv { writeInfos.push_back(vulkanWrite); } - + for (const auto &write : writes.getAccelerationWrites()) { + accelerationStructureOffsets.push_back(accelerationStructures.size()); + + for (const auto &handle : write.structures) { + accelerationStructures.push_back(getCore().getVulkanAccelerationStructure(handle)); + } + } + + for (size_t i = 0; i < writes.getAccelerationWrites().size(); i++) { + const auto &write = writes.getAccelerationWrites()[i]; + const vk::WriteDescriptorSetAccelerationStructureKHR structureWrite( - write.structures.size(), write.structures.data()); + write.structures.size(), + &(accelerationStructures[ accelerationStructureOffsets[i] ]) + ); writeStructures.push_back(structureWrite); - WriteDescriptorSetInfo vulkanWrite = { 0, - 0, - writeStructures.size(), - write.binding, - 0, - 1, - vk::DescriptorType::eAccelerationStructureKHR }; + WriteDescriptorSetInfo vulkanWrite = { + 0, + 0, + writeStructures.size(), + write.binding, + 0, + 1, + vk::DescriptorType::eAccelerationStructureKHR + }; writeInfos.push_back(vulkanWrite); } std::vector<vk::WriteDescriptorSet> vulkanWrites; + vulkanWrites.reserve(writeInfos.size()); for (const auto &write : writeInfos) { vk::WriteDescriptorSet vulkanWrite( diff --git a/src/vkcv/DescriptorWrites.cpp b/src/vkcv/DescriptorWrites.cpp index a3b4c5f4fbc4212da078ec0a00a8a93a6c021d02..b4be5958e977e9c61e4d2169ff98748ba0892682 100644 --- a/src/vkcv/DescriptorWrites.cpp +++ b/src/vkcv/DescriptorWrites.cpp @@ -77,7 +77,7 @@ namespace vkcv { } DescriptorWrites &DescriptorWrites::writeAcceleration( - uint32_t binding, const std::vector<vk::AccelerationStructureKHR> &structures) { + uint32_t binding, const std::vector<AccelerationStructureHandle> &structures) { AccelerationDescriptorWrite write; write.binding = binding; write.structures = structures;