1 /*
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 * All rights reserved.
4 *
5 * This source code is licensed under the BSD-style license found in the
6 * LICENSE file in the root directory of this source tree.
7 */
8
9 #include <executorch/backends/vulkan/runtime/api/containers/ParamsBuffer.h>
10
11 #include <cstring>
12
13 namespace vkcompute {
14 namespace api {
15
16 namespace {
17
memcpy_to_buffer(const vkapi::VulkanBuffer & src,vkapi::VulkanBuffer & dst)18 void memcpy_to_buffer(
19 const vkapi::VulkanBuffer& src,
20 vkapi::VulkanBuffer& dst) {
21 vkapi::MemoryMap dst_mapping(dst, vkapi::MemoryAccessType::WRITE);
22
23 vkapi::MemoryMap src_mapping(src, vkapi::MemoryAccessType::READ);
24 src_mapping.invalidate();
25
26 void* dst_ptr = dst_mapping.template data<void>();
27 void* src_ptr = src_mapping.template data<void>();
28
29 // @lint-ignore CLANGTIDY facebook-security-vulnerable-memcpy
30 memcpy(dst_ptr, src_ptr, src.mem_size());
31 }
32
33 } // namespace
34
ParamsBuffer(const ParamsBuffer & other)35 ParamsBuffer::ParamsBuffer(const ParamsBuffer& other)
36 : context_p_(other.context_p_), vulkan_buffer_{} {
37 if (other.vulkan_buffer_) {
38 vulkan_buffer_ = context_p_->adapter_ptr()->vma().create_uniform_buffer(
39 other.vulkan_buffer_.mem_size());
40
41 memcpy_to_buffer(other.vulkan_buffer_, vulkan_buffer_);
42 }
43 }
44
operator =(const ParamsBuffer & other)45 ParamsBuffer& ParamsBuffer::operator=(const ParamsBuffer& other) {
46 if (&other != this) {
47 context_p_ = other.context_p_;
48
49 // Move vulkan_buffer_ to another VulkanBuffer for cleanup
50 if (vulkan_buffer_) {
51 vkapi::VulkanBuffer temp_buffer(std::move(vulkan_buffer_));
52 context_p_->register_buffer_cleanup(temp_buffer);
53 }
54 // vulkan_buffer_ should now be empty
55
56 if (other.vulkan_buffer_) {
57 vulkan_buffer_ = context_p_->adapter_ptr()->vma().create_uniform_buffer(
58 other.vulkan_buffer_.mem_size());
59
60 memcpy_to_buffer(other.vulkan_buffer_, vulkan_buffer_);
61 }
62 }
63
64 return *this;
65 }
66
67 } // namespace api
68 } // namespace vkcompute
69