Remove acceleration structure host commands usage

This commit is contained in:
Michael Tang 2021-02-23 18:24:59 -08:00
parent 0d732cc4a4
commit 94873f7eaf
5 changed files with 90 additions and 212 deletions

View file

@ -125,27 +125,15 @@ public:
accelerationStructureBuildRangeInfo.transformOffset = 0; accelerationStructureBuildRangeInfo.transformOffset = 0;
std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfo }; std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfo };
if (accelerationStructureFeatures.accelerationStructureHostCommands) // Build the acceleration structure on the device via a one-time command buffer submission
{ // Some implementations may support acceleration structure building on the host (VkPhysicalDeviceAccelerationStructureFeaturesKHR->accelerationStructureHostCommands), but we prefer device builds
// Implementation supports building acceleration structure building on host VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
vkBuildAccelerationStructuresKHR( vkCmdBuildAccelerationStructuresKHR(
device, commandBuffer,
VK_NULL_HANDLE, 1,
1, &accelerationBuildGeometryInfo,
&accelerationBuildGeometryInfo, accelerationBuildStructureRangeInfos.data());
accelerationBuildStructureRangeInfos.data()); vulkanDevice->flushCommandBuffer(commandBuffer, queue);
}
else
{
// Acceleration structure needs to be build on the device
VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
vkCmdBuildAccelerationStructuresKHR(
commandBuffer,
1,
&accelerationBuildGeometryInfo,
accelerationBuildStructureRangeInfos.data());
vulkanDevice->flushCommandBuffer(commandBuffer, queue);
}
deleteScratchBuffer(scratchBuffer); deleteScratchBuffer(scratchBuffer);
} }
@ -225,27 +213,15 @@ public:
accelerationStructureBuildRangeInfo.transformOffset = 0; accelerationStructureBuildRangeInfo.transformOffset = 0;
std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfo }; std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfo };
if (accelerationStructureFeatures.accelerationStructureHostCommands) // Build the acceleration structure on the device via a one-time command buffer submission
{ // Some implementations may support acceleration structure building on the host (VkPhysicalDeviceAccelerationStructureFeaturesKHR->accelerationStructureHostCommands), but we prefer device builds
// Implementation supports building acceleration structure building on host VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
vkBuildAccelerationStructuresKHR( vkCmdBuildAccelerationStructuresKHR(
device, commandBuffer,
VK_NULL_HANDLE, 1,
1, &accelerationBuildGeometryInfo,
&accelerationBuildGeometryInfo, accelerationBuildStructureRangeInfos.data());
accelerationBuildStructureRangeInfos.data()); vulkanDevice->flushCommandBuffer(commandBuffer, queue);
}
else
{
// Acceleration structure needs to be build on the device
VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
vkCmdBuildAccelerationStructuresKHR(
commandBuffer,
1,
&accelerationBuildGeometryInfo,
accelerationBuildStructureRangeInfos.data());
vulkanDevice->flushCommandBuffer(commandBuffer, queue);
}
deleteScratchBuffer(scratchBuffer); deleteScratchBuffer(scratchBuffer);
instancesBuffer.destroy(); instancesBuffer.destroy();

View file

@ -373,27 +373,15 @@ public:
accelerationStructureBuildRangeInfo.transformOffset = 0; accelerationStructureBuildRangeInfo.transformOffset = 0;
std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfo }; std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfo };
if (accelerationStructureFeatures.accelerationStructureHostCommands) // Build the acceleration structure on the device via a one-time command buffer submission
{ // Some implementations may support acceleration structure building on the host (VkPhysicalDeviceAccelerationStructureFeaturesKHR->accelerationStructureHostCommands), but we prefer device builds
// Implementation supports building acceleration structure building on host VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
vkBuildAccelerationStructuresKHR( vkCmdBuildAccelerationStructuresKHR(
device, commandBuffer,
VK_NULL_HANDLE, 1,
1, &accelerationBuildGeometryInfo,
&accelerationBuildGeometryInfo, accelerationBuildStructureRangeInfos.data());
accelerationBuildStructureRangeInfos.data()); vulkanDevice->flushCommandBuffer(commandBuffer, queue);
}
else
{
// Acceleration structure needs to be build on the device
VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
vkCmdBuildAccelerationStructuresKHR(
commandBuffer,
1,
&accelerationBuildGeometryInfo,
accelerationBuildStructureRangeInfos.data());
vulkanDevice->flushCommandBuffer(commandBuffer, queue);
}
VkAccelerationStructureDeviceAddressInfoKHR accelerationDeviceAddressInfo{}; VkAccelerationStructureDeviceAddressInfoKHR accelerationDeviceAddressInfo{};
accelerationDeviceAddressInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR; accelerationDeviceAddressInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR;
@ -492,27 +480,15 @@ public:
accelerationStructureBuildRangeInfo.transformOffset = 0; accelerationStructureBuildRangeInfo.transformOffset = 0;
std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfo }; std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfo };
if (accelerationStructureFeatures.accelerationStructureHostCommands) // Build the acceleration structure on the device via a one-time command buffer submission
{ // Some implementations may support acceleration structure building on the host (VkPhysicalDeviceAccelerationStructureFeaturesKHR->accelerationStructureHostCommands), but we prefer device builds
// Implementation supports building acceleration structure building on host VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
vkBuildAccelerationStructuresKHR( vkCmdBuildAccelerationStructuresKHR(
device, commandBuffer,
VK_NULL_HANDLE, 1,
1, &accelerationBuildGeometryInfo,
&accelerationBuildGeometryInfo, accelerationBuildStructureRangeInfos.data());
accelerationBuildStructureRangeInfos.data()); vulkanDevice->flushCommandBuffer(commandBuffer, queue);
}
else
{
// Acceleration structure needs to be build on the device
VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
vkCmdBuildAccelerationStructuresKHR(
commandBuffer,
1,
&accelerationBuildGeometryInfo,
accelerationBuildStructureRangeInfos.data());
vulkanDevice->flushCommandBuffer(commandBuffer, queue);
}
VkAccelerationStructureDeviceAddressInfoKHR accelerationDeviceAddressInfo{}; VkAccelerationStructureDeviceAddressInfoKHR accelerationDeviceAddressInfo{};
accelerationDeviceAddressInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR; accelerationDeviceAddressInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR;

