Skip to content
Snippets Groups Projects
Verified Commit 076b975a authored by Tobias Frisch's avatar Tobias Frisch
Browse files

Improve descriptor set writes

parent 8a6af65b
No related branches found
No related tags found
1 merge request!112Resolve "Raytracing module improvements"
...@@ -61,7 +61,7 @@ namespace vkcv { ...@@ -61,7 +61,7 @@ namespace vkcv {
*/ */
struct AccelerationDescriptorWrite { struct AccelerationDescriptorWrite {
uint32_t binding; uint32_t binding;
std::vector<vk::AccelerationStructureKHR> structures; std::vector<AccelerationStructureHandle> structures;
}; };
/** /**
...@@ -154,12 +154,12 @@ namespace vkcv { ...@@ -154,12 +154,12 @@ namespace vkcv {
* of a descriptor set. * of a descriptor set.
* *
* @param[in] binding Binding index * @param[in] binding Binding index
* @param[in] structures Acceleration structures * @param[in] structures Acceleration structure handles
* @return Instance of descriptor writes * @return Instance of descriptor writes
*/ */
DescriptorWrites & DescriptorWrites &
writeAcceleration(uint32_t binding, 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. * @brief Returns the list of stored write entries for sampled images.
......
...@@ -103,7 +103,7 @@ int main(int argc, const char** argv) { ...@@ -103,7 +103,7 @@ int main(int argc, const char** argv) {
{ {
vkcv::DescriptorWrites writes; vkcv::DescriptorWrites writes;
writes.writeAcceleration(1, { core.getVulkanAccelerationStructure(scene_tlas) }); writes.writeAcceleration(1, { scene_tlas });
writes.writeStorageBuffer(2, geometryData.getVertexBufferBinding().m_buffer); writes.writeStorageBuffer(2, geometryData.getVertexBufferBinding().m_buffer);
writes.writeStorageBuffer(3, geometryData.getIndexBuffer()); writes.writeStorageBuffer(3, geometryData.getIndexBuffer());
core.writeDescriptorSet(descriptorSetHandles[0], writes); core.writeDescriptorSet(descriptorSetHandles[0], writes);
......
...@@ -147,10 +147,28 @@ namespace vkcv { ...@@ -147,10 +147,28 @@ namespace vkcv {
std::vector<vk::DescriptorImageInfo> imageInfos; std::vector<vk::DescriptorImageInfo> imageInfos;
std::vector<vk::DescriptorBufferInfo> bufferInfos; 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<vk::WriteDescriptorSetAccelerationStructureKHR> writeStructures;
std::vector<WriteDescriptorSetInfo> writeInfos; 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()) { for (const auto &write : writes.getSampledImageWrites()) {
const vk::ImageLayout layout = const vk::ImageLayout layout =
...@@ -209,15 +227,17 @@ namespace vkcv { ...@@ -209,15 +227,17 @@ namespace vkcv {
bufferInfos.push_back(bufferInfo); bufferInfos.push_back(bufferInfo);
WriteDescriptorSetInfo vulkanWrite = { 0, WriteDescriptorSetInfo vulkanWrite = {
bufferInfos.size(), 0,
0, bufferInfos.size(),
write.binding, 0,
0, write.binding,
1, 0,
write.dynamic ? 1,
vk::DescriptorType::eUniformBufferDynamic : write.dynamic ?
vk::DescriptorType::eUniformBuffer }; vk::DescriptorType::eUniformBufferDynamic :
vk::DescriptorType::eUniformBuffer
};
writeInfos.push_back(vulkanWrite); writeInfos.push_back(vulkanWrite);
} }
...@@ -232,15 +252,17 @@ namespace vkcv { ...@@ -232,15 +252,17 @@ namespace vkcv {
bufferInfos.push_back(bufferInfo); bufferInfos.push_back(bufferInfo);
WriteDescriptorSetInfo vulkanWrite = { 0, WriteDescriptorSetInfo vulkanWrite = {
bufferInfos.size(), 0,
0, bufferInfos.size(),
write.binding, 0,
0, write.binding,
1, 0,
write.dynamic ? 1,
vk::DescriptorType::eStorageBufferDynamic : write.dynamic ?
vk::DescriptorType::eStorageBuffer }; vk::DescriptorType::eStorageBufferDynamic :
vk::DescriptorType::eStorageBuffer
};
writeInfos.push_back(vulkanWrite); writeInfos.push_back(vulkanWrite);
} }
...@@ -258,25 +280,40 @@ namespace vkcv { ...@@ -258,25 +280,40 @@ namespace vkcv {
writeInfos.push_back(vulkanWrite); writeInfos.push_back(vulkanWrite);
} }
for (const auto &write : writes.getAccelerationWrites()) { 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( const vk::WriteDescriptorSetAccelerationStructureKHR structureWrite(
write.structures.size(), write.structures.data()); write.structures.size(),
&(accelerationStructures[ accelerationStructureOffsets[i] ])
);
writeStructures.push_back(structureWrite); writeStructures.push_back(structureWrite);
WriteDescriptorSetInfo vulkanWrite = { 0, WriteDescriptorSetInfo vulkanWrite = {
0, 0,
writeStructures.size(), 0,
write.binding, writeStructures.size(),
0, write.binding,
1, 0,
vk::DescriptorType::eAccelerationStructureKHR }; 1,
vk::DescriptorType::eAccelerationStructureKHR
};
writeInfos.push_back(vulkanWrite); writeInfos.push_back(vulkanWrite);
} }
std::vector<vk::WriteDescriptorSet> vulkanWrites; std::vector<vk::WriteDescriptorSet> vulkanWrites;
vulkanWrites.reserve(writeInfos.size());
for (const auto &write : writeInfos) { for (const auto &write : writeInfos) {
vk::WriteDescriptorSet vulkanWrite( vk::WriteDescriptorSet vulkanWrite(
......
...@@ -77,7 +77,7 @@ namespace vkcv { ...@@ -77,7 +77,7 @@ namespace vkcv {
} }
DescriptorWrites &DescriptorWrites::writeAcceleration( DescriptorWrites &DescriptorWrites::writeAcceleration(
uint32_t binding, const std::vector<vk::AccelerationStructureKHR> &structures) { uint32_t binding, const std::vector<AccelerationStructureHandle> &structures) {
AccelerationDescriptorWrite write; AccelerationDescriptorWrite write;
write.binding = binding; write.binding = binding;
write.structures = structures; write.structures = structures;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment