Loading services/surfaceflinger/CompositionEngine/include/compositionengine/CompositionRefreshArgs.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -57,6 +57,9 @@ struct CompositionRefreshArgs { // Forces a color mode on the outputs being refreshed // Forces a color mode on the outputs being refreshed ui::ColorMode forceOutputColorMode{ui::ColorMode::NATIVE}; ui::ColorMode forceOutputColorMode{ui::ColorMode::NATIVE}; // If true, GPU clocks will be increased when rendering blurs bool blursAreExpensive{false}; // If true, the complete output geometry needs to be recomputed this frame // If true, the complete output geometry needs to be recomputed this frame bool updatingOutputGeometryThisFrame{false}; bool updatingOutputGeometryThisFrame{false}; Loading services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h +2 −1 Original line number Original line Diff line number Diff line Loading @@ -265,7 +265,8 @@ protected: virtual void prepareFrame() = 0; virtual void prepareFrame() = 0; virtual void devOptRepaintFlash(const CompositionRefreshArgs&) = 0; virtual void devOptRepaintFlash(const CompositionRefreshArgs&) = 0; virtual void finishFrame(const CompositionRefreshArgs&) = 0; virtual void finishFrame(const CompositionRefreshArgs&) = 0; virtual std::optional<base::unique_fd> composeSurfaces(const Region&) = 0; virtual std::optional<base::unique_fd> composeSurfaces( const Region&, const compositionengine::CompositionRefreshArgs& refreshArgs) = 0; virtual void postFramebuffer() = 0; virtual void postFramebuffer() = 0; virtual void chooseCompositionStrategy() = 0; virtual void chooseCompositionStrategy() = 0; virtual bool getSkipColorTransform() const = 0; virtual bool getSkipColorTransform() const = 0; Loading services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h +2 −1 Original line number Original line Diff line number Diff line Loading @@ -83,7 +83,8 @@ public: void prepareFrame() override; void prepareFrame() override; void devOptRepaintFlash(const CompositionRefreshArgs&) override; void devOptRepaintFlash(const CompositionRefreshArgs&) override; void finishFrame(const CompositionRefreshArgs&) override; void finishFrame(const CompositionRefreshArgs&) override; std::optional<base::unique_fd> composeSurfaces(const Region&) override; std::optional<base::unique_fd> composeSurfaces( const Region&, const compositionengine::CompositionRefreshArgs& refreshArgs) override; void postFramebuffer() override; void postFramebuffer() override; void cacheClientCompositionRequests(uint32_t) override; void cacheClientCompositionRequests(uint32_t) override; Loading services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h +4 −1 Original line number Original line Diff line number Diff line Loading @@ -98,7 +98,10 @@ public: MOCK_METHOD1(finishFrame, void(const compositionengine::CompositionRefreshArgs&)); MOCK_METHOD1(finishFrame, void(const compositionengine::CompositionRefreshArgs&)); MOCK_METHOD1(composeSurfaces, std::optional<base::unique_fd>(const Region&)); MOCK_METHOD2(composeSurfaces, std::optional<base::unique_fd>( const Region&, const compositionengine::CompositionRefreshArgs& refreshArgs)); MOCK_CONST_METHOD0(getSkipColorTransform, bool()); MOCK_CONST_METHOD0(getSkipColorTransform, bool()); MOCK_METHOD0(postFramebuffer, void()); MOCK_METHOD0(postFramebuffer, void()); Loading services/surfaceflinger/CompositionEngine/src/Output.cpp +8 −5 Original line number Original line Diff line number Diff line Loading @@ -774,7 +774,7 @@ void Output::devOptRepaintFlash(const compositionengine::CompositionRefreshArgs& if (!dirtyRegion.isEmpty()) { if (!dirtyRegion.isEmpty()) { base::unique_fd readyFence; base::unique_fd readyFence; // redraw the whole screen // redraw the whole screen static_cast<void>(composeSurfaces(dirtyRegion)); static_cast<void>(composeSurfaces(dirtyRegion, refreshArgs)); mRenderSurface->queueBuffer(std::move(readyFence)); mRenderSurface->queueBuffer(std::move(readyFence)); } } Loading @@ -787,7 +787,7 @@ void Output::devOptRepaintFlash(const compositionengine::CompositionRefreshArgs& prepareFrame(); prepareFrame(); } } void Output::finishFrame(const compositionengine::CompositionRefreshArgs&) { void Output::finishFrame(const compositionengine::CompositionRefreshArgs& refreshArgs) { ATRACE_CALL(); ATRACE_CALL(); ALOGV(__FUNCTION__); ALOGV(__FUNCTION__); Loading @@ -797,7 +797,7 @@ void Output::finishFrame(const compositionengine::CompositionRefreshArgs&) { // Repaint the framebuffer (if needed), getting the optional fence for when // Repaint the framebuffer (if needed), getting the optional fence for when // the composition completes. // the composition completes. auto optReadyFence = composeSurfaces(Region::INVALID_REGION); auto optReadyFence = composeSurfaces(Region::INVALID_REGION, refreshArgs); if (!optReadyFence) { if (!optReadyFence) { return; return; } } Loading @@ -806,7 +806,8 @@ void Output::finishFrame(const compositionengine::CompositionRefreshArgs&) { mRenderSurface->queueBuffer(std::move(*optReadyFence)); mRenderSurface->queueBuffer(std::move(*optReadyFence)); } } std::optional<base::unique_fd> Output::composeSurfaces(const Region& debugRegion) { std::optional<base::unique_fd> Output::composeSurfaces( const Region& debugRegion, const compositionengine::CompositionRefreshArgs& refreshArgs) { ATRACE_CALL(); ATRACE_CALL(); ALOGV(__FUNCTION__); ALOGV(__FUNCTION__); Loading Loading @@ -894,8 +895,10 @@ std::optional<base::unique_fd> Output::composeSurfaces(const Region& debugRegion // or complex GPU shaders and it's expensive. We boost the GPU frequency so that // or complex GPU shaders and it's expensive. We boost the GPU frequency so that // GPU composition can finish in time. We must reset GPU frequency afterwards, // GPU composition can finish in time. We must reset GPU frequency afterwards, // because high frequency consumes extra battery. // because high frequency consumes extra battery. const bool expensiveBlurs = refreshArgs.blursAreExpensive && mLayerRequestingBackgroundBlur != nullptr; const bool expensiveRenderingExpected = const bool expensiveRenderingExpected = clientCompositionDisplay.outputDataspace == ui::Dataspace::DISPLAY_P3; clientCompositionDisplay.outputDataspace == ui::Dataspace::DISPLAY_P3 || expensiveBlurs; if (expensiveRenderingExpected) { if (expensiveRenderingExpected) { setExpensiveRenderingExpected(true); setExpensiveRenderingExpected(true); } } Loading Loading
services/surfaceflinger/CompositionEngine/include/compositionengine/CompositionRefreshArgs.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -57,6 +57,9 @@ struct CompositionRefreshArgs { // Forces a color mode on the outputs being refreshed // Forces a color mode on the outputs being refreshed ui::ColorMode forceOutputColorMode{ui::ColorMode::NATIVE}; ui::ColorMode forceOutputColorMode{ui::ColorMode::NATIVE}; // If true, GPU clocks will be increased when rendering blurs bool blursAreExpensive{false}; // If true, the complete output geometry needs to be recomputed this frame // If true, the complete output geometry needs to be recomputed this frame bool updatingOutputGeometryThisFrame{false}; bool updatingOutputGeometryThisFrame{false}; Loading
services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h +2 −1 Original line number Original line Diff line number Diff line Loading @@ -265,7 +265,8 @@ protected: virtual void prepareFrame() = 0; virtual void prepareFrame() = 0; virtual void devOptRepaintFlash(const CompositionRefreshArgs&) = 0; virtual void devOptRepaintFlash(const CompositionRefreshArgs&) = 0; virtual void finishFrame(const CompositionRefreshArgs&) = 0; virtual void finishFrame(const CompositionRefreshArgs&) = 0; virtual std::optional<base::unique_fd> composeSurfaces(const Region&) = 0; virtual std::optional<base::unique_fd> composeSurfaces( const Region&, const compositionengine::CompositionRefreshArgs& refreshArgs) = 0; virtual void postFramebuffer() = 0; virtual void postFramebuffer() = 0; virtual void chooseCompositionStrategy() = 0; virtual void chooseCompositionStrategy() = 0; virtual bool getSkipColorTransform() const = 0; virtual bool getSkipColorTransform() const = 0; Loading
services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h +2 −1 Original line number Original line Diff line number Diff line Loading @@ -83,7 +83,8 @@ public: void prepareFrame() override; void prepareFrame() override; void devOptRepaintFlash(const CompositionRefreshArgs&) override; void devOptRepaintFlash(const CompositionRefreshArgs&) override; void finishFrame(const CompositionRefreshArgs&) override; void finishFrame(const CompositionRefreshArgs&) override; std::optional<base::unique_fd> composeSurfaces(const Region&) override; std::optional<base::unique_fd> composeSurfaces( const Region&, const compositionengine::CompositionRefreshArgs& refreshArgs) override; void postFramebuffer() override; void postFramebuffer() override; void cacheClientCompositionRequests(uint32_t) override; void cacheClientCompositionRequests(uint32_t) override; Loading
services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h +4 −1 Original line number Original line Diff line number Diff line Loading @@ -98,7 +98,10 @@ public: MOCK_METHOD1(finishFrame, void(const compositionengine::CompositionRefreshArgs&)); MOCK_METHOD1(finishFrame, void(const compositionengine::CompositionRefreshArgs&)); MOCK_METHOD1(composeSurfaces, std::optional<base::unique_fd>(const Region&)); MOCK_METHOD2(composeSurfaces, std::optional<base::unique_fd>( const Region&, const compositionengine::CompositionRefreshArgs& refreshArgs)); MOCK_CONST_METHOD0(getSkipColorTransform, bool()); MOCK_CONST_METHOD0(getSkipColorTransform, bool()); MOCK_METHOD0(postFramebuffer, void()); MOCK_METHOD0(postFramebuffer, void()); Loading
services/surfaceflinger/CompositionEngine/src/Output.cpp +8 −5 Original line number Original line Diff line number Diff line Loading @@ -774,7 +774,7 @@ void Output::devOptRepaintFlash(const compositionengine::CompositionRefreshArgs& if (!dirtyRegion.isEmpty()) { if (!dirtyRegion.isEmpty()) { base::unique_fd readyFence; base::unique_fd readyFence; // redraw the whole screen // redraw the whole screen static_cast<void>(composeSurfaces(dirtyRegion)); static_cast<void>(composeSurfaces(dirtyRegion, refreshArgs)); mRenderSurface->queueBuffer(std::move(readyFence)); mRenderSurface->queueBuffer(std::move(readyFence)); } } Loading @@ -787,7 +787,7 @@ void Output::devOptRepaintFlash(const compositionengine::CompositionRefreshArgs& prepareFrame(); prepareFrame(); } } void Output::finishFrame(const compositionengine::CompositionRefreshArgs&) { void Output::finishFrame(const compositionengine::CompositionRefreshArgs& refreshArgs) { ATRACE_CALL(); ATRACE_CALL(); ALOGV(__FUNCTION__); ALOGV(__FUNCTION__); Loading @@ -797,7 +797,7 @@ void Output::finishFrame(const compositionengine::CompositionRefreshArgs&) { // Repaint the framebuffer (if needed), getting the optional fence for when // Repaint the framebuffer (if needed), getting the optional fence for when // the composition completes. // the composition completes. auto optReadyFence = composeSurfaces(Region::INVALID_REGION); auto optReadyFence = composeSurfaces(Region::INVALID_REGION, refreshArgs); if (!optReadyFence) { if (!optReadyFence) { return; return; } } Loading @@ -806,7 +806,8 @@ void Output::finishFrame(const compositionengine::CompositionRefreshArgs&) { mRenderSurface->queueBuffer(std::move(*optReadyFence)); mRenderSurface->queueBuffer(std::move(*optReadyFence)); } } std::optional<base::unique_fd> Output::composeSurfaces(const Region& debugRegion) { std::optional<base::unique_fd> Output::composeSurfaces( const Region& debugRegion, const compositionengine::CompositionRefreshArgs& refreshArgs) { ATRACE_CALL(); ATRACE_CALL(); ALOGV(__FUNCTION__); ALOGV(__FUNCTION__); Loading Loading @@ -894,8 +895,10 @@ std::optional<base::unique_fd> Output::composeSurfaces(const Region& debugRegion // or complex GPU shaders and it's expensive. We boost the GPU frequency so that // or complex GPU shaders and it's expensive. We boost the GPU frequency so that // GPU composition can finish in time. We must reset GPU frequency afterwards, // GPU composition can finish in time. We must reset GPU frequency afterwards, // because high frequency consumes extra battery. // because high frequency consumes extra battery. const bool expensiveBlurs = refreshArgs.blursAreExpensive && mLayerRequestingBackgroundBlur != nullptr; const bool expensiveRenderingExpected = const bool expensiveRenderingExpected = clientCompositionDisplay.outputDataspace == ui::Dataspace::DISPLAY_P3; clientCompositionDisplay.outputDataspace == ui::Dataspace::DISPLAY_P3 || expensiveBlurs; if (expensiveRenderingExpected) { if (expensiveRenderingExpected) { setExpensiveRenderingExpected(true); setExpensiveRenderingExpected(true); } } Loading