vulkan - 将缓冲区绑定到内存时使用正确的偏移量
问题描述
我有一大块设备内存和多个要绑定的统一缓冲区。显然,我需要一个偏移量。让我们看看文档是怎么vkBindBufferMemory
说的:
memoryOffset
是要绑定到缓冲区的内存区域的起始偏移量...
memoryOffset
必须是从调用 with buffer返回alignment
的结构成员的整数倍VkMemoryRequirements
vkGetBufferMemoryRequirements
好的,这很清楚 - 我创建了多个使用相同标志的统一缓冲区,因此我可以对所有缓冲区使用相同的对齐方式。vkBindBufferMemory
但是等等,规格中还有另一个使用说明:
如果缓冲区是用
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT
,memoryOffset
必须是的倍数VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment
这很令人困惑。我可以安全地VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment
用于我的箱子还是应该比较它VkMemoryRequirements::alignment
并选择最低的?
解决方案
首先,快速说明:如果要VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment
与VkMemoryRequirements::alignment
then 进行比较,您应该选择这两个值中的最大值,而不是最低(最小)值。
但在规范中我们也可以阅读:
vkGetBufferMemoryRequirements
该实现保证了与 返回的内存需求有关的某些属性vkGetImageMemoryRequirements
:
- 对于使用传递给的结构中的和成员
VkBuffer
的相同值组合创建的所有对象,对齐成员都是相同的。usage
flags
VkBufferCreateInfo
vkCreateBuffer
VkBuffer
对齐成员满足与's关联的缓冲区描述符偏移对齐要求usage
:
- 如果包含使用
VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT
或VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT
,alignment
则必须是 的整数倍VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment
。- 如果包括用法
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT
,alignment
则必须是 的整数倍VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment
。- 如果包括用法
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT
,alignment
则必须是 的整数倍VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment
。
因此,您不必比较它们,而只需获取结构中vkGetBufferMemoryRequirements()
函数返回的(多个)对齐值VkMemoryRequirements
。
基于以上信息,我认为VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment
在使用动态统一缓冲区时值更重要,因为在vkCmdBindDescriptorSets()
函数调用期间提供的偏移值也必须是上述值的倍数。
推荐阅读
- angular - 如何在Angular 6中的Ngx-bootstrap模态中将组件作为模态体传递
- java - JComboBox 并不总是将值保存到 TableModel
- java - 在 Java 中使用 Javamail 获取消息内容类型时出错
- c - 结构定义缺失“()”的宏 - QAC 错误
- java - 无法解决的构建扩展:插件 org.apache.maven.wagon:wagon-webdav-jackrabbit:1.0-beta-6
- automapper - Automapper 8 - 表达式树 lambda 可能不包含空传播运算符
- php - Symfony 4.2 无法连接到 Microsoft SQL Server
- c - 如何解决堆栈损坏错误?
- anaconda - 运行 jupyter notebook 后连接被拒绝(503 错误)
- python - 从PDF读取并存储在数据框中时如何保留表结构?