| /* |
| * Copyright (c) Meta Platforms, Inc. and affiliates. |
| * All rights reserved. |
| * |
| * This source code is licensed under the BSD-style license found in the |
| * LICENSE file in the root directory of this source tree. |
| */ |
| |
| #include <executorch/backends/vulkan/runtime/api/containers/ParamsBuffer.h> |
| |
| #include <cstring> |
| |
| namespace vkcompute { |
| namespace api { |
| |
| namespace { |
| |
| void memcpy_to_buffer( |
| const vkapi::VulkanBuffer& src, |
| vkapi::VulkanBuffer& dst) { |
| vkapi::MemoryMap dst_mapping(dst, vkapi::MemoryAccessType::WRITE); |
| |
| vkapi::MemoryMap src_mapping(src, vkapi::MemoryAccessType::READ); |
| src_mapping.invalidate(); |
| |
| void* dst_ptr = dst_mapping.template data<void>(); |
| void* src_ptr = src_mapping.template data<void>(); |
| |
| // @lint-ignore CLANGTIDY facebook-security-vulnerable-memcpy |
| memcpy(dst_ptr, src_ptr, src.mem_size()); |
| } |
| |
| } // namespace |
| |
| ParamsBuffer::ParamsBuffer(const ParamsBuffer& other) |
| : context_p_(other.context_p_), vulkan_buffer_{} { |
| if (other.vulkan_buffer_) { |
| vulkan_buffer_ = context_p_->adapter_ptr()->vma().create_uniform_buffer( |
| other.vulkan_buffer_.mem_size()); |
| |
| memcpy_to_buffer(other.vulkan_buffer_, vulkan_buffer_); |
| } |
| } |
| |
| ParamsBuffer& ParamsBuffer::operator=(const ParamsBuffer& other) { |
| if (&other != this) { |
| context_p_ = other.context_p_; |
| |
| // Move vulkan_buffer_ to another VulkanBuffer for cleanup |
| if (vulkan_buffer_) { |
| vkapi::VulkanBuffer temp_buffer(std::move(vulkan_buffer_)); |
| context_p_->register_buffer_cleanup(temp_buffer); |
| } |
| // vulkan_buffer_ should now be empty |
| |
| if (other.vulkan_buffer_) { |
| vulkan_buffer_ = context_p_->adapter_ptr()->vma().create_uniform_buffer( |
| other.vulkan_buffer_.mem_size()); |
| |
| memcpy_to_buffer(other.vulkan_buffer_, vulkan_buffer_); |
| } |
| } |
| |
| return *this; |
| } |
| |
| } // namespace api |
| } // namespace vkcompute |