Loading services/surfaceflinger/BufferLayer.cpp +17 −2 Original line number Diff line number Diff line Loading @@ -58,7 +58,7 @@ namespace android { BufferLayer::BufferLayer(const LayerCreationArgs& args) : Layer(args), mTextureName(args.flinger->getNewTexture()), mTextureName(args.textureName), mCompositionLayer{mFlinger->getCompositionEngine().createLayer( compositionengine::LayerCreationArgs{this})} { ALOGV("Creating Layer %s", args.name.string()); Loading @@ -70,7 +70,13 @@ BufferLayer::BufferLayer(const LayerCreationArgs& args) } BufferLayer::~BufferLayer() { if (!isClone()) { // The original layer and the clone layer share the same texture. Therefore, only one of // the layers, in this case the original layer, needs to handle the deletion. The original // layer and the clone should be removed at the same time so there shouldn't be any issue // with the clone layer trying to use the deleted texture. mFlinger->deleteTextureAsync(mTextureName); } const int32_t layerID = getSequence(); mFlinger->mTimeStats->onDestroy(layerID); mFlinger->mFrameTracer->onDestroy(layerID); Loading Loading @@ -722,6 +728,15 @@ void BufferLayer::getDrawingTransformMatrix(bool filteringEnabled, float outMatr mBufferInfo.mTransform, filteringEnabled); } void BufferLayer::setInitialValuesForClone(const sp<Layer>& clonedFrom) { Layer::setInitialValuesForClone(clonedFrom); sp<BufferLayer> bufferClonedFrom = static_cast<BufferLayer*>(clonedFrom.get()); mPremultipliedAlpha = bufferClonedFrom->mPremultipliedAlpha; mPotentialCursor = bufferClonedFrom->mPotentialCursor; mProtectedByApp = bufferClonedFrom->mProtectedByApp; } } // namespace android #if defined(__gl_h_) Loading services/surfaceflinger/BufferLayer.h +1 −0 Original line number Diff line number Diff line Loading @@ -194,6 +194,7 @@ protected: bool mRefreshPending{false}; ui::Dataspace translateDataspace(ui::Dataspace dataspace); void setInitialValuesForClone(const sp<Layer>& clonedFrom); private: // Returns true if this layer requires filtering Loading services/surfaceflinger/BufferQueueLayer.cpp +13 −7 Original line number Diff line number Diff line Loading @@ -461,12 +461,7 @@ void BufferQueueLayer::onFirstRef() { sp<IGraphicBufferConsumer> consumer; BufferQueue::createBufferQueue(&producer, &consumer, true); mProducer = new MonitoredProducer(producer, mFlinger, this); { // Grab the SF state lock during this since it's the only safe way to access RenderEngine Mutex::Autolock lock(mFlinger->mStateLock); mConsumer = new BufferLayerConsumer(consumer, mFlinger->getRenderEngine(), mTextureName, this); } mConsumer = new BufferLayerConsumer(consumer, mFlinger->getRenderEngine(), mTextureName, this); mConsumer->setConsumerUsageBits(getEffectiveUsage(0)); mConsumer->setContentsChangedListener(this); mConsumer->setName(mName); Loading @@ -476,7 +471,7 @@ void BufferQueueLayer::onFirstRef() { mProducer->setMaxDequeuedBufferCount(2); } if (const auto display = mFlinger->getDefaultDisplayDevice()) { if (const auto display = mFlinger->getDefaultDisplayDeviceLocked()) { updateTransformHint(display); } } Loading Loading @@ -531,4 +526,15 @@ void BufferQueueLayer::gatherBufferInfo() { mBufferInfo.mTransformToDisplayInverse = mConsumer->getTransformToDisplayInverse(); } sp<Layer> BufferQueueLayer::createClone() { const String8 name = mName + " (Mirror)"; LayerCreationArgs args = LayerCreationArgs(mFlinger.get(), nullptr, name, 0, 0, 0, LayerMetadata()); args.textureName = mTextureName; sp<BufferQueueLayer> layer = new BufferQueueLayer(args); layer->setInitialValuesForClone(this); return layer; } } // namespace android services/surfaceflinger/BufferQueueLayer.h +2 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ namespace android { */ class BufferQueueLayer : public BufferLayer, public BufferLayerConsumer::ContentsChangedListener { public: // Only call while mStateLock is held explicit BufferQueueLayer(const LayerCreationArgs&); ~BufferQueueLayer() override; Loading Loading @@ -81,6 +82,7 @@ private: status_t updateFrameNumber(nsecs_t latchTime) override; void latchPerFrameState(compositionengine::LayerFECompositionState&) const override; sp<Layer> createClone() override; // ----------------------------------------------------------------------- // Interface implementation for BufferLayerConsumer::ContentsChangedListener Loading services/surfaceflinger/BufferStateLayer.cpp +18 −9 Original line number Diff line number Diff line Loading @@ -48,10 +48,17 @@ BufferStateLayer::BufferStateLayer(const LayerCreationArgs& args) : BufferLayer(args), mHwcSlotGenerator(new HwcSlotGenerator()) { mOverrideScalingMode = NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW; mCurrentState.dataspace = ui::Dataspace::V0_SRGB; if (const auto display = args.displayDevice) { updateTransformHint(display); } } BufferStateLayer::~BufferStateLayer() { if (mBufferInfo.mBuffer != nullptr) { // The original layer and the clone layer share the same texture and buffer. Therefore, only // one of the layers, in this case the original layer, needs to handle the deletion. The // original layer and the clone should be removed at the same time so there shouldn't be any // issue with the clone layer trying to use the texture. if (mBufferInfo.mBuffer != nullptr && !isClone()) { // Ensure that mBuffer is uncached from RenderEngine here, as // RenderEngine may have been using the buffer as an external texture // after the client uncached the buffer. Loading Loading @@ -545,14 +552,6 @@ void BufferStateLayer::latchPerFrameState( mFrameNumber++; } void BufferStateLayer::onFirstRef() { BufferLayer::onFirstRef(); if (const auto display = mFlinger->getDefaultDisplayDevice()) { updateTransformHint(display); } } void BufferStateLayer::HwcSlotGenerator::bufferErased(const client_cache_t& clientCacheId) { std::lock_guard lock(mMutex); if (!clientCacheId.isValid()) { Loading Loading @@ -668,4 +667,14 @@ Rect BufferStateLayer::computeCrop(const State& s) { return s.crop; } sp<Layer> BufferStateLayer::createClone() { const String8 name = mName + " (Mirror)"; LayerCreationArgs args = LayerCreationArgs(mFlinger.get(), nullptr, name, 0, 0, 0, LayerMetadata()); args.textureName = mTextureName; sp<BufferStateLayer> layer = new BufferStateLayer(args); layer->mHwcSlotGenerator = mHwcSlotGenerator; layer->setInitialValuesForClone(this); return layer; } } // namespace android Loading
services/surfaceflinger/BufferLayer.cpp +17 −2 Original line number Diff line number Diff line Loading @@ -58,7 +58,7 @@ namespace android { BufferLayer::BufferLayer(const LayerCreationArgs& args) : Layer(args), mTextureName(args.flinger->getNewTexture()), mTextureName(args.textureName), mCompositionLayer{mFlinger->getCompositionEngine().createLayer( compositionengine::LayerCreationArgs{this})} { ALOGV("Creating Layer %s", args.name.string()); Loading @@ -70,7 +70,13 @@ BufferLayer::BufferLayer(const LayerCreationArgs& args) } BufferLayer::~BufferLayer() { if (!isClone()) { // The original layer and the clone layer share the same texture. Therefore, only one of // the layers, in this case the original layer, needs to handle the deletion. The original // layer and the clone should be removed at the same time so there shouldn't be any issue // with the clone layer trying to use the deleted texture. mFlinger->deleteTextureAsync(mTextureName); } const int32_t layerID = getSequence(); mFlinger->mTimeStats->onDestroy(layerID); mFlinger->mFrameTracer->onDestroy(layerID); Loading Loading @@ -722,6 +728,15 @@ void BufferLayer::getDrawingTransformMatrix(bool filteringEnabled, float outMatr mBufferInfo.mTransform, filteringEnabled); } void BufferLayer::setInitialValuesForClone(const sp<Layer>& clonedFrom) { Layer::setInitialValuesForClone(clonedFrom); sp<BufferLayer> bufferClonedFrom = static_cast<BufferLayer*>(clonedFrom.get()); mPremultipliedAlpha = bufferClonedFrom->mPremultipliedAlpha; mPotentialCursor = bufferClonedFrom->mPotentialCursor; mProtectedByApp = bufferClonedFrom->mProtectedByApp; } } // namespace android #if defined(__gl_h_) Loading
services/surfaceflinger/BufferLayer.h +1 −0 Original line number Diff line number Diff line Loading @@ -194,6 +194,7 @@ protected: bool mRefreshPending{false}; ui::Dataspace translateDataspace(ui::Dataspace dataspace); void setInitialValuesForClone(const sp<Layer>& clonedFrom); private: // Returns true if this layer requires filtering Loading
services/surfaceflinger/BufferQueueLayer.cpp +13 −7 Original line number Diff line number Diff line Loading @@ -461,12 +461,7 @@ void BufferQueueLayer::onFirstRef() { sp<IGraphicBufferConsumer> consumer; BufferQueue::createBufferQueue(&producer, &consumer, true); mProducer = new MonitoredProducer(producer, mFlinger, this); { // Grab the SF state lock during this since it's the only safe way to access RenderEngine Mutex::Autolock lock(mFlinger->mStateLock); mConsumer = new BufferLayerConsumer(consumer, mFlinger->getRenderEngine(), mTextureName, this); } mConsumer = new BufferLayerConsumer(consumer, mFlinger->getRenderEngine(), mTextureName, this); mConsumer->setConsumerUsageBits(getEffectiveUsage(0)); mConsumer->setContentsChangedListener(this); mConsumer->setName(mName); Loading @@ -476,7 +471,7 @@ void BufferQueueLayer::onFirstRef() { mProducer->setMaxDequeuedBufferCount(2); } if (const auto display = mFlinger->getDefaultDisplayDevice()) { if (const auto display = mFlinger->getDefaultDisplayDeviceLocked()) { updateTransformHint(display); } } Loading Loading @@ -531,4 +526,15 @@ void BufferQueueLayer::gatherBufferInfo() { mBufferInfo.mTransformToDisplayInverse = mConsumer->getTransformToDisplayInverse(); } sp<Layer> BufferQueueLayer::createClone() { const String8 name = mName + " (Mirror)"; LayerCreationArgs args = LayerCreationArgs(mFlinger.get(), nullptr, name, 0, 0, 0, LayerMetadata()); args.textureName = mTextureName; sp<BufferQueueLayer> layer = new BufferQueueLayer(args); layer->setInitialValuesForClone(this); return layer; } } // namespace android
services/surfaceflinger/BufferQueueLayer.h +2 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ namespace android { */ class BufferQueueLayer : public BufferLayer, public BufferLayerConsumer::ContentsChangedListener { public: // Only call while mStateLock is held explicit BufferQueueLayer(const LayerCreationArgs&); ~BufferQueueLayer() override; Loading Loading @@ -81,6 +82,7 @@ private: status_t updateFrameNumber(nsecs_t latchTime) override; void latchPerFrameState(compositionengine::LayerFECompositionState&) const override; sp<Layer> createClone() override; // ----------------------------------------------------------------------- // Interface implementation for BufferLayerConsumer::ContentsChangedListener Loading
services/surfaceflinger/BufferStateLayer.cpp +18 −9 Original line number Diff line number Diff line Loading @@ -48,10 +48,17 @@ BufferStateLayer::BufferStateLayer(const LayerCreationArgs& args) : BufferLayer(args), mHwcSlotGenerator(new HwcSlotGenerator()) { mOverrideScalingMode = NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW; mCurrentState.dataspace = ui::Dataspace::V0_SRGB; if (const auto display = args.displayDevice) { updateTransformHint(display); } } BufferStateLayer::~BufferStateLayer() { if (mBufferInfo.mBuffer != nullptr) { // The original layer and the clone layer share the same texture and buffer. Therefore, only // one of the layers, in this case the original layer, needs to handle the deletion. The // original layer and the clone should be removed at the same time so there shouldn't be any // issue with the clone layer trying to use the texture. if (mBufferInfo.mBuffer != nullptr && !isClone()) { // Ensure that mBuffer is uncached from RenderEngine here, as // RenderEngine may have been using the buffer as an external texture // after the client uncached the buffer. Loading Loading @@ -545,14 +552,6 @@ void BufferStateLayer::latchPerFrameState( mFrameNumber++; } void BufferStateLayer::onFirstRef() { BufferLayer::onFirstRef(); if (const auto display = mFlinger->getDefaultDisplayDevice()) { updateTransformHint(display); } } void BufferStateLayer::HwcSlotGenerator::bufferErased(const client_cache_t& clientCacheId) { std::lock_guard lock(mMutex); if (!clientCacheId.isValid()) { Loading Loading @@ -668,4 +667,14 @@ Rect BufferStateLayer::computeCrop(const State& s) { return s.crop; } sp<Layer> BufferStateLayer::createClone() { const String8 name = mName + " (Mirror)"; LayerCreationArgs args = LayerCreationArgs(mFlinger.get(), nullptr, name, 0, 0, 0, LayerMetadata()); args.textureName = mTextureName; sp<BufferStateLayer> layer = new BufferStateLayer(args); layer->mHwcSlotGenerator = mHwcSlotGenerator; layer->setInitialValuesForClone(this); return layer; } } // namespace android