Nvidia Nsight выходит из строя при создании BLAS. В чем может быть причина?

#c #vulkan #raytracing #nsight

#c #vulkan #трассировка лучей #nsight

Вопрос:

ПРАВКА: Я нашел ошибку в коде. Я ошибочно установил значение «max_primive_count» равным 3, но оно должно быть 1, так как я хотел отобразить только один треугольник. Также maxVertex должен быть установлен на 3, и я забыл установить шаг вершины в sizeof(float) * 3. Тот факт, что Nsight потерпел крушение, заставил меня поверить, что что-то было полностью нарушено в моей программе, и я начал искать глубже, чем должен был. По крайней мере, я нашел кое-что еще по пути.

В настоящее время у меня возникли проблемы с настройкой экземпляра BLAS в моем приложении Vulkan, но у меня возникли некоторые проблемы с настройкой Nsight, поэтому я не могу отладить его должным образом.

Сборки работают нормально, и (обычная) отладка также работает, но этого недостаточно, чтобы понять, почему я не вижу никакой геометрии на своем экране. Поэтому я попытался отладить структуру ускорения с помощью Nsight, но у меня это вышло из строя.

 Reason: EXCEPTION_ACCESS_VIOLATION_READ Address: 0x238 Assertion: Unknown assertion type 0x00000000  Thread 0 (crashed)  lt;no framesgt;  Thread 1  lt;no framesgt;  Thread 2  lt;no framesgt;  Thread 3  lt;no framesgt;  Thread 4  lt;no framesgt;  Thread 5  lt;no framesgt;  Thread 6  lt;no framesgt;  Thread 7  lt;no framesgt;  Thread 8  lt;no framesgt;  Thread 9  lt;no framesgt;  Thread 10  lt;no framesgt;  Thread 11  lt;no framesgt;  Thread 12  lt;no framesgt;  Thread 13  lt;no framesgt;  Thread 14  lt;no framesgt;  Thread 15  lt;no framesgt;  Thread 16  lt;no framesgt;  Thread 17  lt;no framesgt;  Thread 18  lt;no framesgt;  

Но он не выходит из строя при запуске, похоже, он выходит из строя именно в «CmdBuildAccelerationStructuresKHR», поэтому я действительно уверен, что проблема кроется где-то в создании BLAS или, возможно, в примере геометрии, который я использую.

Похоже, что Nsight не может получить доступ к адресу или не имеет на это прав, но я действительно не знаю.

Example geometry for test BLAS:

 const float vertices[9] = {  0.25f, 0.25f, 0.0f,  0.75f, 0.25f, 0.0f,  0.50f, 0.75f, 0.0f  };   const float indices[3] = { 0.0f, 1.0f, 2.0f };   BufferResource_t vertex_buffer_resource;  BufferResource_t index_buffer_resource;   VkResult err = buffer_create(amp;vertex_buffer_resource, sizeof(vertices), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR,  VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT);  if (err != VK_SUCCESS)  Sys_Error("Buffer creation failed");   void* mem_vert = buffer_map(amp;vertex_buffer_resource);  memcpy(mem_vert, vertices, vertex_buffer_resource.size);  buffer_unmap(amp;vertex_buffer_resource);  mem_vert = NULL;   buffer_create(amp;index_buffer_resource, sizeof(indices), VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR,  VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT);   void* mem_ind = buffer_map(amp;index_buffer_resource);  memcpy(mem_ind, amp;indices, index_buffer_resource.size);  buffer_unmap(amp;index_buffer_resource);   VkTransformMatrixKHR transform;  memset(amp;transform, 0, sizeof(VkTransformMatrixKHR));  transform.matrix[0][0] = 1.0;  transform.matrix[1][1] = 1.0;  transform.matrix[2][2] = 1.0;   BufferResource_t transform_buffer_resource;  buffer_create(amp;transform_buffer_resource, sizeof(VkTransformMatrixKHR), VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR,  VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT);   void* mem_transf = buffer_map(amp;transform_buffer_resource);  memcpy(mem_transf, amp;transform, transform_buffer_resource.size);  buffer_unmap(amp;transform_buffer_resource);  