View file

@ -194,27 +194,15 @@ public:
} }
std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfos[0], &accelerationStructureBuildRangeInfos[1], &accelerationStructureBuildRangeInfos[2] }; std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfos[0], &accelerationStructureBuildRangeInfos[1], &accelerationStructureBuildRangeInfos[2] };
if (accelerationStructureFeatures.accelerationStructureHostCommands) // Build the acceleration structure on the device via a one-time command buffer submission
{ // Some implementations may support acceleration structure building on the host (VkPhysicalDeviceAccelerationStructureFeaturesKHR->accelerationStructureHostCommands), but we prefer device builds
// Implementation supports building acceleration structure building on host VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
vkBuildAccelerationStructuresKHR( vkCmdBuildAccelerationStructuresKHR(
device, commandBuffer,
VK_NULL_HANDLE, 1,
1, &accelerationBuildGeometryInfo,
&accelerationBuildGeometryInfo, accelerationBuildStructureRangeInfos.data());
accelerationBuildStructureRangeInfos.data()); vulkanDevice->flushCommandBuffer(commandBuffer, queue);
}
else
{
// Acceleration structure needs to be build on the device
VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
vkCmdBuildAccelerationStructuresKHR(
commandBuffer,
1,
&accelerationBuildGeometryInfo,
accelerationBuildStructureRangeInfos.data());
vulkanDevice->flushCommandBuffer(commandBuffer, queue);
}
deleteScratchBuffer(scratchBuffer); deleteScratchBuffer(scratchBuffer);
} }
@ -294,27 +282,15 @@ public:
accelerationStructureBuildRangeInfo.transformOffset = 0; accelerationStructureBuildRangeInfo.transformOffset = 0;
std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfo }; std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfo };
if (accelerationStructureFeatures.accelerationStructureHostCommands) // Build the acceleration structure on the device via a one-time command buffer submission
{ // Some implementations may support acceleration structure building on the host (VkPhysicalDeviceAccelerationStructureFeaturesKHR->accelerationStructureHostCommands), but we prefer device builds
// Implementation supports building acceleration structure building on host VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
vkBuildAccelerationStructuresKHR( vkCmdBuildAccelerationStructuresKHR(
device, commandBuffer,
VK_NULL_HANDLE, 1,
1, &accelerationBuildGeometryInfo,
&accelerationBuildGeometryInfo, accelerationBuildStructureRangeInfos.data());
accelerationBuildStructureRangeInfos.data()); vulkanDevice->flushCommandBuffer(commandBuffer, queue);
}
else
{
// Acceleration structure needs to be build on the device
VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
vkCmdBuildAccelerationStructuresKHR(
commandBuffer,
1,
&accelerationBuildGeometryInfo,
accelerationBuildStructureRangeInfos.data());
vulkanDevice->flushCommandBuffer(commandBuffer, queue);
}
deleteScratchBuffer(scratchBuffer); deleteScratchBuffer(scratchBuffer);
instancesBuffer.destroy(); instancesBuffer.destroy();

View file

