Skip to content

Commit 4c26278

Browse files
committed
gpuav: Validate BLAS buffer memory in TLAS build
1 parent 56b70da commit 4c26278

File tree

6 files changed

+325
-137
lines changed

6 files changed

+325
-137
lines changed

layers/gpuav/shaders/gpuav_error_codes.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,8 @@ const int kErrorSubCode_PreBuildAccelerationStructures_BlasAddrAlignment = 1;
169169
const int kErrorSubCode_PreBuildAccelerationStructures_InvalidAS = 2;
170170
const int kErrorSubCode_PreBuildAccelerationStructures_DestroyedASBuffer = 3;
171171
const int kErrorSubCode_PreBuildAccelerationStructures_InvalidASType = 4;
172-
const int kErrorSubCode_PreBuildAccelerationStructures_BlasMemoryOverlap = 5;
172+
const int kErrorSubCode_PreBuildAccelerationStructures_DestroyedASMemory = 5;
173+
const int kErrorSubCode_PreBuildAccelerationStructures_BlasMemoryOverlap = 6;
173174

174175
#ifdef __cplusplus
175176
} // namespace glsl

layers/gpuav/shaders/validation_cmd/build_acceleration_structures.comp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,17 @@ void main() {
7272

7373
if (GET_BUILD_AS_METADATA_BUFFER_STATUS(as_metadata) != BUILD_AS_METADATA_VALID_BUFFER) {
7474
error_subcode = kErrorSubCode_PreBuildAccelerationStructures_DestroyedASBuffer;
75+
break;
7576
}
7677

7778
if (GET_BUILD_AS_METADATA_AS_TYPE(as_metadata) != BUILD_AS_METADATA_AS_TYPE_BLAS) {
7879
error_subcode = kErrorSubCode_PreBuildAccelerationStructures_InvalidASType;
80+
break;
81+
}
82+
83+
if (GET_BUILD_AS_METADATA_BUFFER_MEMORY_STATUS(as_metadata) != BUILD_AS_METADATA_VALID_BUFFER_MEMORY) {
84+
error_subcode = kErrorSubCode_PreBuildAccelerationStructures_DestroyedASMemory;
85+
break;
7986
}
8087

8188
break;

layers/gpuav/shaders/validation_cmd/build_acceleration_structures.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@
2727
#define GET_BUILD_AS_METADATA_AS_TYPE(metadata) ((metadata & (0x3 << 1u)) >> 1u)
2828
#define SET_BUILD_AS_METADATA_AS_TYPE(as_type) ((uint32_t(as_type) & 0x3) << 1u)
2929

30+
#define BUILD_AS_METADATA_VALID_BUFFER_MEMORY 1u
31+
#define GET_BUILD_AS_METADATA_BUFFER_MEMORY_STATUS(metadata) ((metadata & (0x1 << 3u)) >> 3u)
32+
#define SET_BUILD_AS_METADATA_BUFFER_MEMORY_STATUS(is_memory_destroyed) ((uint32_t(is_memory_destroyed) & 0x1) << 3u)
33+
3034
#ifdef __cplusplus
3135

3236
#include <cstdint>

layers/gpuav/validation_cmd/gpuav_ray_tracing.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -455,8 +455,11 @@ void BuildAccelerationStructures(Validator& gpuav, const Location& loc, CommandB
455455
for (const vvl::AccelerationStructureKHR* as : gpuav.device_state->as_with_addresses.array) {
456456
as_addresses_ptr[written_count] = as->acceleration_structure_address;
457457
uint32_t metadata = 0;
458-
metadata |= SET_BUILD_AS_METADATA_BUFFER_STATUS(as->buffer_state && !as->buffer_state->Destroyed());
458+
const bool is_buffer_destroyed = as->buffer_state && !as->buffer_state->Destroyed();
459+
const bool is_buffer_bound_to_memory = is_buffer_destroyed && as->buffer_state->IsMemoryBound();
460+
metadata |= SET_BUILD_AS_METADATA_BUFFER_STATUS(is_buffer_destroyed);
459461
metadata |= SET_BUILD_AS_METADATA_AS_TYPE(as->create_info.type);
462+
metadata |= SET_BUILD_AS_METADATA_BUFFER_MEMORY_STATUS(is_buffer_bound_to_memory);
460463
as_metadatas_ptr[written_count] = metadata;
461464
const vvl::range<VkDeviceAddress> as_buffer_addr_range = as->GetDeviceAddressRange();
462465
as_buffer_addr_ranges_ptr[2 * written_count] = as_buffer_addr_range.begin;
@@ -636,10 +639,10 @@ void BuildAccelerationStructures(Validator& gpuav, const Location& loc, CommandB
636639
break;
637640
}
638641
case kErrorSubCode_PreBuildAccelerationStructures_DestroyedASBuffer: {
639-
skip |= gpuav.LogError(
640-
"VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-12281", objlist, loc_with_debug_region,
641-
"%s is an invalid acceleration structure reference - underlying buffer %shas been destroyed. %s.",
642-
invalid_blas_loc_str.c_str(), ss_buffer_str.c_str(), ss_as_str.c_str());
642+
skip |= gpuav.LogError("VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-12281", objlist, loc_with_debug_region,
643+
"%s is an invalid acceleration structure reference - underlying buffer %swas already "
644+
"destroyed when build command started execution. %s.",
645+
invalid_blas_loc_str.c_str(), ss_buffer_str.c_str(), ss_as_str.c_str());
643646
break;
644647
}
645648
case kErrorSubCode_PreBuildAccelerationStructures_InvalidASType: {
@@ -654,6 +657,13 @@ void BuildAccelerationStructures(Validator& gpuav, const Location& loc, CommandB
654657
ss_as_type_str.c_str(), ss_as_str.c_str());
655658
break;
656659
}
660+
case kErrorSubCode_PreBuildAccelerationStructures_DestroyedASMemory: {
661+
skip |= gpuav.LogError("VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03709", objlist, loc_with_debug_region,
662+
"%s is an invalid acceleration structure reference - underlying buffer %s was not bound to "
663+
"memory anymore when build command started execution. Memory was probably destroyed. %s.",
664+
invalid_blas_loc_str.c_str(), ss_buffer_str.c_str(), ss_as_str.c_str());
665+
break;
666+
}
657667
case kErrorSubCode_PreBuildAccelerationStructures_BlasMemoryOverlap: {
658668
const uint32_t blas_built_in_cmd_i = error_record[kValCmdErrorPayloadDword_4];
659669
const BlasBuiltInCmd& blas_built_in_cmd = blas_built_in_cmd_array[blas_built_in_cmd_i];

0 commit comments

Comments
 (0)