xref: /aosp_15_r20/external/executorch/backends/vulkan/runtime/api/containers/ParamsBuffer.cpp (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
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