You wrote:
// TODO: separate transfer queue (if not supported by compute queue) including buffer ownership transfer
but there is a note:
Note
All commands that are allowed on a queue that supports transfer operations are also allowed on a queue that supports either graphics or compute operations. Thus, if the capabilities of a queue family include VK_QUEUE_GRAPHICS_BIT or VK_QUEUE_COMPUTE_BIT, then reporting the VK_QUEUE_TRANSFER_BIT capability separately for that queue family is optional.
So in most cases there is no need to separate.
You wrote:
but there is a note:
So in most cases there is no need to separate.