Loading services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h +16 −0 Original line number Original line Diff line number Diff line Loading @@ -19,8 +19,10 @@ #include <cstdint> #include <cstdint> #include <optional> #include <optional> #include <string> #include <string> #include <unordered_map> #include <math/mat4.h> #include <math/mat4.h> #include <ui/Fence.h> #include <ui/GraphicTypes.h> #include <ui/GraphicTypes.h> #include <ui/Region.h> #include <ui/Region.h> #include <ui/Transform.h> #include <ui/Transform.h> Loading @@ -28,6 +30,10 @@ #include "DisplayHardware/DisplayIdentification.h" #include "DisplayHardware/DisplayIdentification.h" namespace HWC2 { class Layer; } // namespace HWC2 namespace android::compositionengine { namespace android::compositionengine { class DisplayColorProfile; class DisplayColorProfile; Loading @@ -48,6 +54,12 @@ public: using OutputLayers = std::vector<std::unique_ptr<compositionengine::OutputLayer>>; using OutputLayers = std::vector<std::unique_ptr<compositionengine::OutputLayer>>; using ReleasedLayers = std::vector<wp<LayerFE>>; using ReleasedLayers = std::vector<wp<LayerFE>>; struct FrameFences { sp<Fence> presentFence{Fence::NO_FENCE}; sp<Fence> clientTargetAcquireFence{Fence::NO_FENCE}; std::unordered_map<HWC2::Layer*, sp<Fence>> layerFences; }; virtual ~Output(); virtual ~Output(); // Returns true if the output is valid. This is meant to be checked post- // Returns true if the output is valid. This is meant to be checked post- Loading Loading @@ -141,10 +153,14 @@ public: // Prepares a frame for display // Prepares a frame for display virtual void prepareFrame() = 0; virtual void prepareFrame() = 0; // Posts the new frame, and sets release fences. virtual void postFramebuffer() = 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; virtual void chooseCompositionStrategy() = 0; virtual void chooseCompositionStrategy() = 0; virtual FrameFences presentAndGetFrameFences() = 0; }; }; } // namespace android::compositionengine } // namespace android::compositionengine services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Display.h +3 −2 Original line number Original line Diff line number Diff line Loading @@ -42,6 +42,7 @@ public: void setColorTransform(const mat4&) override; void setColorTransform(const mat4&) override; void setColorMode(ui::ColorMode, ui::Dataspace, ui::RenderIntent, ui::Dataspace) override; void setColorMode(ui::ColorMode, ui::Dataspace, ui::RenderIntent, ui::Dataspace) override; void chooseCompositionStrategy() override; void chooseCompositionStrategy() override; compositionengine::Output::FrameFences presentAndGetFrameFences() override; // compositionengine::Display overrides // compositionengine::Display overrides const std::optional<DisplayId>& getId() const override; const std::optional<DisplayId>& getId() const override; Loading @@ -66,7 +67,7 @@ private: std::optional<DisplayId> mId; std::optional<DisplayId> mId; }; }; std::shared_ptr<compositionengine::Display> createDisplay( std::shared_ptr<Display> createDisplay(const compositionengine::CompositionEngine&, const compositionengine::CompositionEngine&, compositionengine::DisplayCreationArgs&&); compositionengine::DisplayCreationArgs&&); } // namespace impl } // namespace impl } // namespace android::compositionengine } // namespace android::compositionengine services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -76,6 +76,7 @@ public: ReleasedLayers takeReleasedLayers() override; ReleasedLayers takeReleasedLayers() override; void prepareFrame() override; void prepareFrame() override; void postFramebuffer() override; // Testing // Testing void setDisplayColorProfileForTest(std::unique_ptr<compositionengine::DisplayColorProfile>); void setDisplayColorProfileForTest(std::unique_ptr<compositionengine::DisplayColorProfile>); Loading @@ -84,6 +85,7 @@ public: protected: protected: const CompositionEngine& getCompositionEngine() const; const CompositionEngine& getCompositionEngine() const; void chooseCompositionStrategy() override; void chooseCompositionStrategy() override; compositionengine::Output::FrameFences presentAndGetFrameFences() override; void dumpBase(std::string&) const; void dumpBase(std::string&) const; private: private: Loading services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -75,6 +75,9 @@ public: MOCK_METHOD0(prepareFrame, void()); MOCK_METHOD0(prepareFrame, void()); MOCK_METHOD0(chooseCompositionStrategy, void()); MOCK_METHOD0(chooseCompositionStrategy, void()); MOCK_METHOD0(postFramebuffer, void()); MOCK_METHOD0(presentAndGetFrameFences, compositionengine::Output::FrameFences()); }; }; } // namespace android::compositionengine::mock } // namespace android::compositionengine::mock services/surfaceflinger/CompositionEngine/src/Display.cpp +28 −1 Original line number Original line Diff line number Diff line Loading @@ -29,7 +29,7 @@ namespace android::compositionengine::impl { namespace android::compositionengine::impl { std::shared_ptr<compositionengine::Display> createDisplay( std::shared_ptr<Display> createDisplay( const compositionengine::CompositionEngine& compositionEngine, const compositionengine::CompositionEngine& compositionEngine, compositionengine::DisplayCreationArgs&& args) { compositionengine::DisplayCreationArgs&& args) { return std::make_shared<Display>(compositionEngine, std::move(args)); return std::make_shared<Display>(compositionEngine, std::move(args)); Loading Loading @@ -213,4 +213,31 @@ void Display::applyLayerRequestsToLayers(const LayerRequests& layerRequests) { } } } } compositionengine::Output::FrameFences Display::presentAndGetFrameFences() { auto result = impl::Output::presentAndGetFrameFences(); if (!mId) { return result; } auto& hwc = getCompositionEngine().getHwComposer(); hwc.presentAndGetReleaseFences(*mId); result.presentFence = hwc.getPresentFence(*mId); // TODO(b/121291683): Change HWComposer call to return entire map for (const auto& layer : getOutputLayersOrderedByZ()) { auto hwcLayer = layer->getHwcLayer(); if (!hwcLayer) { continue; } result.layerFences.emplace(hwcLayer, hwc.getLayerReleaseFence(*mId, hwcLayer)); } hwc.clearReleaseFences(*mId); return result; } } // namespace android::compositionengine::impl } // namespace android::compositionengine::impl Loading
services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h +16 −0 Original line number Original line Diff line number Diff line Loading @@ -19,8 +19,10 @@ #include <cstdint> #include <cstdint> #include <optional> #include <optional> #include <string> #include <string> #include <unordered_map> #include <math/mat4.h> #include <math/mat4.h> #include <ui/Fence.h> #include <ui/GraphicTypes.h> #include <ui/GraphicTypes.h> #include <ui/Region.h> #include <ui/Region.h> #include <ui/Transform.h> #include <ui/Transform.h> Loading @@ -28,6 +30,10 @@ #include "DisplayHardware/DisplayIdentification.h" #include "DisplayHardware/DisplayIdentification.h" namespace HWC2 { class Layer; } // namespace HWC2 namespace android::compositionengine { namespace android::compositionengine { class DisplayColorProfile; class DisplayColorProfile; Loading @@ -48,6 +54,12 @@ public: using OutputLayers = std::vector<std::unique_ptr<compositionengine::OutputLayer>>; using OutputLayers = std::vector<std::unique_ptr<compositionengine::OutputLayer>>; using ReleasedLayers = std::vector<wp<LayerFE>>; using ReleasedLayers = std::vector<wp<LayerFE>>; struct FrameFences { sp<Fence> presentFence{Fence::NO_FENCE}; sp<Fence> clientTargetAcquireFence{Fence::NO_FENCE}; std::unordered_map<HWC2::Layer*, sp<Fence>> layerFences; }; virtual ~Output(); virtual ~Output(); // Returns true if the output is valid. This is meant to be checked post- // Returns true if the output is valid. This is meant to be checked post- Loading Loading @@ -141,10 +153,14 @@ public: // Prepares a frame for display // Prepares a frame for display virtual void prepareFrame() = 0; virtual void prepareFrame() = 0; // Posts the new frame, and sets release fences. virtual void postFramebuffer() = 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; virtual void chooseCompositionStrategy() = 0; virtual void chooseCompositionStrategy() = 0; virtual FrameFences presentAndGetFrameFences() = 0; }; }; } // namespace android::compositionengine } // namespace android::compositionengine
services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Display.h +3 −2 Original line number Original line Diff line number Diff line Loading @@ -42,6 +42,7 @@ public: void setColorTransform(const mat4&) override; void setColorTransform(const mat4&) override; void setColorMode(ui::ColorMode, ui::Dataspace, ui::RenderIntent, ui::Dataspace) override; void setColorMode(ui::ColorMode, ui::Dataspace, ui::RenderIntent, ui::Dataspace) override; void chooseCompositionStrategy() override; void chooseCompositionStrategy() override; compositionengine::Output::FrameFences presentAndGetFrameFences() override; // compositionengine::Display overrides // compositionengine::Display overrides const std::optional<DisplayId>& getId() const override; const std::optional<DisplayId>& getId() const override; Loading @@ -66,7 +67,7 @@ private: std::optional<DisplayId> mId; std::optional<DisplayId> mId; }; }; std::shared_ptr<compositionengine::Display> createDisplay( std::shared_ptr<Display> createDisplay(const compositionengine::CompositionEngine&, const compositionengine::CompositionEngine&, compositionengine::DisplayCreationArgs&&); compositionengine::DisplayCreationArgs&&); } // namespace impl } // namespace impl } // namespace android::compositionengine } // namespace android::compositionengine
services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -76,6 +76,7 @@ public: ReleasedLayers takeReleasedLayers() override; ReleasedLayers takeReleasedLayers() override; void prepareFrame() override; void prepareFrame() override; void postFramebuffer() override; // Testing // Testing void setDisplayColorProfileForTest(std::unique_ptr<compositionengine::DisplayColorProfile>); void setDisplayColorProfileForTest(std::unique_ptr<compositionengine::DisplayColorProfile>); Loading @@ -84,6 +85,7 @@ public: protected: protected: const CompositionEngine& getCompositionEngine() const; const CompositionEngine& getCompositionEngine() const; void chooseCompositionStrategy() override; void chooseCompositionStrategy() override; compositionengine::Output::FrameFences presentAndGetFrameFences() override; void dumpBase(std::string&) const; void dumpBase(std::string&) const; private: private: Loading
services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -75,6 +75,9 @@ public: MOCK_METHOD0(prepareFrame, void()); MOCK_METHOD0(prepareFrame, void()); MOCK_METHOD0(chooseCompositionStrategy, void()); MOCK_METHOD0(chooseCompositionStrategy, void()); MOCK_METHOD0(postFramebuffer, void()); MOCK_METHOD0(presentAndGetFrameFences, compositionengine::Output::FrameFences()); }; }; } // namespace android::compositionengine::mock } // namespace android::compositionengine::mock
services/surfaceflinger/CompositionEngine/src/Display.cpp +28 −1 Original line number Original line Diff line number Diff line Loading @@ -29,7 +29,7 @@ namespace android::compositionengine::impl { namespace android::compositionengine::impl { std::shared_ptr<compositionengine::Display> createDisplay( std::shared_ptr<Display> createDisplay( const compositionengine::CompositionEngine& compositionEngine, const compositionengine::CompositionEngine& compositionEngine, compositionengine::DisplayCreationArgs&& args) { compositionengine::DisplayCreationArgs&& args) { return std::make_shared<Display>(compositionEngine, std::move(args)); return std::make_shared<Display>(compositionEngine, std::move(args)); Loading Loading @@ -213,4 +213,31 @@ void Display::applyLayerRequestsToLayers(const LayerRequests& layerRequests) { } } } } compositionengine::Output::FrameFences Display::presentAndGetFrameFences() { auto result = impl::Output::presentAndGetFrameFences(); if (!mId) { return result; } auto& hwc = getCompositionEngine().getHwComposer(); hwc.presentAndGetReleaseFences(*mId); result.presentFence = hwc.getPresentFence(*mId); // TODO(b/121291683): Change HWComposer call to return entire map for (const auto& layer : getOutputLayersOrderedByZ()) { auto hwcLayer = layer->getHwcLayer(); if (!hwcLayer) { continue; } result.layerFences.emplace(hwcLayer, hwc.getLayerReleaseFence(*mId, hwcLayer)); } hwc.clearReleaseFences(*mId); return result; } } // namespace android::compositionengine::impl } // namespace android::compositionengine::impl