BLAS Code:

 VkDeviceOrHostAddressConstKHR vertex_device_or_host_address_const;  memset(amp;vertex_device_or_host_address_const, 0, sizeof(VkDeviceOrHostAddressConstKHR));  vertex_device_or_host_address_const.deviceAddress = vertex_buffer_resource.address;   VkDeviceOrHostAddressConstKHR index_device_or_host_address_const;  memset(amp;index_device_or_host_address_const, 0, sizeof(VkDeviceOrHostAddressConstKHR));  index_device_or_host_address_const.deviceAddress = index_buffer_resource.address;   VkDeviceOrHostAddressConstKHR transform_device_or_host_address_const;  memset(amp;transform_device_or_host_address_const, 0, sizeof(VkDeviceOrHostAddressConstKHR));  transform_device_or_host_address_const.deviceAddress = transform_buffer_resource.address;   VkAccelerationStructureGeometryTrianglesDataKHR geometry_triangles_data;  memset(amp;geometry_triangles_data, 0, sizeof(VkAccelerationStructureGeometryTrianglesDataKHR));  geometry_triangles_data.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR;  geometry_triangles_data.vertexFormat = VK_FORMAT_R32G32B32_SFLOAT;  geometry_triangles_data.vertexData = vertex_device_or_host_address_const;  geometry_triangles_data.maxVertex = 9;  geometry_triangles_data.indexType = VK_INDEX_TYPE_UINT32;  geometry_triangles_data.indexData = index_device_or_host_address_const;  geometry_triangles_data.transformData = transform_device_or_host_address_const;   VkAccelerationStructureGeometryKHR geometry;  memset(amp;geometry, 0, sizeof(VkAccelerationStructureGeometryKHR));  geometry.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR;  geometry.geometry.triangles = geometry_triangles_data;  geometry.geometryType = VK_GEOMETRY_TYPE_TRIANGLES_KHR;  geometry.flags = VK_GEOMETRY_OPAQUE_BIT_KHR;   VkAccelerationStructureBuildGeometryInfoKHR buildInfo;  memset(amp;buildInfo, 0, sizeof(VkAccelerationStructureBuildGeometryInfoKHR));  buildInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR;  buildInfo.pNext = VK_NULL_HANDLE;  buildInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;  buildInfo.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR;  buildInfo.mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR;  buildInfo.srcAccelerationStructure = VK_NULL_HANDLE;  buildInfo.dstAccelerationStructure = VK_NULL_HANDLE;  buildInfo.geometryCount = 1;  buildInfo.pGeometries = amp;geometry;  buildInfo.ppGeometries = VK_NULL_HANDLE;   const uint32_t max_primitive_count = 3;   VkAccelerationStructureBuildSizesInfoKHR sizeInfo;  memset(amp;sizeInfo, 0, sizeof(VkAccelerationStructureBuildSizesInfoKHR));  sizeInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR;   fpGetAccelerationStructureBuildSizesKHR(vulkan_globals.device, VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR, amp;buildInfo, amp;max_primitive_count, amp;sizeInfo);   VkAccelerationStructureCreateInfoKHR createInfo;  memset(amp;createInfo, 0, sizeof(VkAccelerationStructureCreateInfoKHR));  createInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR;  createInfo.size = sizeInfo.accelerationStructureSize;  createInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;   BufferResource_t scratch_buffer;  buffer_create(amp;scratch_buffer, sizeInfo.buildScratchSize,  VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,  VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);   VkDeviceOrHostAddressKHR scratchDeviceOrHostAddress;  memset(amp;scratchDeviceOrHostAddress, 0, sizeof(VkDeviceOrHostAddressKHR));  scratchDeviceOrHostAddress.deviceAddress = scratch_buffer.address;   buildInfo.scratchData = scratchDeviceOrHostAddress;   buffer_create(amp;blas-gt;mem, sizeInfo.accelerationStructureSize, VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,  VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);  createInfo.buffer = blas-gt;mem.buffer;   VkResult err = fpCreateAccelerationStructureKHR(vulkan_globals.device, amp;createInfo, NULL, amp;blas-gt;accel);  if (err != VK_SUCCESS)  Sys_Error("vkCreateAccelerationStructure failed");   buildInfo.dstAccelerationStructure = blas-gt;accel;   VkAccelerationStructureBuildRangeInfoKHR* build_range =  amp;(VkAccelerationStructureBuildRangeInfoKHR) {  .primitiveCount = 1,  .primitiveOffset = 0,  .firstVertex = 0,  .transformOffset = 0  };  const VkAccelerationStructureBuildRangeInfoKHR** build_range_infos = amp;build_range;   fpCmdBuildAccelerationStructuresKHR(vulkan_globals.command_buffer, 1, amp;buildInfo, build_range_infos);  

Я ценю все отзывы и предложения!