如何在 Vulkan 主机程序上创建共享缓冲区?

How to create Shared Buffer on Vulkan Host Program?

  1. 目标
    我想在运行时在 GLSL 中设置 'shared' 缓冲区的大小。

问题是“如何在 Vulkan Host C/C++ 程序中创建共享内存?” \

  1. 例子
    在 OpenCL 中,OpenCL 内核函数下面有 '__local' 参数。
// foo.cl
__kernel void foo(__global float *dst, __global float *src, __local *buf ){
   /*do something great*/
}

并且在主机 C++ 程序中,我创建了 __local 内存并将内核参数传递给它。

void main(){
    ...
    cl_uint args_index = 2;
    foo.setArg(args_index,__local(128) ); // make 128bytes local memory and pass it to kernel.
}

我想在 Vulkan 计算管道上做同样的事情。 我在下面尝试过。

  1. GLSL
//foo.comp
#version 450
layout(binding=0) buffer dstBuffer{
   uint dst[];
};
layout(binding=1) buffer srcBuffer{
   uint src[];
};

// try 1
layout(binding=2) uniform SharedMemSize{
   uint size[];
};
shared uint buf[size[0]]; // compile Error! msg : array size must be a constant integer expression
// try 2
layout(binding=2) shared SharedBuffer{
   uint buf[]; 
}; // compile Error! msg :'shared block' not supported
//try 3
layout(binding=2) shared uint buf[]; // compile Error! msg : binding requires uniform or buffer.

上面的事情我都失败了。
需要你的帮助。谢谢。

GLSL 有 shared 个变量,其中 represent storage accessible to any member of a work group。但是,它不像 OpenCL 那样具有“共享内存”。例如,您不能直接将数据从 CPU 上传到 shared 变量。您无法获得指向 shared 变量的指针。

最接近此的可能是拥有某种共享变量数组,其大小由着色器外部确定。但是即便如此,您也不会影响总内存的大小;您正在影响 array.

的大小

你可以这样做。 SPIR-V in OpenGL 允许专门化常量。这些是在着色器对象的编译过程中由外界指定的值。此类常量可用作共享变量数组的大小。当然,这意味着更改它需要一个完整的 recompile/relink 过程。