在PowerVR GE 8320(以及可能所有PowerVR设备上),我们发现,着色器阶段IO插槽中的不匹配的RelaxedPrecision
限定符会导致渲染问题。@jonahwilliams在flutter/engine#51974中解决了这个问题,但这个问题很难测试,也没有验证,因为PowerVR的行为违反了规范中关于接口匹配的行为(参见https://registry.khronos.org/vulkan/specs/1.3/html/vkspec.html#interfaces-iointerfaces-matching 关于RelaxedPrecision
的注解)。
然而,自从这个补丁发布以来,@gaaclarke已经在flutter/engine#52174中实现了对着色器接口的静态检查。现在,不匹配的阶段应该会导致编译错误,而不是运行时链接错误(或者像PowerVR那样,导致图形损坏)。
关于松散精度的信息是一个装饰,编译器可以在ShaderStageIOSlot
结构中输出。然后,可以修补静态Assert以检查这个额外的字段。这样,我们应该能找到任何剩余的此类问题示例(如果有的话),并且将来会有一个硬性检查来防止引入这种bug(这只是PowerVR上才会被捕捉到)。当我们试图压缩着色器数量并共享更多阶段时,这可能会派上用场。
对于这个功能的测试方法是,撤销@jonahwilliams早先的补丁是否会破坏现在的构建。
3条答案
按热度按时间h43kikqp1#
这也将有助于iOS,我们在那里遇到了实数浮点16位和32位不匹配的错误,以及Vulkan,如果我们将来实现真正的半精度支持。
n1bvdmb62#
这些现在不会被现有的静态检查捕捉到,因为
bit_width
字段不同。无论如何,是的,我们可以使这些检查尽可能严格。nkoocmlb3#
哦,可能值得检查一下!