Loading services/surfaceflinger/BufferQueueLayer.cpp +57 −1 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ namespace android { BufferQueueLayer::BufferQueueLayer(const LayerCreationArgs& args) : BufferLayer(args) {} BufferQueueLayer::~BufferQueueLayer() { mContentsChangedListener->abandon(); mConsumer->abandon(); } Loading Loading @@ -480,7 +481,9 @@ void BufferQueueLayer::onFirstRef() { mFlinger->getFactory().createBufferLayerConsumer(consumer, mFlinger->getRenderEngine(), mTextureName, this); mConsumer->setConsumerUsageBits(getEffectiveUsage(0)); mConsumer->setContentsChangedListener(this); mContentsChangedListener = new ContentsChangedListener(this); mConsumer->setContentsChangedListener(mContentsChangedListener); mConsumer->setName(String8(mName.data(), mName.size())); // BufferQueueCore::mMaxDequeuedBufferCount is default to 1 Loading Loading @@ -552,4 +555,57 @@ sp<Layer> BufferQueueLayer::createClone() { return layer; } // ----------------------------------------------------------------------- // Interface implementation for BufferLayerConsumer::ContentsChangedListener // ----------------------------------------------------------------------- void BufferQueueLayer::ContentsChangedListener::onFrameAvailable(const BufferItem& item) { Mutex::Autolock lock(mMutex); if (mBufferQueueLayer != nullptr) { mBufferQueueLayer->onFrameAvailable(item); } } void BufferQueueLayer::ContentsChangedListener::onFrameReplaced(const BufferItem& item) { Mutex::Autolock lock(mMutex); if (mBufferQueueLayer != nullptr) { mBufferQueueLayer->onFrameReplaced(item); } } void BufferQueueLayer::ContentsChangedListener::onSidebandStreamChanged() { Mutex::Autolock lock(mMutex); if (mBufferQueueLayer != nullptr) { mBufferQueueLayer->onSidebandStreamChanged(); } } void BufferQueueLayer::ContentsChangedListener::onFrameDequeued(const uint64_t bufferId) { Mutex::Autolock lock(mMutex); if (mBufferQueueLayer != nullptr) { mBufferQueueLayer->onFrameDequeued(bufferId); } } void BufferQueueLayer::ContentsChangedListener::onFrameDetached(const uint64_t bufferId) { Mutex::Autolock lock(mMutex); if (mBufferQueueLayer != nullptr) { mBufferQueueLayer->onFrameDetached(bufferId); } } void BufferQueueLayer::ContentsChangedListener::onFrameCancelled(const uint64_t bufferId) { Mutex::Autolock lock(mMutex); if (mBufferQueueLayer != nullptr) { mBufferQueueLayer->onFrameCancelled(bufferId); } } void BufferQueueLayer::ContentsChangedListener::abandon() { Mutex::Autolock lock(mMutex); mBufferQueueLayer = nullptr; } // ----------------------------------------------------------------------- } // namespace android services/surfaceflinger/BufferQueueLayer.h +31 −10 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ namespace android { * This also implements onFrameAvailable(), which notifies SurfaceFlinger * that new data has arrived. */ class BufferQueueLayer : public BufferLayer, public BufferLayerConsumer::ContentsChangedListener { class BufferQueueLayer : public BufferLayer { public: // Only call while mStateLock is held explicit BufferQueueLayer(const LayerCreationArgs&); Loading Loading @@ -84,18 +84,37 @@ private: void latchPerFrameState(compositionengine::LayerFECompositionState&) const override; sp<Layer> createClone() override; void onFrameAvailable(const BufferItem& item); void onFrameReplaced(const BufferItem& item); void onSidebandStreamChanged(); void onFrameDequeued(const uint64_t bufferId); void onFrameDetached(const uint64_t bufferId); void onFrameCancelled(const uint64_t bufferId); protected: void gatherBufferInfo() override; // ----------------------------------------------------------------------- // Interface implementation for BufferLayerConsumer::ContentsChangedListener // ----------------------------------------------------------------------- protected: void gatherBufferInfo() override; class ContentsChangedListener : public BufferLayerConsumer::ContentsChangedListener { public: ContentsChangedListener(BufferQueueLayer* bufferQueueLayer) : mBufferQueueLayer(bufferQueueLayer) {} void abandon(); protected: void onFrameAvailable(const BufferItem& item) override; void onFrameReplaced(const BufferItem& item) override; void onSidebandStreamChanged() override; void onFrameDequeued(const uint64_t bufferId) override; void onFrameDetached(const uint64_t bufferId) override; void onFrameCancelled(const uint64_t bufferId) override; private: BufferQueueLayer* mBufferQueueLayer = nullptr; Mutex mMutex; }; // ----------------------------------------------------------------------- public: Loading Loading @@ -130,6 +149,8 @@ private: // thread-safe std::atomic<int32_t> mQueuedFrames{0}; std::atomic<bool> mSidebandStreamChanged{false}; sp<ContentsChangedListener> mContentsChangedListener; }; } // namespace android Loading
services/surfaceflinger/BufferQueueLayer.cpp +57 −1 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ namespace android { BufferQueueLayer::BufferQueueLayer(const LayerCreationArgs& args) : BufferLayer(args) {} BufferQueueLayer::~BufferQueueLayer() { mContentsChangedListener->abandon(); mConsumer->abandon(); } Loading Loading @@ -480,7 +481,9 @@ void BufferQueueLayer::onFirstRef() { mFlinger->getFactory().createBufferLayerConsumer(consumer, mFlinger->getRenderEngine(), mTextureName, this); mConsumer->setConsumerUsageBits(getEffectiveUsage(0)); mConsumer->setContentsChangedListener(this); mContentsChangedListener = new ContentsChangedListener(this); mConsumer->setContentsChangedListener(mContentsChangedListener); mConsumer->setName(String8(mName.data(), mName.size())); // BufferQueueCore::mMaxDequeuedBufferCount is default to 1 Loading Loading @@ -552,4 +555,57 @@ sp<Layer> BufferQueueLayer::createClone() { return layer; } // ----------------------------------------------------------------------- // Interface implementation for BufferLayerConsumer::ContentsChangedListener // ----------------------------------------------------------------------- void BufferQueueLayer::ContentsChangedListener::onFrameAvailable(const BufferItem& item) { Mutex::Autolock lock(mMutex); if (mBufferQueueLayer != nullptr) { mBufferQueueLayer->onFrameAvailable(item); } } void BufferQueueLayer::ContentsChangedListener::onFrameReplaced(const BufferItem& item) { Mutex::Autolock lock(mMutex); if (mBufferQueueLayer != nullptr) { mBufferQueueLayer->onFrameReplaced(item); } } void BufferQueueLayer::ContentsChangedListener::onSidebandStreamChanged() { Mutex::Autolock lock(mMutex); if (mBufferQueueLayer != nullptr) { mBufferQueueLayer->onSidebandStreamChanged(); } } void BufferQueueLayer::ContentsChangedListener::onFrameDequeued(const uint64_t bufferId) { Mutex::Autolock lock(mMutex); if (mBufferQueueLayer != nullptr) { mBufferQueueLayer->onFrameDequeued(bufferId); } } void BufferQueueLayer::ContentsChangedListener::onFrameDetached(const uint64_t bufferId) { Mutex::Autolock lock(mMutex); if (mBufferQueueLayer != nullptr) { mBufferQueueLayer->onFrameDetached(bufferId); } } void BufferQueueLayer::ContentsChangedListener::onFrameCancelled(const uint64_t bufferId) { Mutex::Autolock lock(mMutex); if (mBufferQueueLayer != nullptr) { mBufferQueueLayer->onFrameCancelled(bufferId); } } void BufferQueueLayer::ContentsChangedListener::abandon() { Mutex::Autolock lock(mMutex); mBufferQueueLayer = nullptr; } // ----------------------------------------------------------------------- } // namespace android
services/surfaceflinger/BufferQueueLayer.h +31 −10 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ namespace android { * This also implements onFrameAvailable(), which notifies SurfaceFlinger * that new data has arrived. */ class BufferQueueLayer : public BufferLayer, public BufferLayerConsumer::ContentsChangedListener { class BufferQueueLayer : public BufferLayer { public: // Only call while mStateLock is held explicit BufferQueueLayer(const LayerCreationArgs&); Loading Loading @@ -84,18 +84,37 @@ private: void latchPerFrameState(compositionengine::LayerFECompositionState&) const override; sp<Layer> createClone() override; void onFrameAvailable(const BufferItem& item); void onFrameReplaced(const BufferItem& item); void onSidebandStreamChanged(); void onFrameDequeued(const uint64_t bufferId); void onFrameDetached(const uint64_t bufferId); void onFrameCancelled(const uint64_t bufferId); protected: void gatherBufferInfo() override; // ----------------------------------------------------------------------- // Interface implementation for BufferLayerConsumer::ContentsChangedListener // ----------------------------------------------------------------------- protected: void gatherBufferInfo() override; class ContentsChangedListener : public BufferLayerConsumer::ContentsChangedListener { public: ContentsChangedListener(BufferQueueLayer* bufferQueueLayer) : mBufferQueueLayer(bufferQueueLayer) {} void abandon(); protected: void onFrameAvailable(const BufferItem& item) override; void onFrameReplaced(const BufferItem& item) override; void onSidebandStreamChanged() override; void onFrameDequeued(const uint64_t bufferId) override; void onFrameDetached(const uint64_t bufferId) override; void onFrameCancelled(const uint64_t bufferId) override; private: BufferQueueLayer* mBufferQueueLayer = nullptr; Mutex mMutex; }; // ----------------------------------------------------------------------- public: Loading Loading @@ -130,6 +149,8 @@ private: // thread-safe std::atomic<int32_t> mQueuedFrames{0}; std::atomic<bool> mSidebandStreamChanged{false}; sp<ContentsChangedListener> mContentsChangedListener; }; } // namespace android