@@ -183,53 +183,6 @@ struct BuildAccelerationStructuresValidationShader {
183183 std::vector<VkWriteDescriptorSet> GetDescriptorWrites () const { return {}; }
184184};
185185
186- struct AccelerationStructuresWithAddressesArray {
187- std::shared_mutex map_mutex;
188- std::vector<vvl::AccelerationStructureKHR*> array;
189- };
190-
191- void RecordGetAccelerationStructureDeviceAddress (Validator& gpuav, VkAccelerationStructureKHR as, VkDeviceAddress as_addr) {
192- if (!gpuav.gpuav_settings .validate_acceleration_structures_builds ) {
193- return ;
194- }
195-
196- if (as_addr == 0 ) {
197- return ;
198- }
199- if (auto as_state = gpuav.Get <vvl::AccelerationStructureKHR>(as)) {
200- as_state->acceleration_structure_address = as_addr;
201- AccelerationStructuresWithAddressesArray& as_with_addresses =
202- gpuav.shared_resources_cache .GetOrCreate <AccelerationStructuresWithAddressesArray>();
203- WriteLockGuard lock (as_with_addresses.map_mutex );
204- if (as_with_addresses.array .capacity () <= (as_with_addresses.array .size () + 1 )) {
205- as_with_addresses.array .reserve (as_with_addresses.array .capacity () * 2 );
206- }
207- as_with_addresses.array .emplace_back (as_state.get ());
208- }
209- }
210-
211- void RemoveAccelerationStrutureDeviceAddress (Validator& gpuav, VkAccelerationStructureKHR as) {
212- if (!gpuav.gpuav_settings .validate_acceleration_structures_builds ) {
213- return ;
214- }
215- if (auto as_state = gpuav.Get <vvl::AccelerationStructureKHR>(as)) {
216- if (as_state->acceleration_structure_address != 0 ) {
217- auto * as_with_addresses = gpuav.shared_resources_cache .TryGet <AccelerationStructuresWithAddressesArray>();
218- if (as_with_addresses) {
219- WriteLockGuard lock (as_with_addresses->map_mutex );
220- auto as_found_it = std::find (as_with_addresses->array .begin (), as_with_addresses->array .end (), as_state.get ());
221- while (as_found_it != as_with_addresses->array .end ()) {
222- const size_t i = std::distance (as_with_addresses->array .begin (), as_found_it);
223- std::swap (as_with_addresses->array [i], as_with_addresses->array [as_with_addresses->array .size () - 1 ]);
224- as_with_addresses->array .resize (as_with_addresses->array .size () - 1 );
225- as_found_it = as_with_addresses->array .begin () + i;
226- }
227- }
228- as_state->acceleration_structure_address = 0 ;
229- }
230- }
231- }
232-
233186class DummyBLAS {
234187 public:
235188 DummyBLAS (Validator& gpuav, CommandBufferSubState& cb_state)
@@ -477,34 +430,29 @@ void BuildAccelerationStructures(Validator& gpuav, const Location& loc, CommandB
477430 VkCommandBuffer per_submission_cb) {
478431 VVL_ZoneScopedN (" validate_as_builds_pre_submit" );
479432
480- auto * as_with_addresses = gpuav.shared_resources_cache .TryGet <AccelerationStructuresWithAddressesArray>();
481- if (!as_with_addresses) {
482- return ;
483- }
484-
485- ReadLockGuard lock (as_with_addresses->map_mutex );
433+ ReadLockGuard lock (gpuav.device_state ->as_with_addresses .array_mutex );
486434
487435 // valid AS addresses buffer
488436 vko::BufferRange as_addresses_buffer = cb.gpu_resources_manager .GetHostCoherentBufferRange (
489- 2 * sizeof (uint32_t ) + as_with_addresses-> array .size () * sizeof (uint64_t ));
437+ 2 * sizeof (uint32_t ) + gpuav. device_state -> as_with_addresses . array .size () * sizeof (uint64_t ));
490438 auto accel_struct_addresses_buffer_u32_ptr = (uint32_t *)as_addresses_buffer.offset_mapped_ptr ;
491439
492- *accel_struct_addresses_buffer_u32_ptr = (uint32_t )as_with_addresses-> array .size ();
440+ *accel_struct_addresses_buffer_u32_ptr = (uint32_t )gpuav. device_state -> as_with_addresses . array .size ();
493441
494442 auto as_addresses_ptr = (uint64_t *)(accel_struct_addresses_buffer_u32_ptr + 2 );
495443
496444 // valid AS metadata buffer
497- vko::BufferRange as_metadatas_buffer =
498- cb. gpu_resources_manager . GetHostCachedBufferRange (as_with_addresses-> array .size () * sizeof (uint32_t ));
445+ vko::BufferRange as_metadatas_buffer = cb. gpu_resources_manager . GetHostCachedBufferRange (
446+ gpuav. device_state -> as_with_addresses . array .size () * sizeof (uint32_t ));
499447 auto as_metadatas_ptr = (uint32_t *)(as_metadatas_buffer.offset_mapped_ptr );
500448
501449 // valid AS buffer address ranges buffer
502- vko::BufferRange as_buffer_addr_ranges_buffer =
503- cb. gpu_resources_manager . GetHostCoherentBufferRange (as_with_addresses-> array .size () * (2 * sizeof (uint64_t )));
450+ vko::BufferRange as_buffer_addr_ranges_buffer = cb. gpu_resources_manager . GetHostCoherentBufferRange (
451+ gpuav. device_state -> as_with_addresses . array .size () * (2 * sizeof (uint64_t )));
504452 auto as_buffer_addr_ranges_ptr = (uint64_t *)(as_buffer_addr_ranges_buffer.offset_mapped_ptr );
505453
506454 uint32_t written_count = 0 ;
507- for (const vvl::AccelerationStructureKHR* as : as_with_addresses-> array ) {
455+ for (const vvl::AccelerationStructureKHR* as : gpuav. device_state -> as_with_addresses . array ) {
508456 as_addresses_ptr[written_count] = as->acceleration_structure_address ;
509457 uint32_t metadata = 0 ;
510458 metadata |= SET_BUILD_AS_METADATA_BUFFER_STATUS (as->buffer_state && !as->buffer_state ->Destroyed ());
@@ -648,14 +596,14 @@ void BuildAccelerationStructures(Validator& gpuav, const Location& loc, CommandB
648596 const char * vvl_bug_msg =
649597 " this is most likely a validation layer bug. Please file an issue at "
650598 " https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues " ;
651- auto & as_with_addresses = gpuav. shared_resources_cache . Get <AccelerationStructuresWithAddressesArray>();
652- const auto as_found_it = std::find_if (as_with_addresses.array .begin (), as_with_addresses.array .end (),
653- [blas_in_tlas_addr](vvl::AccelerationStructureKHR* as) {
654- return as->acceleration_structure_address == blas_in_tlas_addr;
655- });
599+ const auto as_found_it =
600+ std::find_if (gpuav. device_state -> as_with_addresses .array .begin (), gpuav. device_state -> as_with_addresses .array .end (),
601+ [blas_in_tlas_addr](vvl::AccelerationStructureKHR* as) {
602+ return as->acceleration_structure_address == blas_in_tlas_addr;
603+ });
656604 std::stringstream ss_as;
657605 std::stringstream ss_as_buffer;
658- if (as_found_it != as_with_addresses.array .end ()) {
606+ if (as_found_it != gpuav. device_state -> as_with_addresses .array .end ()) {
659607 ss_as << " Acceleration structure corresponding to reference: " << gpuav.FormatHandle ((*as_found_it)->VkHandle ());
660608 if ((*as_found_it)->buffer_state ) {
661609 ss_as_buffer << " (" << gpuav.FormatHandle ((*as_found_it)->buffer_state ->VkHandle ()) << " ) " ;
@@ -691,7 +639,7 @@ void BuildAccelerationStructures(Validator& gpuav, const Location& loc, CommandB
691639 }
692640 case kErrorSubCode_PreBuildAccelerationStructures_InvalidASType : {
693641 std::stringstream ss_as_type;
694- if (as_found_it != as_with_addresses.array .end ()) {
642+ if (as_found_it != gpuav. device_state -> as_with_addresses .array .end ()) {
695643 ss_as_type << " , but has type " << string_VkAccelerationStructureTypeKHR ((*as_found_it)->create_info .type )
696644 << " . " ;
697645 }
@@ -705,7 +653,7 @@ void BuildAccelerationStructures(Validator& gpuav, const Location& loc, CommandB
705653 const uint32_t blas_built_in_cmd_i = error_record[kValCmdErrorPayloadDword_4 ];
706654 const BlasBuiltInCmd& blas_built_in_cmd = blas_built_in_cmd_array[blas_built_in_cmd_i];
707655 std::stringstream error_ss;
708- if (as_found_it != as_with_addresses.array .end ()) {
656+ if (as_found_it != gpuav. device_state -> as_with_addresses .array .end ()) {
709657 const vvl::range<VkDeviceAddress> blas_in_tlas_buffer_addr_range = (*as_found_it)->GetDeviceAddressRange ();
710658 const vvl::range<VkDeviceAddress> blas_built_in_cmd_buffer_addr_range =
711659 blas_built_in_cmd.blas ->GetDeviceAddressRange ();
0 commit comments