Loading services/surfaceflinger/FrontEnd/RequestedLayerState.cpp +9 −6 Original line number Diff line number Diff line Loading @@ -158,13 +158,16 @@ void RequestedLayerState::merge(const ResolvedComposerState& resolvedComposerSta RequestedLayerState::Changes::VisibleRegion | RequestedLayerState::Changes::Visibility | RequestedLayerState::Changes::Input; } } if (clientState.what & layer_state_t::eBufferChanged) { barrierProducerId = std::max(bufferData->producerId, barrierProducerId); barrierFrameNumber = std::max(bufferData->frameNumber, barrierFrameNumber); // TODO(b/277265947) log and flush transaction trace when we detect out of order updates changes |= RequestedLayerState::Changes::Buffer; } if (clientState.what & layer_state_t::eSidebandStreamChanged) { changes |= RequestedLayerState::Changes::SidebandStream; } } if (what & (layer_state_t::eAlphaChanged)) { if (oldAlpha == 0 || color.a == 0) { changes |= RequestedLayerState::Changes::Visibility | Loading services/surfaceflinger/FrontEnd/RequestedLayerState.h +2 −0 Original line number Diff line number Diff line Loading @@ -111,6 +111,8 @@ struct RequestedLayerState : layer_state_t { ui::LayerStack layerStackToMirror = ui::INVALID_LAYER_STACK; uint32_t touchCropId = UNASSIGNED_LAYER_ID; uint32_t bgColorLayerId = UNASSIGNED_LAYER_ID; uint64_t barrierFrameNumber = 0; uint32_t barrierProducerId = 0; // book keeping states bool handleAlive = true; Loading services/surfaceflinger/Layer.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -167,6 +167,9 @@ Layer::Layer(const LayerCreationArgs& args) mDrawingState.sequence = 0; mDrawingState.transform.set(0, 0); mDrawingState.frameNumber = 0; mDrawingState.barrierFrameNumber = 0; mDrawingState.producerId = 0; mDrawingState.barrierProducerId = 0; mDrawingState.bufferTransform = 0; mDrawingState.transformToDisplayInverse = false; mDrawingState.crop.makeInvalid(); Loading Loading @@ -3070,7 +3073,13 @@ bool Layer::setBuffer(std::shared_ptr<renderengine::ExternalTexture>& buffer, } mDrawingState.producerId = bufferData.producerId; mDrawingState.barrierProducerId = std::max(mDrawingState.producerId, mDrawingState.barrierProducerId); mDrawingState.frameNumber = frameNumber; mDrawingState.barrierFrameNumber = std::max(mDrawingState.frameNumber, mDrawingState.barrierFrameNumber); // TODO(b/277265947) log and flush transaction trace when we detect out of order updates mDrawingState.releaseBufferListener = bufferData.releaseBufferListener; mDrawingState.buffer = std::move(buffer); mDrawingState.clientCacheId = bufferData.cachedBuffer; Loading services/surfaceflinger/Layer.h +7 −0 Original line number Diff line number Diff line Loading @@ -139,9 +139,16 @@ public: ui::Dataspace dataspace; uint64_t frameNumber; // high watermark framenumber to use to check for barriers to protect ourselves // from out of order transactions uint64_t barrierFrameNumber; ui::Transform transform; uint32_t producerId = 0; // high watermark producerId to use to check for barriers to protect ourselves // from out of order transactions uint32_t barrierProducerId = 0; uint32_t bufferTransform; bool transformToDisplayInverse; Region transparentRegionHint; Loading services/surfaceflinger/SurfaceFlinger.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -4228,7 +4228,7 @@ TransactionHandler::TransactionReadiness SurfaceFlinger::transactionReadyBufferC // The current producerId is already a newer producer than the buffer that has a // barrier. This means the incoming buffer is older and we can release it here. We // don't wait on the barrier since we know that's stale information. if (layer->getDrawingState().producerId > s.bufferData->producerId) { if (layer->getDrawingState().barrierProducerId > s.bufferData->producerId) { layer->callReleaseBufferCallback(s.bufferData->releaseBufferListener, externalTexture->getBuffer(), s.bufferData->frameNumber, Loading @@ -4239,7 +4239,7 @@ TransactionHandler::TransactionReadiness SurfaceFlinger::transactionReadyBufferC return TraverseBuffersReturnValues::DELETE_AND_CONTINUE_TRAVERSAL; } if (layer->getDrawingState().frameNumber < s.bufferData->barrierFrameNumber) { if (layer->getDrawingState().barrierFrameNumber < s.bufferData->barrierFrameNumber) { const bool willApplyBarrierFrame = flushState.bufferLayersReadyToPresent.contains(s.surface.get()) && ((flushState.bufferLayersReadyToPresent.get(s.surface.get()) >= Loading Loading
services/surfaceflinger/FrontEnd/RequestedLayerState.cpp +9 −6 Original line number Diff line number Diff line Loading @@ -158,13 +158,16 @@ void RequestedLayerState::merge(const ResolvedComposerState& resolvedComposerSta RequestedLayerState::Changes::VisibleRegion | RequestedLayerState::Changes::Visibility | RequestedLayerState::Changes::Input; } } if (clientState.what & layer_state_t::eBufferChanged) { barrierProducerId = std::max(bufferData->producerId, barrierProducerId); barrierFrameNumber = std::max(bufferData->frameNumber, barrierFrameNumber); // TODO(b/277265947) log and flush transaction trace when we detect out of order updates changes |= RequestedLayerState::Changes::Buffer; } if (clientState.what & layer_state_t::eSidebandStreamChanged) { changes |= RequestedLayerState::Changes::SidebandStream; } } if (what & (layer_state_t::eAlphaChanged)) { if (oldAlpha == 0 || color.a == 0) { changes |= RequestedLayerState::Changes::Visibility | Loading
services/surfaceflinger/FrontEnd/RequestedLayerState.h +2 −0 Original line number Diff line number Diff line Loading @@ -111,6 +111,8 @@ struct RequestedLayerState : layer_state_t { ui::LayerStack layerStackToMirror = ui::INVALID_LAYER_STACK; uint32_t touchCropId = UNASSIGNED_LAYER_ID; uint32_t bgColorLayerId = UNASSIGNED_LAYER_ID; uint64_t barrierFrameNumber = 0; uint32_t barrierProducerId = 0; // book keeping states bool handleAlive = true; Loading
services/surfaceflinger/Layer.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -167,6 +167,9 @@ Layer::Layer(const LayerCreationArgs& args) mDrawingState.sequence = 0; mDrawingState.transform.set(0, 0); mDrawingState.frameNumber = 0; mDrawingState.barrierFrameNumber = 0; mDrawingState.producerId = 0; mDrawingState.barrierProducerId = 0; mDrawingState.bufferTransform = 0; mDrawingState.transformToDisplayInverse = false; mDrawingState.crop.makeInvalid(); Loading Loading @@ -3070,7 +3073,13 @@ bool Layer::setBuffer(std::shared_ptr<renderengine::ExternalTexture>& buffer, } mDrawingState.producerId = bufferData.producerId; mDrawingState.barrierProducerId = std::max(mDrawingState.producerId, mDrawingState.barrierProducerId); mDrawingState.frameNumber = frameNumber; mDrawingState.barrierFrameNumber = std::max(mDrawingState.frameNumber, mDrawingState.barrierFrameNumber); // TODO(b/277265947) log and flush transaction trace when we detect out of order updates mDrawingState.releaseBufferListener = bufferData.releaseBufferListener; mDrawingState.buffer = std::move(buffer); mDrawingState.clientCacheId = bufferData.cachedBuffer; Loading
services/surfaceflinger/Layer.h +7 −0 Original line number Diff line number Diff line Loading @@ -139,9 +139,16 @@ public: ui::Dataspace dataspace; uint64_t frameNumber; // high watermark framenumber to use to check for barriers to protect ourselves // from out of order transactions uint64_t barrierFrameNumber; ui::Transform transform; uint32_t producerId = 0; // high watermark producerId to use to check for barriers to protect ourselves // from out of order transactions uint32_t barrierProducerId = 0; uint32_t bufferTransform; bool transformToDisplayInverse; Region transparentRegionHint; Loading
services/surfaceflinger/SurfaceFlinger.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -4228,7 +4228,7 @@ TransactionHandler::TransactionReadiness SurfaceFlinger::transactionReadyBufferC // The current producerId is already a newer producer than the buffer that has a // barrier. This means the incoming buffer is older and we can release it here. We // don't wait on the barrier since we know that's stale information. if (layer->getDrawingState().producerId > s.bufferData->producerId) { if (layer->getDrawingState().barrierProducerId > s.bufferData->producerId) { layer->callReleaseBufferCallback(s.bufferData->releaseBufferListener, externalTexture->getBuffer(), s.bufferData->frameNumber, Loading @@ -4239,7 +4239,7 @@ TransactionHandler::TransactionReadiness SurfaceFlinger::transactionReadyBufferC return TraverseBuffersReturnValues::DELETE_AND_CONTINUE_TRAVERSAL; } if (layer->getDrawingState().frameNumber < s.bufferData->barrierFrameNumber) { if (layer->getDrawingState().barrierFrameNumber < s.bufferData->barrierFrameNumber) { const bool willApplyBarrierFrame = flushState.bufferLayersReadyToPresent.contains(s.surface.get()) && ((flushState.bufferLayersReadyToPresent.get(s.surface.get()) >= Loading