使用std430的SPIR-V中的动态数组的对齐规则是什么?

时间:2018-06-18 07:05:03

标签: vulkan spir-v

规范说

  

[140]数组的基本对齐方式等于其元素类型的基本对齐方式,向上舍入为16的倍数。   .... [430]除了阵列和结构基础对齐,不需要四舍五入到16的倍数。

我假设静态数组的大小很简单size_of(elem_type) * length但动态数组呢?

逻辑模式中没有指针,这是否意味着动态数组的大小为0?

我不知道哪些偏移应该应用于以下结构

struct Data {
    float i1;
    float[] arr;
    float i2;
}

或SPIR-V表示法

%Data = OpTypeStruct %float %_runtimearr_float %float

可以这样做,或者在这里适用同样的GLSL规则,只允许在缓冲区块中只有一个动态数组,而且它必须是最后一个?

1 个答案:

答案 0 :(得分:2)

附录A中的Vulkan定义了SPIR-V的执行环境;因此,它可以对着色器中允许的内容施加限制,超出SPIR-V规范的限制。在该附录中,它说:

  

#include <iostream> #include <string> #include <vector> #include <queue> using namespace std; void foo() { //queue<char> x; } int main() { //vector<int> a; //string t; cout << "Hello World!" << endl; cin.get(); return 0; } 必须仅用于OpTypeRuntimeArray OpTypeStruct存储类StorageBuffer的最后一个成员,该Block存储类设为Uniform,或者BufferBlock存储类装饰为$art = Article::where('id',$article)->firstOrFail(); $products = $art->products->take($limit);