diff options
Diffstat (limited to 'libs')
| -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-- | libs/nativewindow/include/android/hardware_buffer.h | 11 |
5 files changed, 78 insertions, 6 deletions
diff --git a/libs/gui/ISurfaceComposerClient.cpp b/libs/gui/ISurfaceComposerClient.cpp index a6890eeb19..16554b1a77 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, DESTROY_SURFACE, CLEAR_LAYER_FRAME_STATS, GET_LAYER_FRAME_STATS, @@ -57,6 +58,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 destroySurface(const sp<IBinder>& handle) override { return callRemote<decltype(&ISurfaceComposerClient::destroySurface)>(Tag::DESTROY_SURFACE, handle); @@ -92,6 +105,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::DESTROY_SURFACE: return callLocal(data, reply, &ISurfaceComposerClient::destroySurface); case Tag::CLEAR_LAYER_FRAME_STATS: diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 824e43fb07..cee9153cf3 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -972,6 +972,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, @@ -1134,6 +1157,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 82b01b8cf0..0497a03b0e 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 destroySurface(const sp<IBinder>& handle) = 0; /* diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h index 4a8e01bec1..a6b85b174b 100644 --- a/libs/gui/include/gui/SurfaceComposerClient.h +++ b/libs/gui/include/gui/SurfaceComposerClient.h @@ -161,15 +161,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/libs/nativewindow/include/android/hardware_buffer.h b/libs/nativewindow/include/android/hardware_buffer.h index 03545a68ca..2796c75f04 100644 --- a/libs/nativewindow/include/android/hardware_buffer.h +++ b/libs/nativewindow/include/android/hardware_buffer.h @@ -208,6 +208,17 @@ enum AHardwareBuffer_UsageFlags { */ AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT = AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER, /** + * The buffer will be used as a composer HAL overlay layer. + * + * This flag is currently only needed when using ASurfaceTransaction_setBuffer + * to set a buffer. In all other cases, the framework adds this flag + * internally to buffers that could be presented in a composer overlay. + * ASurfaceTransaction_setBuffer is special because it uses buffers allocated + * directly through AHardwareBuffer_allocate instead of buffers allocated + * by the framework. + */ + AHARDWAREBUFFER_USAGE_COMPOSER_OVERLAY = 1ULL << 11, + /** * The buffer is protected from direct CPU access or being read by * non-secure hardware, such as video encoders. * |