vkWriteResourceDescriptorsEXT(): pResources[0].data.pAddressRange->address is 0xc200400 which is not an address obtained from a currently existing VkAccelerationStructureKHR after a call to vkGetAccelerationStructureDeviceAddressKHR.
The Vulkan spec states: If type is VK_DESCRIPTOR_TYPE_PARTITIONED_ACCELERATION_STRUCTURE_NV or VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, and data.pAddressRange is not NULL, data.pAddressRange->address must be an acceleration structure address retrieved from a VkAccelerationStructureKHR object via vkGetAccelerationStructureDeviceAddressKHR (https://docs.vulkan.org/spec/latest/chapters/descriptorheaps.html#VUID-VkResourceDescriptorInfoEXT-type-11483)
Thread 2, Frame 0:
vkGetAccelerationStructureBuildSizesKHR(device, buildType, pBuildInfo, pMaxPrimitiveCounts, pSizeInfo) returns void:
device: VkDevice = 0000017942BEB270
buildType: VkAccelerationStructureBuildTypeKHR = VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR (1)
pBuildInfo: const VkAccelerationStructureBuildGeometryInfoKHR* = 00000065879FB060:
sType: VkStructureType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR (1000150000)
pNext: const void* = NULL
type: VkAccelerationStructureTypeKHR = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR (0)
flags: VkBuildAccelerationStructureFlagsKHR = 4 (VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR)
mode: VkBuildAccelerationStructureModeKHR = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR (0)
srcAccelerationStructure: VkAccelerationStructureKHR = 0000000000000000
dstAccelerationStructure: VkAccelerationStructureKHR = 0000000000000000
geometryCount: uint32_t = 1
pGeometries: const VkAccelerationStructureGeometryKHR* = 00000065879FB640
pGeometries[0]: const VkAccelerationStructureGeometryKHR = 00000065879FB640:
sType: VkStructureType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR (1000150006)
pNext: const void* = NULL
geometryType: VkGeometryTypeKHR = VK_GEOMETRY_TYPE_INSTANCES_KHR (2)
geometry: VkAccelerationStructureGeometryDataKHR = 0000000000000000 (Union):
triangles: VkAccelerationStructureGeometryTrianglesDataKHR = 0000000000000000:
sType: VkStructureType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR (1000150004)
pNext: const void* = NULL
vertexFormat: VkFormat = VK_FORMAT_UNDEFINED (0)
vertexData: VkDeviceOrHostAddressConstKHR = 0000000000000000 (Union):
deviceAddress: VkDeviceAddress = 0x0
hostAddress: const void* = NULL
vertexStride: VkDeviceSize = 0
maxVertex: uint32_t = 0
indexType: VkIndexType = VK_INDEX_TYPE_UINT16 (0)
indexData: VkDeviceOrHostAddressConstKHR = 0000000000000000 (Union):
deviceAddress: VkDeviceAddress = 0x0
hostAddress: const void* = NULL
transformData: VkDeviceOrHostAddressConstKHR = 0000000000000000 (Union):
deviceAddress: VkDeviceAddress = 0x0
hostAddress: const void* = NULL
aabbs: VkAccelerationStructureGeometryAabbsDataKHR = 0000000000000000:
sType: VkStructureType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR (1000150004)
pNext: const void* = NULL
data: VkDeviceOrHostAddressConstKHR = 0000000000000000 (Union):
deviceAddress: VkDeviceAddress = 0x0
hostAddress: const void* = NULL
stride: VkDeviceSize = 0
instances: VkAccelerationStructureGeometryInstancesDataKHR = 0000000000000000:
sType: VkStructureType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR (1000150004)
pNext: const void* = NULL
arrayOfPointers: VkBool32 = 0
data: VkDeviceOrHostAddressConstKHR = 0000000000000000 (Union):
deviceAddress: VkDeviceAddress = 0x0
hostAddress: const void* = NULL
flags: VkGeometryFlagsKHR = 0
ppGeometries: const VkAccelerationStructureGeometryKHR* const* = NULL
scratchData: VkDeviceOrHostAddressKHR = 0000000000000000 (Union):
deviceAddress: VkDeviceAddress = 0x0
hostAddress: void* = NULL
pMaxPrimitiveCounts: const uint32_t* = 00000065879FB6B4
pMaxPrimitiveCounts[0]: const uint32_t = 0
pSizeInfo: VkAccelerationStructureBuildSizesInfoKHR* = 00000065879FB7D0:
sType: VkStructureType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR (1000150020)
pNext: void* = NULL
accelerationStructureSize: VkDeviceSize = 640
updateScratchSize: VkDeviceSize = 0
buildScratchSize: VkDeviceSize = 1792
Thread 2, Frame 0:
vkCreateBuffer(device, pCreateInfo, pAllocator, pBuffer) returns VkResult VK_SUCCESS (0):
device: VkDevice = 0000017942BEB270
pCreateInfo: const VkBufferCreateInfo* = 00000065879FAD58:
sType: VkStructureType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO (12)
pNext: const void* = NULL
flags: VkBufferCreateFlags = 0
size: VkDeviceSize = 640
usage: VkBufferUsageFlags = 1179648 (VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR)
sharingMode: VkSharingMode = VK_SHARING_MODE_CONCURRENT (1)
queueFamilyIndexCount: uint32_t = 2
pQueueFamilyIndices: const uint32_t* = 00000065868FF3F4
pQueueFamilyIndices[0]: const uint32_t = 0
pQueueFamilyIndices[1]: const uint32_t = 2
pAllocator: const VkAllocationCallbacks* = NULL
pBuffer: VkBuffer* = 000002B954F6DC90
Thread 2, Frame 0:
vkGetBufferMemoryRequirements(device, buffer, pMemoryRequirements) returns void:
device: VkDevice = 0000017942BEB270
buffer: VkBuffer = 000002B954F6DC90
pMemoryRequirements: VkMemoryRequirements* = 00000065879FB428:
size: VkDeviceSize = 768
alignment: VkDeviceSize = 256
memoryTypeBits: uint32_t = 31
Thread 3, Frame 0:
vkGetSemaphoreCounterValue(device, semaphore, pValue) returns VkResult VK_SUCCESS (0):
device: VkDevice = 0000017942BEB270
semaphore: VkSemaphore = 000002B9510BAB70
pValue: uint64_t* = 0
Thread 3, Frame 0:
vkGetSemaphoreCounterValue(device, semaphore, pValue) returns VkResult VK_SUCCESS (0):
device: VkDevice = 0000017942BEB270
semaphore: VkSemaphore = 000002B9510BC330
pValue: uint64_t* = 0
Thread 3, Frame 0:
vkGetSemaphoreCounterValue(device, semaphore, pValue) returns VkResult VK_SUCCESS (0):
device: VkDevice = 0000017942BEB270
semaphore: VkSemaphore = 000002B9510BB880
pValue: uint64_t* = 0
Thread 2, Frame 0:
vkAllocateMemory(device, pAllocateInfo, pAllocator, pMemory) returns VkResult VK_SUCCESS (0):
device: VkDevice = 0000017942BEB270
pAllocateInfo: const VkMemoryAllocateInfo* = 00000065879FA1E8:
sType: VkStructureType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO (5)
pNext: const void* = VkMemoryAllocateFlagsInfo
allocationSize: VkDeviceSize = 268435456
memoryTypeIndex: uint32_t = 1
pNext: VkMemoryAllocateFlagsInfo = 00000065879FA1B8:
sType: VkStructureType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO (1000060000)
pNext: const void* = NULL
flags: VkMemoryAllocateFlags = 2 (VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT)
deviceMask: uint32_t = 0
pAllocator: const VkAllocationCallbacks* = NULL
pMemory: VkDeviceMemory* = 000002B954F6E080
Thread 2, Frame 0:
vkBindBufferMemory(device, buffer, memory, memoryOffset) returns VkResult VK_SUCCESS (0):
device: VkDevice = 0000017942BEB270
buffer: VkBuffer = 000002B954F6DC90
memory: VkDeviceMemory = 000002B954F6E080
memoryOffset: VkDeviceSize = 0
Thread 2, Frame 0:
vkCreateAccelerationStructureKHR(device, pCreateInfo, pAllocator, pAccelerationStructure) returns VkResult VK_SUCCESS (0):
device: VkDevice = 0000017942BEB270
pCreateInfo: const VkAccelerationStructureCreateInfoKHR* = 00000065879FB0D0:
sType: VkStructureType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR (1000150017)
pNext: const void* = NULL
createFlags: VkAccelerationStructureCreateFlagsKHR = 0
buffer: VkBuffer = 000002B954F6DC90
offset: VkDeviceSize = 0
size: VkDeviceSize = 640
type: VkAccelerationStructureTypeKHR = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR (0)
deviceAddress: VkDeviceAddress = 0x0
pAllocator: const VkAllocationCallbacks* = NULL
pAccelerationStructure: VkAccelerationStructureKHR* = 000002B956862300
Thread 2, Frame 0:
vkGetAccelerationStructureDeviceAddressKHR(device, pInfo) returns VkDeviceAddress 0xc200000:
device: VkDevice = 0000017942BEB270
pInfo: const VkAccelerationStructureDeviceAddressInfoKHR* = 00000065879FB248:
sType: VkStructureType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR (1000150002)
pNext: const void* = NULL
accelerationStructure: VkAccelerationStructureKHR = 000002B956862300
Thread 2, Frame 0:
vkGetAccelerationStructureBuildSizesKHR(device, buildType, pBuildInfo, pMaxPrimitiveCounts, pSizeInfo) returns void:
device: VkDevice = 0000017942BEB270
buildType: VkAccelerationStructureBuildTypeKHR = VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR (1)
pBuildInfo: const VkAccelerationStructureBuildGeometryInfoKHR* = 00000065879FB060:
sType: VkStructureType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR (1000150000)
pNext: const void* = NULL
type: VkAccelerationStructureTypeKHR = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR (0)
flags: VkBuildAccelerationStructureFlagsKHR = 4 (VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR)
mode: VkBuildAccelerationStructureModeKHR = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR (0)
srcAccelerationStructure: VkAccelerationStructureKHR = 0000000000000000
dstAccelerationStructure: VkAccelerationStructureKHR = 0000000000000000
geometryCount: uint32_t = 1
pGeometries: const VkAccelerationStructureGeometryKHR* = 00000065879FB640
pGeometries[0]: const VkAccelerationStructureGeometryKHR = 00000065879FB640:
sType: VkStructureType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR (1000150006)
pNext: const void* = NULL
geometryType: VkGeometryTypeKHR = VK_GEOMETRY_TYPE_INSTANCES_KHR (2)
geometry: VkAccelerationStructureGeometryDataKHR = 0000000000000000 (Union):
triangles: VkAccelerationStructureGeometryTrianglesDataKHR = 0000000000000000:
sType: VkStructureType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR (1000150004)
pNext: const void* = NULL
vertexFormat: VkFormat = VK_FORMAT_UNDEFINED (0)
vertexData: VkDeviceOrHostAddressConstKHR = 0000000000000000 (Union):
deviceAddress: VkDeviceAddress = 0x0
hostAddress: const void* = NULL
vertexStride: VkDeviceSize = 0
maxVertex: uint32_t = 0
indexType: VkIndexType = VK_INDEX_TYPE_UINT16 (0)
indexData: VkDeviceOrHostAddressConstKHR = 0000000000000000 (Union):
deviceAddress: VkDeviceAddress = 0x0
hostAddress: const void* = NULL
transformData: VkDeviceOrHostAddressConstKHR = 0000000000000000 (Union):
deviceAddress: VkDeviceAddress = 0x0
hostAddress: const void* = NULL
aabbs: VkAccelerationStructureGeometryAabbsDataKHR = 0000000000000000:
sType: VkStructureType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR (1000150004)
pNext: const void* = NULL
data: VkDeviceOrHostAddressConstKHR = 0000000000000000 (Union):
deviceAddress: VkDeviceAddress = 0x0
hostAddress: const void* = NULL
stride: VkDeviceSize = 0
instances: VkAccelerationStructureGeometryInstancesDataKHR = 0000000000000000:
sType: VkStructureType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR (1000150004)
pNext: const void* = NULL
arrayOfPointers: VkBool32 = 0
data: VkDeviceOrHostAddressConstKHR = 0000000000000000 (Union):
deviceAddress: VkDeviceAddress = 0x0
hostAddress: const void* = NULL
flags: VkGeometryFlagsKHR = 0
ppGeometries: const VkAccelerationStructureGeometryKHR* const* = NULL
scratchData: VkDeviceOrHostAddressKHR = 0000000000000000 (Union):
deviceAddress: VkDeviceAddress = 0x0
hostAddress: void* = NULL
pMaxPrimitiveCounts: const uint32_t* = 00000065879FB6B4
pMaxPrimitiveCounts[0]: const uint32_t = 0
pSizeInfo: VkAccelerationStructureBuildSizesInfoKHR* = 00000065879FB7D0:
sType: VkStructureType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR (1000150020)
pNext: void* = NULL
accelerationStructureSize: VkDeviceSize = 640
updateScratchSize: VkDeviceSize = 0
buildScratchSize: VkDeviceSize = 1792
Thread 2, Frame 0:
vkCreateBuffer(device, pCreateInfo, pAllocator, pBuffer) returns VkResult VK_SUCCESS (0):
device: VkDevice = 0000017942BEB270
pCreateInfo: const VkBufferCreateInfo* = 00000065879FAD58:
sType: VkStructureType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO (12)
pNext: const void* = NULL
flags: VkBufferCreateFlags = 0
size: VkDeviceSize = 640
usage: VkBufferUsageFlags = 1179648 (VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR)
sharingMode: VkSharingMode = VK_SHARING_MODE_CONCURRENT (1)
queueFamilyIndexCount: uint32_t = 2
pQueueFamilyIndices: const uint32_t* = 00000065868FF3F4
pQueueFamilyIndices[0]: const uint32_t = 0
pQueueFamilyIndices[1]: const uint32_t = 2
pAllocator: const VkAllocationCallbacks* = NULL
pBuffer: VkBuffer* = 000002B954F6D4C0
Thread 2, Frame 0:
vkGetBufferMemoryRequirements(device, buffer, pMemoryRequirements) returns void:
device: VkDevice = 0000017942BEB270
buffer: VkBuffer = 000002B954F6D4C0
pMemoryRequirements: VkMemoryRequirements* = 00000065879FB428:
size: VkDeviceSize = 768
alignment: VkDeviceSize = 256
memoryTypeBits: uint32_t = 31
Thread 2, Frame 0:
vkBindBufferMemory(device, buffer, memory, memoryOffset) returns VkResult VK_SUCCESS (0):
device: VkDevice = 0000017942BEB270
buffer: VkBuffer = 000002B954F6D4C0
memory: VkDeviceMemory = 000002B954F6E080
memoryOffset: VkDeviceSize = 1024
Thread 2, Frame 0:
vkCreateAccelerationStructureKHR(device, pCreateInfo, pAllocator, pAccelerationStructure) returns VkResult VK_SUCCESS (0):
device: VkDevice = 0000017942BEB270
pCreateInfo: const VkAccelerationStructureCreateInfoKHR* = 00000065879FB0D0:
sType: VkStructureType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR (1000150017)
pNext: const void* = NULL
createFlags: VkAccelerationStructureCreateFlagsKHR = 0
buffer: VkBuffer = 000002B954F6D4C0
offset: VkDeviceSize = 0
size: VkDeviceSize = 640
type: VkAccelerationStructureTypeKHR = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR (0)
deviceAddress: VkDeviceAddress = 0x0
pAllocator: const VkAllocationCallbacks* = NULL
pAccelerationStructure: VkAccelerationStructureKHR* = 000002B956861610
Thread 2, Frame 0:
vkGetAccelerationStructureDeviceAddressKHR(device, pInfo) returns VkDeviceAddress 0xc200400:
device: VkDevice = 0000017942BEB270
pInfo: const VkAccelerationStructureDeviceAddressInfoKHR* = 00000065879FB248:
sType: VkStructureType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR (1000150002)
pNext: const void* = NULL
accelerationStructure: VkAccelerationStructureKHR = 000002B956861610
Thread 2, Frame 0:
vkDeviceWaitIdle(device) returns VkResult VK_SUCCESS (0):
device: VkDevice = 0000017942BEB270
Thread 2, Frame 0:
vkGetSemaphoreCounterValue(device, semaphore, pValue) returns VkResult VK_SUCCESS (0):
device: VkDevice = 0000017942BEB270
semaphore: VkSemaphore = 000002B9510BAB70
pValue: uint64_t* = 0
Thread 2, Frame 0:
vkGetSemaphoreCounterValue(device, semaphore, pValue) returns VkResult VK_SUCCESS (0):
device: VkDevice = 0000017942BEB270
semaphore: VkSemaphore = 000002B9510BC330
pValue: uint64_t* = 0
Thread 2, Frame 0:
vkGetSemaphoreCounterValue(device, semaphore, pValue) returns VkResult VK_SUCCESS (0):
device: VkDevice = 0000017942BEB270
semaphore: VkSemaphore = 000002B9510BB880
pValue: uint64_t* = 0
Thread 2, Frame 0:
vkDestroyAccelerationStructureKHR(device, accelerationStructure, pAllocator) returns void:
device: VkDevice = 0000017942BEB270
accelerationStructure: VkAccelerationStructureKHR = 000002B956862300
pAllocator: const VkAllocationCallbacks* = NULL
Thread 2, Frame 0:
vkDestroyBuffer(device, buffer, pAllocator) returns void:
device: VkDevice = 0000017942BEB270
buffer: VkBuffer = 000002B954F6DC90
pAllocator: const VkAllocationCallbacks* = NULL
Thread 2, Frame 0:
vkWriteResourceDescriptorsEXT(device, resourceCount, pResources, pDescriptors) returns VkResult VK_SUCCESS (0):
device: VkDevice = 0000017942BEB270
resourceCount: uint32_t = 1
pResources: const VkResourceDescriptorInfoEXT* = 00000065879FBA28
pResources[0]: const VkResourceDescriptorInfoEXT = 00000065879FBA28:
sType: VkStructureType = VK_STRUCTURE_TYPE_RESOURCE_DESCRIPTOR_INFO_EXT (1000135002)
pNext: const void* = NULL
type: VkDescriptorType = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR (1000150000)
data: VkResourceDescriptorDataEXT = 0000000000000000 (Union):
pAddressRange: const VkDeviceAddressRangeEXT* = 00000065879FB9F8:
address: VkDeviceAddress = 0xc200400
size: VkDeviceSize = 640
pDescriptors: const VkHostAddressRangeEXT* = 00000065879FB5E8
pDescriptors[0]: const VkHostAddressRangeEXT = 00000065879FB5E8:
address: void* = 000002B957300000
size: size_t = 32
Environment:
Describe the Issue
Creating 2 top level acceleration structures sharing the same device address at different offsets. Destroying one of the 2 then creating a descriptor of the other one result in a validation error.
(the validator is probably using bound buffer's "address" instead of "address+offset" as discriminant)
(check vkBindBufferMemory in the API dump)
Pseudo code:
Expected behavior
This should not result in a validation error
Additional context
code or terminal output - repro API dump