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

Commit 7234fa59 authored by Vishnu Nair's avatar Vishnu Nair
Browse files

SF: Predict HWC composition strategy

Asynchronously run ValidateDisplay to determine client composition
strategy. If we can predict that the composition strategy will not
change from frame to frame (for example by looking at whether
the geometry of the layers is changing), the hwc call is run
asynchronously with the gpu composition. If the result of the call is
incorrectly predicted, the gpu composition is rerun.

ValidateDisplay can take multiple milliseconds to complete and by
making it non-blocking in cases where we can predict the strategy
chosen by the hardware, we can jump start the client composition
and shave valuable milliseconds from the frame time.

This feature is disabled by default.

Test: perfetto traces
Bug: 220031739

Change-Id: Ib4dcc0e055d5272c89cfff853211edac73aa449b
parent 80f319d7
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -41,6 +41,10 @@ cc_defaults {
        "libtonemap",
        "libtonemap",
        "libtrace_proto",
        "libtrace_proto",
        "libaidlcommonsupport",
        "libaidlcommonsupport",
        "libprocessgroup",
        "libcgrouprc",
        "libjsoncpp",
        "libcgrouprc_format",
    ],
    ],
    header_libs: [
    header_libs: [
        "android.hardware.graphics.composer@2.1-command-buffer",
        "android.hardware.graphics.composer@2.1-command-buffer",
@@ -68,6 +72,7 @@ cc_library {
        "src/DisplayColorProfile.cpp",
        "src/DisplayColorProfile.cpp",
        "src/DisplaySurface.cpp",
        "src/DisplaySurface.cpp",
        "src/DumpHelpers.cpp",
        "src/DumpHelpers.cpp",
        "src/HwcAsyncWorker.cpp",
        "src/HwcBufferCache.cpp",
        "src/HwcBufferCache.cpp",
        "src/LayerFECompositionState.cpp",
        "src/LayerFECompositionState.cpp",
        "src/Output.cpp",
        "src/Output.cpp",
+3 −0
Original line number Original line Diff line number Diff line
@@ -72,6 +72,9 @@ public:
    virtual void resizeBuffers(const ui::Size&) = 0;
    virtual void resizeBuffers(const ui::Size&) = 0;


    virtual const sp<Fence>& getClientTargetAcquireFence() const = 0;
    virtual const sp<Fence>& getClientTargetAcquireFence() const = 0;

    // Returns true if the render surface supports client composition prediction.
    virtual bool supportsCompositionStrategyPrediction() const;
};
};


} // namespace compositionengine
} // namespace compositionengine
+18 −3
Original line number Original line Diff line number Diff line
@@ -35,6 +35,7 @@
#include <utils/Vector.h>
#include <utils/Vector.h>


#include <ui/DisplayIdentification.h>
#include <ui/DisplayIdentification.h>
#include "DisplayHardware/HWComposer.h"


