在三星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]