| 327 | } |
| 328 | |
| 329 | void vulkan_buffer::copy(const device_queue& cqueue, const device_buffer& src, |
| 330 | const size_t size_, const size_t src_offset, const size_t dst_offset) { |
| 331 | if(buffer == nullptr) return; |
| 332 | |
| 333 | const size_t src_size = src.get_size(); |
| 334 | const size_t copy_size = (size_ == 0 ? std::min(src_size, size) : size_); |
| 335 | if(!copy_check(size, src_size, copy_size, dst_offset, src_offset)) return; |
| 336 | |
| 337 | const auto& vk_queue = (const vulkan_queue&)cqueue; |
| 338 | VK_CMD_BLOCK_RET(vk_queue, "buffer zero", ({ |
| 339 | const VkBufferCopy2 region { |
| 340 | .sType = VK_STRUCTURE_TYPE_BUFFER_COPY_2, |
| 341 | .pNext = nullptr, |
| 342 | .srcOffset = src_offset, |
| 343 | .dstOffset = dst_offset, |
| 344 | .size = copy_size, |
| 345 | }; |
| 346 | const VkCopyBufferInfo2 info { |
| 347 | .sType = VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2, |
| 348 | .pNext = nullptr, |
| 349 | .srcBuffer = ((const vulkan_buffer&)src).buffer, |
| 350 | .dstBuffer = buffer, |
| 351 | .regionCount = 1, |
| 352 | .pRegions = ®ion, |
| 353 | }; |
| 354 | vkCmdCopyBuffer2(block_cmd_buffer.cmd_buffer, &info); |
| 355 | }), , true /* always blocking */); |
| 356 | } |
| 357 | |
| 358 | bool vulkan_buffer::fill(const device_queue& cqueue, |
| 359 | const void* pattern, const size_t& pattern_size, |