UBOs/SSBOs 与 Vulkan 的着色器内存绑定有何不同?
How do UBOs/SSBOs differ from Vulkan's shader memory bindings?
在 article on Imagination's website 中,我阅读了以下段落:
For example, there are no glUniform*()
equivalent entry points in Vulkan; instead, writing to GPU memory is the only way to pass data to shaders.
When you call glUniform*()
, the OpenGL ES driver typically needs to allocate a driver managed buffer and copy data to it, the management of which incurs CPU overhead. In Vulkan, you simply map the memory address and write to that memory location directly.
这和使用统一缓冲区有什么区别吗?它们也被显式分配并且可以携带任意数据。由于统一缓冲区的大小非常有限,也许 Shader Storage Buffers 是一个更好的类比。
据我所知,这不是 glUniform*()
具体的:glUniform*()
只是本文作者用来说明 Vulkan 在主机和主机之间通信方面的工作方式的示例GPU。
When you call glUniform*()
, the OpenGL ES driver typically needs to allocate a driver managed buffer and copy data to it, the management of which incurs CPU overhead.
在这种情况下,当用户使用某些数据调用 glUniform*()
时,该数据首先被复制到 OpenGL 实现拥有的缓冲区中。该缓冲区可能已固定,然后驱动程序可以使用它通过 DMA 将数据传输到设备。这是两个步骤:
- 将用户数据复制到驱动程序缓冲区;
- 通过 DMA 将缓冲区内容传输到 GPU。
In Vulkan, you simply map the memory address and write to that memory location directly.
在这种情况下,没有用户数据的中间副本。您要求 Vulkan 将一个区域映射到您直接写入的主机的虚拟地址 space。数据通过 DMA 以对用户完全透明的方式到达设备。
从性能的角度来看,好处是显而易见的:零拷贝。这也意味着 Vulkan 实现可以更简单,因为它不需要管理中间缓冲区。
由于规格尚未发布,这里有一个虚构的示例:
// Assume Lights is some kind of handle to your buffer/data
float4* lights = vkMap(Lights);
for (int i = 0; i < light_count; ++i) {
// Goes directly to the device
lights[i] = make_light(/* stuff */);
}
vkUnmap(lights);
在 article on Imagination's website 中,我阅读了以下段落:
For example, there are no
glUniform*()
equivalent entry points in Vulkan; instead, writing to GPU memory is the only way to pass data to shaders.When you call
glUniform*()
, the OpenGL ES driver typically needs to allocate a driver managed buffer and copy data to it, the management of which incurs CPU overhead. In Vulkan, you simply map the memory address and write to that memory location directly.
这和使用统一缓冲区有什么区别吗?它们也被显式分配并且可以携带任意数据。由于统一缓冲区的大小非常有限,也许 Shader Storage Buffers 是一个更好的类比。
据我所知,这不是 glUniform*()
具体的:glUniform*()
只是本文作者用来说明 Vulkan 在主机和主机之间通信方面的工作方式的示例GPU。
When you call
glUniform*()
, the OpenGL ES driver typically needs to allocate a driver managed buffer and copy data to it, the management of which incurs CPU overhead.
在这种情况下,当用户使用某些数据调用 glUniform*()
时,该数据首先被复制到 OpenGL 实现拥有的缓冲区中。该缓冲区可能已固定,然后驱动程序可以使用它通过 DMA 将数据传输到设备。这是两个步骤:
- 将用户数据复制到驱动程序缓冲区;
- 通过 DMA 将缓冲区内容传输到 GPU。
In Vulkan, you simply map the memory address and write to that memory location directly.
在这种情况下,没有用户数据的中间副本。您要求 Vulkan 将一个区域映射到您直接写入的主机的虚拟地址 space。数据通过 DMA 以对用户完全透明的方式到达设备。
从性能的角度来看,好处是显而易见的:零拷贝。这也意味着 Vulkan 实现可以更简单,因为它不需要管理中间缓冲区。
由于规格尚未发布,这里有一个虚构的示例:
// Assume Lights is some kind of handle to your buffer/data
float4* lights = vkMap(Lights);
for (int i = 0; i < light_count; ++i) {
// Goes directly to the device
lights[i] = make_light(/* stuff */);
}
vkUnmap(lights);