diff --git a/tests/framework/ray_tracing_objects.cpp b/tests/framework/ray_tracing_objects.cpp index 0f314ce8562..7850efe496c 100644 --- a/tests/framework/ray_tracing_objects.cpp +++ b/tests/framework/ray_tracing_objects.cpp @@ -440,6 +440,11 @@ BuildGeometryInfoKHR &BuildGeometryInfoKHR::SetIndirectStride(uint32_t indirect_ return *this; } +BuildGeometryInfoKHR &BuildGeometryInfoKHR::SetIndirectDeviceAddress(std::optional indirect_buffer_address) { + indirect_buffer_address_ = indirect_buffer_address; + return *this; +} + void BuildGeometryInfoKHR::BuildCmdBuffer(VkCommandBuffer cmd_buffer, bool use_ppGeometries /*= true*/) { if (blas_) { blas_->BuildCmdBuffer(cmd_buffer, use_ppGeometries); @@ -615,7 +620,7 @@ void BuildGeometryInfoKHR::VkCmdBuildAccelerationStructuresIndirectKHR(VkCommand std::vector p_max_primitive_counts(vk_info_.geometryCount, 1); const uint32_t *pp_max_primitive_counts = p_max_primitive_counts.data(); - const VkDeviceAddress indirect_address = indirect_buffer_->address(); + const VkDeviceAddress indirect_address = indirect_buffer_address_ ? *indirect_buffer_address_ : indirect_buffer_->address(); vk::CmdBuildAccelerationStructuresIndirectKHR(cmd_buffer, vk_info_count_, &vk_info_, &indirect_address, &indirect_stride_, &pp_max_primitive_counts); diff --git a/tests/framework/ray_tracing_objects.h b/tests/framework/ray_tracing_objects.h index 7e5f587c62d..228ce56ad96 100644 --- a/tests/framework/ray_tracing_objects.h +++ b/tests/framework/ray_tracing_objects.h @@ -16,6 +16,7 @@ #include "shader_helper.h" #include +#include namespace vkt { // acceleration structure @@ -178,6 +179,7 @@ class BuildGeometryInfoKHR { BuildGeometryInfoKHR& SetDeferredOp(VkDeferredOperationKHR deferred_op); BuildGeometryInfoKHR& SetUpdateDstAccelStructSizeBeforeBuild(bool update_before_build); BuildGeometryInfoKHR& SetIndirectStride(uint32_t indirect_stride); + BuildGeometryInfoKHR& SetIndirectDeviceAddress(std::optional indirect_buffer_address); // Those functions call Build() on internal resources (geometries, src and dst acceleration structures, scratch buffer), // then will build/update an acceleration structure. @@ -221,6 +223,7 @@ class BuildGeometryInfoKHR { std::unique_ptr host_scratch_; std::shared_ptr blas_; std::unique_ptr indirect_buffer_; + std::optional indirect_buffer_address_{}; uint32_t indirect_stride_ = sizeof(VkAccelerationStructureBuildRangeInfoKHR); std::vector build_range_infos_; VkDeferredOperationKHR deferred_op_ = VK_NULL_HANDLE; diff --git a/tests/unit/ray_tracing.cpp b/tests/unit/ray_tracing.cpp index 14f0c10eee0..9eb1ad5be72 100644 --- a/tests/unit/ray_tracing.cpp +++ b/tests/unit/ray_tracing.cpp @@ -1433,9 +1433,12 @@ TEST_F(NegativeRayTracing, IndirectStridesMultiple) { auto blas = vkt::as::blueprint::BuildGeometryInfoSimpleOnDeviceBottomLevel(*m_device); blas.SetIndirectStride(13); + blas.SetIndirectDeviceAddress(13); m_commandBuffer->begin(); m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pIndirectStrides-03787"); + m_errorMonitor->SetDesiredFailureMsg(kErrorBit, + "VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pIndirectDeviceAddresses-03648"); blas.BuildCmdBufferIndirect(*m_commandBuffer); m_errorMonitor->VerifyFound(); }