项目开启AddressSanitizer后,GetRaytracingAccelerationStructurePrebuildInfo返回的PrebuildInfo数据都是0

​开启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 版本的这个函数会报告一个错误值,也许有一些有用信息。

如果您有新的发现,请随时联系我们。