| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "flutter/lib/gpu/host_buffer.h" |
| |
| #include <optional> |
| |
| #include "dart_api.h" |
| #include "impeller/core/host_buffer.h" |
| #include "impeller/core/platform.h" |
| #include "third_party/tonic/typed_data/dart_byte_data.h" |
| |
| namespace flutter { |
| namespace gpu { |
| |
| IMPLEMENT_WRAPPERTYPEINFO(flutter_gpu, HostBuffer); |
| |
| HostBuffer::HostBuffer(Context* context) |
| : host_buffer_(impeller::HostBuffer::Create( |
| context->GetContext()->GetResourceAllocator())) {} |
| |
| HostBuffer::~HostBuffer() = default; |
| |
| std::shared_ptr<impeller::HostBuffer> HostBuffer::GetBuffer() { |
| return host_buffer_; |
| } |
| |
| size_t HostBuffer::EmplaceBytes(const tonic::DartByteData& byte_data) { |
| auto view = |
| host_buffer_->Emplace(byte_data.data(), byte_data.length_in_bytes(), |
| impeller::DefaultUniformAlignment()); |
| emplacements_[current_offset_] = view; |
| size_t previous_offset = current_offset_; |
| current_offset_ += view.range.length; |
| return previous_offset; |
| } |
| |
| std::optional<impeller::BufferView> HostBuffer::GetBufferViewForOffset( |
| size_t offset) { |
| return emplacements_[offset]; |
| } |
| |
| } // namespace gpu |
| } // namespace flutter |
| |
| //---------------------------------------------------------------------------- |
| /// Exports |
| /// |
| |
| void InternalFlutterGpu_HostBuffer_Initialize(Dart_Handle wrapper, |
| flutter::gpu::Context* context) { |
| auto res = fml::MakeRefCounted<flutter::gpu::HostBuffer>(context); |
| res->AssociateWithDartWrapper(wrapper); |
| } |
| |
| size_t InternalFlutterGpu_HostBuffer_EmplaceBytes( |
| flutter::gpu::HostBuffer* wrapper, |
| Dart_Handle byte_data) { |
| return wrapper->EmplaceBytes(tonic::DartByteData(byte_data)); |
| } |