Loading libs/gui/Surface.cpp +10 −12 Original line number Diff line number Diff line Loading @@ -44,8 +44,6 @@ #include <gui/AidlStatusUtil.h> #include <gui/BufferItem.h> #include <gui/IProducerListener.h> #include <gui/ISurfaceComposer.h> #include <gui/LayerState.h> #include <private/gui/ComposerService.h> Loading Loading @@ -1860,30 +1858,31 @@ bool Surface::transformToDisplayInverse() const { } int Surface::connect(int api) { static sp<IProducerListener> listener = new StubProducerListener(); static sp<SurfaceListener> listener = new StubSurfaceListener(); return connect(api, listener); } int Surface::connect(int api, const sp<IProducerListener>& listener) { int Surface::connect(int api, const sp<SurfaceListener>& listener) { return connect(api, listener, false); } int Surface::connect( int api, bool reportBufferRemoval, const sp<SurfaceListener>& sListener) { if (sListener != nullptr) { mListenerProxy = new ProducerListenerProxy(this, sListener); } return connect(api, mListenerProxy, reportBufferRemoval); return connect(api, sListener, reportBufferRemoval); } int Surface::connect( int api, const sp<IProducerListener>& listener, bool reportBufferRemoval) { int Surface::connect(int api, const sp<SurfaceListener>& listener, bool reportBufferRemoval) { ATRACE_CALL(); ALOGV("Surface::connect"); Mutex::Autolock lock(mMutex); IGraphicBufferProducer::QueueBufferOutput output; mReportRemovedBuffers = reportBufferRemoval; int err = mGraphicBufferProducer->connect(listener, api, mProducerControlledByApp, &output); if (listener != nullptr) { mListenerProxy = new ProducerListenerProxy(this, listener); } int err = mGraphicBufferProducer->connect(mListenerProxy, api, mProducerControlledByApp, &output); if (err == NO_ERROR) { mDefaultWidth = output.width; mDefaultHeight = output.height; Loading Loading @@ -1911,7 +1910,6 @@ int Surface::connect( return err; } int Surface::disconnect(int api, IGraphicBufferProducer::DisconnectMode mode) { ATRACE_CALL(); ALOGV("Surface::disconnect"); Loading libs/gui/include/gui/Surface.h +14 −4 Original line number Diff line number Diff line Loading @@ -56,6 +56,16 @@ public: virtual bool needsReleaseNotify() = 0; virtual void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& buffers) = 0; virtual void onBufferDetached(int slot) = 0; }; class StubSurfaceListener : public SurfaceListener { public: virtual ~StubSurfaceListener() {} virtual void onBufferReleased() override {} virtual bool needsReleaseNotify() { return false; } virtual void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& /*buffers*/) override {} virtual void onBufferDetached(int /*slot*/) override {} }; /* Loading Loading @@ -357,15 +367,13 @@ public: virtual int unlockAndPost(); virtual int query(int what, int* value) const; virtual int connect(int api, const sp<IProducerListener>& listener); virtual int connect(int api, const sp<SurfaceListener>& listener); // When reportBufferRemoval is true, clients must call getAndFlushRemovedBuffers to fetch // GraphicBuffers removed from this surface after a dequeueBuffer, detachNextBuffer or // attachBuffer call. This allows clients with their own buffer caches to free up buffers no // longer in use by this surface. virtual int connect( int api, const sp<IProducerListener>& listener, bool reportBufferRemoval); virtual int connect(int api, const sp<SurfaceListener>& listener, bool reportBufferRemoval); virtual int detachNextBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence); virtual int attachBuffer(ANativeWindowBuffer*); Loading Loading @@ -422,6 +430,8 @@ protected: return mSurfaceListener->needsReleaseNotify(); } virtual void onBufferDetached(int slot) { mSurfaceListener->onBufferDetached(slot); } virtual void onBuffersDiscarded(const std::vector<int32_t>& slots); private: wp<Surface> mParent; Loading libs/gui/tests/BLASTBufferQueue_test.cpp +15 −1 Original line number Diff line number Diff line Loading @@ -1269,6 +1269,20 @@ public: } }; class TestSurfaceListener : public SurfaceListener { public: sp<IGraphicBufferProducer> mIgbp; TestSurfaceListener(const sp<IGraphicBufferProducer>& igbp) : mIgbp(igbp) {} void onBufferReleased() override { sp<GraphicBuffer> buffer; sp<Fence> fence; mIgbp->detachNextBuffer(&buffer, &fence); } bool needsReleaseNotify() override { return true; } void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& /*buffers*/) override {} void onBufferDetached(int /*slot*/) {} }; TEST_F(BLASTBufferQueueTest, CustomProducerListener) { BLASTBufferQueueHelper adapter(mSurfaceControl, mDisplayWidth, mDisplayHeight); sp<IGraphicBufferProducer> igbProducer = adapter.getIGraphicBufferProducer(); Loading Loading @@ -1327,7 +1341,7 @@ TEST_F(BLASTBufferQueueTest, TransformHint) { ASSERT_EQ(ui::Transform::ROT_0, static_cast<ui::Transform::RotationFlags>(transformHint)); ASSERT_EQ(NO_ERROR, surface->connect(NATIVE_WINDOW_API_CPU, new TestProducerListener(igbProducer))); surface->connect(NATIVE_WINDOW_API_CPU, new TestSurfaceListener(igbProducer))); // After connecting to the surface, we should get the correct hint. surface->query(NATIVE_WINDOW_TRANSFORM_HINT, &transformHint); Loading libs/gui/tests/Surface_test.cpp +4 −5 Original line number Diff line number Diff line Loading @@ -27,7 +27,6 @@ #include <configstore/Utils.h> #include <gui/AidlStatusUtil.h> #include <gui/BufferItemConsumer.h> #include <gui/IProducerListener.h> #include <gui/ISurfaceComposer.h> #include <gui/Surface.h> #include <gui/SurfaceComposerClient.h> Loading Loading @@ -82,7 +81,7 @@ public: virtual void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& buffers) { mDiscardedBuffers.insert(mDiscardedBuffers.end(), buffers.begin(), buffers.end()); } virtual void onBufferDetached(int /*slot*/) {} int getReleaseNotifyCount() const { return mBuffersReleased; } Loading Loading @@ -491,7 +490,7 @@ TEST_F(SurfaceTest, GetAndFlushRemovedBuffers) { sp<Surface> surface = new Surface(producer); sp<ANativeWindow> window(surface); sp<StubProducerListener> listener = new StubProducerListener(); sp<StubSurfaceListener> listener = new StubSurfaceListener(); ASSERT_EQ(OK, surface->connect( NATIVE_WINDOW_API_CPU, /*listener*/listener, Loading Loading @@ -2154,7 +2153,7 @@ TEST_F(SurfaceTest, BatchOperations) { sp<CpuConsumer> cpuConsumer = new CpuConsumer(consumer, 1); sp<Surface> surface = new Surface(producer); sp<ANativeWindow> window(surface); sp<StubProducerListener> listener = new StubProducerListener(); sp<StubSurfaceListener> listener = new StubSurfaceListener(); ASSERT_EQ(OK, surface->connect(NATIVE_WINDOW_API_CPU, /*listener*/listener, /*reportBufferRemoval*/false)); Loading Loading @@ -2206,7 +2205,7 @@ TEST_F(SurfaceTest, BatchIllegalOperations) { sp<CpuConsumer> cpuConsumer = new CpuConsumer(consumer, 1); sp<Surface> surface = new Surface(producer); sp<ANativeWindow> window(surface); sp<StubProducerListener> listener = new StubProducerListener(); sp<StubSurfaceListener> listener = new StubSurfaceListener(); ASSERT_EQ(OK, surface->connect(NATIVE_WINDOW_API_CPU, /*listener*/listener, /*reportBufferRemoval*/false)); Loading Loading
libs/gui/Surface.cpp +10 −12 Original line number Diff line number Diff line Loading @@ -44,8 +44,6 @@ #include <gui/AidlStatusUtil.h> #include <gui/BufferItem.h> #include <gui/IProducerListener.h> #include <gui/ISurfaceComposer.h> #include <gui/LayerState.h> #include <private/gui/ComposerService.h> Loading Loading @@ -1860,30 +1858,31 @@ bool Surface::transformToDisplayInverse() const { } int Surface::connect(int api) { static sp<IProducerListener> listener = new StubProducerListener(); static sp<SurfaceListener> listener = new StubSurfaceListener(); return connect(api, listener); } int Surface::connect(int api, const sp<IProducerListener>& listener) { int Surface::connect(int api, const sp<SurfaceListener>& listener) { return connect(api, listener, false); } int Surface::connect( int api, bool reportBufferRemoval, const sp<SurfaceListener>& sListener) { if (sListener != nullptr) { mListenerProxy = new ProducerListenerProxy(this, sListener); } return connect(api, mListenerProxy, reportBufferRemoval); return connect(api, sListener, reportBufferRemoval); } int Surface::connect( int api, const sp<IProducerListener>& listener, bool reportBufferRemoval) { int Surface::connect(int api, const sp<SurfaceListener>& listener, bool reportBufferRemoval) { ATRACE_CALL(); ALOGV("Surface::connect"); Mutex::Autolock lock(mMutex); IGraphicBufferProducer::QueueBufferOutput output; mReportRemovedBuffers = reportBufferRemoval; int err = mGraphicBufferProducer->connect(listener, api, mProducerControlledByApp, &output); if (listener != nullptr) { mListenerProxy = new ProducerListenerProxy(this, listener); } int err = mGraphicBufferProducer->connect(mListenerProxy, api, mProducerControlledByApp, &output); if (err == NO_ERROR) { mDefaultWidth = output.width; mDefaultHeight = output.height; Loading Loading @@ -1911,7 +1910,6 @@ int Surface::connect( return err; } int Surface::disconnect(int api, IGraphicBufferProducer::DisconnectMode mode) { ATRACE_CALL(); ALOGV("Surface::disconnect"); Loading
libs/gui/include/gui/Surface.h +14 −4 Original line number Diff line number Diff line Loading @@ -56,6 +56,16 @@ public: virtual bool needsReleaseNotify() = 0; virtual void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& buffers) = 0; virtual void onBufferDetached(int slot) = 0; }; class StubSurfaceListener : public SurfaceListener { public: virtual ~StubSurfaceListener() {} virtual void onBufferReleased() override {} virtual bool needsReleaseNotify() { return false; } virtual void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& /*buffers*/) override {} virtual void onBufferDetached(int /*slot*/) override {} }; /* Loading Loading @@ -357,15 +367,13 @@ public: virtual int unlockAndPost(); virtual int query(int what, int* value) const; virtual int connect(int api, const sp<IProducerListener>& listener); virtual int connect(int api, const sp<SurfaceListener>& listener); // When reportBufferRemoval is true, clients must call getAndFlushRemovedBuffers to fetch // GraphicBuffers removed from this surface after a dequeueBuffer, detachNextBuffer or // attachBuffer call. This allows clients with their own buffer caches to free up buffers no // longer in use by this surface. virtual int connect( int api, const sp<IProducerListener>& listener, bool reportBufferRemoval); virtual int connect(int api, const sp<SurfaceListener>& listener, bool reportBufferRemoval); virtual int detachNextBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence); virtual int attachBuffer(ANativeWindowBuffer*); Loading Loading @@ -422,6 +430,8 @@ protected: return mSurfaceListener->needsReleaseNotify(); } virtual void onBufferDetached(int slot) { mSurfaceListener->onBufferDetached(slot); } virtual void onBuffersDiscarded(const std::vector<int32_t>& slots); private: wp<Surface> mParent; Loading
libs/gui/tests/BLASTBufferQueue_test.cpp +15 −1 Original line number Diff line number Diff line Loading @@ -1269,6 +1269,20 @@ public: } }; class TestSurfaceListener : public SurfaceListener { public: sp<IGraphicBufferProducer> mIgbp; TestSurfaceListener(const sp<IGraphicBufferProducer>& igbp) : mIgbp(igbp) {} void onBufferReleased() override { sp<GraphicBuffer> buffer; sp<Fence> fence; mIgbp->detachNextBuffer(&buffer, &fence); } bool needsReleaseNotify() override { return true; } void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& /*buffers*/) override {} void onBufferDetached(int /*slot*/) {} }; TEST_F(BLASTBufferQueueTest, CustomProducerListener) { BLASTBufferQueueHelper adapter(mSurfaceControl, mDisplayWidth, mDisplayHeight); sp<IGraphicBufferProducer> igbProducer = adapter.getIGraphicBufferProducer(); Loading Loading @@ -1327,7 +1341,7 @@ TEST_F(BLASTBufferQueueTest, TransformHint) { ASSERT_EQ(ui::Transform::ROT_0, static_cast<ui::Transform::RotationFlags>(transformHint)); ASSERT_EQ(NO_ERROR, surface->connect(NATIVE_WINDOW_API_CPU, new TestProducerListener(igbProducer))); surface->connect(NATIVE_WINDOW_API_CPU, new TestSurfaceListener(igbProducer))); // After connecting to the surface, we should get the correct hint. surface->query(NATIVE_WINDOW_TRANSFORM_HINT, &transformHint); Loading
libs/gui/tests/Surface_test.cpp +4 −5 Original line number Diff line number Diff line Loading @@ -27,7 +27,6 @@ #include <configstore/Utils.h> #include <gui/AidlStatusUtil.h> #include <gui/BufferItemConsumer.h> #include <gui/IProducerListener.h> #include <gui/ISurfaceComposer.h> #include <gui/Surface.h> #include <gui/SurfaceComposerClient.h> Loading Loading @@ -82,7 +81,7 @@ public: virtual void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& buffers) { mDiscardedBuffers.insert(mDiscardedBuffers.end(), buffers.begin(), buffers.end()); } virtual void onBufferDetached(int /*slot*/) {} int getReleaseNotifyCount() const { return mBuffersReleased; } Loading Loading @@ -491,7 +490,7 @@ TEST_F(SurfaceTest, GetAndFlushRemovedBuffers) { sp<Surface> surface = new Surface(producer); sp<ANativeWindow> window(surface); sp<StubProducerListener> listener = new StubProducerListener(); sp<StubSurfaceListener> listener = new StubSurfaceListener(); ASSERT_EQ(OK, surface->connect( NATIVE_WINDOW_API_CPU, /*listener*/listener, Loading Loading @@ -2154,7 +2153,7 @@ TEST_F(SurfaceTest, BatchOperations) { sp<CpuConsumer> cpuConsumer = new CpuConsumer(consumer, 1); sp<Surface> surface = new Surface(producer); sp<ANativeWindow> window(surface); sp<StubProducerListener> listener = new StubProducerListener(); sp<StubSurfaceListener> listener = new StubSurfaceListener(); ASSERT_EQ(OK, surface->connect(NATIVE_WINDOW_API_CPU, /*listener*/listener, /*reportBufferRemoval*/false)); Loading Loading @@ -2206,7 +2205,7 @@ TEST_F(SurfaceTest, BatchIllegalOperations) { sp<CpuConsumer> cpuConsumer = new CpuConsumer(consumer, 1); sp<Surface> surface = new Surface(producer); sp<ANativeWindow> window(surface); sp<StubProducerListener> listener = new StubProducerListener(); sp<StubSurfaceListener> listener = new StubSurfaceListener(); ASSERT_EQ(OK, surface->connect(NATIVE_WINDOW_API_CPU, /*listener*/listener, /*reportBufferRemoval*/false)); Loading