From 7a64505c6c087e151fbbfe108424b54893d604b9 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Fri, 27 Oct 2023 14:57:14 -0700 Subject: [PATCH] Revert "[Impeller] remove image upload workarounds. (#47209)" This reverts commit 8eb59095b78ac74f1893247af1c135ac772a978d. --- lib/ui/painting/image_decoder_impeller.cc | 46 +++++++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/lib/ui/painting/image_decoder_impeller.cc b/lib/ui/painting/image_decoder_impeller.cc index 9be5f0c631ee6..02380442984af 100644 --- a/lib/ui/painting/image_decoder_impeller.cc +++ b/lib/ui/painting/image_decoder_impeller.cc @@ -10,13 +10,14 @@ #include "flutter/fml/make_copyable.h" #include "flutter/fml/trace_event.h" #include "flutter/impeller/core/allocator.h" +#include "flutter/impeller/core/texture.h" #include "flutter/impeller/display_list/dl_image_impeller.h" #include "flutter/impeller/renderer/command_buffer.h" #include "flutter/impeller/renderer/context.h" +#include "flutter/lib/ui/painting/image_decoder_skia.h" #include "impeller/base/strings.h" #include "impeller/display_list/skia_conversions.h" #include "impeller/geometry/size.h" - #include "third_party/skia/include/core/SkAlphaType.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkColorSpace.h" @@ -31,6 +32,42 @@ namespace flutter { +class MallocDeviceBuffer : public impeller::DeviceBuffer { + public: + explicit MallocDeviceBuffer(impeller::DeviceBufferDescriptor desc) + : impeller::DeviceBuffer(desc) { + data_ = static_cast(malloc(desc.size)); + } + + ~MallocDeviceBuffer() override { free(data_); } + + bool SetLabel(const std::string& label) override { return true; } + + bool SetLabel(const std::string& label, impeller::Range range) override { + return true; + } + + uint8_t* OnGetContents() const override { return data_; } + + bool OnCopyHostBuffer(const uint8_t* source, + impeller::Range source_range, + size_t offset) override { + memcpy(data_ + offset, source + source_range.offset, source_range.length); + return true; + } + + private: + uint8_t* data_; + + FML_DISALLOW_COPY_AND_ASSIGN(MallocDeviceBuffer); +}; + +#ifdef FML_OS_ANDROID +static constexpr bool kShouldUseMallocDeviceBuffer = true; +#else +static constexpr bool kShouldUseMallocDeviceBuffer = false; +#endif // FML_OS_ANDROID + namespace { /** * Loads the gamut as a set of three points (triangle). @@ -485,7 +522,8 @@ void ImageDecoderImpeller::Decode(fml::RefPtr descriptor, gpu_disabled_switch]() { sk_sp image; std::string decode_error; - if (context->GetCapabilities()->SupportsBufferToTextureBlits()) { + if (!kShouldUseMallocDeviceBuffer && + context->GetCapabilities()->SupportsBufferToTextureBlits()) { std::tie(image, decode_error) = UploadTextureToPrivate( context, bitmap_result.device_buffer, bitmap_result.image_info, bitmap_result.sk_bitmap, gpu_disabled_switch); @@ -529,7 +567,9 @@ bool ImpellerAllocator::allocPixelRef(SkBitmap* bitmap) { (bitmap->width() * bitmap->bytesPerPixel()); std::shared_ptr device_buffer = - allocator_->CreateBuffer(descriptor); + kShouldUseMallocDeviceBuffer + ? std::make_shared(descriptor) + : allocator_->CreateBuffer(descriptor); struct ImpellerPixelRef final : public SkPixelRef { ImpellerPixelRef(int w, int h, void* s, size_t r)