diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc index aa397938bb957..8e56920a32868 100644 --- a/shell/platform/embedder/embedder.cc +++ b/shell/platform/embedder/embedder.cc @@ -902,3 +902,18 @@ void FlutterEngineTraceEventDurationEnd(const char* name) { void FlutterEngineTraceEventInstant(const char* name) { fml::tracing::TraceEventInstant0("flutter", name); } + +FlutterEngineResult FlutterEnginePostRenderThreadTask(FlutterEngine engine, + VoidCallback callback, + void* baton) { + if (engine == nullptr || callback == nullptr) { + return kInvalidArguments; + } + + auto task = [callback, baton]() { callback(baton); }; + + return reinterpret_cast(engine)->PostRenderThreadTask( + task) + ? kSuccess + : kInternalInconsistency; +} diff --git a/shell/platform/embedder/embedder.h b/shell/platform/embedder/embedder.h index 0be1fae740ad2..bf2343ec6e728 100644 --- a/shell/platform/embedder/embedder.h +++ b/shell/platform/embedder/embedder.h @@ -688,6 +688,14 @@ void FlutterEngineTraceEventDurationEnd(const char* name); FLUTTER_EXPORT void FlutterEngineTraceEventInstant(const char* name); +// Posts a task onto the Flutter render thread. Typically, this may be called +// from any thread as long as a |FlutterEngineShutdown| on the specific engine +// has not already been initiated. +FLUTTER_EXPORT +FlutterEngineResult FlutterEnginePostRenderThreadTask(FlutterEngine engine, + VoidCallback callback, + void* callback_data); + #if defined(__cplusplus) } // extern "C" #endif diff --git a/shell/platform/embedder/embedder_engine.cc b/shell/platform/embedder/embedder_engine.cc index 559840bb8d5f0..63083bcef1b4d 100644 --- a/shell/platform/embedder/embedder_engine.cc +++ b/shell/platform/embedder/embedder_engine.cc @@ -203,4 +203,13 @@ bool EmbedderEngine::OnVsyncEvent(intptr_t baton, frame_target_time); } +bool EmbedderEngine::PostRenderThreadTask(fml::closure task) { + if (!IsValid()) { + return false; + } + + shell_->GetTaskRunners().GetGPUTaskRunner()->PostTask(task); + return true; +} + } // namespace shell diff --git a/shell/platform/embedder/embedder_engine.h b/shell/platform/embedder/embedder_engine.h index 9975eea25d5a1..52b528e3a2ec3 100644 --- a/shell/platform/embedder/embedder_engine.h +++ b/shell/platform/embedder/embedder_engine.h @@ -63,6 +63,8 @@ class EmbedderEngine { fml::TimePoint frame_start_time, fml::TimePoint frame_target_time); + bool PostRenderThreadTask(fml::closure task); + private: const ThreadHost thread_host_; std::unique_ptr shell_;