给出以下glsl声明(这只是一个示例):
struct S{
f16vec3 a;
float16_t b;
f16vec3_t c;
float16_t d;
};
shared float16_t my_float_array[100];
shared S my_S_array[100];
我有以下问题:
- 在上面的例子中,给定的声明将使用多少共享内存?
- 哪个内存布局用于共享内存中的变量?Std140, std430还是别的?
- 这与银行冲突有什么关系?
我能够使用glGetProgramBinary并跳过直到以"! NV":
开头的行所指示的文本部分的开始处获得程序所需的总共享内存。...
!!NVcp5.0
OPTION NV_shader_buffer_load;
OPTION NV_internal;
OPTION NV_gpu_program_fp64;
OPTION NV_shader_storage_buffer;
OPTION NV_bindless_texture;
OPTION NV_gpu_program5_mem_extended;
GROUP_SIZE 4 4 4;
SHARED_MEMORY 4480;
SHARED shared_mem[] = { program.sharedmem };
...
这是相当间接的,但并没有告诉太多的对齐/包装规则。
哪个内存布局用于共享内存中的变量?Std140, std430还是别的?
定义。
应用于缓冲存储的布局很重要,因为着色器外部的代码需要能够访问它。shared
变量不能在着色器的外部,所以这些变量的布局在功能上是由实现定义的。
简而言之,您无法确定任何特定的shared
变量声明将消耗多少存储空间。您可以假设它将占用至少与存储您要求存储的数据所需的最小字节数相同的字节数。但也就这些了。
如何处理银行冲突?
"Banks"不是OpenGL或GLSL认可的概念。因此,它是由实现定义的。