vulkan缓冲区(vkCreateBuffer)读取和写入的预期行为是什么

时间:2019-01-11 20:33:53

标签: vulkan

当将索引(VK_INDEX_TYPE_UINT16)和顶点缓冲区组合到单个缓冲区对象中时,当索引数量奇数时,最后一个顶点不会发送到我的顶点着色器,而是接收到顶点,颜色和UV的全零坐标,但是当索引数为偶数时,一切正常。

两者之间的唯一区别是,奇数个索引会获得稍大的缓冲区,并且需要移动顶点数据,以便每个vkMemoryRequirements调用将其对齐4个字节。

最后结果是,当索引数为奇数时,VkBufferCreateInfo的size参数小于内存对齐后所需的实际大小。 (小2个字节)

如果我人为地在缓冲区中添加2个字节以创建信息大小,则一切正常。

我正在使用的当前(破解)解决方法:创建缓冲区,执行内存请求,销毁缓冲区,将缓冲区大小增加到结果大小并使用新大小重新创建缓冲区。然后一切正常。

我要附加到缓冲区的内存的实际大小是巨大的(256兆),我填充了整个缓冲区周围的区域,然后检查以确保没有丢失的灵魂踩到我的内存上。

坦率地说,这表现为驱动程序正在检查是否将缓冲区发送到着色器时溢出了缓冲区的末尾,以使着色器无法读取任意内存,但是它正在获取实际的末尾。缓冲错误。

还需要注意的是,这仅发生在AMD驱动程序(版本25.20.1003.5010)上,Nvidia驱动程序非常高兴让我整天覆盖/覆盖缓冲区。 (严重的是有一个错误...)

我似乎记得在某个地方读过vulkan可以解决这种情况,并且会自动调整缓冲区大小要求以解决内存对齐的额外字节,但是我似乎找不到任何地方对此进行了实际记录。

那么预期的行为是什么?我是否应该期望vulkan实际上遵守通过vkGetMemoryRequirements报告给我的缓冲区大小?

所以我开始为此添加代码,并意识到这将是一堆又一堆的代码,所以我不想添加任何内容,因为我想怜悯任何想看一下这本书的可怜人一百行vulkan代码才能完全实现此问题。

缓冲区连接到的内存的实际大小为256mb,缓冲区本身仅为282字节数据大小和284字节对齐大小。该代码要求一个282字节的缓冲区,vkGetBufferMemoryRequirements返回大小为284字节且对齐4字节的缓冲区,(子)内存分配器为缓冲区放入一个284字节的区域。

0 个答案:

没有答案