Synax用于金属着色器文件中除vertex | fragment | kernel之外的函数

Jay*_*ais 5 gpgpu ios metal

我正在将一些基本的OpenCL代码移植到Metal计算着色器.在尝试转换其他辅助函数时很快就卡住了.例如,在.metal文件Xcode(7.1)中包含类似以下函数的内容,这给了我一个"没有以前的函数原型"警告

float maxComponent(float4 a) {
    return fmax(a.x, fmax(a.y, fmax(a.z, a.w)));
}
Run Code Online (Sandbox Code Playgroud)

这种"金属"方式是什么?

Jes*_*ssy 7

我知道的三种方式:

(我把这个函数改写为重载,对我来说更具可读性.)

实际上宣布原型:

float fmax(float4 float4);
float fmax(float4 float4) {
   return fmax(
      fmax(float4[0], float4[1]),
      fmax(float4[2], float4[3])
   );
}
Run Code Online (Sandbox Code Playgroud)

将其范围限定为具有静态的文件:

static float fmax(float4 float4) {
   return fmax(
      fmax(float4[0], float4[1]),
      fmax(float4[2], float4[3])
   );
}
Run Code Online (Sandbox Code Playgroud)

将其包装在匿名命名空间中:

namespace {
   float fmax(float4 float4) {
      return metal::fmax(
         metal::fmax(float4[0], float4[1]),
         metal::fmax(float4[2], float4[3])
      );
   }
}
Run Code Online (Sandbox Code Playgroud)