开启ASan后
在 Engine\Source\Runtime\D3D12RHI\Private\D3D12RayTracing.cpp 的 RHICalcRayTracingGeometrySize 函数中
Adapter.GetDevice(GPUIndex)->GetRaytracingAccelerationStructurePrebuildInfo(&PrebuildDescInputs, &PrebuildInfo);
获取的 PrebuildInfo都是空,
尝试获取GetLastError,错误码是0x000000B7, ERROR_ALREADY_EXISTS
因为PrebuildInfo获取的值都是0后,导致后面的crash。
非常不理解,ASan是内存检查,理应和 渲染完全没有关系,希望指导一下。
您好,
请问这个问题是只存在某个特定显卡型号上吗?
开启 AddressSanitizer 应该不会影响 GetRaytracingAccelerationStructurePrebuildInfo 的行为。您可以尝试在 D3D12RayTracing.cpp 开头添加 UE_DISABLE_OPTIMIZATION 后重新检查吗?有时候调试器会因为优化等原因显示错误的变量值或者行号。
按照 Win32 文档中的信息,ERROR_ALREADY_EXISTS 的意思是”在文件已存在时无法创建该文件“。这可能表明 GetRaytracingAccelerationStructurePrebuildInfo 的错误是由其他错误间接导致的。
希望这些信息能帮到您。
这个我可以确定,因为在调试的过程中有去编译优化。
之所以会定位到 GetRaytracingAccelerationStructurePrebuildInfo 这个函数,是因为开启ASan后,调用 GetRaytracingAccelerationStructurePrebuildInfo 会crash在Nv的DLL中。
很遗憾,我现在已经没有crash现场了,因为我手动升级到最新的显卡驱动版本。
在我将显卡驱动升级到最新版本后,表现就和提问中描述的现象一致了 GetRaytracingAccelerationStructurePrebuildInfo 返回空,并且尝试获取 GetLastError,错误码是0x000000B7。
我猜测可能是在我的机子上出现了小概率的兼容性问题。项目测试ASan的目的是检查项目内的内存问题,我通过禁用光追规避了这个问题。
希望能给您们提供一些帮助。
显卡型号: NVIDIA GeForce RTX 4060;驱动版本(升级后):32.0.15.7628
您好,
由于图形 API 底层的异步特性,有时候驱动 DLL 中的崩溃并不是由当前的调用直接导致的。考虑到您反馈的情况在驱动升级前后有变化,这也有可能是驱动侧的问题。
您可以尝试在运行时命令行参数中加上 -d3ddebug 和 -d3d12gpuvalidation 吗?这两个选项可能会拦截到一些错误的 API 调用。
除此之外,考虑到您在使用 NVIDIA 的显卡,您能尝试将对应调用替换成 NvAPI_D3D12_GetRaytracingAccelerationStructurePrebuildInfoEx 吗?NVAPI 版本的这个函数会报告一个错误值,也许有一些有用信息。
如果您有新的发现,请随时联系我们。