我在Metal Shader中遇到了一个非常奇怪的问题,它与范围(0,255)中的字节值有关。此字节值表示为ushort,通过类似(x / 255.0h)的代码转换为半精度。奇怪的是,当在A7设备上运行时,这个字面常数除法似乎被错误地优化(A10不这样做)。有没有其他人遇到这个?有什么方法可以编写仅在此GPU系列1设备上使用的Metal代码吗?
我找到了一种解决方法,将h后缀留在内联常量:
// This method accepts 4 byte range input values and encodes them as a half4 vector
// that works properly on A7 class hardware. The issue with A7 devices is that
// there seems to be a compler bug or range issue with an operation like (x / 255.0h).
// What should be the same operation (x / 255.0) does not show the range problem on A7.
half4
encodeBytesAsHalf4(const ushort4 b4) {
return half4(b4.x/255.0, b4.y/255.0, b4.z/255.0, b4.a/255.0);
}