struct AccelerationStructureData
{
- vk::raii::AccelerationStructureNV acclerationStructure = nullptr;
- vk::raii::su::BufferData scratchBufferData = nullptr;
- vk::raii::su::BufferData resultBufferData = nullptr;
- vk::raii::su::BufferData instanceBufferData = nullptr;
+ // Note: in order to have a clean destruction order, list the resultBufferData before the accelerationStructure that binds it
+ vk::raii::su::BufferData resultBufferData = nullptr;
+ vk::raii::AccelerationStructureNV accelerationStructure = nullptr;
+ vk::raii::su::BufferData scratchBufferData = nullptr;
+ vk::raii::su::BufferData instanceBufferData = nullptr;
};
AccelerationStructureData createAccelerationStructureData( vk::raii::PhysicalDevice const & physicalDevice,
instances.empty() ? vk::AccelerationStructureTypeNV::eBottomLevel : vk::AccelerationStructureTypeNV::eTopLevel;
vk::AccelerationStructureInfoNV accelerationStructureInfo( accelerationStructureType, {}, vk::su::checked_cast<uint32_t>( instances.size() ), geometries );
vk::AccelerationStructureCreateInfoNV accelerationStructureCreateInfoNV( 0, accelerationStructureInfo );
- accelerationStructureData.acclerationStructure = vk::raii::AccelerationStructureNV( device, accelerationStructureCreateInfoNV );
+ accelerationStructureData.accelerationStructure = vk::raii::AccelerationStructureNV( device, accelerationStructureCreateInfoNV );
vk::AccelerationStructureMemoryRequirementsInfoNV objectRequirements( vk::AccelerationStructureMemoryRequirementsTypeNV::eObject,
- *accelerationStructureData.acclerationStructure );
+ *accelerationStructureData.accelerationStructure );
vk::DeviceSize resultSizeInBytes = device.getAccelerationStructureMemoryRequirementsNV( objectRequirements ).memoryRequirements.size;
assert( 0 < resultSizeInBytes );
accelerationStructureData.resultBufferData =
vk::raii::su::BufferData( physicalDevice, device, resultSizeInBytes, vk::BufferUsageFlagBits::eRayTracingNV, vk::MemoryPropertyFlagBits::eDeviceLocal );
vk::AccelerationStructureMemoryRequirementsInfoNV buildScratchRequirements( vk::AccelerationStructureMemoryRequirementsTypeNV::eBuildScratch,
- *accelerationStructureData.acclerationStructure );
+ *accelerationStructureData.accelerationStructure );
vk::AccelerationStructureMemoryRequirementsInfoNV updateScratchRequirements( vk::AccelerationStructureMemoryRequirementsTypeNV::eUpdateScratch,
- *accelerationStructureData.acclerationStructure );
+ *accelerationStructureData.accelerationStructure );
vk::DeviceSize scratchSizeInBytes = std::max( device.getAccelerationStructureMemoryRequirementsNV( buildScratchRequirements ).memoryRequirements.size,
device.getAccelerationStructureMemoryRequirementsNV( updateScratchRequirements ).memoryRequirements.size );
assert( 0 < scratchSizeInBytes );
}
device.bindAccelerationStructureMemoryNV(
- vk::BindAccelerationStructureMemoryInfoNV( *accelerationStructureData.acclerationStructure, *accelerationStructureData.resultBufferData.deviceMemory ) );
+ vk::BindAccelerationStructureMemoryInfoNV( *accelerationStructureData.accelerationStructure, *accelerationStructureData.resultBufferData.deviceMemory ) );
vk::Buffer instanceData;
if ( *accelerationStructureData.instanceBufferData.buffer )
instanceData,
0,
false,
- *accelerationStructureData.acclerationStructure,
+ *accelerationStructureData.accelerationStructure,
nullptr,
*accelerationStructureData.scratchBufferData.buffer,
0 );
{
instanceExtensions.push_back( glfwExtensions[i] );
}
- instanceExtensions.push_back( VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME );
#if VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL
vk::raii::Context context;
auto supportedFeatures = physicalDevice.getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceDescriptorIndexingFeaturesEXT>();
vk::raii::Device device = vk::raii::su::makeDevice( physicalDevice,
graphicsAndPresentQueueFamilyIndex.first,
- { VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME,
- VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
- VK_KHR_MAINTENANCE_3_EXTENSION_NAME,
- VK_KHR_SWAPCHAIN_EXTENSION_NAME,
- VK_NV_RAY_TRACING_EXTENSION_NAME },
+ { VK_KHR_SWAPCHAIN_EXTENSION_NAME, VK_NV_RAY_TRACING_EXTENSION_NAME },
&supportedFeatures.get<vk::PhysicalDeviceFeatures2>().features,
&supportedFeatures.get<vk::PhysicalDeviceDescriptorIndexingFeaturesEXT>() );
topLevelAS = createAccelerationStructureData( physicalDevice,
device,
commandBuffer,
- { std::make_pair( std::ref( bottomLevelAS.acclerationStructure ), std::ref( transform ) ) },
+ { std::make_pair( std::ref( bottomLevelAS.accelerationStructure ), std::ref( transform ) ) },
std::vector<vk::GeometryNV>() );
} );
vk::BufferMemoryBarrier bufferMemoryBarrier(
{}, vk::AccessFlagBits::eShaderRead, VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, *vertexBufferData.buffer, 0, VK_WHOLE_SIZE );
commandBuffer.pipelineBarrier(
- vk::PipelineStageFlagBits::eAllCommands, vk::PipelineStageFlagBits::eAllCommands, {}, nullptr, bufferMemoryBarrier, nullptr );
+ vk::PipelineStageFlagBits::eTopOfPipe, vk::PipelineStageFlagBits::eRayTracingShaderKHR, {}, nullptr, bufferMemoryBarrier, nullptr );
bufferMemoryBarrier.buffer = *indexBufferData.buffer;
commandBuffer.pipelineBarrier(
- vk::PipelineStageFlagBits::eAllCommands, vk::PipelineStageFlagBits::eAllCommands, {}, nullptr, bufferMemoryBarrier, nullptr );
+ vk::PipelineStageFlagBits::eTopOfPipe, vk::PipelineStageFlagBits::eRayTracingShaderKHR, {}, nullptr, bufferMemoryBarrier, nullptr );
} );
std::vector<vk::DescriptorSetLayoutBinding> bindings;
vk::raii::DescriptorSets rayTracingDescriptorSets( device, descriptorSetAllocateInfo );
// Bind ray tracing specific descriptor sets into pNext of a vk::WriteDescriptorSet
- vk::WriteDescriptorSetAccelerationStructureNV writeDescriptorSetAcceleration( 1, &*topLevelAS.acclerationStructure );
+ vk::WriteDescriptorSetAccelerationStructureNV writeDescriptorSetAcceleration( 1, &*topLevelAS.accelerationStructure );
std::vector<vk::WriteDescriptorSet> accelerationDescriptionSets;
for ( size_t i = 0; i < rayTracingDescriptorSets.size(); i++ )
{
rayTracingDescriptorSets.clear();
rayTracingDescriptorSetLayout = vk::raii::DescriptorSetLayout( nullptr );
rayTracingDescriptorPool = vk::raii::DescriptorPool( nullptr );
- topLevelAS.acclerationStructure = vk::raii::AccelerationStructureNV( nullptr );
+ topLevelAS.accelerationStructure = vk::raii::AccelerationStructureNV( nullptr );
topLevelAS.instanceBufferData.buffer = vk::raii::Buffer( nullptr );
topLevelAS.instanceBufferData.deviceMemory = vk::raii::DeviceMemory( nullptr );
topLevelAS.resultBufferData.buffer = vk::raii::Buffer( nullptr );
topLevelAS.scratchBufferData.buffer = vk::raii::Buffer( nullptr );
topLevelAS.scratchBufferData.deviceMemory = vk::raii::DeviceMemory( nullptr );
descriptorSet = vk::raii::DescriptorSet( nullptr );
- bottomLevelAS.acclerationStructure = vk::raii::AccelerationStructureNV( nullptr );
+ bottomLevelAS.accelerationStructure = vk::raii::AccelerationStructureNV( nullptr );
bottomLevelAS.instanceBufferData.buffer = vk::raii::Buffer( nullptr );
bottomLevelAS.instanceBufferData.deviceMemory = vk::raii::DeviceMemory( nullptr );
bottomLevelAS.resultBufferData.buffer = vk::raii::Buffer( nullptr );
vk::raii::su::findGraphicsAndPresentQueueFamilyIndex( physicalDevice, surfaceData.surface );
vk::raii::Device device = vk::raii::su::makeDevice( physicalDevice, graphicsAndPresentQueueFamilyIndex.first, vk::su::getDeviceExtensions() );
- vk::raii::CommandPool commandPool = vk::raii::CommandPool( device, { {}, graphicsAndPresentQueueFamilyIndex.first } );
+ vk::raii::CommandPool commandPool = vk::raii::CommandPool( device, { {}, graphicsAndPresentQueueFamilyIndex.first } );
vk::raii::CommandBuffer commandBuffer = vk::raii::su::makeCommandBuffer( device, commandPool );
vk::raii::Queue graphicsQueue( device, graphicsAndPresentQueueFamilyIndex.first, 0 );
fragmentShaderModule,
nullptr,
sizeof( texturedCubeData[0] ),
- { { vk::Format::eR32G32B32A32Sfloat, 0 }, { vk::Format::eR32G32Sfloat, 16 } },
+ { { vk::Format::eR32G32B32A32Sfloat, 0 }, { vk::Format::eR32G32Sfloat, 16 } },
vk::FrontFace::eClockwise,
true,
pipelineLayout,
vk::ImageSubresourceRange imageSubresourceRange( vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1 );
vk::ImageMemoryBarrier prePresentBarrier( vk::AccessFlagBits::eColorAttachmentWrite,
- vk::AccessFlagBits::eMemoryRead,
+ {},
vk::ImageLayout::eColorAttachmentOptimal,
vk::ImageLayout::ePresentSrcKHR,
VK_QUEUE_FAMILY_IGNORED,