[GpuCrash][DX12]Lumen关闭InlineRayTracing,SBT提交与AsyncCompute的同步问题

关闭InlineRT后SBT的提交似乎只会与Graphics Pipe同步,无法与AsyncCompute​进行同步。

[Image Removed]

SBT的同步依赖了InlineRT在RDG层面的Buffer。​

关闭InlineRT后的PIX​

copyqueue signal[Image Removed]​

​Graphics Queue wait

[Image Removed]

​asynccompute queue wait

[Image Removed]

​---------

lumen开启inline

graphics pipe

[Image Removed]

asynccompute (offscreenscene没读scenemetadata,所以在Radiosity做的同步)[Image Removed]

​-----------

以上是最新main分支截帧的结果。

我们的问题是部分合入了光追的一些升级(eg: persistent sbt),但是inline RT暂时未合入,且短期内无合入计划。

想请教下除了伪装一个dummybuffer​放到setshaderbindings和async的pass上,使得fence能正常生成外还有什么比较好的解决方式吗?

目前遇到了一些gpucrash挂在sbt copy的同时开始了shadow的trace

​[Image Removed]

​[Image Removed]

重现步骤
ProjectSetting:Hardware Ray Tracing Mode-> Full​

r.Lumen.HardwareRayTracing.Inline 0

FirstPerson示例工程,DX12后端

Hi,

你好,为避免我理解错误,复现步骤里的意思是,使用5.6引擎创建一个FirstPerson工程,设置 r.Lumen.HardwareRayTracing.LightingMode 1, r.Lumen.HardwareRayTracing.Inline 0,然后就会有gpu崩溃吗?

不会必现gpu崩溃。。

发现似乎是关闭Lumen的inlineraytracing后,SBT的上传和AsyncCompute部分的同步可能会有点问题,导致概率出现gpu崩溃。

SBT Copy跟GraphicsPipe有一次同步,但是AsyncCompute只会跟BuildRaytracingScene同步,可能会导致AsyncCompute里的Full Raytracing在SBT上传的同时发起。

InlineRayTracing由于有RayTraceMetaData,所以可以在RDG层面处理好同步。

请问AsyncCompute是特指哪个pass?

上传了一份PIX文件

​[Image Removed]

传了一份PIX,可以关注下Obj #243, #1347

好的,我是想先从上层上理解一下,你说的问题是出在哪里。能否描述一下是哪个AsyncCompute pass用到了SBT,但是因为没有添加正确的Barrier,导致出现了asynccompute里访问到了无效数据的情况(如果我理解有问题,麻烦指正)?

哦哦。。 不好意思。。如果我没理解错误的话,

这个PIX里的AsyncComputePass是LumenSceneLighting->offscreenshadows->LumenDirectLightingHardwareRayTracingRGS这个Pass,用到的是LumenSBT​ (Scene->RayTracingSBT.GetPersistentSBT(Scene->LumenRayTracingSBTID)

),FullRT的SBT在RDG层面没有对应RDGBuffer,所以会在DX12层给GraphicsPipe手动加Fence

见D3D12Raytracing.cpp​ (

// Use copy queue for uploading the data

Context.BatchedSyncPoints.ToWait.Emplace(Buffer->UploadResourceDataViaCopyQueue(Context, &Data)):wink:

切换至InlineRT模式后,会​使用InlineRayTracingBindingDataBuffer作为RayTracingSceneMetadata进行绑定,InlineRayTracingBindingDataBuffer在RDG层面是由对应Buffer的,所以可以正常解析出Barrier的放置时机。

Hi,

感谢,我明白你的意思了,SBT commit的Context是Graphic的Pipeline,而LumenDirectLightingHardwareRayTracingRGS应该是AsyncCompute的Pipeline,所以SBT commit里的Context.BatchedSyncPoints.ToWait并不能保证LumenDirectLightingHardwareRayTracingRGS执行时,CopyQueue已经执行完了。

我跟开发的同学讨论一下,后续给你回复。

嗯嗯,好的~ 非常感谢

Hi,

我已经提了一个Jira UE-351043,同事已经知道问题,并基本有思路如何修复,你可以在issues.unrealengine.com上关注这个问题(可能要过几天之后才能看到)。

好的,非常感谢,我们后续来关注一下这个单~