diff options
author | 2019-01-08 10:08:52 -0800 | |
---|---|---|
committer | 2019-01-10 09:29:39 -0800 | |
commit | 35187b32107eff2ded94adf29c19192524537ee1 (patch) | |
tree | b5e7d6dcfd95e6087ffa3644f982e434fe0cf467 /services/surfaceflinger/Client.cpp | |
parent | 6e1ceefbba451a2778c192044ead4bd8add9f394 (diff) |
blast: [FIXED] create SurfaceControl from Surface parent
Create a child SurfaceControl from a parent Surface. This is done
by sending the parent IGBP to SurfaceFlinger who gets the parent
Layer information.
This is change is necessary for public SurfaceControl because
createScopedConnection is deprecated.
[Previous version used Layer::mStateMutex which was removed hours
before this patch went in. Presubmit did not catch the conflict
so the patch was immediately reverted. This version does not have
that conflict.]
Test: atest CtsViewTestCases:android.view.cts.ASurfaceControlTest
Bug: 80477568
Change-Id: Ibbfb2851ff71c21cce1761cab434b85735e35515
Diffstat (limited to 'services/surfaceflinger/Client.cpp')
-rw-r--r-- | services/surfaceflinger/Client.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/services/surfaceflinger/Client.cpp b/services/surfaceflinger/Client.cpp index 4f6fb1cca6..0e447d87f2 100644 --- a/services/surfaceflinger/Client.cpp +++ b/services/surfaceflinger/Client.cpp @@ -95,6 +95,26 @@ status_t Client::createSurface( ownerUid, handle, gbp, &parent); } +status_t Client::createWithSurfaceParent(const String8& name, uint32_t w, uint32_t h, + PixelFormat format, uint32_t flags, + const sp<IGraphicBufferProducer>& parent, + int32_t windowType, int32_t ownerUid, sp<IBinder>* handle, + sp<IGraphicBufferProducer>* gbp) { + if (mFlinger->authenticateSurfaceTexture(parent) == false) { + return BAD_VALUE; + } + + const auto& layer = (static_cast<MonitoredProducer*>(parent.get()))->getLayer(); + if (layer == nullptr) { + return BAD_VALUE; + } + + sp<IBinder> parentHandle = layer->getHandle(); + + return createSurface(name, w, h, format, flags, parentHandle, windowType, ownerUid, handle, + gbp); +} + status_t Client::clearLayerFrameStats(const sp<IBinder>& handle) const { sp<Layer> layer = getLayerUser(handle); if (layer == nullptr) { |