// Record a transfer command buffer
auto cmd = vk::raii::CommandBuffer(device, { .commandPool = *transferPool, .level = vk::CommandBufferLevel::ePrimary });
cmd.begin({ .flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit });
// Copy from staging buffer to GPU-optimal image
auto region = vk::BufferImageCopy{
.bufferOffset = 0,
.imageSubresource = { .aspectMask = vk::ImageAspectFlagBits::eColor, .mipLevel = 0, .baseArrayLayer = 0, .layerCount = 1 },
.imageExtent = extent
};
cmd.copyBufferToImage(*stagingBuffer, *gpuImage, vk::ImageLayout::eTransferDstOptimal, region);
cmd.end();