Offload present to a separate thread
Make Output::present() return an ftl::Future. When offloading its HWC call, present will return a future that can be waited upon. In CompositionEngine::present, store a vector of futures and wait upon the results before returning. This allow's HWC's present to run in parallel with other work; in particular, present on other displays. Waiting here ensures that post-composition work does not start until present has completed. Future work may defer this even later. Reuse HwcAsyncWorker to run present on a separate thread. Add a new variable for determining whether to run validate in parallel, since the presence of the HwcAsyncWorker could just mean that we are offloading present. Read the new DisplayCapability to determine whether a display can be offloaded to a worker thread. Only run displays in parallel if they all have the DisplayCapability. Non HWC-enabled displays without the capability do not prevent other displays from being offloaded. They also run last, since they can run in parallel with HWC-enabled displays. (The ordering is now set by SurfaceFlinger, which places physical displays at the start of the list of outputs.) When telling a display to offload its present call, make it only last for a single frame. This simplifies the code while ensuring we do not leave it enabled unnecessarily. Leave a single present call on the main thread. This saves a thread-hop, while still allowing it to run in parallel with other HWC work. Only attempt to offload present if the appropriate trunk stable flag (or debug sysprop, "debug.sf.multithreaded_present") is set. Bug: 241285491 Bug: 259132483 Test: manual: perfetto trace Test: libcompositionengine_test Change-Id: Ib9d074671e32c95875ef7e0791dd95d6e595e47a
Loading
Please register or sign in to comment