Skip to content

Commit e0ed1ae

Browse files
author
devsh
committed
Merge remote-tracking branch 'origin/ray_query_geometry_creator_example' into bindless_blit
2 parents 7ed9c5b + 189cfae commit e0ed1ae

9 files changed

+50
-23
lines changed

include/nbl/video/IGPUAccelerationStructure.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,13 @@ class IGPUAccelerationStructure : public asset::IAccelerationStructure, public I
8181
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructuresIndirectKHR-geometry-03673
8282
static inline bool invalidInputBuffer(const asset::SBufferBinding<const BufferType>& binding, const size_t byteOffset, const size_t count, const size_t elementSize, const size_t alignment)
8383
{
84-
if (!binding.buffer || binding.offset+byteOffset+count*elementSize<binding.buffer->getSize())
84+
if (!binding.buffer || binding.offset+byteOffset+count*elementSize>binding.buffer->getSize())
8585
return true;
8686

8787
if constexpr (std::is_same_v<BufferType,IGPUBuffer>)
8888
{
8989
const auto deviceAddr = binding.buffer->getDeviceAddress();
90-
if (!deviceAddr==0ull || !core::is_aligned_to(deviceAddr,alignment))
90+
if (deviceAddr==0ull || !core::is_aligned_to(deviceAddr,alignment))
9191
return true;
9292

9393
if (!binding.buffer->getCreationParams().usage.hasFlags(IGPUBuffer::E_USAGE_FLAGS::EUF_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT))
@@ -228,7 +228,7 @@ class IGPUBottomLevelAccelerationStructure : public asset::IBottomLevelAccelerat
228228

229229
const size_t vertexSize = asset::getTexelOrBlockBytesize(geometry.vertexFormat);
230230
// TODO: improve in line with the spec https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03711
231-
const size_t vertexAlignment = core::max(vertexSize/4u,1ull);
231+
const size_t vertexAlignment = core::max(core::roundDownToPoT(vertexSize/asset::getFormatChannelCount(geometry.vertexFormat)),1ull);
232232
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryTrianglesDataKHR-vertexStride-03735
233233
if (!core::is_aligned_to(geometry.vertexStride,vertexAlignment))
234234
return false;

include/nbl/video/ILogicalDevice.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe
406406
const uint32_t* const pMaxPrimitiveCounts
407407
) const
408408
{
409-
if (invalidFeaturesForASBuild<Geometry::buffer_t>(motionBlur))
409+
if (invalidFeaturesForASBuild<typename Geometry::buffer_t>(motionBlur))
410410
{
411411
NBL_LOG_ERROR("Required features are not enabled");
412412
return {};
@@ -567,17 +567,19 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe
567567
return false;
568568
break;
569569
}
570+
// https://vulkan.lunarg.com/doc/view/1.3.290.0/windows/1.3-extensions/vkspec.html#VUID-vkWriteAccelerationStructuresPropertiesKHR-accelerationStructureHostCommands-03585
570571
if (!getEnabledFeatures().accelerationStructureHostCommands)
571572
{
572573
NBL_LOG_ERROR("Feature `acceleration structure` host commands is not enabled");
573574
return false;
574575
}
576+
// https://vulkan.lunarg.com/doc/view/1.3.290.0/windows/1.3-extensions/vkspec.html#VUID-vkWriteAccelerationStructuresPropertiesKHR-buffer-03733
575577
for (const auto& as : accelerationStructures)
576-
if (invalidAccelerationStructureForHostOperations(as))
577-
{
578-
NBL_LOG_ERROR("Invalid acceleration structure for host operations");
579-
return false;
580-
}
578+
if (invalidAccelerationStructureForHostOperations(as))
579+
{
580+
NBL_LOG_ERROR("Invalid acceleration structure for host operations");
581+
return false;
582+
}
581583
// unfortunately cannot validate if they're built and if they're built with the right flags
582584
return writeAccelerationStructuresProperties_impl(accelerationStructures,type,data,stride);
583585
}

src/nbl/video/CVulkanAccelerationStructure.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ inline VkAccelerationStructureBuildGeometryInfoKHR getVkASBuildGeometryInfo(cons
205205
vk_info.type = IsTLAS ? VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR:VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;
206206
vk_info.flags = getVkASBuildFlagsFrom<acceleration_structure_t>(info.buildFlags,info.dstAS);
207207
vk_info.mode = info.isUpdate ? VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR:VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR;
208-
vk_info.srcAccelerationStructure = static_cast<const CVulkanAccelerationStructure<acceleration_structure_t>*>(info.srcAS)->getInternalObject();
208+
vk_info.srcAccelerationStructure = info.srcAS ? static_cast<const CVulkanAccelerationStructure<acceleration_structure_t>*>(info.srcAS)->getInternalObject():VK_NULL_HANDLE;
209209
vk_info.dstAccelerationStructure = static_cast<CVulkanAccelerationStructure<acceleration_structure_t>*>(info.dstAS)->getInternalObject();
210210
vk_info.geometryCount = info.inputCount();
211211
vk_info.pGeometries = p_vk_geometry;

src/nbl/video/CVulkanCommandBuffer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,7 @@ bool CVulkanCommandBuffer::writeAccelerationStructureProperties_impl(const std::
583583
vk_accelerationStructures[i] = *reinterpret_cast<const VkAccelerationStructureKHR*>(static_cast<const IGPUAccelerationStructure*>(pAccelerationStructures[i])->getNativeHandle());
584584

585585
getFunctionTable().vkCmdWriteAccelerationStructuresPropertiesKHR(
586-
m_cmdbuf, vk_accelerationStructures.size(), vk_accelerationStructures.data(),
586+
m_cmdbuf, vk_accelerationStructures.size()/sizeof(VkAccelerationStructureKHR), vk_accelerationStructures.data(),
587587
CVulkanQueryPool::getVkQueryTypeFrom(queryType), static_cast<CVulkanQueryPool*>(queryPool)->getInternalObject(), firstQuery
588588
);
589589
return true;
@@ -643,7 +643,7 @@ bool CVulkanCommandBuffer::beginRenderPass_impl(const SRenderpassBeginInfo& info
643643
.renderArea = info.renderArea,
644644
// Implicitly but could be optimizedif needed
645645
// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkRenderPassBeginInfo.html#VUID-VkRenderPassBeginInfo-clearValueCount-00902
646-
.clearValueCount = vk_clearValues.size(),
646+
.clearValueCount = vk_clearValues.size()/sizeof(VkClearValue),
647647
// Implicit
648648
// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkRenderPassBeginInfo.html#VUID-VkRenderPassBeginInfo-clearValueCount-04962
649649
.pClearValues = vk_clearValues.data()

src/nbl/video/CVulkanCommandBuffer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ class CVulkanCommandBuffer final : public IGPUCommandBuffer
118118

119119
auto out_vk_geoms = vk_geometries.data();
120120
for (auto i=0u; i<infoCount; i++)
121-
getVkASBuildGeometryInfo<typename AccelerationStructure::DeviceBuildInfo>(infos[i],out_vk_geoms,out_vk_vertexMotions);
121+
vk_buildGeomsInfos[i] = getVkASBuildGeometryInfo<typename AccelerationStructure::DeviceBuildInfo>(infos[i],out_vk_geoms,out_vk_vertexMotions);
122122

123123
getFunctionTable().vkCmdBuildAccelerationStructuresKHR(m_cmdbuf,infoCount,vk_buildGeomsInfos.data(),vk_ppBuildRangeInfos);
124124
return true;
@@ -170,7 +170,7 @@ class CVulkanCommandBuffer final : public IGPUCommandBuffer
170170
auto out_vk_geoms = vk_geometries.data();
171171
for (auto i=0u; i<infoCount; i++)
172172
{
173-
getVkASBuildGeometryInfo<typename AccelerationStructure::DeviceBuildInfo>(infos[i],out_vk_geoms,out_vk_vertexMotions);
173+
vk_buildGeomsInfos[i] = getVkASBuildGeometryInfo<typename AccelerationStructure::DeviceBuildInfo>(infos[i],out_vk_geoms,out_vk_vertexMotions);
174174
indirectDeviceAddresses[i] = baseIndirectAddress+pIndirectOffsets[i];
175175
}
176176
getFunctionTable().vkCmdBuildAccelerationStructuresIndirectKHR(m_cmdbuf,infoCount,vk_buildGeomsInfos.data(),indirectDeviceAddresses.data(),pIndirectStrides,ppMaxPrimitiveOrInstanceCounts);

src/nbl/video/CVulkanLogicalDevice.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,7 @@ auto CVulkanLogicalDevice::getAccelerationStructureBuildSizes_impl(
459459
) const -> AccelerationStructureBuildSizes
460460
{
461461
VkAccelerationStructureGeometryKHR geometry = {VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR,nullptr,VK_GEOMETRY_TYPE_INSTANCES_KHR};
462-
geometry.geometry.instances = {};
462+
geometry.geometry.instances = { .sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR };
463463
// no "geometry flags" are valid for all instances!
464464
geometry.flags = static_cast<VkGeometryFlagBitsKHR>(0);
465465

@@ -1434,7 +1434,7 @@ core::smart_refctd_ptr<IQueryPool> CVulkanLogicalDevice::createQueryPool_impl(co
14341434
info.pipelineStatistics = CVulkanQueryPool::getVkPipelineStatisticsFlagsFrom(params.pipelineStatisticsFlags.value);
14351435

14361436
VkQueryPool vk_queryPool = VK_NULL_HANDLE;
1437-
if (m_devf.vk.vkCreateQueryPool(m_vkdev,&info,nullptr,&vk_queryPool)!=VK_SUCCESS)
1437+
if (m_devf.vk.vkCreateQueryPool(m_vkdev,&info,nullptr,&vk_queryPool)==VK_SUCCESS)
14381438
return core::make_smart_refctd_ptr<CVulkanQueryPool>(this,params,vk_queryPool);
14391439
return nullptr;
14401440
}

src/nbl/video/CVulkanPhysicalDevice.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,7 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
703703
VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR subgroupUniformControlFlowFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR };
704704
VkPhysicalDeviceRayTracingMotionBlurFeaturesNV rayTracingMotionBlurFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV };
705705
VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR workgroupMemoryExplicitLayout = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR };
706+
VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR raytracingMaintenance1Features = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR };
706707
VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM rasterizationOrderAttachmentAccessFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_ARM };
707708
VkPhysicalDeviceColorWriteEnableFeaturesEXT colorWriteEnableFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT };
708709
#if 0
@@ -712,8 +713,11 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
712713
addToPNextChain(&conditionalRenderingFeatures);
713714
if (isExtensionSupported(VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME))
714715
addToPNextChain(&performanceQueryFeatures);
715-
if (isExtensionSupported(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME))
716+
if (isExtensionSupported(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME) && isExtensionSupported(VK_KHR_RAY_TRACING_MAINTENANCE_1_EXTENSION_NAME))
717+
{
716718
addToPNextChain(&accelerationStructureFeatures);
719+
addToPNextChain(&raytracingMaintenance1Features);
720+
}
717721
if (isExtensionSupported(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME))
718722
addToPNextChain(&rayTracingPipelineFeatures);
719723
if (isExtensionSupported(VK_NV_SHADER_SM_BUILTINS_EXTENSION_NAME))
@@ -1027,7 +1031,7 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
10271031

