29 if (dstOffset + nbytes >
size_)
30 throw Exception(
"GpuBuffer.write: out of range (offset=%llu size=%llu capacity=%llu)",
31 (
unsigned long long)dstOffset, (
unsigned long long)nbytes,
32 (
unsigned long long)
size_);
39 void *
ptr = (*device_)->mapMemory(
memory_, dstOffset, nbytes, vk::MemoryMapFlags{});
40 std::memcpy(
ptr, src,
size_t(nbytes));
41 (*device_)->unmapMemory(
memory_);
45 using buf = vk::BufferUsageFlagBits;
46 using pfb = vk::MemoryPropertyFlagBits;
47 vkb::GenericBuffer staging(*
device_, buf::eTransferSrc, nbytes,
48 pfb::eHostVisible | pfb::eHostCoherent);
49 staging.updateLocal(vkb::FrameSlot::gpuIdle(), src, nbytes);
50 vkb::executeImmediately(
device_->instance, pool, queue, [&](vk::CommandBuffer cb) {
51 vk::BufferCopy bc{0, vk::DeviceSize(dstOffset), vk::DeviceSize(nbytes)};
52 cb.copyBuffer(staging.buffer,
buffer_, bc);
56void VulkanGpuBuffer::downloadBytes(
void *dst, uint64_t nbytes, uint64_t srcOffset)
const {
57 if (!device_ || !buffer_ || !dst || nbytes == 0)
return;
58 if (srcOffset + nbytes > size_)
59 throw Exception(
"GpuBuffer.read: out of range (offset=%llu size=%llu capacity=%llu)",
60 (
unsigned long long)srcOffset, (
unsigned long long)nbytes,
61 (
unsigned long long)size_);
68 void *
ptr = (*device_)->mapMemory(memory_, srcOffset, nbytes, vk::MemoryMapFlags{});
69 std::memcpy(dst,
ptr,
size_t(nbytes));
70 (*device_)->unmapMemory(memory_);
74 using buf = vk::BufferUsageFlagBits;
75 using pfb = vk::MemoryPropertyFlagBits;
76 vkb::GenericBuffer staging(*device_, buf::eTransferDst, nbytes,
77 pfb::eHostVisible | pfb::eHostCoherent);
78 vkb::executeImmediately(device_->instance, pool, queue, [&](vk::CommandBuffer cb) {
79 vk::BufferCopy bc{vk::DeviceSize(srcOffset), 0, vk::DeviceSize(nbytes)};
80 cb.copyBuffer(buffer_, staging.buffer, bc);
82 void *
ptr = (*device_)->mapMemory(staging.memory, 0, nbytes, vk::MemoryMapFlags{});
83 std::memcpy(dst,
ptr,
size_t(nbytes));
84 (*device_)->unmapMemory(staging.memory);