| // 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/device_buffer.h" |
| |
| #include "dart_api.h" |
| #include "flutter/lib/gpu/formats.h" |
| #include "fml/mapping.h" |
| #include "impeller/core/device_buffer.h" |
| #include "impeller/core/device_buffer_descriptor.h" |
| #include "impeller/core/formats.h" |
| #include "impeller/core/platform.h" |
| #include "impeller/core/range.h" |
| #include "third_party/tonic/typed_data/dart_byte_data.h" |
| #include "tonic/converter/dart_converter.h" |
| |
| namespace flutter { |
| namespace gpu { |
| |
| IMPLEMENT_WRAPPERTYPEINFO(flutter_gpu, DeviceBuffer); |
| |
| DeviceBuffer::DeviceBuffer( |
| std::shared_ptr<impeller::DeviceBuffer> device_buffer) |
| : device_buffer_(std::move(device_buffer)) {} |
| |
| DeviceBuffer::~DeviceBuffer() = default; |
| |
| std::shared_ptr<impeller::DeviceBuffer> DeviceBuffer::GetBuffer() { |
| return device_buffer_; |
| } |
| |
| bool DeviceBuffer::Overwrite(const tonic::DartByteData& source_bytes, |
| size_t destination_offset_in_bytes) { |
| if (!device_buffer_->CopyHostBuffer( |
| reinterpret_cast<const uint8_t*>(source_bytes.data()), |
| impeller::Range(0, source_bytes.length_in_bytes()), |
| destination_offset_in_bytes)) { |
| return false; |
| } |
| return true; |
| } |
| |
| } // namespace gpu |
| } // namespace flutter |
| |
| //---------------------------------------------------------------------------- |
| /// Exports |
| /// |
| |
| bool InternalFlutterGpu_DeviceBuffer_Initialize( |
| Dart_Handle wrapper, |
| flutter::gpu::Context* gpu_context, |
| int storage_mode, |
| int size_in_bytes) { |
| impeller::DeviceBufferDescriptor desc; |
| desc.storage_mode = flutter::gpu::ToImpellerStorageMode(storage_mode); |
| desc.size = size_in_bytes; |
| auto device_buffer = |
| gpu_context->GetContext()->GetResourceAllocator()->CreateBuffer(desc); |
| if (!device_buffer) { |
| FML_LOG(ERROR) << "Failed to create device buffer."; |
| return false; |
| } |
| |
| auto res = |
| fml::MakeRefCounted<flutter::gpu::DeviceBuffer>(std::move(device_buffer)); |
| res->AssociateWithDartWrapper(wrapper); |
| |
| return true; |
| } |
| |
| bool InternalFlutterGpu_DeviceBuffer_InitializeWithHostData( |
| Dart_Handle wrapper, |
| flutter::gpu::Context* gpu_context, |
| Dart_Handle byte_data) { |
| auto data = tonic::DartByteData(byte_data); |
| auto mapping = fml::NonOwnedMapping(reinterpret_cast<uint8_t*>(data.data()), |
| data.length_in_bytes()); |
| auto device_buffer = |
| gpu_context->GetContext()->GetResourceAllocator()->CreateBufferWithCopy( |
| mapping); |
| if (!device_buffer) { |
| FML_LOG(ERROR) << "Failed to create device buffer with copy."; |
| return false; |
| } |
| |
| auto res = |
| fml::MakeRefCounted<flutter::gpu::DeviceBuffer>(std::move(device_buffer)); |
| res->AssociateWithDartWrapper(wrapper); |
| |
| return true; |
| } |
| |
| bool InternalFlutterGpu_DeviceBuffer_Overwrite( |
| flutter::gpu::DeviceBuffer* device_buffer, |
| Dart_Handle source_byte_data, |
| int destination_offset_in_bytes) { |
| return device_buffer->Overwrite(tonic::DartByteData(source_byte_data), |
| destination_offset_in_bytes); |
| } |