10281032
features.mixedAttachmentSamples = isExtensionSupported(VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME) || isExtensionSupported(VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME);
10291033

1030-
if (isExtensionSupported(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME))
1034+
if (isExtensionSupported(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME) && isExtensionSupported(VK_KHR_RAY_TRACING_MAINTENANCE_1_EXTENSION_NAME))
10311035
{
10321036
features.accelerationStructure = accelerationStructureFeatures.accelerationStructure;
10331037
features.accelerationStructureIndirectBuild = accelerationStructureFeatures.accelerationStructureIndirectBuild;
@@ -1039,10 +1043,10 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
10391043
}
10401044
}
10411045

1042-
if (isExtensionSupported(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME))
1046+
if (isExtensionSupported(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME) && isExtensionSupported(VK_KHR_RAY_TRACING_MAINTENANCE_1_EXTENSION_NAME))
10431047
{
10441048
features.rayTracingPipeline = rayTracingPipelineFeatures.rayTracingPipeline;
1045-
if (!rayTracingPipelineFeatures.rayTracingPipelineTraceRaysIndirect)
1049+
if (!rayTracingPipelineFeatures.rayTracingPipelineTraceRaysIndirect && !raytracingMaintenance1Features.rayTracingPipelineTraceRaysIndirect2)
10461050
{
10471051
logger.log("Not enumerating VkPhysicalDevice %p because it reports features contrary to Vulkan specification!", system::ILogger::ELL_INFO, vk_physicalDevice);
10481052
return nullptr;
@@ -1056,7 +1060,7 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
10561060
features.rayTraversalPrimitiveCulling = rayTracingPipelineFeatures.rayTraversalPrimitiveCulling;
10571061
}
10581062

1059-
features.rayQuery = isExtensionSupported(VK_KHR_RAY_QUERY_EXTENSION_NAME);
1063+
features.rayQuery = isExtensionSupported(VK_KHR_RAY_QUERY_EXTENSION_NAME) && isExtensionSupported(VK_KHR_RAY_TRACING_MAINTENANCE_1_EXTENSION_NAME);
10601064

10611065
if (isExtensionSupported(VK_NV_REPRESENTATIVE_FRAGMENT_TEST_EXTENSION_NAME))
10621066
features.representativeFragmentTest = representativeFragmentTestFeatures.representativeFragmentTest;
@@ -1449,7 +1453,9 @@ core::smart_refctd_ptr<ILogicalDevice> CVulkanPhysicalDevice::createLogicalDevic
14491453
enableExtensionIfAvailable(VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME);
14501454

14511455
VkPhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR,nullptr };
1456+
VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR rayTracingMaintenance1Features = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR,nullptr };
14521457
REQUIRE_EXTENSION_IF(enabledFeatures.accelerationStructure,VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME,&accelerationStructureFeatures); // feature dependency taken care of
1458+
REQUIRE_EXTENSION_IF(enabledFeatures.accelerationStructure,VK_KHR_RAY_TRACING_MAINTENANCE_1_EXTENSION_NAME,&rayTracingMaintenance1Features); // feature dependency taken care of
14531459

