如何在 Vulkan 主机程序上创建共享缓冲区?
How to create Shared Buffer on Vulkan Host Program?
- 目标
我想在运行时在 GLSL 中设置 'shared' 缓冲区的大小。
问题是“如何在 Vulkan Host C/C++ 程序中创建共享内存?” \
- 例子
在 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 计算管道上做同样的事情。
我在下面尝试过。
- 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 过程。
- 目标
我想在运行时在 GLSL 中设置 'shared' 缓冲区的大小。
问题是“如何在 Vulkan Host C/C++ 程序中创建共享内存?” \
- 例子
在 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 计算管道上做同样的事情。 我在下面尝试过。
- 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 过程。