• C
    Allow embedders to specify a render task runner description. (#13124) · bf81971f
    Chinmay Garde 提交于
    Embedders may use this to specify a thread whose event loop is managed by them
    instead of the engine. In addition, specifying the same task runner for both
    the platform and render task runners allows embedders to effectively perform
    GPU rendering operations on the platform thread.
    
    To affect this change, the following non breaking changes to the API have been
    made:
    
    * The `FlutterCustomTaskRunners` struct now has a new field `render_task_runner`
      for the specification of a custom render task runner.
    * The `FlutterTaskRunnerDescription` has a new field `identifier`. Embedders
      must supply a unique identifier for each task runner they specify. In
      addition, when describing multiple task runners that run their tasks on the
      same thread, their identifiers must match.
    * The embedder may need to process tasks during `FlutterEngineRun` and
      `FlutterEngineShutdown`. However, the embedder doesn't have the Flutter engine
      handle before `FlutterEngineRun` and is supposed to relinquish handle right
      before `FlutterEngineShutdown`. Since the embedder needs the Flutter engine
      handle to service tasks on other threads while these calls are underway,
      there exist opportunities for deadlock. To work around this scenario, three
      new calls have been added that allow more deliberate management of the Flutter
      engine instance.
      * `FlutterEngineRun` can be replaced with `FlutterEngineInitialize` and
        `FlutterEngineRunInitialized`. The embedder can obtain a handle to the
        engine after the first call but the engine will not post any tasks to custom
        task runners specified by the embedder till the
        `FlutterEngineRunInitialized` call. Embedders can guard the Flutter engine
        handle behind a mutex for safe task runner interop.
      * `FlutterEngineShutdown` can be preceded by the `FlutterEngineDeinitialize`
        call. After this call the Flutter engine will no longer post tasks onto
        embedder managed task runners. It is still embedder responsibility to
        collect the Flutter engine handle via `FlutterEngineShutdown`.
    * To maintain backwards compatibility with the old APIs, `FlutterEngineRun` is
      now just a convenience for `FlutterEngineInitialize` and
      `FlutterEngineRunInitilaized`. `FlutterEngineShutdown` now implicitly calls
      `FlutterEngineDeinitialize` as well. This allows existing users who don't care
      are custom task runner interop to keep using the old APIs.
    * Adds complete test coverage for both old and new paths.
    
    Fixes https://github.com/flutter/flutter/issues/42460
    Prerequisite for https://github.com/flutter/flutter/issues/17579
    bf81971f
embedder.h 62.7 KB