VK_ERROR_DEVICE_LOST when building acceleration structure

i’m trying to make an acceleration structure like this

VkAccelerationStructureGeometryTrianglesDataKHR geometryData = {};
geometryData.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR;
geometryData.vertexFormat = VK_FORMAT_R32G32B32_SFLOAT;

VkBufferDeviceAddressInfo bufferAddressInfo = {};
bufferAddressInfo.sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO;
bufferAddressInfo.buffer = vertexBuffer;
	
geometryData.vertexData.deviceAddress = vkGetBufferDeviceAddress(device, &bufferAddressInfo);
geometryData.maxVertex = vertices.size()-1;
geometryData.vertexStride = 0;
geometryData.indexType = VK_INDEX_TYPE_UINT32;

bufferAddressInfo.buffer = indexBuffer;
geometryData.indexData.deviceAddress = vkGetBufferDeviceAddress(device, &bufferAddressInfo);

VkAccelerationStructureGeometryKHR accelGeometry = {};
accelGeometry.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR;
accelGeometry.geometryType = VK_GEOMETRY_TYPE_TRIANGLES_KHR;
accelGeometry.geometry.triangles = geometryData;
accelGeometry.flags = VK_GEOMETRY_OPAQUE_BIT_KHR;

VkAccelerationStructureBuildRangeInfoKHR offset;
offset.firstVertex = 0;
offset.primitiveCount = vertices.size() / 3;
offset.primitiveOffset = 0;
offset.transformOffset = 0;

VkAccelerationStructureBuildGeometryInfoKHR accelGeometryBuild = {};
accelGeometryBuild.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR;
accelGeometryBuild.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;
accelGeometryBuild.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR;
accelGeometryBuild.mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR;
accelGeometryBuild.geometryCount = 1;
accelGeometryBuild.pGeometries = &accelGeometry;

VkAccelerationStructureBuildSizesInfoKHR accelSize;
accelSize.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR;
vkGetAccelerationStructureBuildSizesKHR(device, VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR, &accelGeometryBuild, &offset.primitiveCount, &accelSize);

VkBuffer scratchBuffer;
VkDeviceMemory scratchBufferMemory;
createBuffer(accelSize.buildScratchSize, VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR, scratchBuffer, scratchBufferMemory);

VkAccelerationStructureCreateInfoKHR accelCreateInfo = {};
accelCreateInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR;
accelCreateInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;
accelCreateInfo.size = accelSize.accelerationStructureSize;

createBuffer(accelCreateInfo.size, VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR, blAccelStructureBuffer, blAccelStructureBufferMemory);

accelCreateInfo.buffer = blAccelStructureBuffer;
if (vkCreateAccelerationStructureKHR(device, &accelCreateInfo, nullptr, &blAccelStructure) != VK_SUCCESS)
		log_fatal(std::runtime_error("failed to create a bottom level acceleration structure"));

accelGeometryBuild.dstAccelerationStructure = blAccelStructure;

bufferAddressInfo.buffer = scratchBuffer;
accelGeometryBuild.scratchData.deviceAddress = vkGetBufferDeviceAddress(device, &bufferAddressInfo);

VkCommandBuffer cmdBuffer;

VkCommandBufferBeginInfo beginInfo = {};
beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;

vkBeginCommandBuffer(cmdBuffer, &beginInfo);

std::array<VkAccelerationStructureBuildRangeInfoKHR*, 1> offsets = {&offset};

vkCmdBuildAccelerationStructuresKHR(cmdBuffer, 1, &accelGeometryBuild, offsets.data());

vkEndCommandBuffer(cmdBuffer);

VkSubmitInfo submitInfo = {};
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
submitInfo.commandBufferCount = 1;
submitInfo.pCommandBuffers = &cmdBuffer;

vkQueueSubmit(mainQueue, 1, &submitInfo, VK_NULL_HANDLE);
vkQueueWaitIdle(mainQueue);

vkFreeCommandBuffers(device, shortCommandPool, 1, &cmdBuffer);

vkDestroyBuffer(device, scratchBuffer, nullptr);
vkFreeMemory(device, scratchBufferMemory, nullptr);

note that both vertexBuffer and indexBuffer are created with usage flags VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT and their memory is allocated with flag VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT.
also vertices is a vector of vertex data which is copied into vertexBuffer

when running that code, the program stucks for like a minute and then the only thing validation layers say is that i can’t free command buffer, which is in pending state. when debugging this, i found out that vkQueueWaitIdle returns VK_ERROR_DEVICE_LOST. what am i doing wrong?