Nvidia Nsight创建BLAS时崩溃,可能的引发原因有哪些?
Vulkan BLAS构建及Nsight调试崩溃问题
编辑补充:我已找到代码中的错误。我误将max_primive_count设为3,但我仅需要显示单个三角形,正确值应为1。此外maxVertex应设为3,我还忘记将顶点步长设置为sizeof(float) * 3。Nsight崩溃的情况让我误以为程序存在严重问题,反而排查得过于深入,不过过程中也有其他收获。
我目前在Vulkan应用中搭建BLAS实例时遇到问题,且Nsight配置异常无法正常开展调试工作。
程序构建正常,常规调试也可以运行,但不足以定位屏幕上无几何图形渲染的原因。因此我尝试用Nsight调试加速结构,却出现崩溃问题。
崩溃日志如下:
Reason: EXCEPTION_ACCESS_VIOLATION_READ Address: 0x238 Assertion: Unknown assertion type 0x00000000 Thread 0 (crashed) <no frames> Thread 1 <no frames> Thread 2 <no frames> Thread 3 <no frames> Thread 4 <no frames> Thread 5 <no frames> Thread 6 <no frames> Thread 7 <no frames> Thread 8 <no frames> Thread 9 <no frames> Thread 10 <no frames> Thread 11 <no frames> Thread 12 <no frames> Thread 13 <no frames> Thread 14 <no frames> Thread 15 <no frames> Thread 16 <no frames> Thread 17 <no frames> Thread 18 <no frames>
崩溃并不发生在启动阶段,而是正好在执行CmdBuildAccelerationStructuresKHR时触发,因此我基本可以确定问题出在BLAS创建环节,或是我使用的测试几何数据存在问题。
看起来是Nsight无法访问某个地址或是没有对应权限,但我暂时无法确定具体原因。
测试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(&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(&vertex_buffer_resource); memcpy(mem_vert, vertices, vertex_buffer_resource.size); buffer_unmap(&vertex_buffer_resource); mem_vert = NULL; buffer_create(&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(&index_buffer_resource); memcpy(mem_ind, &indices, index_buffer_resource.size); buffer_unmap(&index_buffer_resource); VkTransformMatrixKHR transform; memset(&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(&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(&transform_buffer_resource); memcpy(mem_transf, &transform, transform_buffer_resource.size); buffer_unmap(&transform_buffer_resource);
BLAS构建代码
VkDeviceOrHostAddressConstKHR vertex_device_or_host_address_const; memset(&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(&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(&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(&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(&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(&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 = &geometry; buildInfo.ppGeometries = VK_NULL_HANDLE; const uint32_t max_primitive_count = 3; VkAccelerationStructureBuildSizesInfoKHR sizeInfo; memset(&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, &buildInfo, &max_primitive_count, &sizeInfo); VkAccelerationStructureCreateInfoKHR createInfo; memset(&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(&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(&scratchDeviceOrHostAddress, 0, sizeof(VkDeviceOrHostAddressKHR)); scratchDeviceOrHostAddress.deviceAddress = scratch_buffer.address; buildInfo.scratchData = scratchDeviceOrHostAddress; buffer_create(&blas->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->mem.buffer; VkResult err = fpCreateAccelerationStructureKHR(vulkan_globals.device, &createInfo, NULL, &blas->accel); if (err != VK_SUCCESS) Sys_Error("vkCreateAccelerationStructure failed"); buildInfo.dstAccelerationStructure = blas->accel; VkAccelerationStructureBuildRangeInfoKHR* build_range = &(VkAccelerationStructureBuildRangeInfoKHR) { .primitiveCount = 1, .primitiveOffset = 0, .firstVertex = 0, .transformOffset = 0 }; const VkAccelerationStructureBuildRangeInfoKHR** build_range_infos = &build_range; fpCmdBuildAccelerationStructuresKHR(vulkan_globals.command_buffer, 1, &buildInfo, build_range_infos);
欢迎各位提供反馈和建议,非常感谢!
内容的提问来源于stack exchange,提问作者Ruslan
相关产品推荐
相关产品推荐

