diff options
author | 2019-01-08 10:08:52 -0800 | |
---|---|---|
committer | 2019-01-10 09:29:39 -0800 | |
commit | 35187b32107eff2ded94adf29c19192524537ee1 (patch) | |
tree | b5e7d6dcfd95e6087ffa3644f982e434fe0cf467 | |
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
-rw-r--r-- | libs/gui/ISurfaceComposerClient.cpp | 15 | ||||
-rw-r--r-- | libs/gui/SurfaceComposerClient.cpp | 24 | ||||
-rw-r--r-- | libs/gui/include/gui/ISurfaceComposerClient.h | 10 | ||||
-rw-r--r-- | libs/gui/include/gui/SurfaceComposerClient.h | 24 | ||||
-rw-r--r-- | services/surfaceflinger/Client.cpp | 20 | ||||
-rw-r--r-- | services/surfaceflinger/Client.h | 6 |
6 files changed, 93 insertions, 6 deletions
diff --git a/libs/gui/ISurfaceComposerClient.cpp b/libs/gui/ISurfaceComposerClient.cpp index 369f523ea4..928ef95aa8 100644 --- a/libs/gui/ISurfaceComposerClient.cpp +++ b/libs/gui/ISurfaceComposerClient.cpp @@ -31,6 +31,7 @@ namespace { // Anonymous enum class Tag : uint32_t { CREATE_SURFACE = IBinder::FIRST_CALL_TRANSACTION, + CREATE_WITH_SURFACE_PARENT, CLEAR_LAYER_FRAME_STATS, GET_LAYER_FRAME_STATS, LAST = GET_LAYER_FRAME_STATS, @@ -56,6 +57,18 @@ public: handle, gbp); } + status_t createWithSurfaceParent(const String8& name, uint32_t width, uint32_t height, + PixelFormat format, uint32_t flags, + const sp<IGraphicBufferProducer>& parent, int32_t windowType, + int32_t ownerUid, sp<IBinder>* handle, + sp<IGraphicBufferProducer>* gbp) override { + return callRemote<decltype( + &ISurfaceComposerClient::createWithSurfaceParent)>(Tag::CREATE_WITH_SURFACE_PARENT, + name, width, height, format, + flags, parent, windowType, + ownerUid, handle, gbp); + } + status_t clearLayerFrameStats(const sp<IBinder>& handle) const override { return callRemote<decltype( &ISurfaceComposerClient::clearLayerFrameStats)>(Tag::CLEAR_LAYER_FRAME_STATS, @@ -86,6 +99,8 @@ status_t BnSurfaceComposerClient::onTransact(uint32_t code, const Parcel& data, switch (tag) { case Tag::CREATE_SURFACE: return callLocal(data, reply, &ISurfaceComposerClient::createSurface); + case Tag::CREATE_WITH_SURFACE_PARENT: + return callLocal(data, reply, &ISurfaceComposerClient::createWithSurfaceParent); case Tag::CLEAR_LAYER_FRAME_STATS: return callLocal(data, reply, &ISurfaceComposerClient::clearLayerFrameStats); case Tag::GET_LAYER_FRAME_STATS: diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 6c39d6f1b8..8b9e4d7fee 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -977,6 +977,29 @@ sp<SurfaceControl> SurfaceComposerClient::createSurface( return s; } +sp<SurfaceControl> SurfaceComposerClient::createWithSurfaceParent(const String8& name, uint32_t w, + uint32_t h, PixelFormat format, + uint32_t flags, Surface* parent, + int32_t windowType, + int32_t ownerUid) { + sp<SurfaceControl> sur; + status_t err = mStatus; + + if (mStatus == NO_ERROR) { + sp<IBinder> handle; + sp<IGraphicBufferProducer> parentGbp = parent->getIGraphicBufferProducer(); + sp<IGraphicBufferProducer> gbp; + + err = mClient->createWithSurfaceParent(name, w, h, format, flags, parentGbp, windowType, + ownerUid, &handle, &gbp); + ALOGE_IF(err, "SurfaceComposerClient::createWithSurfaceParent error %s", strerror(-err)); + if (err == NO_ERROR) { + return new SurfaceControl(this, handle, gbp, true /* owned */); + } + } + return nullptr; +} + status_t SurfaceComposerClient::createSurfaceChecked( const String8& name, uint32_t w, @@ -1132,6 +1155,7 @@ status_t SurfaceComposerClient::getDisplayedContentSample(const sp<IBinder>& dis return ComposerService::getComposerService()->getDisplayedContentSample(display, maxFrames, timestamp, outStats); } + // ---------------------------------------------------------------------------- status_t ScreenshotClient::capture(const sp<IBinder>& display, const ui::Dataspace reqDataSpace, diff --git a/libs/gui/include/gui/ISurfaceComposerClient.h b/libs/gui/include/gui/ISurfaceComposerClient.h index 56ca197ff9..f443df8533 100644 --- a/libs/gui/include/gui/ISurfaceComposerClient.h +++ b/libs/gui/include/gui/ISurfaceComposerClient.h @@ -58,6 +58,16 @@ public: /* * Requires ACCESS_SURFACE_FLINGER permission */ + virtual status_t 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) = 0; + + /* + * Requires ACCESS_SURFACE_FLINGER permission + */ virtual status_t clearLayerFrameStats(const sp<IBinder>& handle) const = 0; /* diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h index e0cbb705c7..f16f7814e2 100644 --- a/libs/gui/include/gui/SurfaceComposerClient.h +++ b/libs/gui/include/gui/SurfaceComposerClient.h @@ -168,15 +168,27 @@ public: ); status_t createSurfaceChecked( - const String8& name,// name of the surface - uint32_t w, // width in pixel - uint32_t h, // height in pixel - PixelFormat format, // pixel-format desired + const String8& name, // name of the surface + uint32_t w, // width in pixel + uint32_t h, // height in pixel + PixelFormat format, // pixel-format desired sp<SurfaceControl>* outSurface, - uint32_t flags = 0, // usage flags + uint32_t flags = 0, // usage flags SurfaceControl* parent = nullptr, // parent int32_t windowType = -1, // from WindowManager.java (STATUS_BAR, INPUT_METHOD, etc.) - int32_t ownerUid = -1 // UID of the task + int32_t ownerUid = -1 // UID of the task + ); + + //! Create a surface + sp<SurfaceControl> createWithSurfaceParent( + const String8& name, // name of the surface + uint32_t w, // width in pixel + uint32_t h, // height in pixel + PixelFormat format, // pixel-format desired + uint32_t flags = 0, // usage flags + Surface* parent = nullptr, // parent + int32_t windowType = -1, // from WindowManager.java (STATUS_BAR, INPUT_METHOD, etc.) + int32_t ownerUid = -1 // UID of the task ); //! Create a virtual display 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) { diff --git a/services/surfaceflinger/Client.h b/services/surfaceflinger/Client.h index d0051dee1a..0f5ee4c85c 100644 --- a/services/surfaceflinger/Client.h +++ b/services/surfaceflinger/Client.h @@ -58,6 +58,12 @@ private: sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp); + virtual status_t 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); + virtual status_t clearLayerFrameStats(const sp<IBinder>& handle) const; virtual status_t getLayerFrameStats(const sp<IBinder>& handle, FrameStats* outStats) const; |