You allocate two buffers A and B, then you write the content of buffer A (in your program), then you want to ask the GPU to copy the content of buffer A to buffer B.
But there's another problem: in Vulkan, you can prepare commands in advance.
This again complicates the safety checks.
That would be a performance killer.
That's why vulkano has a GpuFuture trait. When you submit a command, a GpuFuture is returned.
A GpuFuture doesn't return any value, but you can use them to enforce an order in the commands that the GPU performs.
GpuFutures are also used to enforce synchronization.
It is legal to submit a command that requires an exclusive borrow of a Buffer after a GpuFuture that holds an exclusive borrow to that same buffer.
If you submit a command for execution after a GpuFuture, vulkano will first try to prolong an existing lock inside of that GpuFuture.
And I didn't even mention pipeline barriers! That's maybe for another day.