Is the TRANSFER stage useful for anything or is it actually deprecated with VK_KHR_synchronization2, too?

Is there actually any remaining use for VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR? Or can

  • VK_PIPELINE_STAGE_2_COPY_BIT_KHR
  • VK_PIPELINE_STAGE_2_BLIT_BIT_KHR
  • VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR
  • VK_PIPELINE_STAGE_2_CLEAR_BIT_KHR

be used in its stead in all cases?

Skimming throught the specification, I found the following:

vkCmdCopyQueryPoolResults is considered to be a transfer operation, and its writes to buffer memory
must be synchronized using VK_PIPELINE_STAGE_TRANSFER_BIT

But I guess that vkCmdCopyQueryPoolResults would qualify as a VK_PIPELINE_STAGE_2_COPY_BIT_KHR operation, wouldn’t it? (It doesn’t say so in the specification, though)

Other than that, I can only find it in the context of image layout transitions:

VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL must only be used as a source image of a transfer
command (see the definition of VK_PIPELINE_STAGE_TRANSFER_BIT)

There aren’t many useful mentions in the whole specification other than these two ^. And VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR is actually not even mentioned in any description at all.
So, are maybe image layout transitions the only remaining TRANSFER operations with VK_KHR_synchronization2?

Note that STAGE_2_TRANSFER has the same value as STAGE_2_ALL_TRANSFER, which also has the same value as STAGE_TRANSFER. The specification states that the bits corresponding to the old bits have the same behavior as the old bits:

The VkPipelineStageFlags2KHR bitmask goes beyond the 31 individual bit flags allowable within a C99 enum, which is how VkPipelineStageFlagBits is defined. The first 31 values are common to both, and are interchangeable.

So if something mentions STAGE_TRANSFER, then it behaves exactly like STAGE_2_TRANSFER or STAGE_2_ALL_TRANSFER.

Yes, it does. It says so right in the definition of the bit:

VK_PIPELINE_STAGE_2_COPY_BIT_KHR specifies the execution of all copy commands, including vkCmdCopyQueryPoolResults.

Oh, I completely missed that STAGE_2_ALL_TRANSFER and STAGE_2_TRANSFER have the same value. I still wonder, though, if we should just get rid of the VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR flag and only use VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR. This would make things clearer, wouldn’t it?

Or are there actually any transfer commands which can not be assigned to one of the more precisely defined

  • VK_PIPELINE_STAGE_2_COPY_BIT_KHR
  • VK_PIPELINE_STAGE_2_BLIT_BIT_KHR
  • VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR
  • VK_PIPELINE_STAGE_2_CLEAR_BIT_KHR

stages?

I see. I was hoping to see the new Synchronization2-stages also mentioned in the commands’ descriptions. But since they are “just” an extension, that might not happen at all places where the specification refers to classical stages.