diff options
author | 2019-08-21 13:52:59 -0700 | |
---|---|---|
committer | 2019-10-01 17:56:39 -0700 | |
commit | fe94a225a556265e93b1ebfe520d3637fe7cc67d (patch) | |
tree | 0c72ea02c9b193f1144fdf9f16b117eb2573dc91 /services/surfaceflinger/SurfaceFlinger.cpp | |
parent | 3809d1d616f95442aad5a45628d72a0726b534ec (diff) |
[Mirror Layers] Added mirrorSurface API to enable mirroring (3/4)
Added a new SurfaceComposer API called mirrorSurface that allows a
client to request a mirror of a particular heirarchy starting from the
passed in layer. The API will return a SurfaceControl that's the parent
of the mirrored layer that can be updated by the client.
Test: MirrorLayerTest
Bug: 131622422
Change-Id: Ia6047f0334eabfc59d6222b2edfd4e9576ba31e5
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 86e73c2481..a9fad1e21b 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -3388,6 +3388,35 @@ uint32_t SurfaceFlinger::addInputWindowCommands(const InputWindowCommands& input return flags; } +status_t SurfaceFlinger::mirrorLayer(const sp<Client>& client, const sp<IBinder>& mirrorFromHandle, + sp<IBinder>* outHandle) { + if (!mirrorFromHandle) { + return NAME_NOT_FOUND; + } + + sp<Layer> mirrorLayer; + sp<Layer> mirrorFrom; + String8 uniqueName = getUniqueLayerName(String8("MirrorRoot")); + + { + Mutex::Autolock _l(mStateLock); + mirrorFrom = fromHandle(mirrorFromHandle); + if (!mirrorFrom) { + return NAME_NOT_FOUND; + } + + status_t result = createContainerLayer(client, uniqueName, -1, -1, 0, LayerMetadata(), + outHandle, &mirrorLayer); + if (result != NO_ERROR) { + return result; + } + + mirrorLayer->mClonedChild = mirrorFrom->createClone(); + } + + return addClientLayer(client, *outHandle, nullptr, mirrorLayer, nullptr, nullptr, false); +} + status_t SurfaceFlinger::createLayer(const String8& name, const sp<Client>& client, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags, LayerMetadata metadata, sp<IBinder>* handle, |