14541460
VkPhysicalDeviceRayTracingPipelineFeaturesKHR rayTracingPipelineFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR,nullptr };
14551461
REQUIRE_EXTENSION_IF(enabledFeatures.rayTracingPipeline,VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME,&rayTracingPipelineFeatures); // feature dependency taken care of
@@ -1797,6 +1803,10 @@ core::smart_refctd_ptr<ILogicalDevice> CVulkanPhysicalDevice::createLogicalDevic
17971803

17981804
//workgroupMemoryExplicitLayoutFeatures [LIMIT SO ENABLE EVERYTHING BY DEFAULT]
17991805

1806+
// we require this extension if the base ones and their features are enabled
1807+
rayTracingMaintenance1Features.rayTracingMaintenance1 = accelerationStructureFeatures.accelerationStructure;
1808+
rayTracingMaintenance1Features.rayTracingPipelineTraceRaysIndirect2 = rayTracingPipelineFeatures.rayTracingPipelineTraceRaysIndirect;
1809+
18001810
rasterizationOrderAttachmentAccessFeatures.rasterizationOrderColorAttachmentAccess = enabledFeatures.rasterizationOrderColorAttachmentAccess;
18011811
rasterizationOrderAttachmentAccessFeatures.rasterizationOrderDepthAttachmentAccess = enabledFeatures.rasterizationOrderDepthAttachmentAccess;
18021812
rasterizationOrderAttachmentAccessFeatures.rasterizationOrderStencilAttachmentAccess = enabledFeatures.rasterizationOrderStencilAttachmentAccess;

