Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 08f13b72 authored by Melody Hsu's avatar Melody Hsu Committed by Android (Google) Code Review
Browse files

Merge "Store layer snapshot in LayerRenderArea" into main

parents bebdf4e5 50c151ad
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -25,13 +25,14 @@

namespace android {

LayerRenderArea::LayerRenderArea(sp<Layer> layer, const Rect& crop, ui::Size reqSize,
                                 ui::Dataspace reqDataSpace, bool allowSecureLayers,
                                 const ui::Transform& layerTransform, const Rect& layerBufferSize,
                                 bool hintForSeamlessTransition)
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)),
        mLayerSnapshot(std::move(layerSnapshot)),
        mLayerBufferSize(layerBufferSize),
        mCrop(crop),
        mTransform(layerTransform) {}
+7 −4
Original line number Diff line number Diff line
@@ -32,19 +32,22 @@ class SurfaceFlinger;

class LayerRenderArea : public RenderArea {
public:
    LayerRenderArea(sp<Layer> layer, const Rect& crop, ui::Size reqSize, ui::Dataspace reqDataSpace,
                    bool allowSecureLayers, const ui::Transform& layerTransform,
                    const Rect& layerBufferSize, bool hintForSeamlessTransition);
    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);

    const ui::Transform& getTransform() const override;
    bool isSecure() const override;
    sp<const DisplayDevice> getDisplayDevice() const override;
    Rect getSourceCrop() const override;

    virtual sp<Layer> getParentLayer() const { return mLayer; }
    sp<Layer> getParentLayer() const override { return mLayer; }
    const frontend::LayerSnapshot* getLayerSnapshot() const override { return &mLayerSnapshot; }

private:
    const sp<Layer> mLayer;
    const frontend::LayerSnapshot mLayerSnapshot;
    const Rect mLayerBufferSize;
    const Rect mCrop;

+6 −0
Original line number Diff line number Diff line
@@ -4,6 +4,8 @@
#include <ui/Transform.h>

#include <functional>

#include "FrontEnd/LayerSnapshot.h"
#include "Layer.h"

namespace android {
@@ -82,6 +84,10 @@ public:
    // capture operation.
    virtual sp<Layer> getParentLayer() const { return nullptr; }

    // If this is a LayerRenderArea, return the layer snapshot
    // of the root layer of the capture operation
    virtual const frontend::LayerSnapshot* getLayerSnapshot() const { return nullptr; }

    // Returns whether the render result may be used for system animations that
    // must preserve the exact colors of the display.
    bool getHintForSeamlessTransition() const { return mHintForSeamlessTransition; }
+11 −7
Original line number Diff line number Diff line
@@ -83,9 +83,12 @@ struct LayerRenderAreaBuilder : RenderAreaBuilder {
            layer(layer),
            childrenOnly(childrenOnly) {}

    // Layer that the render area will be on
    // Root layer of the render area
    sp<Layer> layer;

    // Layer snapshot of the root layer
    frontend::LayerSnapshot layerSnapshot;

    // Transform to be applied on the layers to transform them
    // into the logical render area
    ui::Transform layerTransform{ui::Transform()};
@@ -97,17 +100,18 @@ struct LayerRenderAreaBuilder : RenderAreaBuilder {
    bool childrenOnly;

    // Uses parent snapshot to determine layer transform and buffer size
    void setLayerInfo(const frontend::LayerSnapshot* parentSnapshot) {
    void setLayerSnapshot(const frontend::LayerSnapshot& parentSnapshot) {
        layerSnapshot = parentSnapshot;
        if (!childrenOnly) {
            layerTransform = parentSnapshot->localTransform.inverse();
            layerTransform = parentSnapshot.localTransform.inverse();
        }
        layerBufferSize = parentSnapshot->bufferSize;
        layerBufferSize = parentSnapshot.bufferSize;
    }

    std::unique_ptr<RenderArea> build() const override {
        return std::make_unique<LayerRenderArea>(layer, crop, reqSize, reqDataSpace,
                                                 allowSecureLayers, layerTransform, layerBufferSize,
                                                 hintForSeamlessTransition);
        return std::make_unique<LayerRenderArea>(layer, std::move(layerSnapshot), crop, reqSize,
                                                 reqDataSpace, allowSecureLayers, layerTransform,
                                                 layerBufferSize, hintForSeamlessTransition);
    }
};

+3 −4
Original line number Diff line number Diff line
@@ -8207,7 +8207,7 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenshot(
                ALOGW("Couldn't find layer snapshot for %d",
                      layerRenderAreaBuilder->layer->getSequence());
            } else {
                layerRenderAreaBuilder->setLayerInfo(snapshot);
                layerRenderAreaBuilder->setLayerSnapshot(*snapshot);
            }
        }

@@ -8302,9 +8302,8 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::renderScreenImpl(
        Mutex::Autolock lock(mStateLock);
        const DisplayDevice* display = nullptr;
        if (parent) {
            const frontend::LayerSnapshot* snapshot = mLayerLifecycleManagerEnabled
                    ? mLayerSnapshotBuilder.getSnapshot(parent->sequence)
                    : parent->getLayerSnapshot();
            const frontend::LayerSnapshot* snapshot =
                    mLayerSnapshotBuilder.getSnapshot(parent->sequence);
            if (snapshot) {
                display = findDisplay([layerStack = snapshot->outputFilter.layerStack](
                                              const auto& display) {