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

Commit 66d6860c authored by Lloyd Pique's avatar Lloyd Pique
Browse files

SF: Move/Refactor prepareFrame to CompositionEngine

This refactors both the SurfaceFlinger::prepareFrame() and
HWComposer::prepare() logic, moving things to to
compositionEngine::Output and compositionEngine::Display.

Along the way, the composition related state is moved out of HWComposer
up to compositionengine::OutputCompositionState.

As there were some subtleties, tests are also added to cover the
refactored logic.

Test: atest libsurfaceflinger_unittest libcompositionengine_test
Bug: 121291683

Change-Id: I2713e9e52751ca0523f6348ffdb51ead8bca5235
parent 304d161f
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -132,15 +132,19 @@ public:
    // Gets the ordered set of output layers for this output
    virtual const OutputLayers& getOutputLayersOrderedByZ() const = 0;

    // Sets the new set of layers being released this frame.
    // Sets the new set of layers being released this frame
    virtual void setReleasedLayers(ReleasedLayers&&) = 0;

    // Takes (moves) the set of layers being released this frame.
    virtual ReleasedLayers takeReleasedLayers() = 0;

    // Prepares a frame for display
    virtual void prepareFrame() = 0;

protected:
    virtual void setDisplayColorProfile(std::unique_ptr<DisplayColorProfile>) = 0;
    virtual void setRenderSurface(std::unique_ptr<RenderSurface>) = 0;
    virtual void chooseCompositionStrategy() = 0;
};

} // namespace android::compositionengine
+20 −0
Original line number Diff line number Diff line
@@ -21,8 +21,13 @@

#include <utils/StrongPointer.h>

#include "DisplayHardware/ComposerHal.h"
#include "DisplayHardware/DisplayIdentification.h"

namespace HWC2 {
class Layer;
} // namespace HWC2

namespace android {

namespace compositionengine {
@@ -73,6 +78,21 @@ public:
    // skipped.
    virtual void writeStateToHWC(bool includeGeometry) = 0;

    // Returns the HWC2::Layer associated with this layer, if it exists
    virtual HWC2::Layer* getHwcLayer() const = 0;

    // Returns true if the current layer state requires client composition
    virtual bool requiresClientComposition() const = 0;

    // Applies a HWC device requested composition type change
    virtual void applyDeviceCompositionTypeChange(Hwc2::IComposerClient::Composition) = 0;

    // Prepares to apply any HWC device layer requests
    virtual void prepareForDeviceLayerRequests() = 0;

    // Applies a HWC device layer request
    virtual void applyDeviceLayerRequest(Hwc2::IComposerClient::LayerRequest request) = 0;

    // Debugging
    virtual void dump(std::string& result) const = 0;
};
+1 −1
Original line number Diff line number Diff line
@@ -71,7 +71,7 @@ public:
    virtual status_t beginFrame(bool mustRecompose) = 0;

    // Prepares the frame for rendering
    virtual status_t prepareFrame() = 0;
    virtual void prepareFrame(bool usesClientComposition, bool usesDeviceComposition) = 0;

    // Allocates a buffer as scratch space for GPU composition
    virtual sp<GraphicBuffer> dequeueBuffer(base::unique_fd* bufferFence) = 0;
+14 −2
Original line number Diff line number Diff line
@@ -16,12 +16,13 @@

#pragma once

#include <memory>

#include <compositionengine/Display.h>
#include <compositionengine/impl/Output.h>

#include <memory>

#include "DisplayHardware/DisplayIdentification.h"
#include "DisplayHardware/HWComposer.h"

namespace android::compositionengine {

@@ -40,6 +41,7 @@ public:
    void dump(std::string&) const override;
    void setColorTransform(const mat4&) override;
    void setColorMode(ui::ColorMode, ui::Dataspace, ui::RenderIntent, ui::Dataspace) override;
    void chooseCompositionStrategy() override;

    // compositionengine::Display overrides
    const std::optional<DisplayId>& getId() const override;
@@ -49,6 +51,16 @@ public:
    void createDisplayColorProfile(compositionengine::DisplayColorProfileCreationArgs&&) override;
    void createRenderSurface(compositionengine::RenderSurfaceCreationArgs&&) override;

    // Internal helpers used by chooseCompositionStrategy()
    using ChangedTypes = android::HWComposer::DeviceRequestedChanges::ChangedTypes;
    using DisplayRequests = android::HWComposer::DeviceRequestedChanges::DisplayRequests;
    using LayerRequests = android::HWComposer::DeviceRequestedChanges::LayerRequests;
    virtual bool anyLayersRequireClientComposition() const;
    virtual bool allLayersRequireClientComposition() const;
    virtual void applyChangedTypesToLayers(const ChangedTypes&);
    virtual void applyDisplayRequests(const DisplayRequests&);
    virtual void applyLayerRequestsToLayers(const LayerRequests&);

private:
    const bool mIsVirtual;
    std::optional<DisplayId> mId;
+3 −0
Original line number Diff line number Diff line
@@ -75,12 +75,15 @@ public:
    void setReleasedLayers(ReleasedLayers&&) override;
    ReleasedLayers takeReleasedLayers() override;

    void prepareFrame() override;

    // Testing
    void setDisplayColorProfileForTest(std::unique_ptr<compositionengine::DisplayColorProfile>);
    void setRenderSurfaceForTest(std::unique_ptr<compositionengine::RenderSurface>);

protected:
    const CompositionEngine& getCompositionEngine() const;
    void chooseCompositionStrategy() override;
    void dumpBase(std::string&) const;

private:
Loading