金属着色器文件中除顶点|片段|内核之外的函数的 Synax
Synax for functions other than vertex|fragment|kernel in metal shader file
我正在将一些基本的 OpenCL 代码移植到 Metal 计算着色器。尝试转换其他辅助函数时很早就陷入困境。例如,在 .metal
文件 Xcode (7.1) 中包含类似以下函数的内容会给我一个 "No previous prototype for function" 警告
float maxComponent(float4 a) {
return fmax(a.x, fmax(a.y, fmax(a.z, a.w)));
}
'metal' 方法是什么?
我知道的三种方式:
(我将函数重写为重载,并且对我来说更具可读性。)
实际声明原型:
float fmax(float4 float4);
float fmax(float4 float4) {
return fmax(
fmax(float4[0], float4[1]),
fmax(float4[2], float4[3])
);
}
将其范围限定为静态文件:
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])
);
}
}
我正在将一些基本的 OpenCL 代码移植到 Metal 计算着色器。尝试转换其他辅助函数时很早就陷入困境。例如,在 .metal
文件 Xcode (7.1) 中包含类似以下函数的内容会给我一个 "No previous prototype for function" 警告
float maxComponent(float4 a) {
return fmax(a.x, fmax(a.y, fmax(a.z, a.w)));
}
'metal' 方法是什么?
我知道的三种方式:
(我将函数重写为重载,并且对我来说更具可读性。)
实际声明原型:
float fmax(float4 float4);
float fmax(float4 float4) {
return fmax(
fmax(float4[0], float4[1]),
fmax(float4[2], float4[3])
);
}
将其范围限定为静态文件:
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])
);
}
}