src/nbl/video/IGPUAccelerationStructure.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ bool IGPUAccelerationStructure::BuildInfo<BufferType>::invalid(const IGPUAcceler
3434
if constexpr (std::is_same_v<BufferType,IGPUBuffer>)
3535
{
3636
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03674
37-
if (scratch.buffer->getCreationParams().usage.hasFlags(IGPUBuffer::EUF_STORAGE_BUFFER_BIT))
37+
if (!scratch.buffer->getCreationParams().usage.hasFlags(IGPUBuffer::EUF_STORAGE_BUFFER_BIT))
3838
return true;
3939
const auto scratchAddress = scratch.buffer->getDeviceAddress();
4040
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03802

src/nbl/video/IGPUCommandBuffer.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,21 +585,36 @@ uint32_t IGPUCommandBuffer::buildAccelerationStructures_common(const std::span<c
585585
{
586586
// valid also checks that the `ranges` are below device limits
587587
const auto toAdd = infos[i].valid(ranges[i]);
588-
if (toAdd!=0)
588+
if (toAdd==0)
589+
{
590+
m_logger.log("Acceleration Structure Build Info combined with Range %d is not valid!",system::ILogger::ELL_ERROR,i);
589591
return false;
592+
}
590593
if (!isCompatibleDevicewise(infos[i].dstAS))
594+
{
595+
m_logger.log(
596+
"Acceleration Structure Build Info %d destination acceleration structure `%s` is not compatible with our Logical Device!",system::ILogger::ELL_ERROR,
597+
i,infos[i].dstAS ? infos[i].dstAS->getObjectDebugName():"nullptr"
598+
);
591599
return false;
600+
}
592601
resourcesToTrack += toAdd;
593602
totalGeometries += infos[i].inputCount();
594603
}
595604
// infos array was empty
596605
if (resourcesToTrack==0u)
606+
{
607+
m_logger.log("Acceleration Structure Build Info span was empty!", system::ILogger::ELL_ERROR);
597608
return false;
609+
}
598610

599611
if (indirectBuffer)
600612
{
601613
if (!features.accelerationStructureIndirectBuild)
614+
{
615+
m_logger.log("Indirect Acceleration Structure Build Feature not enabled!", system::ILogger::ELL_ERROR);
602616
return false;
617+
}
603618
resourcesToTrack++;
604619
}
605620

0 commit comments

Comments
 (0)