除了metal着色器文件中的顶点|片段|内核外,其他函数的语法

8

我正在将一些基本的OpenCL代码移植到Metal计算着色器中。在尝试转换杂项辅助函数时遇到了困难。例如,在.metal文件中包含以下函数会导致Xcode(7.1)给出“函数没有先前的原型”的警告:

float maxComponent(float4 a) {
    return fmax(a.x, fmax(a.y, fmax(a.z, a.w)));
}

这应该采用"底层"的方式来完成吗?
1个回答

8

我知道三种方式:

(我重写了函数成为一个重载函数,更容易理解)

实际上声明原型:

float fmax(float4 float4);
float fmax(float4 float4) {
   return fmax(
      fmax(float4[0], float4[1]),
      fmax(float4[2], float4[3])
   );
}

使用 static 关键字将作用域限定为文件:

static float fmax(float4 float4) {
   return fmax(
      fmax(float4[0], float4[1]),
      fmax(float4[2], float4[3])
   );
}

将其放在匿名命名空间中:

namespace {
   float fmax(float4 float4) {
      return metal::fmax(
         metal::fmax(float4[0], float4[1]),
         metal::fmax(float4[2], float4[3])
      );
   }
}

方法2(静态)和方法3(命名空间)对我有用,但由于某种原因,方法1(原型)会给我一个“Command /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/bin/metallib failed with exit code 11”错误。无论如何,你肯定帮了我大忙。谢谢。 - Jaysen Marais

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接