AnsweredAssumed Answered

Transfer queue copy operations

Question asked by invertedantimatter on Aug 27, 2016
Latest reply on Sep 7, 2016 by invertedantimatter

I'm attempting to copy staged data from a VkBuffer or VkImage bound in host-visible memory into a VkImage in device-local memory.

vkCmdCopyBuffer appears to work with any queue family.

However, I've only been able to get vkCmdCopyBufferToImage, and vkCmdCopyImage to work in a queue family with graphics enabled.

The spec reads:

The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations.


VK_PIPELINE_STAGE_TRANSFER_BIT: Execution of copy commands. This includes the operations resulting from all transfer commands. The set of transfer commands comprises vkCmdCopyBuffer, vkCmdCopyImage, vkCmdBlitImage, vkCmdCopyBufferToImage, vkCmdCopyImageToBuffer, vkCmdUpdateBuffer, vkCmdFillBuffer, vkCmdClearColorImage, vkCmdClearDepthStencilImage, vkCmdResolveImage, and vkCmdCopyQueryPoolResults.

Which seems to me that transfer queue families should support it.

The obvious workaround is to use vkCmdCopyBuffer (host to GPU copy) using the transfer queue family and vkCmdCopyBufferToImage (local GPU memory copy) using the graphics queue family to avoid stalling the graphics queue since local memory copies are faster than PCI-e transfers.

Is this expected behavior?

  • Hardware: AMD GPU (R9 Nano)
  • Requested API: 1.0.13
  • Radeon driver: 16.4.2
  • Windows 10