vkCmdPipelineBarrier():图像屏障 0x0x7fff9c1cdaf0 newLayout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL 与图像 0x4 使用标志不兼容

vkCmdPipelineBarrier(): Image barrier 0x0x7fff9c1cdaf0 newLayout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL is not compatible with image 0x4 usage flags

vkCmdPipelineBarrier():图像屏障 0x0x7fff9c1cdaf0 newLayout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL 与图像 0x4 使用标志 0x16 不兼容。

我正在尝试将交换链图像保存为png或bmp等图片文件,我发现Vulkan SDK 1.2.148.1中有一个示例,路径为:“VulkanSDK/1.2.148 .1/ubuntu/samples/API-Samples/15-draw_cube”,它在文件“VulkanSDK/1.2.148.1/ubuntu/samples/API-Samples/utils/util.cpp”中使用了一个write_ppm函数,官方示例运行非常well.But 当我以同样的方式使用该函数时,我将一个预先构造的 sample_info 对象传递给 write_ppm() 函数,当它运行到第二个 set_image_layout()在行“VkImageCopy copy_region;”之前运行函数,它给出错误:

日志:VulkanDebugCallBack:40 错误:[验证] 代码 0:[VUID-VkImageMemoryBarrier-oldLayout-01212] 对象:0x4(类型 = 10)| vkCmdPipelineBarrier():图像屏障 0x0x7fff9c1cdaf0 newLayout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL 与图像 0x4 使用标志 0x16 不兼容。 Vulkan 规范指出:如果 oldLayout 或 newLayout 是 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,则必须使用 VK_IMAGE_USAGE_TRANSFER_SRC_BIT 集创建图像 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01212) 日志:VulkanDebugCallBack:40 错误:[验证] 代码 0:[VUID-vkCmdCopyImage-srcImage-00126] 对象:0x4(类型 = 10)| vkCmdCopyImage() 使用的图像 0x4 的使用标志无效。在这种情况下,Image 在创建时应该设置 VK_IMAGE_USAGE_TRANSFER_SRC_BIT。 Vulkan 规范指出:srcImage 必须使用 VK_IMAGE_USAGE_TRANSFER_SRC_BIT 使用标志 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-00126) 创建 formatNumByDigit() : num == 1, outputStr == 00001 utils::write_png() :创建可映射图像 日志:VulkanDebugCallBack:40 错误:[验证] 代码 0:[VUID-vkBeginCommandBuffer-commandBuffer-00049] 对象:0x5590939c7538(类型 = 6)| vkBeginCommandBuffer():无法在 RECORDING 状态下在命令缓冲区 (0x5590939c7538) 上调用 Begin。必须先调用 vkEndCommandBuffer()。 Vulkan 规范规定:commandBuffer 不得处于记录或挂起状态。 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBeginCommandBuffer-commandBuffer-00049)

它说“如果 oldLayout 或 newLayout 是 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL 那么图像必须是用 VK_IMAGE_USAGE_TRANSFER_SRC_BIT 创建的”,但它使用的图像是交换链图像,据我所知它可以是仅通过函数 vkGetSwapchainImagesKHR() 获取,我如何确定它是否是使用“VK_IMAGE_USAGE_TRANSFER_SRC_BIT”创建的?或者,如何解决这个问题? 非常感谢!

how could I make sure if it was created with "VK_IMAGE_USAGE_TRANSFER_SRC_BIT"?

你不知道。 Swapchain 图片不属于你;它们属于显示系统和OS。您可以使用它们,但只能以显示系统允许.

的方式使用

vkGetPhysicalDeviceSurfaceCapabilitiesKHR 告诉您交换链图像的属性,包括图像使用标志。 Vulkan 规范 要求 在交换链图像上的唯一使用标志是颜色附件标志。其他任何事情,哪怕是简单的复制操作,都要经过显示系统的认可。

因此,如果您希望您的应用程序能够 运行 在各种硬件上,您需要考虑无法从交换链图像复制的可能性。因此,您至少需要能够渲染到您自己的图像,您最终要么将其 blit 到交换链图像(这又是 not 需要被允许)或渲染图像到交换链图像。