我想用Vulkan构建一个屏幕外渲染器,并将呈现内容复制到每个帧中的内存中。
一种方案是使用带有TILING_OPTIMAL的帧映像,并使用另一个复制呈现传递将内容复制到主机可见的暂存缓冲区。
另一种方案是使用带有TILING_LINEAR的帧图像,并直接从图像中复制。
我认为第一个方案是更有效的,虽然涉及多一个复制步骤,但我不确定。还有更好的解决办法吗?
谢谢!
发布于 2018-07-23 14:50:10
第一种解决办法可能是更好的办法。
VK_IMAGE_TILING_LINEAR可能是坏的。
非VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT内存可能也很糟糕。
第一种解决方案是双缓冲的,这样可以更好地重叠设备本地和主机本地工作.
Vulkan设备存储器的文章似乎推荐HOST_VISIBLE,将HOST_COHERENT和HOST_CACHED作为屏幕截图之类的暂存缓冲区。除了作为溢出内存,他们甚至不敢提到GPU写入非DEVICE_LOCAL内存类型。
你的Vulkan记忆类型是什么?提到可以根据图像使用(vkGetImageMemoryRequirements)限制内存类型。VK_IMAGE_TILING_LINEAR保证具有HOST_VISIBLE内存,但是(正如@Ekzuzy所述),这种限制可能表现为VK_IMAGE_TILING_LINEAR VkFormat在使用颜色附件时不受支持(甚至不能执行vkCreateImage)。
UMA设备可能值得测量方法nr。2.这些内存类型通常是DEVICE_LOCAL|HOST_VISIBLE|HOST_CACHED。尽管如此,复制可以是快速的,并且绘制到严重的瓦片图像可能太慢.
发布于 2018-07-23 11:53:01
您可能会发现,只有第一个解决方案是可能的。规范保证只有VK_IMAGE_USAGE_TRANSFER_SRC_BIT、和/或 VK_IMAGE_USAGE_TRANSFER_DST_BIT用法支持线性拼接的图像。其他用法也可能得到支持,但这种支持没有得到保证。因此,您要实现的代码可能在一个平台上工作,但可能不能在其他平台上工作,并且,根据您的目标,您可能需要实现这两种解决方案。
因此,首先检查你是否能够直接渲染成一个线性平铺的图像。在此之后,如果可能的话,执行您自己的测试并检查在您的情况下哪个解决方案是最优的。或者--如果你想瞄准更多的平台--只实现第一个通用的解决方案,这个解决方案应该在任何地方都能工作。
https://stackoverflow.com/questions/51477954
复制相似问题