我正在编写一个框架,需要提供在image2D类型上定义的一些函数。
但似乎有点难以做到这一点,我找不到任何关于将{'url': 'http://url1', 'iam': 'type 1'}
{'url': 'http://url2', 'iam': 'type 2'}
{'url': 'http://url3', 'iam': 'type 3'}
传递给函数的文档。
以下是我的问题的最小示例:
image2D
这在我的机载(hd4400)Windows 10上失败了。
更复杂的版本在调用函数时会生成#version 440
layout (local_size_x = 16, local_size_y = 16) in;
struct Test
{
bool empty;
};
// Version 1:
// fails with 0:11: '' : imageLoad function cannot access the image defined
// without layout format qualifier or with writeonly memory qualifier
float kernel1(image2D x, Test arg1){
return imageLoad(x, ivec2(1, 1)).x;
}
// Version 2:
// fails with ERROR: 0:16: 'Test' : syntax error syntax error
// doesn't fail without the Test struct at second argument
float kernel2(layout (r32f) image2D x, Test arg2){
return imageLoad(x, ivec2(1, 1)).x;
}
layout (binding=0, r32f) readonly uniform image2D globalvar_A;
const Test globalvar_f = Test(false);
void main(){
// works when other function are commented out
imageLoad(globalvar_A, ivec2(1, 1)).x;
//kernel1(globalvar_A, globalvar_f);
//kernel2(globalvar_A, globalvar_f);
}
错误。
在nvidia硬件上,我通过用no overloaded function found
键入img
来解决这个问题,但这似乎是未记录的nvidia特定名称争论。
有人能用这个看似简单的任务指引我走向正确的方向吗?
更新
我直接从GLSL 4.3 specs第4.10节
中抽取了一个例子image2D1x32_bindless
并且获取 imageLoad函数无法访问没有布局格式限定符定义的图像。
我可以通过添加#version 430
layout (local_size_x = 16, local_size_y = 16) in;
// this works fine without the imageLoad
vec4 funcA(restrict image2D a){ return imageLoad(a, ivec2(1, 1));}
layout(rgba32f) coherent uniform image2D img2;
void main(){
funcA(img1); // OK, adding "restrict" is allowed
}
来解决这个问题。
但是后来我无法将其他结构传递给该函数,因为它会导致语法错误。
所以我可以得出结论:
对于layout(rgba32f)
,您必须拥有包含布局限定符的图像,
但声明这个函数参数是破坏/错误定义的。
解析器错误非常可能,因为内置类型有效,这表明对这些类型的解析器支持更强大。