diff options
Diffstat (limited to 'services/surfaceflinger/LayerRenderArea.cpp')
-rw-r--r-- | services/surfaceflinger/LayerRenderArea.cpp | 70 |
1 files changed, 4 insertions, 66 deletions
diff --git a/services/surfaceflinger/LayerRenderArea.cpp b/services/surfaceflinger/LayerRenderArea.cpp index 51d4ff854f..f323ce7284 100644 --- a/services/surfaceflinger/LayerRenderArea.cpp +++ b/services/surfaceflinger/LayerRenderArea.cpp @@ -24,31 +24,18 @@ #include "SurfaceFlinger.h" namespace android { -namespace { -void reparentForDrawing(const sp<Layer>& oldParent, const sp<Layer>& newParent, - const Rect& drawingBounds) { - // Compute and cache the bounds for the new parent layer. - newParent->computeBounds(drawingBounds.toFloatRect(), ui::Transform(), - 0.f /* shadowRadius */); - newParent->updateSnapshot(true /* updateGeometry */); - oldParent->setChildrenDrawingParent(newParent); -}; - -} // namespace - -LayerRenderArea::LayerRenderArea(SurfaceFlinger& flinger, sp<Layer> layer, const Rect& crop, - ui::Size reqSize, ui::Dataspace reqDataSpace, bool childrenOnly, +LayerRenderArea::LayerRenderArea(sp<Layer> layer, frontend::LayerSnapshot layerSnapshot, + const Rect& crop, ui::Size reqSize, ui::Dataspace reqDataSpace, bool allowSecureLayers, const ui::Transform& layerTransform, const Rect& layerBufferSize, bool hintForSeamlessTransition) : RenderArea(reqSize, CaptureFill::CLEAR, reqDataSpace, hintForSeamlessTransition, allowSecureLayers), mLayer(std::move(layer)), - mLayerTransform(layerTransform), + mLayerSnapshot(std::move(layerSnapshot)), mLayerBufferSize(layerBufferSize), mCrop(crop), - mFlinger(flinger), - mChildrenOnly(childrenOnly) {} + mTransform(layerTransform) {} const ui::Transform& LayerRenderArea::getTransform() const { return mTransform; @@ -71,53 +58,4 @@ Rect LayerRenderArea::getSourceCrop() const { } } -void LayerRenderArea::render(std::function<void()> drawLayers) { - using namespace std::string_literals; - - if (!mChildrenOnly) { - mTransform = mLayerTransform.inverse(); - } - - if (mFlinger.mLayerLifecycleManagerEnabled) { - drawLayers(); - return; - } - // If layer is offscreen, update mirroring info if it exists - if (mLayer->isRemovedFromCurrentState()) { - mLayer->traverse(LayerVector::StateSet::Drawing, - [&](Layer* layer) { layer->updateMirrorInfo({}); }); - mLayer->traverse(LayerVector::StateSet::Drawing, - [&](Layer* layer) { layer->updateCloneBufferInfo(); }); - } - - if (!mChildrenOnly) { - // If the layer is offscreen, compute bounds since we don't compute bounds for offscreen - // layers in a regular cycles. - if (mLayer->isRemovedFromCurrentState()) { - FloatRect maxBounds = mFlinger.getMaxDisplayBounds(); - mLayer->computeBounds(maxBounds, ui::Transform(), 0.f /* shadowRadius */); - } - drawLayers(); - } else { - // In the "childrenOnly" case we reparent the children to a screenshot - // layer which has no properties set and which does not draw. - // We hold the statelock as the reparent-for-drawing operation modifies the - // hierarchy and there could be readers on Binder threads, like dump. - auto screenshotParentLayer = mFlinger.getFactory().createEffectLayer( - {&mFlinger, nullptr, "Screenshot Parent"s, ISurfaceComposerClient::eNoColorFill, - LayerMetadata()}); - { - Mutex::Autolock _l(mFlinger.mStateLock); - reparentForDrawing(mLayer, screenshotParentLayer, getSourceCrop()); - } - drawLayers(); - { - Mutex::Autolock _l(mFlinger.mStateLock); - mLayer->setChildrenDrawingParent(mLayer); - } - } - mLayer->updateSnapshot(/*updateGeometry=*/true); - mLayer->updateChildrenSnapshots(/*updateGeometry=*/true); -} - } // namespace android |