AidlComposer: use a reader/writer per display
In order to call HWC from different threads, with one thread per
display, separate commands and their results per display.
AidlComposer:
- Add a maps from display to a ComposerClientReader and a
ComposerClientWriter. Each reader/writer will be used by a single
display. AidlComposer is generally threadsafe, except for these
objects. (The other members are pointers to proxy binders, which can
have their methods safely called from multiple threads.) Use an
ftl::SharedMutex to guard access to the maps. The client is
responsible for ensuring they do not attempt to access the same
reader/writer concurrently from multiple threads. Different threads
can access different readers/writers concurrently, but the mutex
ensures that adding or deleting an entry does not impact access to the
objects.
- Add a `Display` parameter to execute[Commands] and resetCommands, so
that it only affects the intended writer. The callers already know
which Display they care about, so pass it in.
- If no displays support DisplayCapability.MULTI_THREADED_PRESENT, use a
single reader for all displays. This is required for backwards
compatibility.
[Hidl]ComposerHal, MockComposer:
- update APIs for executeCommands and resetCommands
- implement onHotPlug[Connect/Disconnect]
HWComposer, fuzzer:
- pass the display to new APIs
Bug: 241285491
Test: make, boot
Change-Id: I2b62e4965b12b3c653e6c00f9f6ab4f48b506b18
diff --git a/services/surfaceflinger/DisplayHardware/ComposerHal.h b/services/surfaceflinger/DisplayHardware/ComposerHal.h
index b02f867..a9bf282 100644
--- a/services/surfaceflinger/DisplayHardware/ComposerHal.h
+++ b/services/surfaceflinger/DisplayHardware/ComposerHal.h
@@ -110,10 +110,10 @@
// Reset all pending commands in the command buffer. Useful if you want to
// skip a frame but have already queued some commands.
- virtual void resetCommands() = 0;
+ virtual void resetCommands(Display) = 0;
// Explicitly flush all pending commands in the command buffer.
- virtual Error executeCommands() = 0;
+ virtual Error executeCommands(Display) = 0;
virtual uint32_t getMaxVirtualDisplayCount() = 0;
virtual Error createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat*,
@@ -283,6 +283,8 @@
virtual Error getPhysicalDisplayOrientation(Display displayId,
AidlTransform* outDisplayOrientation) = 0;
virtual Error getOverlaySupport(V3_0::OverlayProperties* outProperties) = 0;
+ virtual void onHotplugConnect(Display) = 0;
+ virtual void onHotplugDisconnect(Display) = 0;
};
} // namespace Hwc2