blob: 482a5c50be6b14f4e9412aba7d1f69a373555860 [file] [log] [blame]
/*
* 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