mali设备编译vulkan的spv崩溃

在三星A54的mali设备上编译某个材质的Shader崩溃,游戏中具体崩溃栈如下

[Image Removed]

接下来我找到了崩溃的材质,并cook移动端资产把shader同时dump出来,得到了如下spv:

[Image Removed]

[Image Removed]

接下来我把这一对shader放到这台手机上进行创建pipeline并编译,得到了相同的崩溃问题:

[Image Removed]

接下来我使用dump目录下的CompileDXC.bat对dump出来的usf进行再次编译spv,得到了MobileBasePassVertexShader.DXC.spv和MobileBasePassPixelShader.DXC.spv,把这俩也放到了机器上进行编译尝试,发现最终使用bat编译的PS是能正常编译通过的

[Image Removed]

[Image Removed]

回过头对比两个ps(MobileBasePassPixelShader.DXC.spv和MobileBasePassPixelShader.spv),发现这俩大小不一样(一个5k一个6k),接下来我对其进行了反编译,得到两个反编译文件(DXC.dis.txt和UE.dis.txt),对比这俩发编译文件发现有三个差异:1、ue的文件中把opFma指令替换成了opMul+opAdd。2、ue的文件中把NMax指令替换成FMax。3、ue的buffer的数组类型成员被降维度。

[Image Removed]

查阅代码发现是SpirVShaderCompiler.inl:928-941中开启--android-driver-patch导致,这个patch的实现如下图

[Image Removed]

看了一下引擎的git的提交记录发现5.6最终是进行了这个优化,5.8最终删掉了这个优化,中间反复开启删掉多次。请帮忙确认一下这个问题我们该如何修改,这个只在部分mali的机型上崩溃

[Image Removed]

最后附带上两个反编译的文件

<br/>

[Attachment Removed]

Hi,

最新的更新的确是去掉了,从历史提交记录来看,就是随着升级DXC同步升级了里面的SPRIV-Tool。因为历史比较就了,24年加回去应该是在某些设备上遇到了兼容性问题。目前是否整个兼容性问题不存在了,我还不太确定,公司现在放暑假了,要等7月中旬后我可以再找人确认一下。

[Attachment Removed]

好的👌

[Attachment Removed]

Hi,

你好,我已经给总部同学留言了,如果有回复,我再在这里更新。

[Attachment Removed]

感谢👍

[Attachment Removed]

Hi,

同事表示那几个改动不是有意去掉的,很可能下一个版本要加回来。不过现在的崩溃他希望了解更多信息,

  1. 是否能提供那个出问题的材质?(5.6的版本)
  2. 能否帮忙确定一下,具体是哪个函数造成的?(StripFMA,FixupOpVectorShuffle,FixupNMinMax)。

感谢。

[Attachment Removed]