From a5799c09641f653a80321c943dfd1409da6183c5 Mon Sep 17 00:00:00 2001 From: Chinmay Garde Date: Tue, 9 Jul 2019 14:59:34 -0700 Subject: [PATCH] Rework image & texture management to use concurrent message queues. (flutter/engine#9486) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch reworks image decompression and collection in the following ways because of misbehavior in the described edge cases. The current flow for realizing a texture on the GPU from a blob of compressed bytes is to first pass it to the IO thread for image decompression and then upload to the GPU. The handle to the texture on the GPU is then passed back to the UI thread so that it can be included in subsequent layer trees for rendering. The GPU contexts on the Render & IO threads are in the same sharegroup so the texture ends up being visible to the Render Thread context during rendering. This works fine and does not block the UI thread. All references to the image are owned on UI thread by Dart objects. When the final reference to the image is dropped, the texture cannot be collected on the UI thread (because it has not GPU context). Instead, it must be passed to either the GPU or IO threads. The GPU thread is usually in the middle of a frame workload so we redirect the same to the IO thread for eventual collection. While texture collections are usually (comparatively) fast, texture decompression and upload are slow (order of magnitude of frame intervals). For application that end up creating (by not necessarily using) numerous large textures in straight-line execution, it could be the case that texture collection tasks are pending on the IO task runner after all the image decompressions (and upload) are done. Put simply, the collection of the first image could be waiting for the decompression and upload of the last image in the queue. This is exacerbated by two other hacks added to workaround unrelated issues. * First, creating a codec with a single image frame immediately kicks of decompression and upload of that frame image (even if the frame was never request from the codec). This hack was added because we wanted to get rid of the compressed image allocation ASAP. The expectation was codecs would only be created with the sole purpose of getting the decompressed image bytes. However, for applications that only create codecs to get image sizes (but never actually decompress the same), we would end up replacing the compressed image allocation with a larger allocation (device resident no less) for no obvious use. This issue is particularly insidious when you consider that the codec is usually asked for the native image size first before the frame is requested at a smaller size (usually using a new codec with same data but new targetsize). This would cause the creation of a whole extra texture (at 1:1) when the caller was trying to “optimize” for memory use by requesting a texture of a smaller size. * Second, all image collections we delayed in by the unref queue by 250ms because of observations that the calling thread (the UI thread) was being descheduled unnecessarily when a task with a timeout of zero was posted from the same (recall that a task has to be posted to the IO thread for the collection of that texture). 250ms is multiple frame intervals worth of potentially unnecessary textures. The net result of these issues is that we may end up creating textures when all that the application needs is to ask it’s codec for details about the same (but not necessarily access its bytes). Texture collection could also be delayed behind other jobs to decompress the textures on the IO thread. Also, all texture collections are delayed for an arbitrary amount of time. These issues cause applications to be susceptible to OOM situations. These situations manifest in various ways. Host memory exhaustion causes the usual OOM issues. Device memory exhaustion seems to manifest in different ways on iOS and Android. On Android, allocation of a new texture seems to be causing an assertion (in the driver). On iOS, the call hangs (presumably waiting for another thread to release textures which we won’t do because those tasks are blocked behind the current task completing). To address peak memory usage, the following changes have been made: * Image decompression and upload/collection no longer happen on the same thread. All image decompression will now be handled on a workqueue. The number of worker threads in this workqueue is equal to the number of processors on the device. These threads have a lower priority that either the UI or Render threads. These workers are shared between all Flutter applications in the process. * Both the images and their codec now report the correct allocation size to Dart for GC purposes. The Dart VM uses this to pick objects for collection. Earlier the image allocation was assumed to 32bpp with no mipmapping overhead reported. Now, the correct image size is reported and the mipmapping overhead is accounted for. Image codec sizes were not reported to the VM earlier and now are. Expect “External” VM allocations to be higher than previously reported and the numbers in Observatory to line up more closely with actual memory usage (device and host). * Decoding images to a specific size used to decode to 1:1 before performing a resize to the correct dimensions before texture upload. This has now been reworked so that images are first decompressed to a smaller size supported natively by the codec before final resizing to the requested target size. The intermediate copy is now smaller and more promptly collected. Resizing also happens on the workqueue worker. * The drain interval of the unref queue is now sub-frame-interval. I am hesitant to remove the delay entirely because I have not been able to instrument the performance overhead of the same. That is next on my list. But now, multiple frame intervals worth of textures no longer stick around. The following issues have been addressed: * https://github.com/flutter/flutter/issues/34070 Since this was the first usage of the concurrent message loops, the number of idle wakes were determined to be too high and this component has been rewritten to be simpler and not use the existing task runner and MessageLoopImpl interface. * Image decoding had no tests. The new `ui_unittests` harness has been added that sets up a GPU test harness on the host using SwiftShader. Tests have been added for image decompression, upload and resizing. * The device memory exhaustion in this benchmark has been addressed. That benchmark is still not viable for inclusion in any harness however because it creates 9 million codecs in straight-line execution. Because these codecs are destroyed in the microtask callbacks, these are referenced till those callbacks are executed. So now, instead of device memory exhaustion, this will lead to (slower) exhaustion of host memory. This is expected and working as intended. This patch only addresses peak memory use and makes collection of unused images and textures more prompt. It does NOT address memory use by images referenced strongly by the application or framework. --- engine/src/flutter/BUILD.gn | 1 + .../ci/licenses_golden/licenses_flutter | 9 + .../flutter/fml/concurrent_message_loop.cc | 112 +++- .../src/flutter/fml/concurrent_message_loop.h | 64 +- engine/src/flutter/fml/message_loop.cc | 8 - engine/src/flutter/fml/message_loop.h | 4 - .../src/flutter/fml/message_loop_unittests.cc | 21 +- engine/src/flutter/fml/trace_event.h | 35 + engine/src/flutter/lib/ui/BUILD.gn | 30 + .../lib/ui/fixtures/DashInNooglerHat.jpg | Bin 0 -> 354679 bytes .../src/flutter/lib/ui/fixtures/ui_test.dart | 5 + engine/src/flutter/lib/ui/io_manager.h | 2 + engine/src/flutter/lib/ui/painting/codec.cc | 598 +++--------------- engine/src/flutter/lib/ui/painting/codec.h | 53 +- .../src/flutter/lib/ui/painting/frame_info.h | 4 - engine/src/flutter/lib/ui/painting/image.cc | 5 +- .../flutter/lib/ui/painting/image_decoder.cc | 336 ++++++++++ .../flutter/lib/ui/painting/image_decoder.h | 73 +++ .../ui/painting/image_decoder_unittests.cc | 390 ++++++++++++ .../lib/ui/painting/multi_frame_codec.cc | 191 ++++++ .../lib/ui/painting/multi_frame_codec.h | 54 ++ .../lib/ui/painting/single_frame_codec.cc | 79 +++ .../lib/ui/painting/single_frame_codec.h | 41 ++ engine/src/flutter/lib/ui/ui_dart_state.cc | 6 + engine/src/flutter/lib/ui/ui_dart_state.h | 5 + engine/src/flutter/runtime/dart_isolate.cc | 6 + engine/src/flutter/runtime/dart_isolate.h | 2 + .../flutter/runtime/dart_isolate_unittests.cc | 3 + .../runtime/dart_lifecycle_unittests.cc | 1 + engine/src/flutter/runtime/dart_vm.cc | 6 + engine/src/flutter/runtime/dart_vm.h | 5 + .../src/flutter/runtime/runtime_controller.cc | 6 + .../src/flutter/runtime/runtime_controller.h | 3 + engine/src/flutter/shell/common/engine.cc | 4 + engine/src/flutter/shell/common/engine.h | 2 + .../flutter/shell/common/shell_io_manager.cc | 24 +- .../flutter/shell/common/shell_io_manager.h | 13 +- .../flutter/shell/platform/embedder/BUILD.gn | 9 +- .../embedder/tests/embedder_context.cc | 2 +- .../embedder/tests/embedder_context.h | 4 +- engine/src/flutter/testing/BUILD.gn | 22 + engine/src/flutter/testing/run_tests.sh | 3 + .../test_gl_surface.cc} | 60 +- .../test_gl_surface.h} | 28 +- engine/src/flutter/testing/testing.cc | 33 + engine/src/flutter/testing/testing.h | 3 + engine/src/flutter/testing/thread_test.cc | 8 + engine/src/flutter/testing/thread_test.h | 4 + 48 files changed, 1685 insertions(+), 692 deletions(-) create mode 100644 engine/src/flutter/lib/ui/fixtures/DashInNooglerHat.jpg create mode 100644 engine/src/flutter/lib/ui/fixtures/ui_test.dart create mode 100644 engine/src/flutter/lib/ui/painting/image_decoder.cc create mode 100644 engine/src/flutter/lib/ui/painting/image_decoder.h create mode 100644 engine/src/flutter/lib/ui/painting/image_decoder_unittests.cc create mode 100644 engine/src/flutter/lib/ui/painting/multi_frame_codec.cc create mode 100644 engine/src/flutter/lib/ui/painting/multi_frame_codec.h create mode 100644 engine/src/flutter/lib/ui/painting/single_frame_codec.cc create mode 100644 engine/src/flutter/lib/ui/painting/single_frame_codec.h rename engine/src/flutter/{shell/platform/embedder/tests/embedder_test_gl_surface.cc => testing/test_gl_surface.cc} (81%) rename engine/src/flutter/{shell/platform/embedder/tests/embedder_test_gl_surface.h => testing/test_gl_surface.h} (58%) diff --git a/engine/src/flutter/BUILD.gn b/engine/src/flutter/BUILD.gn index 9374834dc9..5521ce8174 100644 --- a/engine/src/flutter/BUILD.gn +++ b/engine/src/flutter/BUILD.gn @@ -55,6 +55,7 @@ group("flutter") { public_deps += [ "$flutter_root/flow:flow_unittests", "$flutter_root/fml:fml_unittests", + "$flutter_root/lib/ui:ui_unittests", "$flutter_root/runtime:runtime_unittests", "$flutter_root/shell/common:shell_unittests", "$flutter_root/shell/platform/common/cpp/client_wrapper:client_wrapper_unittests", diff --git a/engine/src/flutter/ci/licenses_golden/licenses_flutter b/engine/src/flutter/ci/licenses_golden/licenses_flutter index 8d3693f1cc..9b6ea9ff88 100644 --- a/engine/src/flutter/ci/licenses_golden/licenses_flutter +++ b/engine/src/flutter/ci/licenses_golden/licenses_flutter @@ -316,6 +316,8 @@ FILE: ../../../flutter/lib/ui/dart_runtime_hooks.h FILE: ../../../flutter/lib/ui/dart_ui.cc FILE: ../../../flutter/lib/ui/dart_ui.h FILE: ../../../flutter/lib/ui/dart_wrapper.h +FILE: ../../../flutter/lib/ui/fixtures/DashInNooglerHat.jpg +FILE: ../../../flutter/lib/ui/fixtures/ui_test.dart FILE: ../../../flutter/lib/ui/geometry.dart FILE: ../../../flutter/lib/ui/hash_codes.dart FILE: ../../../flutter/lib/ui/hooks.dart @@ -342,6 +344,9 @@ FILE: ../../../flutter/lib/ui/painting/gradient.cc FILE: ../../../flutter/lib/ui/painting/gradient.h FILE: ../../../flutter/lib/ui/painting/image.cc FILE: ../../../flutter/lib/ui/painting/image.h +FILE: ../../../flutter/lib/ui/painting/image_decoder.cc +FILE: ../../../flutter/lib/ui/painting/image_decoder.h +FILE: ../../../flutter/lib/ui/painting/image_decoder_unittests.cc FILE: ../../../flutter/lib/ui/painting/image_encoding.cc FILE: ../../../flutter/lib/ui/painting/image_encoding.h FILE: ../../../flutter/lib/ui/painting/image_filter.cc @@ -350,6 +355,8 @@ FILE: ../../../flutter/lib/ui/painting/image_shader.cc FILE: ../../../flutter/lib/ui/painting/image_shader.h FILE: ../../../flutter/lib/ui/painting/matrix.cc FILE: ../../../flutter/lib/ui/painting/matrix.h +FILE: ../../../flutter/lib/ui/painting/multi_frame_codec.cc +FILE: ../../../flutter/lib/ui/painting/multi_frame_codec.h FILE: ../../../flutter/lib/ui/painting/paint.cc FILE: ../../../flutter/lib/ui/painting/paint.h FILE: ../../../flutter/lib/ui/painting/path.cc @@ -364,6 +371,8 @@ FILE: ../../../flutter/lib/ui/painting/rrect.cc FILE: ../../../flutter/lib/ui/painting/rrect.h FILE: ../../../flutter/lib/ui/painting/shader.cc FILE: ../../../flutter/lib/ui/painting/shader.h +FILE: ../../../flutter/lib/ui/painting/single_frame_codec.cc +FILE: ../../../flutter/lib/ui/painting/single_frame_codec.h FILE: ../../../flutter/lib/ui/painting/vertices.cc FILE: ../../../flutter/lib/ui/painting/vertices.h FILE: ../../../flutter/lib/ui/plugins.dart diff --git a/engine/src/flutter/fml/concurrent_message_loop.cc b/engine/src/flutter/fml/concurrent_message_loop.cc index 0c25db2761..482ceb4790 100644 --- a/engine/src/flutter/fml/concurrent_message_loop.cc +++ b/engine/src/flutter/fml/concurrent_message_loop.cc @@ -11,10 +11,14 @@ namespace fml { -ConcurrentMessageLoop::ConcurrentMessageLoop() - : worker_count_(std::max(std::thread::hardware_concurrency(), 1u)), - shutdown_latch_(worker_count_), - shutdown_(false) { +std::shared_ptr ConcurrentMessageLoop::Create( + size_t worker_count) { + return std::shared_ptr{ + new ConcurrentMessageLoop(worker_count)}; +} + +ConcurrentMessageLoop::ConcurrentMessageLoop(size_t worker_count) + : worker_count_(std::max(worker_count, 1ul)) { for (size_t i = 0; i < worker_count_; ++i) { workers_.emplace_back([i, this]() { fml::Thread::SetCurrentThreadName( @@ -26,45 +30,97 @@ ConcurrentMessageLoop::ConcurrentMessageLoop() ConcurrentMessageLoop::~ConcurrentMessageLoop() { Terminate(); - shutdown_latch_.Wait(); for (auto& worker : workers_) { worker.join(); } } -// |fml::MessageLoopImpl| -void ConcurrentMessageLoop::Run() { - FML_CHECK(false); +size_t ConcurrentMessageLoop::GetWorkerCount() const { + return worker_count_; } -// |fml::MessageLoopImpl| -void ConcurrentMessageLoop::Terminate() { - std::scoped_lock lock(wait_condition_mutex_); - shutdown_ = true; - wait_condition_.notify_all(); +std::shared_ptr ConcurrentMessageLoop::GetTaskRunner() { + return std::make_shared(weak_from_this()); } -// |fml::MessageLoopImpl| -void ConcurrentMessageLoop::WakeUp(fml::TimePoint time_point) { - // Assume that the clocks are not the same. - const auto duration = std::chrono::nanoseconds( - (time_point - fml::TimePoint::Now()).ToNanoseconds()); - next_wake_ = std::chrono::high_resolution_clock::now() + duration; - wait_condition_.notify_all(); +void ConcurrentMessageLoop::PostTask(fml::closure task) { + if (!task) { + return; + } + + std::unique_lock lock(tasks_mutex_); + + // Don't just drop tasks on the floor in case of shutdown. + if (shutdown_) { + FML_DLOG(WARNING) + << "Tried to post a task to shutdown concurrent message " + "loop. The task will be executed on the callers thread."; + lock.unlock(); + task(); + return; + } + + tasks_.push(task); + + // Unlock the mutex before notifying the condition variable because that mutex + // has to be acquired on the other thread anyway. Waiting in this scope till + // it is acquired there is a pessimization. + lock.unlock(); + + tasks_condition_.notify_one(); } void ConcurrentMessageLoop::WorkerMain() { - while (!shutdown_) { - std::unique_lock lock(wait_condition_mutex_); - if (!shutdown_) { - wait_condition_.wait(lock); + while (true) { + std::unique_lock lock(tasks_mutex_); + tasks_condition_.wait(lock, + [&]() { return tasks_.size() > 0 || shutdown_; }); + + if (tasks_.size() == 0) { + // This can only be caused by shutdown. + FML_DCHECK(shutdown_); + break; } - TRACE_EVENT0("fml", "ConcurrentWorkerWake"); - RunSingleExpiredTaskNow(); + + auto task = tasks_.front(); + tasks_.pop(); + + // Don't hold onto the mutex while the task is being executed as it could + // itself try to post another tasks to this message loop. + lock.unlock(); + + TRACE_EVENT0("flutter", "ConcurrentWorkerWake"); + // Execute the one tasks we woke up for. + task(); + } +} + +void ConcurrentMessageLoop::Terminate() { + std::scoped_lock lock(tasks_mutex_); + shutdown_ = true; + tasks_condition_.notify_all(); +} + +ConcurrentTaskRunner::ConcurrentTaskRunner( + std::weak_ptr weak_loop) + : weak_loop_(std::move(weak_loop)) {} + +ConcurrentTaskRunner::~ConcurrentTaskRunner() = default; + +void ConcurrentTaskRunner::PostTask(fml::closure task) { + if (!task) { + return; } - RunExpiredTasksNow(); - shutdown_latch_.CountDown(); + if (auto loop = weak_loop_.lock()) { + loop->PostTask(task); + return; + } + + FML_DLOG(WARNING) + << "Tried to post to a concurrent message loop that has already died. " + "Executing the task on the callers thread."; + task(); } } // namespace fml diff --git a/engine/src/flutter/fml/concurrent_message_loop.h b/engine/src/flutter/fml/concurrent_message_loop.h index 7879d05239..0cfd85c90e 100644 --- a/engine/src/flutter/fml/concurrent_message_loop.h +++ b/engine/src/flutter/fml/concurrent_message_loop.h @@ -5,51 +5,67 @@ #ifndef FLUTTER_FML_CONCURRENT_MESSAGE_LOOP_H_ #define FLUTTER_FML_CONCURRENT_MESSAGE_LOOP_H_ -#include -#include #include +#include #include -#include +#include "flutter/fml/closure.h" #include "flutter/fml/macros.h" -#include "flutter/fml/message_loop_impl.h" -#include "flutter/fml/synchronization/count_down_latch.h" #include "flutter/fml/synchronization/thread_annotations.h" namespace fml { -class ConcurrentMessageLoop : public MessageLoopImpl { - private: - const size_t worker_count_; - std::mutex wait_condition_mutex_; - std::condition_variable wait_condition_; - std::vector workers_; - CountDownLatch shutdown_latch_; - std::chrono::high_resolution_clock::time_point next_wake_; - std::atomic_bool shutdown_; +class ConcurrentTaskRunner; - ConcurrentMessageLoop(); +class ConcurrentMessageLoop + : public std::enable_shared_from_this { + public: + static std::shared_ptr Create( + size_t worker_count = std::thread::hardware_concurrency()); ~ConcurrentMessageLoop(); - // |fml::MessageLoopImpl| - void Run() override; + size_t GetWorkerCount() const; - // |fml::MessageLoopImpl| - void Terminate() override; + std::shared_ptr GetTaskRunner(); - // |fml::MessageLoopImpl| - void WakeUp(fml::TimePoint time_point) override; + void Terminate(); - static void WorkerMain(ConcurrentMessageLoop* loop); + private: + friend ConcurrentTaskRunner; + + size_t worker_count_ = 0; + std::vector workers_; + std::mutex tasks_mutex_; + std::condition_variable tasks_condition_; + std::queue tasks_; + bool shutdown_ = false; + + ConcurrentMessageLoop(size_t worker_count); void WorkerMain(); - FML_FRIEND_MAKE_REF_COUNTED(ConcurrentMessageLoop); - FML_FRIEND_REF_COUNTED_THREAD_SAFE(ConcurrentMessageLoop); + void PostTask(fml::closure task); + FML_DISALLOW_COPY_AND_ASSIGN(ConcurrentMessageLoop); }; +class ConcurrentTaskRunner { + public: + ConcurrentTaskRunner(std::weak_ptr weak_loop); + + ~ConcurrentTaskRunner(); + + void PostTask(fml::closure task); + + private: + friend ConcurrentMessageLoop; + + std::weak_ptr weak_loop_; + + FML_DISALLOW_COPY_AND_ASSIGN(ConcurrentTaskRunner); +}; + } // namespace fml #endif // FLUTTER_FML_CONCURRENT_MESSAGE_LOOP_H_ diff --git a/engine/src/flutter/fml/message_loop.cc b/engine/src/flutter/fml/message_loop.cc index bface19f9e..1bf1acd249 100644 --- a/engine/src/flutter/fml/message_loop.cc +++ b/engine/src/flutter/fml/message_loop.cc @@ -6,7 +6,6 @@ #include -#include "flutter/fml/concurrent_message_loop.h" #include "flutter/fml/memory/ref_counted.h" #include "flutter/fml/memory/ref_ptr.h" #include "flutter/fml/message_loop_impl.h" @@ -44,13 +43,6 @@ MessageLoop::MessageLoop() FML_CHECK(task_runner_); } -MessageLoop::MessageLoop(Type) - : loop_(fml::MakeRefCounted()), - task_runner_(fml::MakeRefCounted(loop_)) { - FML_CHECK(loop_); - FML_CHECK(task_runner_); -} - MessageLoop::~MessageLoop() = default; void MessageLoop::Run() { diff --git a/engine/src/flutter/fml/message_loop.h b/engine/src/flutter/fml/message_loop.h index 30db680cb9..961f92bce2 100644 --- a/engine/src/flutter/fml/message_loop.h +++ b/engine/src/flutter/fml/message_loop.h @@ -18,10 +18,6 @@ class MessageLoop { FML_EMBEDDER_ONLY static MessageLoop& GetCurrent(); - enum class Type { kConcurrent }; - - MessageLoop(Type type); - bool IsValid() const; void Run(); diff --git a/engine/src/flutter/fml/message_loop_unittests.cc b/engine/src/flutter/fml/message_loop_unittests.cc index d7c0a9cb92..94585d22ce 100644 --- a/engine/src/flutter/fml/message_loop_unittests.cc +++ b/engine/src/flutter/fml/message_loop_unittests.cc @@ -7,6 +7,7 @@ #include #include +#include "flutter/fml/concurrent_message_loop.h" #include "flutter/fml/message_loop.h" #include "flutter/fml/synchronization/count_down_latch.h" #include "flutter/fml/synchronization/waitable_event.h" @@ -281,19 +282,31 @@ TEST(MessageLoop, TaskObserverFire) { ASSERT_TRUE(terminated); } +TEST(MessageLoop, CanCreateAndShutdownConcurrentMessageLoopsOverAndOver) { + for (size_t i = 0; i < 10; ++i) { + auto loop = fml::ConcurrentMessageLoop::Create(i + 1); + ASSERT_EQ(loop->GetWorkerCount(), i + 1); + } +} + TEST(MessageLoop, CanCreateConcurrentMessageLoop) { - fml::MessageLoop loop(fml::MessageLoop::Type::kConcurrent); - auto task_runner = loop.GetTaskRunner(); + auto loop = fml::ConcurrentMessageLoop::Create(); + auto task_runner = loop->GetTaskRunner(); const size_t kCount = 10; fml::CountDownLatch latch(kCount); + std::mutex thread_ids_mutex; + std::set thread_ids; for (size_t i = 0; i < kCount; ++i) { - task_runner->PostTask([&latch]() { - std::this_thread::sleep_for(std::chrono::milliseconds(5)); + task_runner->PostTask([&]() { + std::this_thread::sleep_for(std::chrono::seconds(1)); std::cout << "Ran on thread: " << std::this_thread::get_id() << std::endl; + std::scoped_lock lock(thread_ids_mutex); + thread_ids.insert(std::this_thread::get_id()); latch.CountDown(); }); } latch.Wait(); + ASSERT_GE(thread_ids.size(), 1u); } TEST(MessageLoop, CanSwapMessageLoopsAndPreserveThreadConfiguration) { diff --git a/engine/src/flutter/fml/trace_event.h b/engine/src/flutter/fml/trace_event.h index 9f86bcfa04..d37b581f33 100644 --- a/engine/src/flutter/fml/trace_event.h +++ b/engine/src/flutter/fml/trace_event.h @@ -244,6 +244,41 @@ class ScopedInstantEnd { FML_DISALLOW_COPY_AND_ASSIGN(ScopedInstantEnd); }; +// A move-only utility object that creates a new flow with a unique ID and +// automatically ends it when it goes out of scope. When tracing using multiple +// overlapping flows, it often gets hard to make sure to end the flow +// (especially with early returns), or, end/step on the wrong flow. This +// leads to corrupted or missing traces in the UI. +class TraceFlow { + public: + TraceFlow(const char* label) : label_(label), nonce_(TraceNonce()) { + TraceEventFlowBegin0("flutter", label_, nonce_); + } + + ~TraceFlow() { End(label_); } + + TraceFlow(TraceFlow&& other) : label_(other.label_), nonce_(other.nonce_) { + other.nonce_ = 0; + } + + void Step(const char* label) const { + TraceEventFlowStep0("flutter", label, nonce_); + } + + void End(const char* label = nullptr) { + if (nonce_ != 0) { + TraceEventFlowEnd0("flutter", label == nullptr ? label_ : label, nonce_); + nonce_ = 0; + } + } + + private: + const char* label_; + size_t nonce_; + + FML_DISALLOW_COPY_AND_ASSIGN(TraceFlow); +}; + } // namespace tracing } // namespace fml diff --git a/engine/src/flutter/lib/ui/BUILD.gn b/engine/src/flutter/lib/ui/BUILD.gn index e7cc9a66bd..06f1aa7869 100644 --- a/engine/src/flutter/lib/ui/BUILD.gn +++ b/engine/src/flutter/lib/ui/BUILD.gn @@ -3,6 +3,7 @@ # found in the LICENSE file. import("//build/fuchsia/sdk.gni") +import("$flutter_root/testing/testing.gni") source_set("ui") { sources = [ @@ -34,6 +35,8 @@ source_set("ui") { "painting/gradient.h", "painting/image.cc", "painting/image.h", + "painting/image_decoder.cc", + "painting/image_decoder.h", "painting/image_encoding.cc", "painting/image_encoding.h", "painting/image_filter.cc", @@ -42,6 +45,8 @@ source_set("ui") { "painting/image_shader.h", "painting/matrix.cc", "painting/matrix.h", + "painting/multi_frame_codec.cc", + "painting/multi_frame_codec.h", "painting/paint.cc", "painting/paint.h", "painting/path.cc", @@ -56,6 +61,8 @@ source_set("ui") { "painting/rrect.h", "painting/shader.cc", "painting/shader.h", + "painting/single_frame_codec.cc", + "painting/single_frame_codec.h", "painting/vertices.cc", "painting/vertices.h", "plugins/callback_cache.cc", @@ -136,3 +143,26 @@ source_set("ui") { } } } + +if (current_toolchain == host_toolchain) { + test_fixtures("ui_unittests_fixtures") { + dart_main = "fixtures/ui_test.dart" + fixtures = [ "fixtures/DashInNooglerHat.jpg" ] + } + + executable("ui_unittests") { + testonly = true + + sources = [ + "painting/image_decoder_unittests.cc", + ] + + deps = [ + ":ui", + ":ui_unittests_fixtures", + "$flutter_root/common", + "$flutter_root/testing:dart", + "$flutter_root/testing:opengl", + ] + } +} diff --git a/engine/src/flutter/lib/ui/fixtures/DashInNooglerHat.jpg b/engine/src/flutter/lib/ui/fixtures/DashInNooglerHat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..488fdb4d5215cad1f7921544b2d9b632583befd9 GIT binary patch literal 354679 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
j%fjKjqyNj$PxwTWwsZ&+QikBjpAkVgw- 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 z%0A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 GetWeakIOManager() const = 0; + virtual fml::WeakPtr GetResourceContext() const = 0; virtual fml::RefPtr GetSkiaUnrefQueue() const = 0; diff --git a/engine/src/flutter/lib/ui/painting/codec.cc b/engine/src/flutter/lib/ui/painting/codec.cc index d8418bd745..b181837e3f 100644 --- a/engine/src/flutter/lib/ui/painting/codec.cc +++ b/engine/src/flutter/lib/ui/painting/codec.cc @@ -4,11 +4,15 @@ #include "flutter/lib/ui/painting/codec.h" +#include + #include "flutter/common/task_runners.h" #include "flutter/fml/logging.h" #include "flutter/fml/make_copyable.h" #include "flutter/fml/trace_event.h" #include "flutter/lib/ui/painting/frame_info.h" +#include "flutter/lib/ui/painting/multi_frame_codec.h" +#include "flutter/lib/ui/painting/single_frame_codec.h" #include "third_party/skia/include/codec/SkCodec.h" #include "third_party/skia/include/core/SkPixelRef.h" #include "third_party/tonic/dart_binding_macros.h" @@ -23,11 +27,6 @@ using tonic::ToDart; namespace flutter { -namespace { - -static constexpr const char* kInitCodecTraceTag = "InitCodec"; -static constexpr const char* kCodecNextFrameTraceTag = "CodecNextFrame"; - // This needs to be kept in sync with _kDoNotResizeDimension in painting.dart const int kDoNotResizeDimension = -1; @@ -37,284 +36,27 @@ enum PixelFormat { kBGRA8888, }; -struct ImageInfo { - SkImageInfo sk_info; - size_t row_bytes; -}; - -static void InvokeCodecCallback(fml::RefPtr codec, - std::unique_ptr callback, - size_t trace_id) { - std::shared_ptr dart_state = callback->dart_state().lock(); - if (!dart_state) { - TRACE_FLOW_END("flutter", kInitCodecTraceTag, trace_id); - return; - } - tonic::DartState::Scope scope(dart_state); - if (!codec) { - DartInvoke(callback->value(), {Dart_Null()}); - } else { - DartInvoke(callback->value(), {ToDart(codec)}); - } - TRACE_FLOW_END("flutter", kInitCodecTraceTag, trace_id); -} - -static sk_sp DecodeImage(fml::WeakPtr context, - sk_sp buffer, - size_t trace_id) { - TRACE_FLOW_STEP("flutter", kInitCodecTraceTag, trace_id); - TRACE_EVENT0("flutter", "DecodeImage"); - - if (buffer == nullptr || buffer->isEmpty()) { - return nullptr; - } - - if (context) { - // This indicates that we do not want a "linear blending" decode. - sk_sp dstColorSpace = nullptr; - return SkImage::MakeCrossContextFromEncoded( - context.get(), std::move(buffer), true, dstColorSpace.get(), true); - } else { - // Defer decoding until time of draw later on the GPU thread. Can happen - // when GL operations are currently forbidden such as in the background - // on iOS. - return SkImage::MakeFromEncoded(std::move(buffer)); - } -} - -// Returns true if the image needs to be resized. -// -// newWidth and newHeight will reflect the dimensions that the image should -// be scaled to. -// -// The targetWidth and targetHeight arguments specify the size of the output -// image, in image pixels. If they are not equal to the intrinsic dimensions of -// the image, then the image will be scaled after being decoded. If exactly one -// of these two arguments is equal to kDoNotResizeDimension, then the aspect -// ratio will be maintained while forcing the image to match the other given -// dimension. If both are equal to kDoNotResizeDimension, then the image -// maintains its real size. -static bool needsResize(const int currentWidth, - const int currentHeight, - const int targetWidth, - const int targetHeight, - int& newWidth, - int& newHeight) { - newWidth = currentWidth; - newHeight = currentHeight; - if (targetWidth == kDoNotResizeDimension && - targetHeight == kDoNotResizeDimension) { - return false; - } - - if (currentWidth == targetWidth && currentHeight == targetHeight) { - return false; - } - - if (targetWidth == kDoNotResizeDimension) { - newHeight = targetHeight; - const double aspectRatio = (double)currentWidth / currentHeight; - newWidth = round(aspectRatio * newHeight); - return true; - } else if (targetHeight == kDoNotResizeDimension) { - newWidth = targetWidth; - const double invAspectRatio = (double)currentHeight / currentWidth; - newHeight = round(invAspectRatio * newWidth); - return true; - } else { - newWidth = targetWidth; - newHeight = targetHeight; - return true; - } -} - -static sk_sp ResizeImageToExactSize(fml::WeakPtr context, - sk_sp image, - SkImageInfo scaledImageInfo) { - if (image == nullptr || !image.get()) { - FML_LOG(ERROR) << "Failed to decode image."; - return nullptr; - } - - SkBitmap bitmap = SkBitmap(); - if (!bitmap.tryAllocPixels(scaledImageInfo)) { - FML_LOG(ERROR) << "Failed to allocate bitmap."; - return nullptr; - } - - if (!image->scalePixels(bitmap.pixmap(), kLow_SkFilterQuality)) { - FML_LOG(ERROR) << "Failed to scale pixels."; - return nullptr; - } - - // This indicates that we do not want a "linear blending" decode. - sk_sp dstColorSpace = nullptr; - GrContext* grContext = context ? context.get() : nullptr; - return SkImage::MakeCrossContextFromPixmap(grContext, bitmap.pixmap(), true, - dstColorSpace.get(), true); -} - -static sk_sp DecodeAndResizeImageToExactSize( - fml::WeakPtr context, - SkImageInfo scaledImageInfo, - sk_sp buffer, - size_t trace_id) { - TRACE_FLOW_STEP("flutter", kInitCodecTraceTag, trace_id); - TRACE_EVENT0("flutter", "DecodeAndResizeImageToExactSize"); - - // Do not create a cross context image here, since it can not be resized. - sk_sp image = SkImage::MakeFromEncoded(std::move(buffer)); - return ResizeImageToExactSize(context, image, scaledImageInfo); -} - -static sk_sp DecodeAndResizeImage(fml::WeakPtr context, - std::unique_ptr& skCodec, - sk_sp buffer, - const int targetWidth, - const int targetHeight, - size_t trace_id) { - const SkImageInfo imageInfo = skCodec->getInfo(); - - const int width = imageInfo.width(); - const int height = imageInfo.height(); - - int newWidth, newHeight; - if (needsResize(width, height, targetWidth, targetHeight, newWidth, - newHeight)) { - return DecodeAndResizeImageToExactSize( - context, imageInfo.makeWH(newWidth, newHeight), buffer, trace_id); - } else { - return DecodeImage(context, buffer, trace_id); - } -} - -fml::RefPtr InitCodec(fml::WeakPtr context, - sk_sp buffer, - fml::RefPtr unref_queue, - const int targetWidth, - const int targetHeight, - size_t trace_id) { - TRACE_FLOW_STEP("flutter", kInitCodecTraceTag, trace_id); - TRACE_EVENT0("blink", "InitCodec"); - - if (buffer == nullptr || buffer->isEmpty()) { - FML_LOG(ERROR) << "InitCodec failed - buffer was empty "; - return nullptr; - } - - std::unique_ptr skCodec = SkCodec::MakeFromData(buffer); - if (!skCodec) { - FML_LOG(ERROR) << "Failed decoding image. Data is either invalid, or it is " - "encoded using an unsupported format."; - return nullptr; - } - if (skCodec->getFrameCount() > 1) { - return fml::MakeRefCounted(std::move(skCodec)); - } - - auto skImage = DecodeAndResizeImage(context, skCodec, buffer, targetWidth, - targetHeight, trace_id); - FML_DCHECK(skImage) << "Unable to resize the image to (w, h): " << targetWidth - << ", " << targetHeight << "."; - if (!skImage) { - return nullptr; - } - auto image = CanvasImage::Create(); - image->set_image({skImage, unref_queue}); - auto frameInfo = fml::MakeRefCounted(std::move(image), 0); - return fml::MakeRefCounted(std::move(frameInfo)); -} - -fml::RefPtr InitCodecUncompressed( - fml::WeakPtr context, - sk_sp buffer, - ImageInfo image_info, - fml::RefPtr unref_queue, - int targetWidth, - int targetHeight, - size_t trace_id) { - TRACE_FLOW_STEP("flutter", kInitCodecTraceTag, trace_id); - TRACE_EVENT0("blink", "InitCodecUncompressed"); - - if (buffer == nullptr || buffer->isEmpty()) { - FML_LOG(ERROR) << "InitCodecUncompressed failed - buffer was empty"; - return nullptr; - } - - sk_sp skImage; - int newWidth, newHeight; - if (needsResize(image_info.sk_info.width(), image_info.sk_info.height(), - targetWidth, targetHeight, newWidth, newHeight)) { - auto imageToResize = SkImage::MakeRasterData( - image_info.sk_info, std::move(buffer), image_info.row_bytes); - skImage = ResizeImageToExactSize( - context, imageToResize, image_info.sk_info.makeWH(newWidth, newHeight)); - } else if (context) { - SkPixmap pixmap(image_info.sk_info, buffer->data(), image_info.row_bytes); - skImage = SkImage::MakeCrossContextFromPixmap(context.get(), pixmap, true, - nullptr, true); - } else { - skImage = SkImage::MakeRasterData(image_info.sk_info, std::move(buffer), - image_info.row_bytes); - } - - auto image = CanvasImage::Create(); - image->set_image({skImage, unref_queue}); - auto frameInfo = fml::MakeRefCounted(std::move(image), 0); - return fml::MakeRefCounted(std::move(frameInfo)); -} - -void InitCodecAndInvokeCodecCallback( - fml::RefPtr ui_task_runner, - fml::WeakPtr context, - fml::RefPtr unref_queue, - std::unique_ptr callback, - sk_sp buffer, - std::unique_ptr image_info, - const int targetWidth, - const int targetHeight, - size_t trace_id) { - fml::RefPtr codec; - if (image_info) { - codec = InitCodecUncompressed(context, std::move(buffer), *image_info, - std::move(unref_queue), targetWidth, - targetHeight, trace_id); - } else { - codec = InitCodec(context, std::move(buffer), std::move(unref_queue), - targetWidth, targetHeight, trace_id); - } - ui_task_runner->PostTask( - fml::MakeCopyable([callback = std::move(callback), - codec = std::move(codec), trace_id]() mutable { - InvokeCodecCallback(std::move(codec), std::move(callback), trace_id); - })); -} - -bool ConvertImageInfo(Dart_Handle image_info_handle, - Dart_NativeArguments args, - ImageInfo* image_info) { +static std::variant ConvertImageInfo( + Dart_Handle image_info_handle, + Dart_NativeArguments args) { Dart_Handle width_handle = Dart_GetField(image_info_handle, ToDart("width")); if (!Dart_IsInteger(width_handle)) { - Dart_SetReturnValue(args, ToDart("ImageInfo.width must be an integer")); - return false; + return "ImageInfo.width must be an integer"; } Dart_Handle height_handle = Dart_GetField(image_info_handle, ToDart("height")); if (!Dart_IsInteger(height_handle)) { - Dart_SetReturnValue(args, ToDart("ImageInfo.height must be an integer")); - return false; + return "ImageInfo.height must be an integer"; } Dart_Handle format_handle = Dart_GetField(image_info_handle, ToDart("format")); if (!Dart_IsInteger(format_handle)) { - Dart_SetReturnValue(args, ToDart("ImageInfo.format must be an integer")); - return false; + return "ImageInfo.format must be an integer"; } Dart_Handle row_bytes_handle = Dart_GetField(image_info_handle, ToDart("rowBytes")); if (!Dart_IsInteger(row_bytes_handle)) { - Dart_SetReturnValue(args, ToDart("ImageInfo.rowBytes must be an integer")); - return false; + return "ImageInfo.rowBytes must be an integer"; } PixelFormat pixel_format = static_cast( @@ -329,70 +71,71 @@ bool ConvertImageInfo(Dart_Handle image_info_handle, break; } if (color_type == kUnknown_SkColorType) { - Dart_SetReturnValue(args, ToDart("Invalid pixel format")); - return false; + return "Invalid pixel format"; } int width = tonic::DartConverter::FromDart(width_handle); if (width <= 0) { - Dart_SetReturnValue(args, ToDart("width must be greater than zero")); - return false; + return "width must be greater than zero"; } int height = tonic::DartConverter::FromDart(height_handle); if (height <= 0) { - Dart_SetReturnValue(args, ToDart("height must be greater than zero")); - return false; + return "height must be greater than zero"; } - image_info->sk_info = + + ImageDecoder::ImageInfo image_info; + image_info.sk_info = SkImageInfo::Make(width, height, color_type, kPremul_SkAlphaType); - image_info->row_bytes = + image_info.row_bytes = tonic::DartConverter::FromDart(row_bytes_handle); - if (image_info->row_bytes < image_info->sk_info.minRowBytes()) { - Dart_SetReturnValue( - args, ToDart("rowBytes does not match the width of the image")); - return false; + if (image_info.row_bytes < image_info.sk_info.minRowBytes()) { + return "rowBytes does not match the width of the image"; } - return true; + return image_info; } -void InstantiateImageCodec(Dart_NativeArguments args) { - static size_t trace_counter = 1; - const size_t trace_id = trace_counter++; - TRACE_FLOW_BEGIN("flutter", kInitCodecTraceTag, trace_id); - +static void InstantiateImageCodec(Dart_NativeArguments args) { Dart_Handle callback_handle = Dart_GetNativeArgument(args, 1); if (!Dart_IsClosure(callback_handle)) { - TRACE_FLOW_END("flutter", kInitCodecTraceTag, trace_id); - Dart_SetReturnValue(args, ToDart("Callback must be a function")); + Dart_SetReturnValue(args, tonic::ToDart("Callback must be a function")); return; } Dart_Handle image_info_handle = Dart_GetNativeArgument(args, 2); - std::unique_ptr image_info; + + std::optional image_info; + if (!Dart_IsNull(image_info_handle)) { - image_info = std::make_unique(); - if (!ConvertImageInfo(image_info_handle, args, image_info.get())) { - TRACE_FLOW_END("flutter", kInitCodecTraceTag, trace_id); + auto image_info_results = ConvertImageInfo(image_info_handle, args); + if (auto value = + std::get_if(&image_info_results)) { + image_info = *value; + } else if (auto error = std::get_if(&image_info_results)) { + Dart_SetReturnValue(args, tonic::ToDart(*error)); return; } } - Dart_Handle exception = nullptr; - tonic::Uint8List list = - tonic::DartConverter::FromArguments(args, 0, exception); - if (exception) { - TRACE_FLOW_END("flutter", kInitCodecTraceTag, trace_id); - Dart_SetReturnValue(args, exception); - return; + sk_sp buffer; + + { + Dart_Handle exception = nullptr; + tonic::Uint8List list = + tonic::DartConverter::FromArguments(args, 0, + exception); + if (exception) { + Dart_SetReturnValue(args, exception); + return; + } + buffer = SkData::MakeWithCopy(list.data(), list.num_elements()); } if (image_info) { - int expected_size = image_info->row_bytes * image_info->sk_info.height(); - if (list.num_elements() < expected_size) { - TRACE_FLOW_END("flutter", kInitCodecTraceTag, trace_id); - list.Release(); + const auto expected_size = + image_info->row_bytes * image_info->sk_info.height(); + if (buffer->size() < expected_size) { Dart_SetReturnValue( args, ToDart("Pixel buffer size does not match image size")); return; @@ -404,73 +147,34 @@ void InstantiateImageCodec(Dart_NativeArguments args) { const int targetHeight = tonic::DartConverter::FromDart(Dart_GetNativeArgument(args, 4)); - auto buffer = SkData::MakeWithCopy(list.data(), list.num_elements()); + auto codec = SkCodec::MakeFromData(buffer); - auto* dart_state = UIDartState::Current(); - - const auto& task_runners = dart_state->GetTaskRunners(); - task_runners.GetIOTaskRunner()->PostTask(fml::MakeCopyable( - [callback = std::make_unique( - tonic::DartState::Current(), callback_handle), - buffer = std::move(buffer), trace_id, image_info = std::move(image_info), - ui_task_runner = task_runners.GetUITaskRunner(), - context = dart_state->GetResourceContext(), - queue = UIDartState::Current()->GetSkiaUnrefQueue(), targetWidth, - targetHeight]() mutable { - InitCodecAndInvokeCodecCallback( - std::move(ui_task_runner), context, std::move(queue), - std::move(callback), std::move(buffer), std::move(image_info), - targetWidth, targetHeight, trace_id); - })); -} - -bool copy_to(SkBitmap* dst, SkColorType dstColorType, const SkBitmap& src) { - SkPixmap srcPM; - if (!src.peekPixels(&srcPM)) { - return false; - } - - SkBitmap tmpDst; - SkImageInfo dstInfo = srcPM.info().makeColorType(dstColorType); - if (!tmpDst.setInfo(dstInfo)) { - return false; - } - - if (!tmpDst.tryAllocPixels()) { - return false; - } - - SkPixmap dstPM; - if (!tmpDst.peekPixels(&dstPM)) { - return false; - } - - if (!srcPM.readPixels(dstPM)) { - return false; - } - - dst->swap(tmpDst); - return true; -} - -void InvokeNextFrameCallback(fml::RefPtr frameInfo, - std::unique_ptr callback, - size_t trace_id) { - std::shared_ptr dart_state = callback->dart_state().lock(); - if (!dart_state) { - TRACE_FLOW_END("flutter", kCodecNextFrameTraceTag, trace_id); + if (!codec) { + Dart_SetReturnValue(args, ToDart("Could not instantiate image codec.")); return; } - tonic::DartState::Scope scope(dart_state); - if (!frameInfo) { - DartInvoke(callback->value(), {Dart_Null()}); - } else { - DartInvoke(callback->value(), {ToDart(frameInfo)}); - } - TRACE_FLOW_END("flutter", kCodecNextFrameTraceTag, trace_id); -} -} // namespace + fml::RefPtr ui_codec; + + if (codec->getFrameCount() == 1) { + ImageDecoder::ImageDescriptor descriptor; + descriptor.decompressed_image_info = image_info; + + if (targetWidth != kDoNotResizeDimension) { + descriptor.target_width = targetWidth; + } + if (targetHeight != kDoNotResizeDimension) { + descriptor.target_height = targetHeight; + } + descriptor.data = std::move(buffer); + + ui_codec = fml::MakeRefCounted(std::move(descriptor)); + } else { + ui_codec = fml::MakeRefCounted(std::move(codec)); + } + + tonic::DartInvoke(callback_handle, {ToDart(ui_codec)}); +} IMPLEMENT_WRAPPERTYPEINFO(ui, Codec); @@ -486,166 +190,6 @@ void Codec::dispose() { ClearDartWrapper(); } -MultiFrameCodec::MultiFrameCodec(std::unique_ptr codec) - : codec_(std::move(codec)), - frameCount_(codec_->getFrameCount()), - repetitionCount_(codec_->getRepetitionCount()), - nextFrameIndex_(0) {} - -MultiFrameCodec::~MultiFrameCodec() {} - -int MultiFrameCodec::frameCount() const { - return frameCount_; -} - -int MultiFrameCodec::repetitionCount() const { - return repetitionCount_; -} - -sk_sp MultiFrameCodec::GetNextFrameImage( - fml::WeakPtr resourceContext) { - SkBitmap bitmap = SkBitmap(); - SkImageInfo info = codec_->getInfo().makeColorType(kN32_SkColorType); - if (info.alphaType() == kUnpremul_SkAlphaType) { - info = info.makeAlphaType(kPremul_SkAlphaType); - } - bitmap.allocPixels(info); - - SkCodec::Options options; - options.fFrameIndex = nextFrameIndex_; - SkCodec::FrameInfo frameInfo; - codec_->getFrameInfo(nextFrameIndex_, &frameInfo); - const int requiredFrameIndex = frameInfo.fRequiredFrame; - if (requiredFrameIndex != SkCodec::kNoFrame) { - if (lastRequiredFrame_ == nullptr) { - FML_LOG(ERROR) << "Frame " << nextFrameIndex_ << " depends on frame " - << requiredFrameIndex - << " and no required frames are cached."; - return NULL; - } else if (lastRequiredFrameIndex_ != requiredFrameIndex) { - FML_DLOG(INFO) << "Required frame " << requiredFrameIndex - << " is not cached. Using " << lastRequiredFrameIndex_ - << " instead"; - } - - if (lastRequiredFrame_->getPixels() && - copy_to(&bitmap, lastRequiredFrame_->colorType(), - *lastRequiredFrame_)) { - options.fPriorFrame = requiredFrameIndex; - } - } - - if (SkCodec::kSuccess != codec_->getPixels(info, bitmap.getPixels(), - bitmap.rowBytes(), &options)) { - FML_LOG(ERROR) << "Could not getPixels for frame " << nextFrameIndex_; - return NULL; - } - - // Hold onto this if we need it to decode future frames. - if (frameInfo.fDisposalMethod == SkCodecAnimation::DisposalMethod::kKeep) { - lastRequiredFrame_ = std::make_unique(bitmap); - lastRequiredFrameIndex_ = nextFrameIndex_; - } - - if (resourceContext) { - SkPixmap pixmap(bitmap.info(), bitmap.pixelRef()->pixels(), - bitmap.pixelRef()->rowBytes()); - // This indicates that we do not want a "linear blending" decode. - sk_sp dstColorSpace = nullptr; - return SkImage::MakeCrossContextFromPixmap(resourceContext.get(), pixmap, - true, dstColorSpace.get()); - } else { - // Defer decoding until time of draw later on the GPU thread. Can happen - // when GL operations are currently forbidden such as in the background - // on iOS. - return SkImage::MakeFromBitmap(bitmap); - } -} - -void MultiFrameCodec::GetNextFrameAndInvokeCallback( - std::unique_ptr callback, - fml::RefPtr ui_task_runner, - fml::WeakPtr resourceContext, - fml::RefPtr unref_queue, - size_t trace_id) { - fml::RefPtr frameInfo = NULL; - sk_sp skImage = GetNextFrameImage(resourceContext); - if (skImage) { - fml::RefPtr image = CanvasImage::Create(); - image->set_image({skImage, std::move(unref_queue)}); - SkCodec::FrameInfo skFrameInfo; - codec_->getFrameInfo(nextFrameIndex_, &skFrameInfo); - frameInfo = - fml::MakeRefCounted(std::move(image), skFrameInfo.fDuration); - } - nextFrameIndex_ = (nextFrameIndex_ + 1) % frameCount_; - - ui_task_runner->PostTask(fml::MakeCopyable( - [callback = std::move(callback), frameInfo, trace_id]() mutable { - InvokeNextFrameCallback(frameInfo, std::move(callback), trace_id); - })); - - TRACE_FLOW_END("flutter", kCodecNextFrameTraceTag, trace_id); -} - -Dart_Handle MultiFrameCodec::getNextFrame(Dart_Handle callback_handle) { - static size_t trace_counter = 1; - const size_t trace_id = trace_counter++; - TRACE_FLOW_BEGIN("flutter", kCodecNextFrameTraceTag, trace_id); - - if (!Dart_IsClosure(callback_handle)) { - TRACE_FLOW_END("flutter", kCodecNextFrameTraceTag, trace_id); - return ToDart("Callback must be a function"); - } - - auto* dart_state = UIDartState::Current(); - - const auto& task_runners = dart_state->GetTaskRunners(); - - task_runners.GetIOTaskRunner()->PostTask(fml::MakeCopyable( - [callback = std::make_unique( - tonic::DartState::Current(), callback_handle), - this, trace_id, ui_task_runner = task_runners.GetUITaskRunner(), - queue = UIDartState::Current()->GetSkiaUnrefQueue(), - context = dart_state->GetResourceContext()]() mutable { - GetNextFrameAndInvokeCallback(std::move(callback), - std::move(ui_task_runner), context, - std::move(queue), trace_id); - })); - - return Dart_Null(); -} - -SingleFrameCodec::SingleFrameCodec(fml::RefPtr frame) - : frame_(std::move(frame)) {} - -SingleFrameCodec::~SingleFrameCodec() {} - -int SingleFrameCodec::frameCount() const { - return 1; -} - -int SingleFrameCodec::repetitionCount() const { - return 0; -} - -Dart_Handle SingleFrameCodec::getNextFrame(Dart_Handle callback_handle) { - if (!Dart_IsClosure(callback_handle)) { - return ToDart("Callback must be a function"); - } - - auto callback = std::make_unique( - tonic::DartState::Current(), callback_handle); - std::shared_ptr dart_state = callback->dart_state().lock(); - if (!dart_state) { - return ToDart("Invalid dart state"); - } - - tonic::DartState::Scope scope(dart_state); - DartInvoke(callback->value(), {ToDart(frame_)}); - return Dart_Null(); -} - void Codec::RegisterNatives(tonic::DartLibraryNatives* natives) { natives->Register({ {"instantiateImageCodec", InstantiateImageCodec, 5, true}, diff --git a/engine/src/flutter/lib/ui/painting/codec.h b/engine/src/flutter/lib/ui/painting/codec.h index 776e97cc58..2e0c746eac 100644 --- a/engine/src/flutter/lib/ui/painting/codec.h +++ b/engine/src/flutter/lib/ui/painting/codec.h @@ -27,63 +27,16 @@ class Codec : public RefCountedDartWrappable { public: virtual int frameCount() const = 0; + virtual int repetitionCount() const = 0; + virtual Dart_Handle getNextFrame(Dart_Handle callback_handle) = 0; + void dispose(); static void RegisterNatives(tonic::DartLibraryNatives* natives); }; -class MultiFrameCodec : public Codec { - public: - int frameCount() const override; - int repetitionCount() const override; - Dart_Handle getNextFrame(Dart_Handle args) override; - - private: - MultiFrameCodec(std::unique_ptr codec); - - ~MultiFrameCodec() override; - - sk_sp GetNextFrameImage(fml::WeakPtr resourceContext); - - void GetNextFrameAndInvokeCallback( - std::unique_ptr callback, - fml::RefPtr ui_task_runner, - fml::WeakPtr resourceContext, - fml::RefPtr unref_queue, - size_t trace_id); - - const std::unique_ptr codec_; - const int frameCount_; - const int repetitionCount_; - int nextFrameIndex_; - - // The last decoded frame that's required to decode any subsequent frames. - std::unique_ptr lastRequiredFrame_; - // The index of the last decoded required frame. - int lastRequiredFrameIndex_ = -1; - - FML_FRIEND_MAKE_REF_COUNTED(MultiFrameCodec); - FML_FRIEND_REF_COUNTED_THREAD_SAFE(MultiFrameCodec); -}; - -class SingleFrameCodec : public Codec { - public: - int frameCount() const override; - int repetitionCount() const override; - Dart_Handle getNextFrame(Dart_Handle args) override; - - private: - SingleFrameCodec(fml::RefPtr frame); - ~SingleFrameCodec() override; - - fml::RefPtr frame_; - - FML_FRIEND_MAKE_REF_COUNTED(SingleFrameCodec); - FML_FRIEND_REF_COUNTED_THREAD_SAFE(SingleFrameCodec); -}; - } // namespace flutter #endif // FLUTTER_LIB_UI_PAINTING_CODEC_H_ diff --git a/engine/src/flutter/lib/ui/painting/frame_info.h b/engine/src/flutter/lib/ui/painting/frame_info.h index 2637d3e66d..184b132d17 100644 --- a/engine/src/flutter/lib/ui/painting/frame_info.h +++ b/engine/src/flutter/lib/ui/painting/frame_info.h @@ -8,10 +8,6 @@ #include "flutter/lib/ui/dart_wrapper.h" #include "flutter/lib/ui/painting/image.h" -namespace tonic { -class DartLibraryNatives; -} // namespace tonic - namespace flutter { // A single animation frame. diff --git a/engine/src/flutter/lib/ui/painting/image.cc b/engine/src/flutter/lib/ui/painting/image.cc index a0a4bfcb02..8ee6579092 100644 --- a/engine/src/flutter/lib/ui/painting/image.cc +++ b/engine/src/flutter/lib/ui/painting/image.cc @@ -42,7 +42,10 @@ void CanvasImage::dispose() { size_t CanvasImage::GetAllocationSize() { if (auto image = image_.get()) { - return image->width() * image->height() * 4; + const auto& info = image->imageInfo(); + const auto kMipmapOverhead = 4.0 / 3.0; + const size_t image_byte_size = info.computeMinByteSize() * kMipmapOverhead; + return image_byte_size + sizeof(this); } else { return sizeof(CanvasImage); } diff --git a/engine/src/flutter/lib/ui/painting/image_decoder.cc b/engine/src/flutter/lib/ui/painting/image_decoder.cc new file mode 100644 index 0000000000..200349eb4b --- /dev/null +++ b/engine/src/flutter/lib/ui/painting/image_decoder.cc @@ -0,0 +1,336 @@ +// 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/ui/painting/image_decoder.h" + +#include "flutter/fml/make_copyable.h" +#include "flutter/fml/trace_event.h" +#include "third_party/skia/include/codec/SkCodec.h" + +namespace flutter { + +ImageDecoder::ImageDecoder( + TaskRunners runners, + std::shared_ptr concurrent_task_runner, + fml::WeakPtr io_manager) + : runners_(std::move(runners)), + concurrent_task_runner_(std::move(concurrent_task_runner)), + io_manager_(std::move(io_manager)), + weak_factory_(this) { + FML_DCHECK(runners_.IsValid()); + FML_DCHECK(runners_.GetUITaskRunner()->RunsTasksOnCurrentThread()) + << "The image decoder must be created & collected on the UI thread."; +} + +ImageDecoder::~ImageDecoder() = default; + +// Get the updated dimensions of the image. If both dimensions are specified, +// use them. If one of them is specified, respect the one that is and use the +// aspect ratio to calculate the other. If neither dimension is specified, use +// intrinsic dimensions of the image. +static SkISize GetResizedDimensions(SkISize current_size, + std::optional target_width, + std::optional target_height) { + if (current_size.isEmpty()) { + return SkISize::MakeEmpty(); + } + + if (target_width && target_height) { + return SkISize::Make(target_width.value(), target_height.value()); + } + + const auto aspect_ratio = + static_cast(current_size.width()) / current_size.height(); + + if (target_width) { + return SkISize::Make(target_width.value(), + target_width.value() / aspect_ratio); + } + + if (target_height) { + return SkISize::Make(target_height.value() * aspect_ratio, + target_height.value()); + } + + return current_size; +} + +static sk_sp ResizeRasterImage(sk_sp image, + std::optional target_width, + std::optional target_height, + const fml::tracing::TraceFlow& flow) { + FML_DCHECK(!image->isTextureBacked()); + + const auto resized_dimensions = + GetResizedDimensions(image->dimensions(), target_width, target_height); + + if (resized_dimensions.isEmpty()) { + FML_LOG(ERROR) << "Could not resize to empty dimensions."; + return nullptr; + } + + if (resized_dimensions == image->dimensions()) { + // The resized dimesions are the same as the intrinsic dimensions of the + // image. There is nothing to do. + return image; + } + + TRACE_EVENT0("flutter", __FUNCTION__); + flow.Step(__FUNCTION__); + + const auto scaled_image_info = image->imageInfo().makeWH( + resized_dimensions.width(), resized_dimensions.height()); + + SkBitmap scaled_bitmap; + if (!scaled_bitmap.tryAllocPixels(scaled_image_info)) { + FML_LOG(ERROR) << "Could not allocate bitmap when attempting to scale."; + return nullptr; + } + + if (!image->scalePixels(scaled_bitmap.pixmap(), kLow_SkFilterQuality, + SkImage::kDisallow_CachingHint)) { + FML_LOG(ERROR) << "Could not scale pixels"; + return nullptr; + } + + // Marking this as immutable makes the MakeFromBitmap call share the pixels + // instead of copying. + scaled_bitmap.setImmutable(); + + auto scaled_image = SkImage::MakeFromBitmap(scaled_bitmap); + if (!scaled_image) { + FML_LOG(ERROR) << "Could not create a scaled image from a scaled bitmap."; + return nullptr; + } + + return scaled_image; +} + +static sk_sp ImageFromDecompressedData( + sk_sp data, + ImageDecoder::ImageInfo info, + std::optional target_width, + std::optional target_height, + const fml::tracing::TraceFlow& flow) { + TRACE_EVENT0("flutter", __FUNCTION__); + flow.Step(__FUNCTION__); + auto image = SkImage::MakeRasterData(info.sk_info, data, info.row_bytes); + + if (!image) { + FML_LOG(ERROR) << "Could not create image from decompressed bytes."; + return nullptr; + } + + return ResizeRasterImage(std::move(image), target_width, target_height, flow); +} + +static sk_sp ImageFromCompressedData( + sk_sp data, + std::optional target_width, + std::optional target_height, + const fml::tracing::TraceFlow& flow) { + TRACE_EVENT0("flutter", __FUNCTION__); + flow.Step(__FUNCTION__); + + auto codec = SkCodec::MakeFromData(data); + + if (!codec) { + return nullptr; + } + + const auto encoded_info = codec->getInfo(); + + if (encoded_info.dimensions().isEmpty()) { + return nullptr; + } + + const double desired_width = + target_width.value_or(encoded_info.dimensions().width()); + const double desired_height = + target_height.value_or(encoded_info.dimensions().height()); + + const auto scale_x = desired_width / encoded_info.dimensions().width(); + const auto scale_y = desired_height / encoded_info.dimensions().height(); + + const double scale = std::min({scale_x, scale_y, 1.0}); + + if (scale <= 0.0) { + return nullptr; + } + + // We ask the codec for one of the natively supported dimensions. This may not + // be exactly what we need, but it will also be smaller than 1:1. We will + // still have to perform a resize, but from a smaller intermediate buffer. In + // case no resize needs to be performed, ResizeRasterImage will just return + // the original image. + const auto scaled_dimensions = codec->getScaledDimensions(scale); + + if (scaled_dimensions.isEmpty()) { + return nullptr; + } + + const auto decoded_info = encoded_info.makeWH(scaled_dimensions.width(), + scaled_dimensions.height()); + + SkBitmap decoded_bitmap; + if (!decoded_bitmap.tryAllocPixels(decoded_info)) { + FML_LOG(ERROR) << "Could not perform allocation for image decoding."; + return nullptr; + } + + const auto decompression_result = codec->getPixels(decoded_bitmap.pixmap()); + if (decompression_result != SkCodec::Result::kSuccess) { + FML_LOG(ERROR) << "Could not perform image decompression. Error: " + << SkCodec::ResultToString(decompression_result); + return nullptr; + } + + decoded_bitmap.setImmutable(); + + auto decoded_image = SkImage::MakeFromBitmap(decoded_bitmap); + + if (!decoded_image) { + return nullptr; + } + + return ResizeRasterImage(decoded_image, target_width, target_height, flow); +} + +static SkiaGPUObject UploadRasterImage( + sk_sp image, + fml::WeakPtr context, + fml::RefPtr queue, + const fml::tracing::TraceFlow& flow) { + TRACE_EVENT0("flutter", __FUNCTION__); + flow.Step(__FUNCTION__); + + // Should not already be a texture image because that is the entire point of + // the this method. + FML_DCHECK(!image->isTextureBacked()); + + if (!context || !queue) { + FML_LOG(ERROR) + << "Could not acquire context of release queue for texture upload."; + return {}; + } + + SkPixmap pixmap; + if (!image->peekPixels(&pixmap)) { + FML_LOG(ERROR) << "Could not peek pixels of image for texture upload."; + return {}; + } + + auto texture_image = + SkImage::MakeCrossContextFromPixmap(context.get(), // context + pixmap, // pixmap + true, // buildMips, + nullptr, // dstColorSpace, + true // limitToMaxTextureSize + ); + + if (!texture_image) { + FML_LOG(ERROR) << "Could not make x-context image."; + return {}; + } + + return {texture_image, queue}; +} + +void ImageDecoder::Decode(ImageDescriptor descriptor, ImageResult callback) { + TRACE_EVENT0("flutter", __FUNCTION__); + fml::tracing::TraceFlow flow(__FUNCTION__); + + FML_DCHECK(callback); + FML_DCHECK(runners_.GetUITaskRunner()->RunsTasksOnCurrentThread()); + + // Always service the callback on the UI thread. + auto result = [callback, ui_runner = runners_.GetUITaskRunner()]( + SkiaGPUObject image, + fml::tracing::TraceFlow flow) { + ui_runner->PostTask(fml::MakeCopyable( + [callback, image = std::move(image), flow = std::move(flow)]() mutable { + // We are going to terminate the trace flow here. Flows cannot + // terminate without a base trace. Add one explicitly. + TRACE_EVENT0("flutter", "ImageDecodeCallback"); + flow.End(); + callback(std::move(image)); + })); + }; + + if (!descriptor.data || descriptor.data->size() == 0) { + result({}, std::move(flow)); + return; + } + + concurrent_task_runner_->PostTask( + fml::MakeCopyable([descriptor, // + io_manager = io_manager_, // + io_runner = runners_.GetIOTaskRunner(), // + result, // + flow = std::move(flow) // + ]() mutable { + // Step 1: Decompress the image. + // On Worker. + + auto decompressed = + descriptor.decompressed_image_info + ? ImageFromDecompressedData( + std::move(descriptor.data), // + descriptor.decompressed_image_info.value(), // + descriptor.target_width, // + descriptor.target_height, // + flow // + ) + : ImageFromCompressedData(std::move(descriptor.data), // + descriptor.target_width, // + descriptor.target_height, // + flow); + + if (!decompressed) { + FML_LOG(ERROR) << "Could not decompress image."; + result({}, std::move(flow)); + return; + } + + // Step 2: Update the image to the GPU. + // On IO Thread. + + io_runner->PostTask(fml::MakeCopyable([io_manager, decompressed, result, + flow = + std::move(flow)]() mutable { + if (!io_manager) { + FML_LOG(ERROR) << "Could not acquire IO manager."; + return result({}, std::move(flow)); + } + + // If the IO manager does not have a resource context, the caller + // might not have set one or a software backend could be in use. + // Either way, just return the image as-is. + if (!io_manager->GetResourceContext()) { + result({std::move(decompressed), io_manager->GetSkiaUnrefQueue()}, + std::move(flow)); + return; + } + + auto uploaded = UploadRasterImage( + std::move(decompressed), io_manager->GetResourceContext(), + io_manager->GetSkiaUnrefQueue(), flow); + + if (!uploaded.get()) { + FML_LOG(ERROR) << "Could not upload image to the GPU."; + result({}, std::move(flow)); + return; + } + + // Finally, all done. + result(std::move(uploaded), std::move(flow)); + })); + })); +} + +fml::WeakPtr ImageDecoder::GetWeakPtr() const { + return weak_factory_.GetWeakPtr(); +} + +} // namespace flutter diff --git a/engine/src/flutter/lib/ui/painting/image_decoder.h b/engine/src/flutter/lib/ui/painting/image_decoder.h new file mode 100644 index 0000000000..202dff569e --- /dev/null +++ b/engine/src/flutter/lib/ui/painting/image_decoder.h @@ -0,0 +1,73 @@ +// 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. + +#ifndef FLUTTER_LIB_UI_PAINTING_IMAGE_DECODER_H_ +#define FLUTTER_LIB_UI_PAINTING_IMAGE_DECODER_H_ + +#include +#include + +#include "flutter/common/task_runners.h" +#include "flutter/flow/skia_gpu_object.h" +#include "flutter/fml/concurrent_message_loop.h" +#include "flutter/fml/macros.h" +#include "flutter/fml/mapping.h" +#include "flutter/lib/ui/io_manager.h" +#include "third_party/skia/include/core/SkData.h" +#include "third_party/skia/include/core/SkImage.h" +#include "third_party/skia/include/core/SkImageInfo.h" +#include "third_party/skia/include/core/SkRefCnt.h" +#include "third_party/skia/include/core/SkSize.h" + +namespace flutter { + +// An object that coordinates image decompression and texture upload across +// multiple threads/components in the shell. This object must be created, +// accessed and collected on the UI thread (typically the engine or its runtime +// controller). None of the expensive operations performed by this component +// occur in a frame pipeline. +class ImageDecoder { + public: + ImageDecoder( + TaskRunners runners, + std::shared_ptr concurrent_task_runner, + fml::WeakPtr io_manager); + + ~ImageDecoder(); + + struct ImageInfo { + SkImageInfo sk_info = {}; + size_t row_bytes = 0; + }; + + struct ImageDescriptor { + sk_sp data; + std::optional decompressed_image_info; + std::optional target_width; + std::optional target_height; + }; + + using ImageResult = std::function)>; + + // Takes an image descriptor and returns a handle to a texture resident on the + // GPU. All image decompression and resizes are done on a worker thread + // concurrently. Texture upload is done on the IO thread and the result + // returned back on the UI thread. On error, the texture is null but the + // callback is guaranteed to return on the UI thread. + void Decode(ImageDescriptor descriptor, ImageResult result); + + fml::WeakPtr GetWeakPtr() const; + + private: + TaskRunners runners_; + std::shared_ptr concurrent_task_runner_; + fml::WeakPtr io_manager_; + fml::WeakPtrFactory weak_factory_; + + FML_DISALLOW_COPY_AND_ASSIGN(ImageDecoder); +}; + +} // namespace flutter + +#endif // FLUTTER_LIB_UI_PAINTING_IMAGE_DECODER_H_ diff --git a/engine/src/flutter/lib/ui/painting/image_decoder_unittests.cc b/engine/src/flutter/lib/ui/painting/image_decoder_unittests.cc new file mode 100644 index 0000000000..7fb08ff50e --- /dev/null +++ b/engine/src/flutter/lib/ui/painting/image_decoder_unittests.cc @@ -0,0 +1,390 @@ +// 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/common/task_runners.h" +#include "flutter/fml/mapping.h" +#include "flutter/fml/synchronization/waitable_event.h" +#include "flutter/lib/ui/painting/image_decoder.h" +#include "flutter/testing/test_gl_surface.h" +#include "flutter/testing/testing.h" +#include "flutter/testing/thread_test.h" + +namespace flutter { +namespace testing { + +using ImageDecoderFixtureTest = ThreadTest; + +class TestIOManager final : public IOManager { + public: + TestIOManager(fml::RefPtr task_runner, + bool has_gpu_context = true) + : gl_context_(has_gpu_context ? gl_surface_.CreateContext() : nullptr), + weak_gl_context_factory_( + has_gpu_context ? std::make_unique>( + gl_context_.get()) + : nullptr), + unref_queue_(fml::MakeRefCounted( + task_runner, + fml::TimeDelta::FromNanoseconds(0))), + runner_(task_runner), + weak_factory_(this) { + FML_CHECK(task_runner->RunsTasksOnCurrentThread()) + << "The IO manager must be initialized its primary task runner. The " + "test harness may not be setup correctly/safely."; + weak_prototype_ = weak_factory_.GetWeakPtr(); + } + + ~TestIOManager() override { + fml::AutoResetWaitableEvent latch; + fml::TaskRunner::RunNowOrPostTask(runner_, + [&latch, queue = unref_queue_]() { + queue->Drain(); + latch.Signal(); + }); + latch.Wait(); + } + + // |IOManager| + fml::WeakPtr GetWeakIOManager() const override { + return weak_prototype_; + } + + // |IOManager| + fml::WeakPtr GetResourceContext() const override { + return weak_gl_context_factory_ ? weak_gl_context_factory_->GetWeakPtr() + : fml::WeakPtr{}; + } + + // |IOManager| + fml::RefPtr GetSkiaUnrefQueue() const override { + return unref_queue_; + } + + private: + TestGLSurface gl_surface_; + sk_sp gl_context_; + std::unique_ptr> weak_gl_context_factory_; + fml::RefPtr unref_queue_; + fml::WeakPtr weak_prototype_; + fml::RefPtr runner_; + fml::WeakPtrFactory weak_factory_; + + FML_DISALLOW_COPY_AND_ASSIGN(TestIOManager); +}; + +static sk_sp OpenFixtureAsSkData(const char* name) { + auto fixtures_directory = + fml::OpenFile(GetFixturesPath(), false, fml::FilePermission::kRead); + if (!fixtures_directory.is_valid()) { + return nullptr; + } + + auto fixture_mapping = + fml::FileMapping::CreateReadOnly(fixtures_directory, name); + + if (!fixture_mapping) { + return nullptr; + } + + SkData::ReleaseProc on_release = [](const void* ptr, void* context) -> void { + delete reinterpret_cast(context); + }; + + return SkData::MakeWithProc(fixture_mapping->GetMapping(), + fixture_mapping->GetSize(), on_release, + fixture_mapping.release()); +} + +TEST_F(ImageDecoderFixtureTest, CanCreateImageDecoder) { + auto loop = fml::ConcurrentMessageLoop::Create(); + TaskRunners runners(GetCurrentTestName(), // label + GetThreadTaskRunner(), // platform + GetThreadTaskRunner(), // gpu + GetThreadTaskRunner(), // ui + GetThreadTaskRunner() // io + + ); + + fml::AutoResetWaitableEvent latch; + runners.GetIOTaskRunner()->PostTask([&]() { + TestIOManager manager(runners.GetIOTaskRunner()); + ImageDecoder decoder(std::move(runners), loop->GetTaskRunner(), + manager.GetWeakIOManager()); + latch.Signal(); + }); + latch.Wait(); +} + +TEST_F(ImageDecoderFixtureTest, InvalidImageResultsError) { + auto loop = fml::ConcurrentMessageLoop::Create(); + TaskRunners runners(GetCurrentTestName(), // label + GetThreadTaskRunner(), // platform + GetThreadTaskRunner(), // gpu + GetThreadTaskRunner(), // ui + GetThreadTaskRunner() // io + ); + + fml::AutoResetWaitableEvent latch; + GetThreadTaskRunner()->PostTask([&]() { + TestIOManager manager(runners.GetIOTaskRunner()); + ImageDecoder decoder(runners, loop->GetTaskRunner(), + manager.GetWeakIOManager()); + + ImageDecoder::ImageDescriptor image_descriptor; + image_descriptor.data = OpenFixtureAsSkData("ThisDoesNotExist.jpg"); + + ASSERT_FALSE(image_descriptor.data); + + ImageDecoder::ImageResult callback = [&](SkiaGPUObject image) { + ASSERT_TRUE(runners.GetUITaskRunner()->RunsTasksOnCurrentThread()); + ASSERT_FALSE(image.get()); + latch.Signal(); + }; + decoder.Decode(std::move(image_descriptor), callback); + }); + latch.Wait(); +} + +TEST_F(ImageDecoderFixtureTest, ValidImageResultsInSuccess) { + auto loop = fml::ConcurrentMessageLoop::Create(); + TaskRunners runners(GetCurrentTestName(), // label + GetThreadTaskRunner(), // platform + CreateNewThread("gpu"), // gpu + CreateNewThread("ui"), // ui + CreateNewThread("io") // io + ); + + fml::AutoResetWaitableEvent latch; + + std::unique_ptr io_manager; + std::unique_ptr image_decoder; + + auto decode_image = [&]() { + image_decoder = std::make_unique( + runners, loop->GetTaskRunner(), io_manager->GetWeakIOManager()); + + ImageDecoder::ImageDescriptor image_descriptor; + image_descriptor.data = OpenFixtureAsSkData("DashInNooglerHat.jpg"); + + ASSERT_TRUE(image_descriptor.data); + ASSERT_GE(image_descriptor.data->size(), 0u); + + ImageDecoder::ImageResult callback = [&](SkiaGPUObject image) { + ASSERT_TRUE(runners.GetUITaskRunner()->RunsTasksOnCurrentThread()); + ASSERT_TRUE(image.get()); + latch.Signal(); + }; + image_decoder->Decode(std::move(image_descriptor), callback); + }; + + auto setup_io_manager_and_decode = [&]() { + io_manager = std::make_unique(runners.GetIOTaskRunner()); + runners.GetUITaskRunner()->PostTask(decode_image); + }; + + runners.GetIOTaskRunner()->PostTask(setup_io_manager_and_decode); + + latch.Wait(); +} + +TEST_F(ImageDecoderFixtureTest, CanDecodeWithoutAGPUContext) { + auto loop = fml::ConcurrentMessageLoop::Create(); + TaskRunners runners(GetCurrentTestName(), // label + GetThreadTaskRunner(), // platform + CreateNewThread("gpu"), // gpu + CreateNewThread("ui"), // ui + CreateNewThread("io") // io + ); + + fml::AutoResetWaitableEvent latch; + + std::unique_ptr io_manager; + std::unique_ptr image_decoder; + + auto decode_image = [&]() { + image_decoder = std::make_unique( + runners, loop->GetTaskRunner(), io_manager->GetWeakIOManager()); + + ImageDecoder::ImageDescriptor image_descriptor; + image_descriptor.data = OpenFixtureAsSkData("DashInNooglerHat.jpg"); + + ASSERT_TRUE(image_descriptor.data); + ASSERT_GE(image_descriptor.data->size(), 0u); + + ImageDecoder::ImageResult callback = [&](SkiaGPUObject image) { + ASSERT_TRUE(runners.GetUITaskRunner()->RunsTasksOnCurrentThread()); + ASSERT_TRUE(image.get()); + latch.Signal(); + }; + image_decoder->Decode(std::move(image_descriptor), callback); + }; + + auto setup_io_manager_and_decode = [&]() { + io_manager = + std::make_unique(runners.GetIOTaskRunner(), false); + runners.GetUITaskRunner()->PostTask(decode_image); + }; + + runners.GetIOTaskRunner()->PostTask(setup_io_manager_and_decode); + + latch.Wait(); +} + +TEST_F(ImageDecoderFixtureTest, CanDecodeWithResizes) { + const auto image_dimensions = + SkImage::MakeFromEncoded(OpenFixtureAsSkData("DashInNooglerHat.jpg")) + ->dimensions(); + + ASSERT_FALSE(image_dimensions.isEmpty()); + + ASSERT_NE(image_dimensions.width(), image_dimensions.height()); + + auto loop = fml::ConcurrentMessageLoop::Create(); + TaskRunners runners(GetCurrentTestName(), // label + GetThreadTaskRunner(), // platform + CreateNewThread("gpu"), // gpu + CreateNewThread("ui"), // ui + CreateNewThread("io") // io + ); + + fml::AutoResetWaitableEvent latch; + std::unique_ptr io_manager; + std::unique_ptr image_decoder; + + // Setup the IO manager. + runners.GetIOTaskRunner()->PostTask([&]() { + io_manager = std::make_unique(runners.GetIOTaskRunner()); + latch.Signal(); + }); + latch.Wait(); + + // Setup the image decoder. + runners.GetUITaskRunner()->PostTask([&]() { + image_decoder = std::make_unique( + runners, loop->GetTaskRunner(), io_manager->GetWeakIOManager()); + + latch.Signal(); + }); + latch.Wait(); + + // Setup a generic decoding utility that gives us the final decoded size. + auto decoded_size = [&](std::optional target_width, + std::optional target_height) -> SkISize { + SkISize final_size = SkISize::MakeEmpty(); + runners.GetUITaskRunner()->PostTask([&]() { + ImageDecoder::ImageDescriptor image_descriptor; + image_descriptor.target_width = target_width; + image_descriptor.target_height = target_height; + image_descriptor.data = OpenFixtureAsSkData("DashInNooglerHat.jpg"); + + ASSERT_TRUE(image_descriptor.data); + ASSERT_GE(image_descriptor.data->size(), 0u); + + ImageDecoder::ImageResult callback = [&](SkiaGPUObject image) { + ASSERT_TRUE(runners.GetUITaskRunner()->RunsTasksOnCurrentThread()); + ASSERT_TRUE(image.get()); + final_size = image.get()->dimensions(); + latch.Signal(); + }; + image_decoder->Decode(std::move(image_descriptor), callback); + }); + latch.Wait(); + return final_size; + }; + + ASSERT_EQ(SkISize::Make(3024, 4032), image_dimensions); + ASSERT_EQ(decoded_size({}, {}), image_dimensions); + ASSERT_EQ(decoded_size(100, {}), SkISize::Make(100, 133)); + ASSERT_EQ(decoded_size({}, 100), SkISize::Make(75, 100)); + ASSERT_EQ(decoded_size(100, 100), SkISize::Make(100, 100)); +} + +TEST_F(ImageDecoderFixtureTest, CanResizeWithoutDecode) { + ImageDecoder::ImageInfo info = {}; + sk_sp decompressed_data; + SkISize image_dimensions = SkISize::MakeEmpty(); + { + auto image = + SkImage::MakeFromEncoded(OpenFixtureAsSkData("DashInNooglerHat.jpg")) + ->makeRasterImage(); + image_dimensions = image->dimensions(); + SkPixmap pixmap; + ASSERT_TRUE(image->peekPixels(&pixmap)); + info.sk_info = SkImageInfo::MakeN32Premul(image_dimensions); + info.row_bytes = pixmap.rowBytes(); + decompressed_data = + SkData::MakeWithCopy(pixmap.writable_addr(), pixmap.computeByteSize()); + } + + // This is not susecptible to changes in the underlying image decoder. + ASSERT_EQ(decompressed_data->size(), 48771072u); + ASSERT_EQ(decompressed_data->size(), + image_dimensions.width() * image_dimensions.height() * 4u); + ASSERT_EQ(info.row_bytes, image_dimensions.width() * 4u); + ASSERT_FALSE(image_dimensions.isEmpty()); + ASSERT_NE(image_dimensions.width(), image_dimensions.height()); + + auto loop = fml::ConcurrentMessageLoop::Create(); + TaskRunners runners(GetCurrentTestName(), // label + GetThreadTaskRunner(), // platform + CreateNewThread("gpu"), // gpu + CreateNewThread("ui"), // ui + CreateNewThread("io") // io + ); + + fml::AutoResetWaitableEvent latch; + std::unique_ptr io_manager; + std::unique_ptr image_decoder; + + // Setup the IO manager. + runners.GetIOTaskRunner()->PostTask([&]() { + io_manager = std::make_unique(runners.GetIOTaskRunner()); + latch.Signal(); + }); + latch.Wait(); + + // Setup the image decoder. + runners.GetUITaskRunner()->PostTask([&]() { + image_decoder = std::make_unique( + runners, loop->GetTaskRunner(), io_manager->GetWeakIOManager()); + + latch.Signal(); + }); + latch.Wait(); + + // Setup a generic decoding utility that gives us the final decoded size. + auto decoded_size = [&](std::optional target_width, + std::optional target_height) -> SkISize { + SkISize final_size = SkISize::MakeEmpty(); + runners.GetUITaskRunner()->PostTask([&]() { + ImageDecoder::ImageDescriptor image_descriptor; + image_descriptor.target_width = target_width; + image_descriptor.target_height = target_height; + image_descriptor.data = decompressed_data; + image_descriptor.decompressed_image_info = info; + + ASSERT_TRUE(image_descriptor.data); + ASSERT_GE(image_descriptor.data->size(), 0u); + + ImageDecoder::ImageResult callback = [&](SkiaGPUObject image) { + ASSERT_TRUE(runners.GetUITaskRunner()->RunsTasksOnCurrentThread()); + ASSERT_TRUE(image.get()); + final_size = image.get()->dimensions(); + latch.Signal(); + }; + image_decoder->Decode(std::move(image_descriptor), callback); + }); + latch.Wait(); + return final_size; + }; + + ASSERT_EQ(SkISize::Make(3024, 4032), image_dimensions); + ASSERT_EQ(decoded_size({}, {}), image_dimensions); + ASSERT_EQ(decoded_size(100, {}), SkISize::Make(100, 133)); + ASSERT_EQ(decoded_size({}, 100), SkISize::Make(75, 100)); + ASSERT_EQ(decoded_size(100, 100), SkISize::Make(100, 100)); +} + +} // namespace testing +} // namespace flutter diff --git a/engine/src/flutter/lib/ui/painting/multi_frame_codec.cc b/engine/src/flutter/lib/ui/painting/multi_frame_codec.cc new file mode 100644 index 0000000000..0cd29b6623 --- /dev/null +++ b/engine/src/flutter/lib/ui/painting/multi_frame_codec.cc @@ -0,0 +1,191 @@ +// 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/ui/painting/multi_frame_codec.h" + +#include "flutter/fml/make_copyable.h" +#include "third_party/dart/runtime/include/dart_api.h" +#include "third_party/skia/include/core/SkPixelRef.h" +#include "third_party/tonic/logging/dart_invoke.h" + +namespace flutter { + +MultiFrameCodec::MultiFrameCodec(std::unique_ptr codec) + : codec_(std::move(codec)), + frameCount_(codec_->getFrameCount()), + repetitionCount_(codec_->getRepetitionCount()), + nextFrameIndex_(0) {} + +MultiFrameCodec::~MultiFrameCodec() = default; + +static void InvokeNextFrameCallback( + fml::RefPtr frameInfo, + std::unique_ptr callback, + size_t trace_id) { + std::shared_ptr dart_state = callback->dart_state().lock(); + if (!dart_state) { + FML_DLOG(ERROR) << "Could not acquire Dart state while attempting to fire " + "next frame callback."; + return; + } + tonic::DartState::Scope scope(dart_state); + if (!frameInfo) { + tonic::DartInvoke(callback->value(), {Dart_Null()}); + } else { + tonic::DartInvoke(callback->value(), {ToDart(frameInfo)}); + } +} + +// Copied the source bitmap to the destination. If this cannot occur due to +// running out of memory or the image info not being compatible, returns false. +static bool CopyToBitmap(SkBitmap* dst, + SkColorType dstColorType, + const SkBitmap& src) { + SkPixmap srcPM; + if (!src.peekPixels(&srcPM)) { + return false; + } + + SkBitmap tmpDst; + SkImageInfo dstInfo = srcPM.info().makeColorType(dstColorType); + if (!tmpDst.setInfo(dstInfo)) { + return false; + } + + if (!tmpDst.tryAllocPixels()) { + return false; + } + + SkPixmap dstPM; + if (!tmpDst.peekPixels(&dstPM)) { + return false; + } + + if (!srcPM.readPixels(dstPM)) { + return false; + } + + dst->swap(tmpDst); + return true; +} + +sk_sp MultiFrameCodec::GetNextFrameImage( + fml::WeakPtr resourceContext) { + SkBitmap bitmap = SkBitmap(); + SkImageInfo info = codec_->getInfo().makeColorType(kN32_SkColorType); + if (info.alphaType() == kUnpremul_SkAlphaType) { + info = info.makeAlphaType(kPremul_SkAlphaType); + } + bitmap.allocPixels(info); + + SkCodec::Options options; + options.fFrameIndex = nextFrameIndex_; + SkCodec::FrameInfo frameInfo; + codec_->getFrameInfo(nextFrameIndex_, &frameInfo); + const int requiredFrameIndex = frameInfo.fRequiredFrame; + if (requiredFrameIndex != SkCodec::kNoFrame) { + if (lastRequiredFrame_ == nullptr) { + FML_LOG(ERROR) << "Frame " << nextFrameIndex_ << " depends on frame " + << requiredFrameIndex + << " and no required frames are cached."; + return nullptr; + } else if (lastRequiredFrameIndex_ != requiredFrameIndex) { + FML_DLOG(INFO) << "Required frame " << requiredFrameIndex + << " is not cached. Using " << lastRequiredFrameIndex_ + << " instead"; + } + + if (lastRequiredFrame_->getPixels() && + CopyToBitmap(&bitmap, lastRequiredFrame_->colorType(), + *lastRequiredFrame_)) { + options.fPriorFrame = requiredFrameIndex; + } + } + + if (SkCodec::kSuccess != codec_->getPixels(info, bitmap.getPixels(), + bitmap.rowBytes(), &options)) { + FML_LOG(ERROR) << "Could not getPixels for frame " << nextFrameIndex_; + return nullptr; + } + + // Hold onto this if we need it to decode future frames. + if (frameInfo.fDisposalMethod == SkCodecAnimation::DisposalMethod::kKeep) { + lastRequiredFrame_ = std::make_unique(bitmap); + lastRequiredFrameIndex_ = nextFrameIndex_; + } + + if (resourceContext) { + SkPixmap pixmap(bitmap.info(), bitmap.pixelRef()->pixels(), + bitmap.pixelRef()->rowBytes()); + // This indicates that we do not want a "linear blending" decode. + sk_sp dstColorSpace = nullptr; + return SkImage::MakeCrossContextFromPixmap(resourceContext.get(), pixmap, + true, dstColorSpace.get()); + } else { + // Defer decoding until time of draw later on the GPU thread. Can happen + // when GL operations are currently forbidden such as in the background + // on iOS. + return SkImage::MakeFromBitmap(bitmap); + } +} + +void MultiFrameCodec::GetNextFrameAndInvokeCallback( + std::unique_ptr callback, + fml::RefPtr ui_task_runner, + fml::WeakPtr resourceContext, + fml::RefPtr unref_queue, + size_t trace_id) { + fml::RefPtr frameInfo = NULL; + sk_sp skImage = GetNextFrameImage(resourceContext); + if (skImage) { + fml::RefPtr image = CanvasImage::Create(); + image->set_image({skImage, std::move(unref_queue)}); + SkCodec::FrameInfo skFrameInfo; + codec_->getFrameInfo(nextFrameIndex_, &skFrameInfo); + frameInfo = + fml::MakeRefCounted(std::move(image), skFrameInfo.fDuration); + } + nextFrameIndex_ = (nextFrameIndex_ + 1) % frameCount_; + + ui_task_runner->PostTask(fml::MakeCopyable( + [callback = std::move(callback), frameInfo, trace_id]() mutable { + InvokeNextFrameCallback(frameInfo, std::move(callback), trace_id); + })); +} + +Dart_Handle MultiFrameCodec::getNextFrame(Dart_Handle callback_handle) { + static size_t trace_counter = 1; + const size_t trace_id = trace_counter++; + + if (!Dart_IsClosure(callback_handle)) { + return tonic::ToDart("Callback must be a function"); + } + + auto* dart_state = UIDartState::Current(); + + const auto& task_runners = dart_state->GetTaskRunners(); + + task_runners.GetIOTaskRunner()->PostTask(fml::MakeCopyable( + [callback = std::make_unique( + tonic::DartState::Current(), callback_handle), + this, trace_id, ui_task_runner = task_runners.GetUITaskRunner(), + queue = UIDartState::Current()->GetSkiaUnrefQueue(), + context = dart_state->GetResourceContext()]() mutable { + GetNextFrameAndInvokeCallback(std::move(callback), + std::move(ui_task_runner), context, + std::move(queue), trace_id); + })); + + return Dart_Null(); +} + +int MultiFrameCodec::frameCount() const { + return frameCount_; +} + +int MultiFrameCodec::repetitionCount() const { + return repetitionCount_; +} + +} // namespace flutter diff --git a/engine/src/flutter/lib/ui/painting/multi_frame_codec.h b/engine/src/flutter/lib/ui/painting/multi_frame_codec.h new file mode 100644 index 0000000000..0be63c2a57 --- /dev/null +++ b/engine/src/flutter/lib/ui/painting/multi_frame_codec.h @@ -0,0 +1,54 @@ +// 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. + +#ifndef FLUTTER_LIB_UI_PAINTING_MUTLI_FRAME_CODEC_H_ +#define FLUTTER_LIB_UI_PAINTING_MUTLI_FRAME_CODEC_H_ + +#include "flutter/fml/macros.h" +#include "flutter/lib/ui/painting/codec.h" + +namespace flutter { + +class MultiFrameCodec : public Codec { + public: + MultiFrameCodec(std::unique_ptr codec); + + ~MultiFrameCodec() override; + + // |Codec| + int frameCount() const override; + + // |Codec| + int repetitionCount() const override; + + // |Codec| + Dart_Handle getNextFrame(Dart_Handle args) override; + + private: + const std::unique_ptr codec_; + const int frameCount_; + const int repetitionCount_; + int nextFrameIndex_; + + // The last decoded frame that's required to decode any subsequent frames. + std::unique_ptr lastRequiredFrame_; + // The index of the last decoded required frame. + int lastRequiredFrameIndex_ = -1; + + sk_sp GetNextFrameImage(fml::WeakPtr resourceContext); + + void GetNextFrameAndInvokeCallback( + std::unique_ptr callback, + fml::RefPtr ui_task_runner, + fml::WeakPtr resourceContext, + fml::RefPtr unref_queue, + size_t trace_id); + + FML_FRIEND_MAKE_REF_COUNTED(MultiFrameCodec); + FML_FRIEND_REF_COUNTED_THREAD_SAFE(MultiFrameCodec); +}; + +} // namespace flutter + +#endif // FLUTTER_LIB_UI_PAINTING_MUTLI_FRAME_CODEC_H_ diff --git a/engine/src/flutter/lib/ui/painting/single_frame_codec.cc b/engine/src/flutter/lib/ui/painting/single_frame_codec.cc new file mode 100644 index 0000000000..8036f767ea --- /dev/null +++ b/engine/src/flutter/lib/ui/painting/single_frame_codec.cc @@ -0,0 +1,79 @@ +// 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/ui/painting/single_frame_codec.h" + +#include "flutter/lib/ui/painting/frame_info.h" +#include "flutter/lib/ui/ui_dart_state.h" +#include "third_party/tonic/logging/dart_invoke.h" + +namespace flutter { + +SingleFrameCodec::SingleFrameCodec(ImageDecoder::ImageDescriptor descriptor) + : descriptor_(std::move(descriptor)) {} + +SingleFrameCodec::~SingleFrameCodec() = default; + +int SingleFrameCodec::frameCount() const { + return 1; +} + +int SingleFrameCodec::repetitionCount() const { + return 0; +} + +Dart_Handle SingleFrameCodec::getNextFrame(Dart_Handle callback_handle) { + if (!Dart_IsClosure(callback_handle)) { + return tonic::ToDart("Callback must be a function"); + } + + // This has to be valid because this method is called from Dart. + auto dart_state = UIDartState::Current(); + + auto decoder = dart_state->GetImageDecoder(); + + if (!decoder) { + return tonic::ToDart("Image decoder not available."); + } + + auto raw_callback = new DartPersistentValue(dart_state, callback_handle); + + // We dont want to to put the raw callback in a lambda capture because we have + // to mutate (i.e destroy) it in the callback. Using MakeCopyable will create + // a shared pointer for the captures which can be destroyed on any thread. But + // we have to ensure that the DartPersistentValue is only destroyed on the UI + // thread. + decoder->Decode(descriptor_, [raw_callback](auto image) { + std::unique_ptr callback(raw_callback); + + auto state = callback->dart_state().lock(); + + if (!state) { + // This is probably because the isolate has been terminated before the + // image could be decoded. + + return; + } + + tonic::DartState::Scope scope(state.get()); + + auto canvas_image = fml::MakeRefCounted(); + canvas_image->set_image(std::move(image)); + + auto frame_info = fml::MakeRefCounted(std::move(canvas_image), + 0 /* duration */); + + tonic::DartInvoke(callback->value(), {tonic::ToDart(frame_info)}); + }); + + return Dart_Null(); +} + +size_t SingleFrameCodec::GetAllocationSize() { + const auto& data = descriptor_.data; + auto data_byte_size = data ? data->size() : 0; + return data_byte_size + sizeof(this); +} + +} // namespace flutter diff --git a/engine/src/flutter/lib/ui/painting/single_frame_codec.h b/engine/src/flutter/lib/ui/painting/single_frame_codec.h new file mode 100644 index 0000000000..9684eef112 --- /dev/null +++ b/engine/src/flutter/lib/ui/painting/single_frame_codec.h @@ -0,0 +1,41 @@ +// 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. + +#ifndef FLUTTER_LIB_UI_PAINTING_SINGLE_FRAME_CODEC_H_ +#define FLUTTER_LIB_UI_PAINTING_SINGLE_FRAME_CODEC_H_ + +#include "flutter/fml/macros.h" +#include "flutter/lib/ui/painting/codec.h" +#include "flutter/lib/ui/painting/image_decoder.h" + +namespace flutter { + +class SingleFrameCodec : public Codec { + public: + SingleFrameCodec(ImageDecoder::ImageDescriptor descriptor); + + ~SingleFrameCodec() override; + + // |Codec| + int frameCount() const override; + + // |Codec| + int repetitionCount() const override; + + // |Codec| + Dart_Handle getNextFrame(Dart_Handle args) override; + + // |DartWrappable| + size_t GetAllocationSize() override; + + private: + ImageDecoder::ImageDescriptor descriptor_; + + FML_FRIEND_MAKE_REF_COUNTED(SingleFrameCodec); + FML_FRIEND_REF_COUNTED_THREAD_SAFE(SingleFrameCodec); +}; + +} // namespace flutter + +#endif // FLUTTER_LIB_UI_PAINTING_SINGLE_FRAME_CODEC_H_ diff --git a/engine/src/flutter/lib/ui/ui_dart_state.cc b/engine/src/flutter/lib/ui/ui_dart_state.cc index b26e01afb1..8b84d18921 100644 --- a/engine/src/flutter/lib/ui/ui_dart_state.cc +++ b/engine/src/flutter/lib/ui/ui_dart_state.cc @@ -19,6 +19,7 @@ UIDartState::UIDartState( TaskObserverRemove remove_callback, fml::WeakPtr snapshot_delegate, fml::WeakPtr io_manager, + fml::WeakPtr image_decoder, std::string advisory_script_uri, std::string advisory_script_entrypoint, std::string logger_prefix, @@ -29,6 +30,7 @@ UIDartState::UIDartState( remove_callback_(std::move(remove_callback)), snapshot_delegate_(std::move(snapshot_delegate)), io_manager_(std::move(io_manager)), + image_decoder_(std::move(image_decoder)), advisory_script_uri_(std::move(advisory_script_uri)), advisory_script_entrypoint_(std::move(advisory_script_entrypoint)), logger_prefix_(std::move(logger_prefix)), @@ -124,6 +126,10 @@ fml::WeakPtr UIDartState::GetResourceContext() const { return io_manager_->GetResourceContext(); } +fml::WeakPtr UIDartState::GetImageDecoder() const { + return image_decoder_; +} + std::shared_ptr UIDartState::GetIsolateNameServer() const { return isolate_name_server_; } diff --git a/engine/src/flutter/lib/ui/ui_dart_state.h b/engine/src/flutter/lib/ui/ui_dart_state.h index 4f9c33387e..550c72ff98 100644 --- a/engine/src/flutter/lib/ui/ui_dart_state.h +++ b/engine/src/flutter/lib/ui/ui_dart_state.h @@ -16,6 +16,7 @@ #include "flutter/fml/memory/weak_ptr.h" #include "flutter/lib/ui/io_manager.h" #include "flutter/lib/ui/isolate_name_server/isolate_name_server.h" +#include "flutter/lib/ui/painting/image_decoder.h" #include "flutter/lib/ui/snapshot_delegate.h" #include "third_party/dart/runtime/include/dart_api.h" #include "third_party/skia/include/gpu/GrContext.h" @@ -53,6 +54,8 @@ class UIDartState : public tonic::DartState { fml::WeakPtr GetResourceContext() const; + fml::WeakPtr GetImageDecoder() const; + std::shared_ptr GetIsolateNameServer() const; tonic::DartErrorHandleType GetLastError(); @@ -77,6 +80,7 @@ class UIDartState : public tonic::DartState { TaskObserverRemove remove_callback, fml::WeakPtr snapshot_delegate, fml::WeakPtr io_manager, + fml::WeakPtr image_decoder, std::string advisory_script_uri, std::string advisory_script_entrypoint, std::string logger_prefix, @@ -99,6 +103,7 @@ class UIDartState : public tonic::DartState { const TaskObserverRemove remove_callback_; fml::WeakPtr snapshot_delegate_; fml::WeakPtr io_manager_; + fml::WeakPtr image_decoder_; const std::string advisory_script_uri_; const std::string advisory_script_entrypoint_; const std::string logger_prefix_; diff --git a/engine/src/flutter/runtime/dart_isolate.cc b/engine/src/flutter/runtime/dart_isolate.cc index 96ac6facd3..91f39b3aeb 100644 --- a/engine/src/flutter/runtime/dart_isolate.cc +++ b/engine/src/flutter/runtime/dart_isolate.cc @@ -37,6 +37,7 @@ std::weak_ptr DartIsolate::CreateRootIsolate( std::unique_ptr window, fml::WeakPtr snapshot_delegate, fml::WeakPtr io_manager, + fml::WeakPtr image_decoder, std::string advisory_script_uri, std::string advisory_script_entrypoint, Dart_IsolateFlags* flags, @@ -62,6 +63,7 @@ std::weak_ptr DartIsolate::CreateRootIsolate( task_runners, // task runners std::move(snapshot_delegate), // snapshot delegate std::move(io_manager), // IO manager + std::move(image_decoder), // Image Decoder advisory_script_uri, // advisory URI advisory_script_entrypoint, // advisory entrypoint nullptr, // child isolate preparer @@ -106,6 +108,7 @@ DartIsolate::DartIsolate(const Settings& settings, TaskRunners task_runners, fml::WeakPtr snapshot_delegate, fml::WeakPtr io_manager, + fml::WeakPtr image_decoder, std::string advisory_script_uri, std::string advisory_script_entrypoint, ChildIsolatePreparer child_isolate_preparer, @@ -116,6 +119,7 @@ DartIsolate::DartIsolate(const Settings& settings, settings.task_observer_remove, std::move(snapshot_delegate), std::move(io_manager), + std::move(image_decoder), advisory_script_uri, advisory_script_entrypoint, settings.log_tag, @@ -597,6 +601,7 @@ Dart_Isolate DartIsolate::DartCreateAndStartServiceIsolate( nullptr, // window {}, // snapshot delegate {}, // IO Manager + {}, // Image Decoder DART_VM_SERVICE_ISOLATE_NAME, // script uri DART_VM_SERVICE_ISOLATE_NAME, // script entrypoint flags, // flags @@ -709,6 +714,7 @@ DartIsolate::CreateDartVMAndEmbedderObjectPair( null_task_runners, // task_runners fml::WeakPtr{}, // snapshot_delegate fml::WeakPtr{}, // io_manager + fml::WeakPtr{}, // io_manager advisory_script_uri, // advisory_script_uri advisory_script_entrypoint, // advisory_script_entrypoint (*raw_embedder_isolate)->child_isolate_preparer_, // preparer diff --git a/engine/src/flutter/runtime/dart_isolate.h b/engine/src/flutter/runtime/dart_isolate.h index 60412972ab..20f53a9a40 100644 --- a/engine/src/flutter/runtime/dart_isolate.h +++ b/engine/src/flutter/runtime/dart_isolate.h @@ -49,6 +49,7 @@ class DartIsolate : public UIDartState { std::unique_ptr window, fml::WeakPtr snapshot_delegate, fml::WeakPtr io_manager, + fml::WeakPtr image_decoder, std::string advisory_script_uri, std::string advisory_script_entrypoint, Dart_IsolateFlags* flags, @@ -61,6 +62,7 @@ class DartIsolate : public UIDartState { TaskRunners task_runners, fml::WeakPtr snapshot_delegate, fml::WeakPtr io_manager, + fml::WeakPtr image_decoder, std::string advisory_script_uri, std::string advisory_script_entrypoint, ChildIsolatePreparer child_isolate_preparer, diff --git a/engine/src/flutter/runtime/dart_isolate_unittests.cc b/engine/src/flutter/runtime/dart_isolate_unittests.cc index e752582cc9..ae14042ecc 100644 --- a/engine/src/flutter/runtime/dart_isolate_unittests.cc +++ b/engine/src/flutter/runtime/dart_isolate_unittests.cc @@ -43,6 +43,7 @@ TEST_F(DartIsolateTest, RootIsolateCreationAndShutdown) { nullptr, // window {}, // snapshot delegate {}, // io manager + {}, // image decoder "main.dart", // advisory uri "main", // advisory entrypoint, nullptr, // flags @@ -76,6 +77,7 @@ TEST_F(DartIsolateTest, IsolateShutdownCallbackIsInIsolateScope) { nullptr, // window {}, // snapshot delegate {}, // io manager + {}, // image decoder "main.dart", // advisory uri "main", // advisory entrypoint nullptr, // flags @@ -186,6 +188,7 @@ static void RunDartCodeInIsolate(DartVMRef& vm_ref, nullptr, // window {}, // snapshot delegate {}, // io manager + {}, // image decoder "main.dart", // advisory uri "main", // advisory entrypoint nullptr, // flags diff --git a/engine/src/flutter/runtime/dart_lifecycle_unittests.cc b/engine/src/flutter/runtime/dart_lifecycle_unittests.cc index a6de7f792f..eec7aa6c9c 100644 --- a/engine/src/flutter/runtime/dart_lifecycle_unittests.cc +++ b/engine/src/flutter/runtime/dart_lifecycle_unittests.cc @@ -58,6 +58,7 @@ static std::shared_ptr CreateAndRunRootIsolate( {}, // window {}, // snapshot_delegate {}, // io_manager + {}, // image_decoder "main.dart", // advisory_script_uri entrypoint.c_str(), // advisory_script_entrypoint nullptr, // flags diff --git a/engine/src/flutter/runtime/dart_vm.cc b/engine/src/flutter/runtime/dart_vm.cc index 903e74b159..0e4109051e 100644 --- a/engine/src/flutter/runtime/dart_vm.cc +++ b/engine/src/flutter/runtime/dart_vm.cc @@ -253,6 +253,7 @@ size_t DartVM::GetVMLaunchCount() { DartVM::DartVM(std::shared_ptr vm_data, std::shared_ptr isolate_name_server) : settings_(vm_data->GetSettings()), + concurrent_message_loop_(fml::ConcurrentMessageLoop::Create()), vm_data_(vm_data), isolate_name_server_(std::move(isolate_name_server)), service_protocol_(std::make_shared()) { @@ -451,4 +452,9 @@ std::shared_ptr DartVM::GetIsolateNameServer() const { return isolate_name_server_; } +std::shared_ptr +DartVM::GetConcurrentWorkerTaskRunner() const { + return concurrent_message_loop_->GetTaskRunner(); +} + } // namespace flutter diff --git a/engine/src/flutter/runtime/dart_vm.h b/engine/src/flutter/runtime/dart_vm.h index b88c033b6e..9cc2d811ac 100644 --- a/engine/src/flutter/runtime/dart_vm.h +++ b/engine/src/flutter/runtime/dart_vm.h @@ -15,6 +15,7 @@ #include "flutter/fml/memory/ref_counted.h" #include "flutter/fml/memory/ref_ptr.h" #include "flutter/fml/memory/weak_ptr.h" +#include "flutter/fml/message_loop.h" #include "flutter/lib/ui/isolate_name_server/isolate_name_server.h" #include "flutter/runtime/dart_isolate.h" #include "flutter/runtime/dart_snapshot.h" @@ -40,8 +41,12 @@ class DartVM { std::shared_ptr GetIsolateNameServer() const; + std::shared_ptr GetConcurrentWorkerTaskRunner() + const; + private: const Settings settings_; + std::shared_ptr concurrent_message_loop_; std::shared_ptr vm_data_; const std::shared_ptr isolate_name_server_; const std::shared_ptr service_protocol_; diff --git a/engine/src/flutter/runtime/runtime_controller.cc b/engine/src/flutter/runtime/runtime_controller.cc index c0d9c3efda..e457f5986e 100644 --- a/engine/src/flutter/runtime/runtime_controller.cc +++ b/engine/src/flutter/runtime/runtime_controller.cc @@ -22,6 +22,7 @@ RuntimeController::RuntimeController( TaskRunners p_task_runners, fml::WeakPtr p_snapshot_delegate, fml::WeakPtr p_io_manager, + fml::WeakPtr p_image_decoder, std::string p_advisory_script_uri, std::string p_advisory_script_entrypoint, std::function p_idle_notification_callback, @@ -34,6 +35,7 @@ RuntimeController::RuntimeController( std::move(p_task_runners), std::move(p_snapshot_delegate), std::move(p_io_manager), + std::move(p_image_decoder), std::move(p_advisory_script_uri), std::move(p_advisory_script_entrypoint), p_idle_notification_callback, @@ -49,6 +51,7 @@ RuntimeController::RuntimeController( TaskRunners p_task_runners, fml::WeakPtr p_snapshot_delegate, fml::WeakPtr p_io_manager, + fml::WeakPtr p_image_decoder, std::string p_advisory_script_uri, std::string p_advisory_script_entrypoint, std::function idle_notification_callback, @@ -62,6 +65,7 @@ RuntimeController::RuntimeController( task_runners_(p_task_runners), snapshot_delegate_(p_snapshot_delegate), io_manager_(p_io_manager), + image_decoder_(p_image_decoder), advisory_script_uri_(p_advisory_script_uri), advisory_script_entrypoint_(p_advisory_script_entrypoint), idle_notification_callback_(idle_notification_callback), @@ -79,6 +83,7 @@ RuntimeController::RuntimeController( std::make_unique(this), // snapshot_delegate_, // io_manager_, // + image_decoder_, // p_advisory_script_uri, // p_advisory_script_entrypoint, // nullptr, // @@ -139,6 +144,7 @@ std::unique_ptr RuntimeController::Clone() const { task_runners_, // snapshot_delegate_, // io_manager_, // + image_decoder_, // advisory_script_uri_, // advisory_script_entrypoint_, // idle_notification_callback_, // diff --git a/engine/src/flutter/runtime/runtime_controller.h b/engine/src/flutter/runtime/runtime_controller.h index 5a125013ea..c3b3e35fa0 100644 --- a/engine/src/flutter/runtime/runtime_controller.h +++ b/engine/src/flutter/runtime/runtime_controller.h @@ -35,6 +35,7 @@ class RuntimeController final : public WindowClient { TaskRunners task_runners, fml::WeakPtr snapshot_delegate, fml::WeakPtr io_manager, + fml::WeakPtr iamge_decoder, std::string advisory_script_uri, std::string advisory_script_entrypoint, std::function idle_notification_callback, @@ -130,6 +131,7 @@ class RuntimeController final : public WindowClient { TaskRunners task_runners_; fml::WeakPtr snapshot_delegate_; fml::WeakPtr io_manager_; + fml::WeakPtr image_decoder_; std::string advisory_script_uri_; std::string advisory_script_entrypoint_; std::function idle_notification_callback_; @@ -146,6 +148,7 @@ class RuntimeController final : public WindowClient { TaskRunners task_runners, fml::WeakPtr snapshot_delegate, fml::WeakPtr io_manager, + fml::WeakPtr image_decoder, std::string advisory_script_uri, std::string advisory_script_entrypoint, std::function idle_notification_callback, diff --git a/engine/src/flutter/shell/common/engine.cc b/engine/src/flutter/shell/common/engine.cc index 5147789d70..d2c752a474 100644 --- a/engine/src/flutter/shell/common/engine.cc +++ b/engine/src/flutter/shell/common/engine.cc @@ -49,6 +49,9 @@ Engine::Engine(Delegate& delegate, animator_(std::move(animator)), activity_running_(false), have_surface_(false), + image_decoder_(task_runners, + vm.GetConcurrentWorkerTaskRunner(), + io_manager), weak_factory_(this) { // Runtime controller is initialized here because it takes a reference to this // object as its delegate. The delegate may be called in the constructor and @@ -61,6 +64,7 @@ Engine::Engine(Delegate& delegate, std::move(task_runners), // task runners std::move(snapshot_delegate), // snapshot delegate std::move(io_manager), // io manager + image_decoder_.GetWeakPtr(), // image decoder settings_.advisory_script_uri, // advisory script uri settings_.advisory_script_entrypoint, // advisory script entrypoint settings_.idle_notification_callback, // idle notification callback diff --git a/engine/src/flutter/shell/common/engine.h b/engine/src/flutter/shell/common/engine.h index 293d78c1a7..95739c9b2b 100644 --- a/engine/src/flutter/shell/common/engine.h +++ b/engine/src/flutter/shell/common/engine.h @@ -12,6 +12,7 @@ #include "flutter/common/task_runners.h" #include "flutter/fml/macros.h" #include "flutter/fml/memory/weak_ptr.h" +#include "flutter/lib/ui/painting/image_decoder.h" #include "flutter/lib/ui/semantics/custom_accessibility_action.h" #include "flutter/lib/ui/semantics/semantics_node.h" #include "flutter/lib/ui/snapshot_delegate.h" @@ -138,6 +139,7 @@ class Engine final : public RuntimeDelegate { bool activity_running_; bool have_surface_; FontCollection font_collection_; + ImageDecoder image_decoder_; fml::WeakPtrFactory weak_factory_; // |RuntimeDelegate| diff --git a/engine/src/flutter/shell/common/shell_io_manager.cc b/engine/src/flutter/shell/common/shell_io_manager.cc index f1155c2e88..76db8505c9 100644 --- a/engine/src/flutter/shell/common/shell_io_manager.cc +++ b/engine/src/flutter/shell/common/shell_io_manager.cc @@ -52,7 +52,7 @@ ShellIOManager::ShellIOManager( : nullptr), unref_queue_(fml::MakeRefCounted( std::move(unref_queue_task_runner), - fml::TimeDelta::FromMilliseconds(250))), + fml::TimeDelta::FromMilliseconds(8))), weak_factory_(this) { if (!resource_context_) { #ifndef OS_FUCHSIA @@ -69,12 +69,6 @@ ShellIOManager::~ShellIOManager() { unref_queue_->Drain(); } -fml::WeakPtr ShellIOManager::GetResourceContext() const { - return resource_context_weak_factory_ - ? resource_context_weak_factory_->GetWeakPtr() - : fml::WeakPtr(); -} - void ShellIOManager::NotifyResourceContextAvailable( sk_sp resource_context) { // The resource context needs to survive as long as we have Dart objects @@ -93,11 +87,25 @@ void ShellIOManager::UpdateResourceContext(sk_sp resource_context) { : nullptr; } +fml::WeakPtr ShellIOManager::GetWeakPtr() { + return weak_factory_.GetWeakPtr(); +} + +// |IOManager| +fml::WeakPtr ShellIOManager::GetResourceContext() const { + return resource_context_weak_factory_ + ? resource_context_weak_factory_->GetWeakPtr() + : fml::WeakPtr(); +} + +// |IOManager| fml::RefPtr ShellIOManager::GetSkiaUnrefQueue() const { return unref_queue_; } -fml::WeakPtr ShellIOManager::GetWeakPtr() { +// |IOManager| +fml::WeakPtr ShellIOManager::GetWeakIOManager() const { return weak_factory_.GetWeakPtr(); } + } // namespace flutter diff --git a/engine/src/flutter/shell/common/shell_io_manager.h b/engine/src/flutter/shell/common/shell_io_manager.h index 11efd34343..066937f53b 100644 --- a/engine/src/flutter/shell/common/shell_io_manager.h +++ b/engine/src/flutter/shell/common/shell_io_manager.h @@ -29,8 +29,6 @@ class ShellIOManager final : public IOManager { ~ShellIOManager() override; - fml::WeakPtr GetResourceContext() const override; - // This method should be called when a resource_context first becomes // available. It is safe to call multiple times, and will only update // the held resource context if it has not already been set. @@ -42,10 +40,17 @@ class ShellIOManager final : public IOManager { // resource context, but may be called if the Dart VM is restarted. void UpdateResourceContext(sk_sp resource_context); - fml::RefPtr GetSkiaUnrefQueue() const override; - fml::WeakPtr GetWeakPtr(); + // |IOManager| + fml::WeakPtr GetWeakIOManager() const override; + + // |IOManager| + fml::WeakPtr GetResourceContext() const override; + + // |IOManager| + fml::RefPtr GetSkiaUnrefQueue() const override; + private: // Resource context management. sk_sp resource_context_; diff --git a/engine/src/flutter/shell/platform/embedder/BUILD.gn b/engine/src/flutter/shell/platform/embedder/BUILD.gn index 1173a4f778..c875d98116 100644 --- a/engine/src/flutter/shell/platform/embedder/BUILD.gn +++ b/engine/src/flutter/shell/platform/embedder/BUILD.gn @@ -67,10 +67,7 @@ if (current_toolchain == host_toolchain) { executable("embedder_unittests") { testonly = true - configs += [ - "$flutter_root:export_dynamic_symbols", - "//third_party/swiftshader_flutter:swiftshader_config", - ] + configs += [ "$flutter_root:export_dynamic_symbols" ] include_dirs = [ "." ] @@ -82,8 +79,6 @@ if (current_toolchain == host_toolchain) { "tests/embedder_context.h", "tests/embedder_test.cc", "tests/embedder_test.h", - "tests/embedder_test_gl_surface.cc", - "tests/embedder_test_gl_surface.h", "tests/embedder_unittests.cc", ] @@ -93,8 +88,8 @@ if (current_toolchain == host_toolchain) { "$flutter_root/lib/ui", "$flutter_root/runtime", "$flutter_root/testing:dart", + "$flutter_root/testing:opengl", "//third_party/skia", - "//third_party/swiftshader_flutter:swiftshader", "//third_party/tonic", ] } diff --git a/engine/src/flutter/shell/platform/embedder/tests/embedder_context.cc b/engine/src/flutter/shell/platform/embedder/tests/embedder_context.cc index ae759d6673..5b8297547c 100644 --- a/engine/src/flutter/shell/platform/embedder/tests/embedder_context.cc +++ b/engine/src/flutter/shell/platform/embedder/tests/embedder_context.cc @@ -124,7 +124,7 @@ EmbedderContext::GetUpdateSemanticsCustomActionCallbackHook() { } void EmbedderContext::SetupOpenGLSurface() { - gl_surface_ = std::make_unique(); + gl_surface_ = std::make_unique(); } bool EmbedderContext::GLMakeCurrent() { diff --git a/engine/src/flutter/shell/platform/embedder/tests/embedder_context.h b/engine/src/flutter/shell/platform/embedder/tests/embedder_context.h index 7e9754e096..02f617411a 100644 --- a/engine/src/flutter/shell/platform/embedder/tests/embedder_context.h +++ b/engine/src/flutter/shell/platform/embedder/tests/embedder_context.h @@ -14,8 +14,8 @@ #include "flutter/fml/macros.h" #include "flutter/fml/mapping.h" #include "flutter/shell/platform/embedder/embedder.h" -#include "flutter/shell/platform/embedder/tests/embedder_test_gl_surface.h" #include "flutter/testing/test_dart_native_resolver.h" +#include "flutter/testing/test_gl_surface.h" namespace flutter { namespace testing { @@ -65,8 +65,8 @@ class EmbedderContext { std::shared_ptr native_resolver_; SemanticsNodeCallback update_semantics_node_callback_; SemanticsActionCallback update_semantics_custom_action_callback_; - std::unique_ptr gl_surface_; // lazy std::function platform_message_callback_; + std::unique_ptr gl_surface_; static VoidCallback GetIsolateCreateCallbackHook(); diff --git a/engine/src/flutter/testing/BUILD.gn b/engine/src/flutter/testing/BUILD.gn index f1cf5b7afe..82107d7f4e 100644 --- a/engine/src/flutter/testing/BUILD.gn +++ b/engine/src/flutter/testing/BUILD.gn @@ -45,3 +45,25 @@ source_set("dart") { "//third_party/tonic", ] } + +if (current_toolchain == host_toolchain) { + source_set("opengl") { + testonly = true + + configs += [ "//third_party/swiftshader_flutter:swiftshader_config" ] + + sources = [ + "$flutter_root/testing/test_gl_surface.cc", + "$flutter_root/testing/test_gl_surface.h", + ] + + deps = [ + "//$flutter_root/fml", + "//third_party/swiftshader_flutter:swiftshader", + ] + + public_deps = [ + "//third_party/skia", + ] + } +} diff --git a/engine/src/flutter/testing/run_tests.sh b/engine/src/flutter/testing/run_tests.sh index 36946316ce..68f353de98 100755 --- a/engine/src/flutter/testing/run_tests.sh +++ b/engine/src/flutter/testing/run_tests.sh @@ -54,6 +54,9 @@ echo "Running client_wrapper_glfw_unittests..." echo "Running txt_unittests..." "$HOST_DIR/txt_unittests" --font-directory="$BUILDROOT_DIR/flutter/third_party/txt/third_party/fonts" +echo "Running ui_unittests..." +"$HOST_DIR/ui_unittests" + echo "Running txt_benchmarks..." "$HOST_DIR/txt_benchmarks" --font-directory="$BUILDROOT_DIR/flutter/third_party/txt/third_party/fonts" diff --git a/engine/src/flutter/shell/platform/embedder/tests/embedder_test_gl_surface.cc b/engine/src/flutter/testing/test_gl_surface.cc similarity index 81% rename from engine/src/flutter/shell/platform/embedder/tests/embedder_test_gl_surface.cc rename to engine/src/flutter/testing/test_gl_surface.cc index 54c2d6e6ff..ec8394078c 100644 --- a/engine/src/flutter/shell/platform/embedder/tests/embedder_test_gl_surface.cc +++ b/engine/src/flutter/testing/test_gl_surface.cc @@ -2,16 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "flutter/shell/platform/embedder/tests/embedder_test_gl_surface.h" +#include "flutter/testing/test_gl_surface.h" #include +#include #include #include #include "flutter/fml/logging.h" +#include "third_party/skia/include/gpu/gl/GrGLAssembleInterface.h" namespace flutter { +namespace testing { static std::string GetEGLError() { std::stringstream stream; @@ -74,7 +77,7 @@ static std::string GetEGLError() { return stream.str(); } -EmbedderTestGLSurface::EmbedderTestGLSurface() { +TestGLSurface::TestGLSurface() { display_ = ::eglGetDisplay(EGL_DEFAULT_DISPLAY); FML_CHECK(display_ != EGL_NO_DISPLAY); @@ -151,7 +154,7 @@ EmbedderTestGLSurface::EmbedderTestGLSurface() { } } -EmbedderTestGLSurface::~EmbedderTestGLSurface() { +TestGLSurface::~TestGLSurface() { auto result = ::eglDestroyContext(display_, onscreen_context_); FML_CHECK(result == EGL_TRUE) << GetEGLError(); @@ -168,7 +171,7 @@ EmbedderTestGLSurface::~EmbedderTestGLSurface() { FML_CHECK(result == EGL_TRUE); } -bool EmbedderTestGLSurface::MakeCurrent() { +bool TestGLSurface::MakeCurrent() { auto result = ::eglMakeCurrent(display_, onscreen_surface_, onscreen_surface_, onscreen_context_); @@ -179,7 +182,7 @@ bool EmbedderTestGLSurface::MakeCurrent() { return result == EGL_TRUE; } -bool EmbedderTestGLSurface::ClearCurrent() { +bool TestGLSurface::ClearCurrent() { auto result = ::eglMakeCurrent(display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); @@ -190,7 +193,7 @@ bool EmbedderTestGLSurface::ClearCurrent() { return result == EGL_TRUE; } -bool EmbedderTestGLSurface::Present() { +bool TestGLSurface::Present() { auto result = ::eglSwapBuffers(display_, onscreen_surface_); if (result == EGL_FALSE) { @@ -200,12 +203,12 @@ bool EmbedderTestGLSurface::Present() { return result == EGL_TRUE; } -uint32_t EmbedderTestGLSurface::GetFramebuffer() { +uint32_t TestGLSurface::GetFramebuffer() { // Return FBO0 return 0; } -bool EmbedderTestGLSurface::MakeResourceCurrent() { +bool TestGLSurface::MakeResourceCurrent() { auto result = ::eglMakeCurrent(display_, offscreen_surface_, offscreen_surface_, offscreen_context_); @@ -217,7 +220,10 @@ bool EmbedderTestGLSurface::MakeResourceCurrent() { return result == EGL_TRUE; } -void* EmbedderTestGLSurface::GetProcAddress(const char* name) { +void* TestGLSurface::GetProcAddress(const char* name) { + if (name == nullptr) { + return nullptr; + } auto symbol = ::eglGetProcAddress(name); if (symbol == NULL) { FML_LOG(ERROR) << "Could not fetch symbol for name: " << name; @@ -225,4 +231,40 @@ void* EmbedderTestGLSurface::GetProcAddress(const char* name) { return reinterpret_cast(symbol); } +sk_sp TestGLSurface::CreateContext() { + if (!MakeCurrent()) { + return nullptr; + } + + auto get_string = + reinterpret_cast(GetProcAddress("glGetString")); + + if (!get_string) { + return nullptr; + } + + auto c_version = reinterpret_cast(get_string(GL_VERSION)); + + if (c_version == NULL) { + return nullptr; + } + + GrGLGetProc get_proc = [](void* context, const char name[]) -> GrGLFuncPtr { + return reinterpret_cast( + reinterpret_cast(context)->GetProcAddress(name)); + }; + + std::string version(c_version); + auto interface = version.find("OpenGL ES") == std::string::npos + ? GrGLMakeAssembledGLInterface(this, get_proc) + : GrGLMakeAssembledGLESInterface(this, get_proc); + + if (!interface) { + return nullptr; + } + + return GrContext::MakeGL(interface); +} + +} // namespace testing } // namespace flutter diff --git a/engine/src/flutter/shell/platform/embedder/tests/embedder_test_gl_surface.h b/engine/src/flutter/testing/test_gl_surface.h similarity index 58% rename from engine/src/flutter/shell/platform/embedder/tests/embedder_test_gl_surface.h rename to engine/src/flutter/testing/test_gl_surface.h index 0d7da60431..3357ce56fe 100644 --- a/engine/src/flutter/shell/platform/embedder/tests/embedder_test_gl_surface.h +++ b/engine/src/flutter/testing/test_gl_surface.h @@ -2,19 +2,22 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef FLUTTER_SHELL_PLATFORM_EMBEDDER_TESTS_EMBEDDER_TEST_GL_SURFACE_H_ -#define FLUTTER_SHELL_PLATFORM_EMBEDDER_TESTS_EMBEDDER_TEST_GL_SURFACE_H_ +#ifndef FLUTTER_TESTING_TEST_GL_SURFACE_H_ +#define FLUTTER_TESTING_TEST_GL_SURFACE_H_ + +#include #include "flutter/fml/macros.h" -#include "flutter/shell/platform/embedder/embedder.h" +#include "third_party/skia/include/gpu/GrContext.h" namespace flutter { +namespace testing { -class EmbedderTestGLSurface { +class TestGLSurface { public: - EmbedderTestGLSurface(); + TestGLSurface(); - ~EmbedderTestGLSurface(); + ~TestGLSurface(); bool MakeCurrent(); @@ -28,11 +31,13 @@ class EmbedderTestGLSurface { void* GetProcAddress(const char* name); + sk_sp CreateContext(); + private: // Importing the EGL.h pulls in platform headers which are problematic - // (especially X11 which #defineds types like Bool). Any TUs importing this - // header then become susceptible to failures because of platform specific - // craziness. Don't expose EGL internals via this header. + // (especially X11 which #defineds types like Bool). Any TUs importing + // this header then become susceptible to failures because of platform + // specific craziness. Don't expose EGL internals via this header. using EGLDisplay = void*; using EGLContext = void*; using EGLSurface = void*; @@ -43,9 +48,10 @@ class EmbedderTestGLSurface { EGLSurface onscreen_surface_; EGLSurface offscreen_surface_; - FML_DISALLOW_COPY_AND_ASSIGN(EmbedderTestGLSurface); + FML_DISALLOW_COPY_AND_ASSIGN(TestGLSurface); }; +} // namespace testing } // namespace flutter -#endif // FLUTTER_SHELL_PLATFORM_EMBEDDER_TESTS_EMBEDDER_TEST_GL_SURFACE_H_ +#endif // FLUTTER_TESTING_TEST_GL_SURFACE_H_ diff --git a/engine/src/flutter/testing/testing.cc b/engine/src/flutter/testing/testing.cc index 2e2225a568..270d6f00b7 100644 --- a/engine/src/flutter/testing/testing.cc +++ b/engine/src/flutter/testing/testing.cc @@ -4,6 +4,8 @@ #include "testing.h" +#include "flutter/fml/file.h" + namespace flutter { namespace testing { @@ -11,5 +13,36 @@ std::string GetCurrentTestName() { return ::testing::UnitTest::GetInstance()->current_test_info()->name(); } +fml::UniqueFD OpenFixture(std::string fixture_name) { + if (fixture_name.size() == 0) { + FML_LOG(ERROR) << "Invalid fixture name."; + return {}; + } + + auto fixtures_directory = + OpenDirectory(GetFixturesPath(), // path + false, // create + fml::FilePermission::kRead // permission + ); + + if (!fixtures_directory.is_valid()) { + FML_LOG(ERROR) << "Could not open fixtures directory."; + return {}; + } + + auto fixture_fd = fml::OpenFile(fixtures_directory, // base directory + fixture_name.c_str(), // path + false, // create + fml::FilePermission::kRead // permission + ); + if (!fixture_fd.is_valid()) { + FML_LOG(ERROR) << "Could not open fixture for path: " << fixture_name + << "."; + return {}; + } + + return fixture_fd; +} + } // namespace testing } // namespace flutter diff --git a/engine/src/flutter/testing/testing.h b/engine/src/flutter/testing/testing.h index 00fe380648..fc4fe6a4d8 100644 --- a/engine/src/flutter/testing/testing.h +++ b/engine/src/flutter/testing/testing.h @@ -7,6 +7,7 @@ #include +#include "flutter/fml/file.h" #include "gtest/gtest.h" namespace flutter { @@ -17,6 +18,8 @@ namespace testing { // error. const char* GetFixturesPath(); +fml::UniqueFD OpenFixture(std::string fixture_name); + std::string GetCurrentTestName(); } // namespace testing diff --git a/engine/src/flutter/testing/thread_test.cc b/engine/src/flutter/testing/thread_test.cc index 986afd4e62..deb371e63b 100644 --- a/engine/src/flutter/testing/thread_test.cc +++ b/engine/src/flutter/testing/thread_test.cc @@ -23,6 +23,7 @@ void ThreadTest::TearDown() { thread_task_runner_ = nullptr; thread_ = nullptr; current_task_runner_ = nullptr; + extra_threads_.clear(); } fml::RefPtr ThreadTest::GetCurrentTaskRunner() { @@ -33,5 +34,12 @@ fml::RefPtr ThreadTest::GetThreadTaskRunner() { return thread_task_runner_; } +fml::RefPtr ThreadTest::CreateNewThread(std::string name) { + auto thread = std::make_unique(name); + auto runner = thread->GetTaskRunner(); + extra_threads_.emplace_back(std::move(thread)); + return runner; +} + } // namespace testing } // namespace flutter diff --git a/engine/src/flutter/testing/thread_test.h b/engine/src/flutter/testing/thread_test.h index 6d168b0d0c..270628b114 100644 --- a/engine/src/flutter/testing/thread_test.h +++ b/engine/src/flutter/testing/thread_test.h @@ -6,6 +6,7 @@ #define FLUTTER_TESTING_THREAD_TEST_H_ #include +#include #include "flutter/fml/macros.h" #include "flutter/fml/message_loop.h" @@ -22,6 +23,8 @@ class ThreadTest : public ::testing::Test { fml::RefPtr GetThreadTaskRunner(); + fml::RefPtr CreateNewThread(std::string name = ""); + protected: // |testing::Test| void SetUp() override; @@ -33,6 +36,7 @@ class ThreadTest : public ::testing::Test { std::unique_ptr thread_; fml::RefPtr thread_task_runner_; fml::RefPtr current_task_runner_; + std::vector> extra_threads_; }; } // namespace testing