namespace android {
namespace android {


@@ -54,6 +55,7 @@ struct LayerFECompositionState;


namespace impl {
namespace impl {
struct OutputCompositionState;
struct OutputCompositionState;
struct GpuCompositionResult;
} // namespace impl
} // namespace impl


/**
/**
@@ -262,6 +264,9 @@ public:
    // Latches the front-end layer state for each output layer
    // Latches the front-end layer state for each output layer
    virtual void updateLayerStateFromFE(const CompositionRefreshArgs&) const = 0;
    virtual void updateLayerStateFromFE(const CompositionRefreshArgs&) const = 0;


    // Enables predicting composition strategy to run client composition earlier
    virtual void setPredictCompositionStrategy(bool) = 0;

protected:
protected:
    virtual void setDisplayColorProfile(std::unique_ptr<DisplayColorProfile>) = 0;
    virtual void setDisplayColorProfile(std::unique_ptr<DisplayColorProfile>) = 0;
    virtual void setRenderSurface(std::unique_ptr<RenderSurface>) = 0;
    virtual void setRenderSurface(std::unique_ptr<RenderSurface>) = 0;
@@ -278,13 +283,22 @@ protected:
    virtual void updateColorProfile(const CompositionRefreshArgs&) = 0;
    virtual void updateColorProfile(const CompositionRefreshArgs&) = 0;
    virtual void beginFrame() = 0;
    virtual void beginFrame() = 0;
    virtual void prepareFrame() = 0;
    virtual void prepareFrame() = 0;

    using GpuCompositionResult = compositionengine::impl::GpuCompositionResult;
    // Runs prepare frame in another thread while running client composition using
    // the previous frame's composition strategy.
    virtual GpuCompositionResult prepareFrameAsync(const CompositionRefreshArgs&) = 0;
    virtual void devOptRepaintFlash(const CompositionRefreshArgs&) = 0;
    virtual void devOptRepaintFlash(const CompositionRefreshArgs&) = 0;
    virtual void finishFrame(const CompositionRefreshArgs&) = 0;
    virtual void finishFrame(const CompositionRefreshArgs&, GpuCompositionResult&&) = 0;
    virtual std::optional<base::unique_fd> composeSurfaces(
    virtual std::optional<base::unique_fd> composeSurfaces(
            const Region&, const compositionengine::CompositionRefreshArgs& refreshArgs) = 0;
            const Region&, const compositionengine::CompositionRefreshArgs&,
            std::shared_ptr<renderengine::ExternalTexture>, base::unique_fd&) = 0;
    virtual void postFramebuffer() = 0;
    virtual void postFramebuffer() = 0;
    virtual void renderCachedSets(const CompositionRefreshArgs&) = 0;
    virtual void renderCachedSets(const CompositionRefreshArgs&) = 0;
    virtual void chooseCompositionStrategy() = 0;
    virtual std::optional<android::HWComposer::DeviceRequestedChanges>
    chooseCompositionStrategy() = 0;
    virtual void applyCompositionStrategy(
            const std::optional<android::HWComposer::DeviceRequestedChanges>& changes) = 0;
    virtual bool getSkipColorTransform() const = 0;
    virtual bool getSkipColorTransform() const = 0;
    virtual FrameFences presentAndGetFrameFences() = 0;
    virtual FrameFences presentAndGetFrameFences() = 0;
    virtual std::vector<LayerFE::LayerSettings> generateClientCompositionRequests(
    virtual std::vector<LayerFE::LayerSettings> generateClientCompositionRequests(
@@ -295,6 +309,7 @@ protected:
            std::vector<LayerFE::LayerSettings>& clientCompositionLayers) = 0;
            std::vector<LayerFE::LayerSettings>& clientCompositionLayers) = 0;
    virtual void setExpensiveRenderingExpected(bool enabled) = 0;
    virtual void setExpensiveRenderingExpected(bool enabled) = 0;
    virtual void cacheClientCompositionRequests(uint32_t cacheSize) = 0;
    virtual void cacheClientCompositionRequests(uint32_t cacheSize) = 0;
    virtual bool canPredictCompositionStrategy(const CompositionRefreshArgs&) = 0;
};
};


} // namespace compositionengine
} // namespace compositionengine
+3 −0
Original line number Original line Diff line number Diff line
@@ -100,6 +100,9 @@ public:


    // Debugging - gets the page flip count for the RenderSurface
    // Debugging - gets the page flip count for the RenderSurface
    virtual std::uint32_t getPageFlipCount() const = 0;
    virtual std::uint32_t getPageFlipCount() const = 0;

    // Returns true if the render surface supports client composition prediction.
    virtual bool supportsCompositionStrategyPrediction() const = 0;
};
};


} // namespace compositionengine
} // namespace compositionengine
+6 −3
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@
#include <compositionengine/DisplayColorProfile.h>
#include <compositionengine/DisplayColorProfile.h>
#include <compositionengine/DisplayCreationArgs.h>
#include <compositionengine/DisplayCreationArgs.h>
#include <compositionengine/RenderSurface.h>
#include <compositionengine/RenderSurface.h>
#include <compositionengine/impl/GpuCompositionResult.h>
#include <compositionengine/impl/Output.h>
#include <compositionengine/impl/Output.h>
#include <ui/PixelFormat.h>
#include <ui/PixelFormat.h>
#include <ui/Size.h>
#include <ui/Size.h>
@@ -51,11 +52,14 @@ public:
    void setReleasedLayers(const CompositionRefreshArgs&) override;
    void setReleasedLayers(const CompositionRefreshArgs&) override;
    void setColorTransform(const CompositionRefreshArgs&) override;
    void setColorTransform(const CompositionRefreshArgs&) override;
    void setColorProfile(const ColorProfile&) override;
    void setColorProfile(const ColorProfile&) override;
    void chooseCompositionStrategy() override;

    using DeviceRequestedChanges = android::HWComposer::DeviceRequestedChanges;
    std::optional<DeviceRequestedChanges> chooseCompositionStrategy() override;
    void applyCompositionStrategy(const std::optional<DeviceRequestedChanges>&) override;
    bool getSkipColorTransform() const override;
    bool getSkipColorTransform() const override;
    compositionengine::Output::FrameFences presentAndGetFrameFences() override;
    compositionengine::Output::FrameFences presentAndGetFrameFences() override;
    void setExpensiveRenderingExpected(bool) override;
    void setExpensiveRenderingExpected(bool) override;
    void finishFrame(const CompositionRefreshArgs&) override;
    void finishFrame(const CompositionRefreshArgs&, GpuCompositionResult&&) override;


    // compositionengine::Display overrides
    // compositionengine::Display overrides
    DisplayId getId() const override;
    DisplayId getId() const override;
@@ -73,7 +77,6 @@ public:
    using DisplayRequests = android::HWComposer::DeviceRequestedChanges::DisplayRequests;
    using DisplayRequests = android::HWComposer::DeviceRequestedChanges::DisplayRequests;
    using LayerRequests = android::HWComposer::DeviceRequestedChanges::LayerRequests;
    using LayerRequests = android::HWComposer::DeviceRequestedChanges::LayerRequests;
    using ClientTargetProperty = android::HWComposer::DeviceRequestedChanges::ClientTargetProperty;
    using ClientTargetProperty = android::HWComposer::DeviceRequestedChanges::ClientTargetProperty;
    virtual bool anyLayersRequireClientComposition() const;
    virtual bool allLayersRequireClientComposition() const;
    virtual bool allLayersRequireClientComposition() const;
    virtual void applyChangedTypesToLayers(const ChangedTypes&);
    virtual void applyChangedTypesToLayers(const ChangedTypes&);
    virtual void applyDisplayRequests(const DisplayRequests&);
    virtual void applyDisplayRequests(const DisplayRequests&);
Loading