@ -137,27 +137,15 @@ public:
accelerationStructureBuildRangeInfo.transformOffset = 0; accelerationStructureBuildRangeInfo.transformOffset = 0;
std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfo }; std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfo };
if (accelerationStructureFeatures.accelerationStructureHostCommands) // Build the acceleration structure on the device via a one-time command buffer submission
{ // Some implementations may support acceleration structure building on the host (VkPhysicalDeviceAccelerationStructureFeaturesKHR->accelerationStructureHostCommands), but we prefer device builds
// Implementation supports building acceleration structure building on host VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
vkBuildAccelerationStructuresKHR( vkCmdBuildAccelerationStructuresKHR(
device, commandBuffer,
VK_NULL_HANDLE, 1,
1, &accelerationBuildGeometryInfo,
&accelerationBuildGeometryInfo, accelerationBuildStructureRangeInfos.data());
accelerationBuildStructureRangeInfos.data()); vulkanDevice->flushCommandBuffer(commandBuffer, queue);
}
else
{
// Acceleration structure needs to be build on the device
VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
vkCmdBuildAccelerationStructuresKHR(
commandBuffer,
1,
&accelerationBuildGeometryInfo,
accelerationBuildStructureRangeInfos.data());
vulkanDevice->flushCommandBuffer(commandBuffer, queue);
}
deleteScratchBuffer(scratchBuffer); deleteScratchBuffer(scratchBuffer);
} }
@ -237,27 +225,15 @@ public:
accelerationStructureBuildRangeInfo.transformOffset = 0; accelerationStructureBuildRangeInfo.transformOffset = 0;
std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfo }; std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfo };
if (accelerationStructureFeatures.accelerationStructureHostCommands) // Build the acceleration structure on the device via a one-time command buffer submission
{ // Some implementations may support acceleration structure building on the host (VkPhysicalDeviceAccelerationStructureFeaturesKHR->accelerationStructureHostCommands), but we prefer device builds
// Implementation supports building acceleration structure building on host VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
vkBuildAccelerationStructuresKHR( vkCmdBuildAccelerationStructuresKHR(
device, commandBuffer,
VK_NULL_HANDLE, 1,
1, &accelerationBuildGeometryInfo,
&accelerationBuildGeometryInfo, accelerationBuildStructureRangeInfos.data());
accelerationBuildStructureRangeInfos.data()); vulkanDevice->flushCommandBuffer(commandBuffer, queue);
}
else
{
// Acceleration structure needs to be build on the device
VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
vkCmdBuildAccelerationStructuresKHR(
commandBuffer,
1,
&accelerationBuildGeometryInfo,
accelerationBuildStructureRangeInfos.data());
vulkanDevice->flushCommandBuffer(commandBuffer, queue);
}
deleteScratchBuffer(scratchBuffer); deleteScratchBuffer(scratchBuffer);
instancesBuffer.destroy(); instancesBuffer.destroy();

View file

@ -136,28 +136,15 @@ public:
accelerationStructureBuildRangeInfo.transformOffset = 0; accelerationStructureBuildRangeInfo.transformOffset = 0;
std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfo }; std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfo };
if (accelerationStructureFeatures.accelerationStructureHostCommands) // Build the acceleration structure on the device via a one-time command buffer submission
{ // Some implementations may support acceleration structure building on the host (VkPhysicalDeviceAccelerationStructureFeaturesKHR->accelerationStructureHostCommands), but we prefer device builds
// Implementation supports building acceleration structure building on host VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
// Implementation supports building acceleration structure building on host vkCmdBuildAccelerationStructuresKHR(
vkBuildAccelerationStructuresKHR( commandBuffer,
device, 1,
VK_NULL_HANDLE, &accelerationBuildGeometryInfo,
1, accelerationBuildStructureRangeInfos.data());
&accelerationBuildGeometryInfo, vulkanDevice->flushCommandBuffer(commandBuffer, queue);
accelerationBuildStructureRangeInfos.data());
}
else
{
// Acceleration structure needs to be build on the device
VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
vkCmdBuildAccelerationStructuresKHR(
commandBuffer,
1,
&accelerationBuildGeometryInfo,
accelerationBuildStructureRangeInfos.data());
vulkanDevice->flushCommandBuffer(commandBuffer, queue);
}
deleteScratchBuffer(scratchBuffer); deleteScratchBuffer(scratchBuffer);
} }
@ -238,28 +225,15 @@ public:
accelerationStructureBuildRangeInfo.transformOffset = 0; accelerationStructureBuildRangeInfo.transformOffset = 0;
std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfo }; std::vector<VkAccelerationStructureBuildRangeInfoKHR*> accelerationBuildStructureRangeInfos = { &accelerationStructureBuildRangeInfo };
if (accelerationStructureFeatures.accelerationStructureHostCommands) // Build the acceleration structure on the device via a one-time command buffer submission
{ // Some implementations may support acceleration structure building on the host (VkPhysicalDeviceAccelerationStructureFeaturesKHR->accelerationStructureHostCommands), but we prefer device builds
// Implementation supports building acceleration structure building on host VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
// Implementation supports building acceleration structure building on host vkCmdBuildAccelerationStructuresKHR(
vkBuildAccelerationStructuresKHR( commandBuffer,
device, 1,
VK_NULL_HANDLE, &accelerationBuildGeometryInfo,
1, accelerationBuildStructureRangeInfos.data());
&accelerationBuildGeometryInfo, vulkanDevice->flushCommandBuffer(commandBuffer, queue);
accelerationBuildStructureRangeInfos.data());
}
else
{
// Acceleration structure needs to be build on the device
VkCommandBuffer commandBuffer = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
vkCmdBuildAccelerationStructuresKHR(
commandBuffer,
1,
&accelerationBuildGeometryInfo,
accelerationBuildStructureRangeInfos.data());
vulkanDevice->flushCommandBuffer(commandBuffer, queue);
}
deleteScratchBuffer(scratchBuffer); deleteScratchBuffer(scratchBuffer);
instancesBuffer.destroy(); instancesBuffer.destroy();