diff options
| author | 2022-03-09 13:49:41 -0800 | |
|---|---|---|
| committer | 2022-03-09 22:43:37 +0000 | |
| commit | 6fe2befa82f1f54c07891f33706e1b1d6672f927 (patch) | |
| tree | aadf1d8747057f6ea48e3517b91b7b89bf703c9e | |
| parent | a00eb14c5e8a95413b4f72b99a09b6acc5f5a374 (diff) | |
Revert "SF: Predict HWC composition strategy"
This reverts commit 7234fa59245e20b934a15ebbd27d4e189ad224d0.
Change-Id: I908f9c279bb91ce2ee654a05eb8ac8d0057caa47
Bug: 223543469
25 files changed, 106 insertions, 797 deletions
diff --git a/services/surfaceflinger/CompositionEngine/Android.bp b/services/surfaceflinger/CompositionEngine/Android.bp index 9302b7bc37..aefc014062 100644 --- a/services/surfaceflinger/CompositionEngine/Android.bp +++ b/services/surfaceflinger/CompositionEngine/Android.bp @@ -41,10 +41,6 @@ cc_defaults { "libtonemap", "libtrace_proto", "libaidlcommonsupport", - "libprocessgroup", - "libcgrouprc", - "libjsoncpp", - "libcgrouprc_format", ], header_libs: [ "android.hardware.graphics.composer@2.1-command-buffer", @@ -72,7 +68,6 @@ cc_library { "src/DisplayColorProfile.cpp", "src/DisplaySurface.cpp", "src/DumpHelpers.cpp", - "src/HwcAsyncWorker.cpp", "src/HwcBufferCache.cpp", "src/LayerFECompositionState.cpp", "src/Output.cpp", diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/DisplaySurface.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/DisplaySurface.h index ca86f4c604..c553fce85d 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/DisplaySurface.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/DisplaySurface.h @@ -72,9 +72,6 @@ public: virtual void resizeBuffers(const ui::Size&) = 0; virtual const sp<Fence>& getClientTargetAcquireFence() const = 0; - - // Returns true if the render surface supports client composition prediction. - virtual bool supportsCompositionStrategyPrediction() const; }; } // namespace compositionengine diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h index 15551029b3..d8644a428d 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h @@ -35,7 +35,6 @@ #include <utils/Vector.h> #include <ui/DisplayIdentification.h> -#include "DisplayHardware/HWComposer.h" namespace android { @@ -55,7 +54,6 @@ struct LayerFECompositionState; namespace impl { struct OutputCompositionState; -struct GpuCompositionResult; } // namespace impl /** @@ -264,9 +262,6 @@ public: // Latches the front-end layer state for each output layer virtual void updateLayerStateFromFE(const CompositionRefreshArgs&) const = 0; - // Enables predicting composition strategy to run client composition earlier - virtual void setPredictCompositionStrategy(bool) = 0; - protected: virtual void setDisplayColorProfile(std::unique_ptr<DisplayColorProfile>) = 0; virtual void setRenderSurface(std::unique_ptr<RenderSurface>) = 0; @@ -283,22 +278,13 @@ protected: virtual void updateColorProfile(const CompositionRefreshArgs&) = 0; virtual void beginFrame() = 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 finishFrame(const CompositionRefreshArgs&, GpuCompositionResult&&) = 0; + virtual void finishFrame(const CompositionRefreshArgs&) = 0; virtual std::optional<base::unique_fd> composeSurfaces( - const Region&, const compositionengine::CompositionRefreshArgs&, - std::shared_ptr<renderengine::ExternalTexture>, base::unique_fd&) = 0; + const Region&, const compositionengine::CompositionRefreshArgs& refreshArgs) = 0; virtual void postFramebuffer() = 0; virtual void renderCachedSets(const CompositionRefreshArgs&) = 0; - virtual std::optional<android::HWComposer::DeviceRequestedChanges> - chooseCompositionStrategy() = 0; - virtual void applyCompositionStrategy( - const std::optional<android::HWComposer::DeviceRequestedChanges>& changes) = 0; + virtual void chooseCompositionStrategy() = 0; virtual bool getSkipColorTransform() const = 0; virtual FrameFences presentAndGetFrameFences() = 0; virtual std::vector<LayerFE::LayerSettings> generateClientCompositionRequests( @@ -309,7 +295,6 @@ protected: std::vector<LayerFE::LayerSettings>& clientCompositionLayers) = 0; virtual void setExpensiveRenderingExpected(bool enabled) = 0; virtual void cacheClientCompositionRequests(uint32_t cacheSize) = 0; - virtual bool canPredictCompositionStrategy(const CompositionRefreshArgs&) = 0; }; } // namespace compositionengine diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/RenderSurface.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/RenderSurface.h index 9ee779cca1..daee83bd2c 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/RenderSurface.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/RenderSurface.h @@ -100,9 +100,6 @@ public: // Debugging - gets the page flip count for the RenderSurface virtual std::uint32_t getPageFlipCount() const = 0; - - // Returns true if the render surface supports client composition prediction. - virtual bool supportsCompositionStrategyPrediction() const = 0; }; } // namespace compositionengine diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Display.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Display.h index 3b8b06fc2f..58d2530877 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Display.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Display.h @@ -22,7 +22,6 @@ #include <compositionengine/DisplayColorProfile.h> #include <compositionengine/DisplayCreationArgs.h> #include <compositionengine/RenderSurface.h> -#include <compositionengine/impl/GpuCompositionResult.h> #include <compositionengine/impl/Output.h> #include <ui/PixelFormat.h> #include <ui/Size.h> @@ -52,14 +51,11 @@ public: void setReleasedLayers(const CompositionRefreshArgs&) override; void setColorTransform(const CompositionRefreshArgs&) override; void setColorProfile(const ColorProfile&) override; - - using DeviceRequestedChanges = android::HWComposer::DeviceRequestedChanges; - std::optional<DeviceRequestedChanges> chooseCompositionStrategy() override; - void applyCompositionStrategy(const std::optional<DeviceRequestedChanges>&) override; + void chooseCompositionStrategy() override; bool getSkipColorTransform() const override; compositionengine::Output::FrameFences presentAndGetFrameFences() override; void setExpensiveRenderingExpected(bool) override; - void finishFrame(const CompositionRefreshArgs&, GpuCompositionResult&&) override; + void finishFrame(const CompositionRefreshArgs&) override; // compositionengine::Display overrides DisplayId getId() const override; @@ -77,6 +73,7 @@ public: using DisplayRequests = android::HWComposer::DeviceRequestedChanges::DisplayRequests; using LayerRequests = android::HWComposer::DeviceRequestedChanges::LayerRequests; using ClientTargetProperty = android::HWComposer::DeviceRequestedChanges::ClientTargetProperty; + virtual bool anyLayersRequireClientComposition() const; virtual bool allLayersRequireClientComposition() const; virtual void applyChangedTypesToLayers(const ChangedTypes&); virtual void applyDisplayRequests(const DisplayRequests&); diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/GpuCompositionResult.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/GpuCompositionResult.h deleted file mode 100644 index ed1ddc172c..0000000000 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/GpuCompositionResult.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include <android-base/unique_fd.h> -#include <ui/GraphicBuffer.h> - -namespace android::compositionengine::impl { - -struct GpuCompositionResult { - // True if composition strategy was predicted successfully. - bool succeeded = false; - - // Composition ready fence. - base::unique_fd fence{}; - - // Buffer to be used for gpu composition. If gpu composition was not successful, - // then we want to reuse the buffer instead of dequeuing another buffer. - std::shared_ptr<renderengine::ExternalTexture> buffer = nullptr; - - bool bufferAvailable() const { return buffer != nullptr; }; -}; - -} // namespace android::compositionengine::impl diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/HwcAsyncWorker.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/HwcAsyncWorker.h deleted file mode 100644 index 11c0054089..0000000000 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/HwcAsyncWorker.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include <android-base/thread_annotations.h> -#include <future> -#include <optional> -#include <thread> - -#include "DisplayHardware/HWComposer.h" - -namespace android::compositionengine::impl { - -// HWC Validate call may take multiple milliseconds to complete and can account for -// a signification amount of time in the display hotpath. This helper class allows -// us to run the hwc validate function on a real time thread if we can predict what -// the composition strategy will be and if composition includes client composition. -// While the hwc validate runs, client composition is kicked off with the prediction. -// When the worker returns with a value, the composition continues if the prediction -// was successful otherwise the client composition is re-executed. -// -// Note: This does not alter the sequence between HWC and surfaceflinger. -class HwcAsyncWorker final { -public: - HwcAsyncWorker(); - ~HwcAsyncWorker(); - // Runs the provided function which calls hwc validate and returns the requested - // device changes as a future. - std::future<std::optional<android::HWComposer::DeviceRequestedChanges>> send( - std::function<std::optional<android::HWComposer::DeviceRequestedChanges>()>); - -private: - std::mutex mMutex; - std::condition_variable mCv GUARDED_BY(mMutex); - bool mDone GUARDED_BY(mMutex) = false; - bool mTaskRequested GUARDED_BY(mMutex) = false; - std::packaged_task<std::optional<android::HWComposer::DeviceRequestedChanges>()> mTask - GUARDED_BY(mMutex); - std::thread mThread; - void run(); -}; - -} // namespace android::compositionengine::impl diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h index 0be5d018f6..a7a8e97be5 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h @@ -17,13 +17,9 @@ #pragma once #include <compositionengine/CompositionEngine.h> -#include <compositionengine/LayerFECompositionState.h> #include <compositionengine/Output.h> #include <compositionengine/impl/ClientCompositionRequestCache.h> -#include <compositionengine/impl/GpuCompositionResult.h> -#include <compositionengine/impl/HwcAsyncWorker.h> #include <compositionengine/impl/OutputCompositionState.h> -#include <compositionengine/impl/OutputLayerCompositionState.h> #include <compositionengine/impl/planner/Planner.h> #include <renderengine/DisplaySettings.h> #include <renderengine/LayerSettings.h> @@ -96,38 +92,25 @@ public: void updateColorProfile(const compositionengine::CompositionRefreshArgs&) override; void beginFrame() override; void prepareFrame() override; - GpuCompositionResult prepareFrameAsync(const CompositionRefreshArgs&) override; void devOptRepaintFlash(const CompositionRefreshArgs&) override; - void finishFrame(const CompositionRefreshArgs&, GpuCompositionResult&&) override; - std::optional<base::unique_fd> composeSurfaces(const Region&, - const compositionengine::CompositionRefreshArgs&, - std::shared_ptr<renderengine::ExternalTexture>, - base::unique_fd&) override; + void finishFrame(const CompositionRefreshArgs&) override; + std::optional<base::unique_fd> composeSurfaces( + const Region&, const compositionengine::CompositionRefreshArgs& refreshArgs) override; void postFramebuffer() override; void renderCachedSets(const CompositionRefreshArgs&) override; void cacheClientCompositionRequests(uint32_t) override; - bool canPredictCompositionStrategy(const CompositionRefreshArgs&) override; - void setPredictCompositionStrategy(bool) override; // Testing const ReleasedLayers& getReleasedLayersForTest() const; void setDisplayColorProfileForTest(std::unique_ptr<compositionengine::DisplayColorProfile>); void setRenderSurfaceForTest(std::unique_ptr<compositionengine::RenderSurface>); bool plannerEnabled() const { return mPlanner != nullptr; } - virtual bool anyLayersRequireClientComposition() const; - virtual void updateProtectedContentState(); - virtual bool dequeueRenderBuffer(base::unique_fd*, - std::shared_ptr<renderengine::ExternalTexture>*); - virtual std::future<std::optional<android::HWComposer::DeviceRequestedChanges>> - chooseCompositionStrategyAsync(); protected: std::unique_ptr<compositionengine::OutputLayer> createOutputLayer(const sp<LayerFE>&) const; std::optional<size_t> findCurrentOutputLayerForLayer( const sp<compositionengine::LayerFE>&) const; - using DeviceRequestedChanges = android::HWComposer::DeviceRequestedChanges; - std::optional<DeviceRequestedChanges> chooseCompositionStrategy() override; - void applyCompositionStrategy(const std::optional<DeviceRequestedChanges>&) override{}; + void chooseCompositionStrategy() override; bool getSkipColorTransform() const override; compositionengine::Output::FrameFences presentAndGetFrameFences() override; std::vector<LayerFE::LayerSettings> generateClientCompositionRequests( @@ -148,7 +131,6 @@ protected: private: void dirtyEntireOutput(); compositionengine::OutputLayer* findLayerRequestingBackgroundComposition() const; - void finishPrepareFrame(); ui::Dataspace getBestDataspace(ui::Dataspace*, bool*) const; compositionengine::Output::ColorProfile pickColorProfile( const compositionengine::CompositionRefreshArgs&) const; @@ -162,7 +144,6 @@ private: OutputLayer* mLayerRequestingBackgroundBlur = nullptr; std::unique_ptr<ClientCompositionRequestCache> mClientCompositionRequestCache; std::unique_ptr<planner::Planner> mPlanner; - std::unique_ptr<HwcAsyncWorker> mHwComposerAsyncWorker; }; // This template factory function standardizes the implementation details of the diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputCompositionState.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputCompositionState.h index 92f22b6a16..66dd825e5b 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputCompositionState.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputCompositionState.h @@ -37,8 +37,6 @@ #include <ui/Region.h> #include <ui/Transform.h> -#include "DisplayHardware/HWComposer.h" - namespace android { namespace compositionengine::impl { @@ -116,8 +114,6 @@ struct OutputCompositionState { // Current target dataspace ui::Dataspace targetDataspace{ui::Dataspace::UNKNOWN}; - std::optional<android::HWComposer::DeviceRequestedChanges> previousDeviceRequestedChanges{}; - // The earliest time to send the present command to the HAL std::chrono::steady_clock::time_point earliestPresentTime; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/RenderSurface.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/RenderSurface.h index e4cb113645..a8a538003e 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/RenderSurface.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/RenderSurface.h @@ -63,7 +63,6 @@ public: void queueBuffer(base::unique_fd readyFence) override; void onPresentDisplayCompleted() override; void flip() override; - bool supportsCompositionStrategyPrediction() const override; // Debugging void dump(std::string& result) const override; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Display.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Display.h index 72e6f3bdbb..d90cc909ba 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Display.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Display.h @@ -41,7 +41,6 @@ public: MOCK_METHOD1(createDisplayColorProfile, void(const DisplayColorProfileCreationArgs&)); MOCK_METHOD1(createRenderSurface, void(const RenderSurfaceCreationArgs&)); MOCK_METHOD1(createClientCompositionCache, void(uint32_t)); - MOCK_METHOD1(setPredictCompositionStrategy, void(bool)); }; } // namespace android::compositionengine::mock diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h index 27303a82be..b68b95d07b 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h @@ -22,7 +22,6 @@ #include <compositionengine/Output.h> #include <compositionengine/OutputLayer.h> #include <compositionengine/RenderSurface.h> -#include <compositionengine/impl/GpuCompositionResult.h> #include <compositionengine/impl/OutputCompositionState.h> #include <gmock/gmock.h> @@ -100,22 +99,16 @@ public: MOCK_METHOD0(beginFrame, void()); MOCK_METHOD0(prepareFrame, void()); - MOCK_METHOD1(prepareFrameAsync, GpuCompositionResult(const CompositionRefreshArgs&)); - MOCK_METHOD0(chooseCompositionStrategy, - std::optional<android::HWComposer::DeviceRequestedChanges>()); - MOCK_METHOD1(applyCompositionStrategy, - void(const std::optional<android::HWComposer::DeviceRequestedChanges>&)); + MOCK_METHOD0(chooseCompositionStrategy, void()); MOCK_METHOD1(devOptRepaintFlash, void(const compositionengine::CompositionRefreshArgs&)); - MOCK_METHOD2(finishFrame, - void(const compositionengine::CompositionRefreshArgs&, GpuCompositionResult&&)); + MOCK_METHOD1(finishFrame, void(const compositionengine::CompositionRefreshArgs&)); - MOCK_METHOD4(composeSurfaces, + MOCK_METHOD2(composeSurfaces, std::optional<base::unique_fd>( const Region&, - const compositionengine::CompositionRefreshArgs& refreshArgs, - std::shared_ptr<renderengine::ExternalTexture>, base::unique_fd&)); + const compositionengine::CompositionRefreshArgs& refreshArgs)); MOCK_CONST_METHOD0(getSkipColorTransform, bool()); MOCK_METHOD0(postFramebuffer, void()); @@ -128,8 +121,6 @@ public: void(const Region&, std::vector<LayerFE::LayerSettings>&)); MOCK_METHOD1(setExpensiveRenderingExpected, void(bool)); MOCK_METHOD1(cacheClientCompositionRequests, void(uint32_t)); - MOCK_METHOD1(canPredictCompositionStrategy, bool(const CompositionRefreshArgs&)); - MOCK_METHOD1(setPredictCompositionStrategy, void(bool)); }; } // namespace android::compositionengine::mock diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/RenderSurface.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/RenderSurface.h index e12aebb50c..fe858c2817 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/RenderSurface.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/RenderSurface.h @@ -45,7 +45,6 @@ public: MOCK_METHOD0(flip, void()); MOCK_CONST_METHOD1(dump, void(std::string& result)); MOCK_CONST_METHOD0(getPageFlipCount, std::uint32_t()); - MOCK_CONST_METHOD0(supportsCompositionStrategyPrediction, bool()); }; } // namespace android::compositionengine::mock diff --git a/services/surfaceflinger/CompositionEngine/src/Display.cpp b/services/surfaceflinger/CompositionEngine/src/Display.cpp index 09648c356d..6a75283f7b 100644 --- a/services/surfaceflinger/CompositionEngine/src/Display.cpp +++ b/services/surfaceflinger/CompositionEngine/src/Display.cpp @@ -221,12 +221,12 @@ void Display::setReleasedLayers(const compositionengine::CompositionRefreshArgs& setReleasedLayers(std::move(releasedLayers)); } -std::optional<android::HWComposer::DeviceRequestedChanges> Display::chooseCompositionStrategy() { +void Display::chooseCompositionStrategy() { ATRACE_CALL(); ALOGV(__FUNCTION__); if (mIsDisconnected) { - return {}; + return; } // Default to the base settings -- client composition only. @@ -235,7 +235,7 @@ std::optional<android::HWComposer::DeviceRequestedChanges> Display::chooseCompos // If we don't have a HWC display, then we are done. const auto halDisplayId = HalDisplayId::tryCast(mId); if (!halDisplayId) { - return {}; + return; } // Get any composition changes requested by the HWC device, and apply them. @@ -260,13 +260,8 @@ std::optional<android::HWComposer::DeviceRequestedChanges> Display::chooseCompos result != NO_ERROR) { ALOGE("chooseCompositionStrategy failed for %s: %d (%s)", getName().c_str(), result, strerror(-result)); - return {}; + return; } - - return changes; -} - -void Display::applyCompositionStrategy(const std::optional<DeviceRequestedChanges>& changes) { if (changes) { applyChangedTypesToLayers(changes->changedTypes); applyDisplayRequests(changes->displayRequests); @@ -292,6 +287,12 @@ bool Display::getSkipColorTransform() const { return hwc.hasCapability(Capability::SKIP_CLIENT_COLOR_TRANSFORM); } +bool Display::anyLayersRequireClientComposition() const { + const auto layers = getOutputLayersOrderedByZ(); + return std::any_of(layers.begin(), layers.end(), + [](const auto& layer) { return layer->requiresClientComposition(); }); +} + bool Display::allLayersRequireClientComposition() const { const auto layers = getOutputLayersOrderedByZ(); return std::all_of(layers.begin(), layers.end(), @@ -389,8 +390,7 @@ void Display::setExpensiveRenderingExpected(bool enabled) { } } -void Display::finishFrame(const compositionengine::CompositionRefreshArgs& refreshArgs, - GpuCompositionResult&& result) { +void Display::finishFrame(const compositionengine::CompositionRefreshArgs& refreshArgs) { // We only need to actually compose the display if: // 1) It is being handled by hardware composer, which may need this to // keep its virtual display state machine in sync, or @@ -400,7 +400,7 @@ void Display::finishFrame(const compositionengine::CompositionRefreshArgs& refre return; } - impl::Output::finishFrame(refreshArgs, std::move(result)); + impl::Output::finishFrame(refreshArgs); } } // namespace android::compositionengine::impl diff --git a/services/surfaceflinger/CompositionEngine/src/DisplaySurface.cpp b/services/surfaceflinger/CompositionEngine/src/DisplaySurface.cpp index 28900af162..db6d4f2fed 100644 --- a/services/surfaceflinger/CompositionEngine/src/DisplaySurface.cpp +++ b/services/surfaceflinger/CompositionEngine/src/DisplaySurface.cpp @@ -20,8 +20,4 @@ namespace android::compositionengine { DisplaySurface::~DisplaySurface() = default; -bool DisplaySurface::supportsCompositionStrategyPrediction() const { - return true; -} - } // namespace android::compositionengine diff --git a/services/surfaceflinger/CompositionEngine/src/HwcAsyncWorker.cpp b/services/surfaceflinger/CompositionEngine/src/HwcAsyncWorker.cpp deleted file mode 100644 index 497424a327..0000000000 --- a/services/surfaceflinger/CompositionEngine/src/HwcAsyncWorker.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <compositionengine/impl/HwcAsyncWorker.h> -#include <processgroup/sched_policy.h> -#include <pthread.h> -#include <sched.h> -#include <sys/prctl.h> -#include <sys/resource.h> -#include <system/thread_defs.h> - -#include <android-base/thread_annotations.h> -#include <cutils/sched_policy.h> - -namespace android::compositionengine::impl { - -HwcAsyncWorker::HwcAsyncWorker() { - mThread = std::thread(&HwcAsyncWorker::run, this); - pthread_setname_np(mThread.native_handle(), "HwcAsyncWorker"); -} - -HwcAsyncWorker::~HwcAsyncWorker() { - { - std::scoped_lock lock(mMutex); - mDone = true; - mCv.notify_all(); - } - if (mThread.joinable()) { - mThread.join(); - } -} -std::future<std::optional<android::HWComposer::DeviceRequestedChanges>> HwcAsyncWorker::send( - std::function<std::optional<android::HWComposer::DeviceRequestedChanges>()> task) { - std::unique_lock<std::mutex> lock(mMutex); - android::base::ScopedLockAssertion assumeLock(mMutex); - mTask = std::packaged_task<std::optional<android::HWComposer::DeviceRequestedChanges>()>( - [task = std::move(task)]() { return task(); }); - mTaskRequested = true; - mCv.notify_one(); - return mTask.get_future(); -} - -void HwcAsyncWorker::run() { - set_sched_policy(0, SP_FOREGROUND); - struct sched_param param = {0}; - param.sched_priority = 2; - sched_setscheduler(gettid(), SCHED_FIFO, ¶m); - - std::unique_lock<std::mutex> lock(mMutex); - android::base::ScopedLockAssertion assumeLock(mMutex); - while (!mDone) { - mCv.wait(lock); - if (mTaskRequested && mTask.valid()) { - mTask(); - mTaskRequested = false; - } - } -} - -} // namespace android::compositionengine::impl diff --git a/services/surfaceflinger/CompositionEngine/src/Output.cpp b/services/surfaceflinger/CompositionEngine/src/Output.cpp index cd10bc10b5..aef55d49fe 100644 --- a/services/surfaceflinger/CompositionEngine/src/Output.cpp +++ b/services/surfaceflinger/CompositionEngine/src/Output.cpp @@ -22,7 +22,6 @@ #include <compositionengine/LayerFE.h> #include <compositionengine/LayerFECompositionState.h> #include <compositionengine/RenderSurface.h> -#include <compositionengine/impl/HwcAsyncWorker.h> #include <compositionengine/impl/Output.h> #include <compositionengine/impl/OutputCompositionState.h> #include <compositionengine/impl/OutputLayer.h> @@ -435,17 +434,9 @@ void Output::present(const compositionengine::CompositionRefreshArgs& refreshArg writeCompositionState(refreshArgs); setColorTransform(refreshArgs); beginFrame(); - - GpuCompositionResult result; - const bool predictCompositionStrategy = canPredictCompositionStrategy(refreshArgs); - if (predictCompositionStrategy) { - result = prepareFrameAsync(refreshArgs); - } else { - prepareFrame(); - } - + prepareFrame(); devOptRepaintFlash(refreshArgs); - finishFrame(refreshArgs, std::move(result)); + finishFrame(refreshArgs); postFramebuffer(); renderCachedSets(refreshArgs); } @@ -960,62 +951,19 @@ void Output::prepareFrame() { ATRACE_CALL(); ALOGV(__FUNCTION__); - auto& outputState = editState(); + const auto& outputState = getState(); if (!outputState.isEnabled) { return; } - auto changes = chooseCompositionStrategy(); - outputState.previousDeviceRequestedChanges = changes; - if (changes) { - applyCompositionStrategy(changes); - } - finishPrepareFrame(); -} + chooseCompositionStrategy(); -std::future<std::optional<android::HWComposer::DeviceRequestedChanges>> -Output::chooseCompositionStrategyAsync() { - return mHwComposerAsyncWorker->send([&]() { return chooseCompositionStrategy(); }); -} - -GpuCompositionResult Output::prepareFrameAsync(const CompositionRefreshArgs& refreshArgs) { - ATRACE_CALL(); - ALOGV(__FUNCTION__); - auto& state = editState(); - const auto& previousChanges = state.previousDeviceRequestedChanges; - auto hwcResult = chooseCompositionStrategyAsync(); - applyCompositionStrategy(previousChanges); - finishPrepareFrame(); - - base::unique_fd bufferFence; - std::shared_ptr<renderengine::ExternalTexture> buffer; - updateProtectedContentState(); - const bool dequeueSucceeded = dequeueRenderBuffer(&bufferFence, &buffer); - GpuCompositionResult compositionResult; - if (dequeueSucceeded) { - std::optional<base::unique_fd> optFd = - composeSurfaces(Region::INVALID_REGION, refreshArgs, buffer, bufferFence); - if (optFd) { - compositionResult.fence = std::move(*optFd); - } + if (mPlanner) { + mPlanner->reportFinalPlan(getOutputLayersOrderedByZ()); } - auto changes = hwcResult.valid() ? hwcResult.get() : std::nullopt; - const bool predictionSucceeded = dequeueSucceeded && changes == previousChanges; - compositionResult.succeeded = predictionSucceeded; - if (!predictionSucceeded) { - ATRACE_NAME("CompositionStrategyPredictionMiss"); - if (changes) { - applyCompositionStrategy(changes); - } - finishPrepareFrame(); - // Track the dequeued buffer to reuse so we don't need to dequeue another one. - compositionResult.buffer = buffer; - } else { - ATRACE_NAME("CompositionStrategyPredictionHit"); - } - state.previousDeviceRequestedChanges = std::move(changes); - return compositionResult; + mRenderSurface->prepareFrame(outputState.usesClientComposition, + outputState.usesDeviceComposition); } void Output::devOptRepaintFlash(const compositionengine::CompositionRefreshArgs& refreshArgs) { @@ -1025,11 +973,7 @@ void Output::devOptRepaintFlash(const compositionengine::CompositionRefreshArgs& if (getState().isEnabled) { if (const auto dirtyRegion = getDirtyRegion(); !dirtyRegion.isEmpty()) { - base::unique_fd bufferFence; - std::shared_ptr<renderengine::ExternalTexture> buffer; - updateProtectedContentState(); - dequeueRenderBuffer(&bufferFence, &buffer); - static_cast<void>(composeSurfaces(dirtyRegion, refreshArgs, buffer, bufferFence)); + static_cast<void>(composeSurfaces(dirtyRegion, refreshArgs)); mRenderSurface->queueBuffer(base::unique_fd()); } } @@ -1041,7 +985,7 @@ void Output::devOptRepaintFlash(const compositionengine::CompositionRefreshArgs& prepareFrame(); } -void Output::finishFrame(const CompositionRefreshArgs& refreshArgs, GpuCompositionResult&& result) { +void Output::finishFrame(const compositionengine::CompositionRefreshArgs& refreshArgs) { ATRACE_CALL(); ALOGV(__FUNCTION__); @@ -1049,25 +993,9 @@ void Output::finishFrame(const CompositionRefreshArgs& refreshArgs, GpuCompositi return; } - std::optional<base::unique_fd> optReadyFence; - std::shared_ptr<renderengine::ExternalTexture> buffer; - base::unique_fd bufferFence; - if (result.succeeded) { - optReadyFence = std::move(result.fence); - } else { - if (result.bufferAvailable()) { - buffer = std::move(result.buffer); - bufferFence = std::move(result.fence); - } else { - updateProtectedContentState(); - if (!dequeueRenderBuffer(&bufferFence, &buffer)) { - return; - } - } - // Repaint the framebuffer (if needed), getting the optional fence for when - // the composition completes. - optReadyFence = composeSurfaces(Region::INVALID_REGION, refreshArgs, buffer, bufferFence); - } + // Repaint the framebuffer (if needed), getting the optional fence for when + // the composition completes. + auto optReadyFence = composeSurfaces(Region::INVALID_REGION, refreshArgs); if (!optReadyFence) { return; } @@ -1076,8 +1004,16 @@ void Output::finishFrame(const CompositionRefreshArgs& refreshArgs, GpuCompositi mRenderSurface->queueBuffer(std::move(*optReadyFence)); } -void Output::updateProtectedContentState() { +std::optional<base::unique_fd> Output::composeSurfaces( + const Region& debugRegion, const compositionengine::CompositionRefreshArgs& refreshArgs) { + ATRACE_CALL(); + ALOGV(__FUNCTION__); + const auto& outputState = getState(); + OutputCompositionState& outputCompositionState = editState(); + const TracedOrdinal<bool> hasClientComposition = {"hasClientComposition", + outputState.usesClientComposition}; + auto& renderEngine = getCompositionEngine().getRenderEngine(); const bool supportsProtectedContent = renderEngine.supportsProtectedContent(); @@ -1099,48 +1035,29 @@ void Output::updateProtectedContentState() { } else if (!outputState.isSecure && renderEngine.isProtected()) { renderEngine.useProtectedContext(false); } -} -bool Output::dequeueRenderBuffer(base::unique_fd* bufferFence, - std::shared_ptr<renderengine::ExternalTexture>* tex) { - const auto& outputState = getState(); + base::unique_fd fd; + + std::shared_ptr<renderengine::ExternalTexture> tex; // If we aren't doing client composition on this output, but do have a // flipClientTarget request for this frame on this output, we still need to // dequeue a buffer. - if (outputState.usesClientComposition || outputState.flipClientTarget) { - *tex = mRenderSurface->dequeueBuffer(bufferFence); - if (*tex == nullptr) { + if (hasClientComposition || outputState.flipClientTarget) { + tex = mRenderSurface->dequeueBuffer(&fd); + if (tex == nullptr) { ALOGW("Dequeuing buffer for display [%s] failed, bailing out of " "client composition for this frame", mName.c_str()); - return false; + return {}; } } - return true; -} -std::optional<base::unique_fd> Output::composeSurfaces( - const Region& debugRegion, const compositionengine::CompositionRefreshArgs& refreshArgs, - std::shared_ptr<renderengine::ExternalTexture> tex, base::unique_fd& fd) { - ATRACE_CALL(); - ALOGV(__FUNCTION__); - - const auto& outputState = getState(); - const TracedOrdinal<bool> hasClientComposition = {"hasClientComposition", - outputState.usesClientComposition}; if (!hasClientComposition) { setExpensiveRenderingExpected(false); return base::unique_fd(); } - if (tex == nullptr) { - ALOGW("Buffer not valid for display [%s], bailing out of " - "client composition for this frame", - mName.c_str()); - return {}; - } - ALOGV("hasClientComposition"); renderengine::DisplaySettings clientCompositionDisplay; @@ -1168,8 +1085,6 @@ std::optional<base::unique_fd> Output::composeSurfaces( outputState.usesDeviceComposition || getSkipColorTransform(); // Generate the client composition requests for the layers on this output. - auto& renderEngine = getCompositionEngine().getRenderEngine(); - const bool supportsProtectedContent = renderEngine.supportsProtectedContent(); std::vector<LayerFE*> clientCompositionLayersFE; std::vector<LayerFE::LayerSettings> clientCompositionLayers = generateClientCompositionRequests(supportsProtectedContent, @@ -1177,19 +1092,16 @@ std::optional<base::unique_fd> Output::composeSurfaces( clientCompositionLayersFE); appendRegionFlashRequests(debugRegion, clientCompositionLayers); - OutputCompositionState& outputCompositionState = editState(); // Check if the client composition requests were rendered into the provided graphic buffer. If // so, we can reuse the buffer and avoid client composition. if (mClientCompositionRequestCache) { if (mClientCompositionRequestCache->exists(tex->getBuffer()->getId(), clientCompositionDisplay, clientCompositionLayers)) { - ATRACE_NAME("ClientCompositionCacheHit"); outputCompositionState.reusedClientComposition = true; setExpensiveRenderingExpected(false); return base::unique_fd(); } - ATRACE_NAME("ClientCompositionCacheMiss"); mClientCompositionRequestCache->add(tex->getBuffer()->getId(), clientCompositionDisplay, clientCompositionLayers); } @@ -1441,13 +1353,12 @@ void Output::dirtyEntireOutput() { outputState.dirtyRegion.set(outputState.displaySpace.getBoundsAsRect()); } -std::optional<android::HWComposer::DeviceRequestedChanges> Output::chooseCompositionStrategy() { +void Output::chooseCompositionStrategy() { // The base output implementation can only do client composition auto& outputState = editState(); outputState.usesClientComposition = true; outputState.usesDeviceComposition = false; outputState.reusedClientComposition = false; - return {}; } bool Output::getSkipColorTransform() const { @@ -1462,63 +1373,5 @@ compositionengine::Output::FrameFences Output::presentAndGetFrameFences() { return result; } -void Output::setPredictCompositionStrategy(bool predict) { - if (predict) { - mHwComposerAsyncWorker = std::make_unique<HwcAsyncWorker>(); - } else { - mHwComposerAsyncWorker.reset(nullptr); - } -} - -bool Output::canPredictCompositionStrategy(const CompositionRefreshArgs& refreshArgs) { - if (!getState().isEnabled || !mHwComposerAsyncWorker) { - ALOGV("canPredictCompositionStrategy disabled"); - return false; - } - - if (!getState().previousDeviceRequestedChanges) { - ALOGV("canPredictCompositionStrategy previous changes not available"); - return false; - } - - if (!mRenderSurface->supportsCompositionStrategyPrediction()) { - ALOGV("canPredictCompositionStrategy surface does not support"); - return false; - } - - if (refreshArgs.devOptFlashDirtyRegionsDelay) { - ALOGV("canPredictCompositionStrategy devOptFlashDirtyRegionsDelay"); - return false; - } - - // If no layer uses clientComposition, then don't predict composition strategy - // because we have less work to do in parallel. - if (!anyLayersRequireClientComposition()) { - ALOGV("canPredictCompositionStrategy no layer uses clientComposition"); - return false; - } - - if (!refreshArgs.updatingOutputGeometryThisFrame) { - return true; - } - - ALOGV("canPredictCompositionStrategy updatingOutputGeometryThisFrame"); - return false; -} - -bool Output::anyLayersRequireClientComposition() const { - const auto layers = getOutputLayersOrderedByZ(); - return std::any_of(layers.begin(), layers.end(), - [](const auto& layer) { return layer->requiresClientComposition(); }); -} - -void Output::finishPrepareFrame() { - const auto& state = getState(); - if (mPlanner) { - mPlanner->reportFinalPlan(getOutputLayersOrderedByZ()); - } - mRenderSurface->prepareFrame(state.usesClientComposition, state.usesDeviceComposition); -} - } // namespace impl } // namespace android::compositionengine diff --git a/services/surfaceflinger/CompositionEngine/src/RenderSurface.cpp b/services/surfaceflinger/CompositionEngine/src/RenderSurface.cpp index 5a3af7bfea..12c2c8eb38 100644 --- a/services/surfaceflinger/CompositionEngine/src/RenderSurface.cpp +++ b/services/surfaceflinger/CompositionEngine/src/RenderSurface.cpp @@ -289,9 +289,5 @@ std::shared_ptr<renderengine::ExternalTexture>& RenderSurface::mutableTextureFor return mTexture; } -bool RenderSurface::supportsCompositionStrategyPrediction() const { - return mDisplaySurface->supportsCompositionStrategyPrediction(); -} - } // namespace impl } // namespace android::compositionengine diff --git a/services/surfaceflinger/CompositionEngine/tests/DisplayTest.cpp b/services/surfaceflinger/CompositionEngine/tests/DisplayTest.cpp index 36b04d909f..cd0323555c 100644 --- a/services/surfaceflinger/CompositionEngine/tests/DisplayTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/DisplayTest.cpp @@ -30,9 +30,7 @@ #include <compositionengine/mock/OutputLayer.h> #include <compositionengine/mock/RenderSurface.h> #include <gtest/gtest.h> -#include <renderengine/mock/FakeExternalTexture.h> #include <renderengine/mock/RenderEngine.h> - #include <ui/Rect.h> #include <ui/StaticDisplayInfo.h> @@ -200,22 +198,6 @@ struct PartialMockDisplayTestCommon : public DisplayTestCommon { std::shared_ptr<Display> mDisplay = createPartialMockDisplay<Display>(mCompositionEngine, getDisplayCreationArgsForPhysicalDisplay()); - - android::HWComposer::DeviceRequestedChanges mDeviceRequestedChanges{ - {{nullptr, Composition::CLIENT}}, - hal::DisplayRequest::FLIP_CLIENT_TARGET, - {{nullptr, hal::LayerRequest::CLEAR_CLIENT_TARGET}}, - {hal::PixelFormat::RGBA_8888, hal::Dataspace::UNKNOWN}, - -1.f, - }; - - void chooseCompositionStrategy(Display* display) { - std::optional<android::HWComposer::DeviceRequestedChanges> changes = - display->chooseCompositionStrategy(); - if (changes) { - display->applyCompositionStrategy(changes); - } - } }; struct FullDisplayImplTestCommon : public DisplayTestCommon { @@ -232,11 +214,6 @@ struct DisplayWithLayersTestCommon : public FullDisplayImplTestCommon { std::unique_ptr<compositionengine::OutputLayer>(mLayer2.outputLayer)); mDisplay->injectOutputLayerForTest( std::unique_ptr<compositionengine::OutputLayer>(mLayer3.outputLayer)); - mResultWithBuffer.buffer = std::make_shared< - renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/, - 1ULL /* bufferId */, - HAL_PIXEL_FORMAT_RGBA_8888, - 0ULL /*usage*/); } Layer mLayer1; @@ -245,8 +222,6 @@ struct DisplayWithLayersTestCommon : public FullDisplayImplTestCommon { StrictMock<HWC2::mock::Layer> hwc2LayerUnknown; std::shared_ptr<Display> mDisplay = createDisplay<Display>(mCompositionEngine, getDisplayCreationArgsForPhysicalDisplay()); - impl::GpuCompositionResult mResultWithBuffer; - impl::GpuCompositionResult mResultWithoutBuffer; }; /* @@ -579,7 +554,7 @@ TEST_F(DisplayChooseCompositionStrategyTest, takesEarlyOutIfGpuDisplay) { createPartialMockDisplay<Display>(mCompositionEngine, args); EXPECT_TRUE(GpuVirtualDisplayId::tryCast(gpuDisplay->getId())); - chooseCompositionStrategy(gpuDisplay.get()); + gpuDisplay->chooseCompositionStrategy(); auto& state = gpuDisplay->getState(); EXPECT_TRUE(state.usesClientComposition); @@ -592,12 +567,11 @@ TEST_F(DisplayChooseCompositionStrategyTest, takesEarlyOutOnHwcError) { getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), false, _, _, _, _)) .WillOnce(Return(INVALID_OPERATION)); - chooseCompositionStrategy(mDisplay.get()); + mDisplay->chooseCompositionStrategy(); auto& state = mDisplay->getState(); EXPECT_TRUE(state.usesClientComposition); EXPECT_FALSE(state.usesDeviceComposition); - EXPECT_FALSE(state.previousDeviceRequestedChanges.has_value()); } TEST_F(DisplayChooseCompositionStrategyTest, normalOperation) { @@ -614,16 +588,10 @@ TEST_F(DisplayChooseCompositionStrategyTest, normalOperation) { EXPECT_CALL(mHwComposer, getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), true, _, _, _, _)) - .WillOnce(testing::DoAll(testing::SetArgPointee<5>(mDeviceRequestedChanges), - Return(NO_ERROR))); - EXPECT_CALL(*mDisplay, applyChangedTypesToLayers(mDeviceRequestedChanges.changedTypes)) - .Times(1); - EXPECT_CALL(*mDisplay, applyDisplayRequests(mDeviceRequestedChanges.displayRequests)).Times(1); - EXPECT_CALL(*mDisplay, applyLayerRequestsToLayers(mDeviceRequestedChanges.layerRequests)) - .Times(1); + .WillOnce(Return(NO_ERROR)); EXPECT_CALL(*mDisplay, allLayersRequireClientComposition()).WillOnce(Return(false)); - chooseCompositionStrategy(mDisplay.get()); + mDisplay->chooseCompositionStrategy(); auto& state = mDisplay->getState(); EXPECT_FALSE(state.usesClientComposition); @@ -650,17 +618,11 @@ TEST_F(DisplayChooseCompositionStrategyTest, normalOperationWithDisplayBrightnes EXPECT_CALL(mHwComposer, getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), true, _, _, _, _)) - .WillOnce(testing::DoAll(testing::SetArgPointee<5>(mDeviceRequestedChanges), - Return(NO_ERROR))); - EXPECT_CALL(*mDisplay, applyChangedTypesToLayers(mDeviceRequestedChanges.changedTypes)) - .Times(1); - EXPECT_CALL(*mDisplay, applyDisplayRequests(mDeviceRequestedChanges.displayRequests)).Times(1); - EXPECT_CALL(*mDisplay, applyLayerRequestsToLayers(mDeviceRequestedChanges.layerRequests)) - .Times(1); + .WillOnce(Return(NO_ERROR)); EXPECT_CALL(*mDisplay, allLayersRequireClientComposition()).WillOnce(Return(false)); mDisplay->setNextBrightness(kDisplayBrightness); - chooseCompositionStrategy(mDisplay.get()); + mDisplay->chooseCompositionStrategy(); auto& state = mDisplay->getState(); EXPECT_FALSE(state.usesClientComposition); @@ -669,6 +631,14 @@ TEST_F(DisplayChooseCompositionStrategyTest, normalOperationWithDisplayBrightnes } TEST_F(DisplayChooseCompositionStrategyTest, normalOperationWithChanges) { + android::HWComposer::DeviceRequestedChanges changes{ + {{nullptr, Composition::CLIENT}}, + hal::DisplayRequest::FLIP_CLIENT_TARGET, + {{nullptr, hal::LayerRequest::CLEAR_CLIENT_TARGET}}, + {hal::PixelFormat::RGBA_8888, hal::Dataspace::UNKNOWN}, + -1.f, + }; + // Since two calls are made to anyLayersRequireClientComposition with different return // values, use a Sequence to control the matching so the values are returned in a known // order. @@ -682,15 +652,13 @@ TEST_F(DisplayChooseCompositionStrategyTest, normalOperationWithChanges) { EXPECT_CALL(mHwComposer, getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), true, _, _, _, _)) - .WillOnce(DoAll(SetArgPointee<5>(mDeviceRequestedChanges), Return(NO_ERROR))); - EXPECT_CALL(*mDisplay, applyChangedTypesToLayers(mDeviceRequestedChanges.changedTypes)) - .Times(1); - EXPECT_CALL(*mDisplay, applyDisplayRequests(mDeviceRequestedChanges.displayRequests)).Times(1); - EXPECT_CALL(*mDisplay, applyLayerRequestsToLayers(mDeviceRequestedChanges.layerRequests)) - .Times(1); + .WillOnce(DoAll(SetArgPointee<5>(changes), Return(NO_ERROR))); + EXPECT_CALL(*mDisplay, applyChangedTypesToLayers(changes.changedTypes)).Times(1); + EXPECT_CALL(*mDisplay, applyDisplayRequests(changes.displayRequests)).Times(1); + EXPECT_CALL(*mDisplay, applyLayerRequestsToLayers(changes.layerRequests)).Times(1); EXPECT_CALL(*mDisplay, allLayersRequireClientComposition()).WillOnce(Return(false)); - chooseCompositionStrategy(mDisplay.get()); + mDisplay->chooseCompositionStrategy(); auto& state = mDisplay->getState(); EXPECT_FALSE(state.usesClientComposition); @@ -954,7 +922,7 @@ TEST_F(DisplayFinishFrameTest, doesNotSkipCompositionIfNotDirtyOnHwcDisplay) { mDisplay->editState().layerStackSpace.setContent(Rect(0, 0, 1, 1)); mDisplay->editState().dirtyRegion = Region::INVALID_REGION; - mDisplay->finishFrame({}, std::move(mResultWithBuffer)); + mDisplay->finishFrame({}); } TEST_F(DisplayFinishFrameTest, skipsCompositionIfNotDirty) { @@ -972,7 +940,7 @@ TEST_F(DisplayFinishFrameTest, skipsCompositionIfNotDirty) { gpuDisplay->editState().layerStackSpace.setContent(Rect(0, 0, 1, 1)); gpuDisplay->editState().dirtyRegion = Region::INVALID_REGION; - gpuDisplay->finishFrame({}, std::move(mResultWithoutBuffer)); + gpuDisplay->finishFrame({}); } TEST_F(DisplayFinishFrameTest, performsCompositionIfDirty) { @@ -989,7 +957,7 @@ TEST_F(DisplayFinishFrameTest, performsCompositionIfDirty) { gpuDisplay->editState().usesClientComposition = false; gpuDisplay->editState().layerStackSpace.setContent(Rect(0, 0, 1, 1)); gpuDisplay->editState().dirtyRegion = Region(Rect(0, 0, 1, 1)); - gpuDisplay->finishFrame({}, std::move(mResultWithBuffer)); + gpuDisplay->finishFrame({}); } /* diff --git a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp index 4e875c8a25..c2521b2fc2 100644 --- a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp @@ -28,7 +28,6 @@ #include <gtest/gtest.h> #include <renderengine/ExternalTexture.h> #include <renderengine/impl/ExternalTexture.h> -#include <renderengine/mock/FakeExternalTexture.h> #include <renderengine/mock/RenderEngine.h> #include <ui/Rect.h> #include <ui/Region.h> @@ -990,7 +989,7 @@ struct OutputPrepareFrameTest : public testing::Test { struct OutputPartialMock : public OutputPartialMockBase { // Sets up the helper functions called by the function under test to use // mock implementations. - MOCK_METHOD0(chooseCompositionStrategy, std::optional<DeviceRequestedChanges>()); + MOCK_METHOD0(chooseCompositionStrategy, void()); }; OutputPrepareFrameTest() { @@ -1038,133 +1037,6 @@ TEST_F(OutputTest, prepareFrameSetsClientCompositionOnlyByDefault) { EXPECT_FALSE(mOutput->getState().usesDeviceComposition); } -struct OutputPrepareFrameAsyncTest : public testing::Test { - struct OutputPartialMock : public OutputPartialMockBase { - // Sets up the helper functions called by the function under test to use - // mock implementations. - MOCK_METHOD0(chooseCompositionStrategy, std::optional<DeviceRequestedChanges>()); - MOCK_METHOD0(updateProtectedContentState, void()); - MOCK_METHOD2(dequeueRenderBuffer, - bool(base::unique_fd*, std::shared_ptr<renderengine::ExternalTexture>*)); - MOCK_METHOD0(chooseCompositionStrategyAsync, - std::future<std::optional<android::HWComposer::DeviceRequestedChanges>>()); - MOCK_METHOD4(composeSurfaces, - std::optional<base::unique_fd>( - const Region&, const compositionengine::CompositionRefreshArgs&, - std::shared_ptr<renderengine::ExternalTexture>, base::unique_fd&)); - }; - - OutputPrepareFrameAsyncTest() { - mOutput.setDisplayColorProfileForTest( - std::unique_ptr<DisplayColorProfile>(mDisplayColorProfile)); - mOutput.setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(mRenderSurface)); - } - - StrictMock<mock::CompositionEngine> mCompositionEngine; - mock::DisplayColorProfile* mDisplayColorProfile = new StrictMock<mock::DisplayColorProfile>(); - mock::RenderSurface* mRenderSurface = new StrictMock<mock::RenderSurface>(); - StrictMock<OutputPartialMock> mOutput; - CompositionRefreshArgs mRefreshArgs; -}; - -TEST_F(OutputPrepareFrameAsyncTest, delegatesToChooseCompositionStrategyAndRenderSurface) { - mOutput.editState().isEnabled = true; - mOutput.editState().usesClientComposition = false; - mOutput.editState().usesDeviceComposition = true; - mOutput.editState().previousDeviceRequestedChanges = - std::make_optional<android::HWComposer::DeviceRequestedChanges>({}); - std::promise<std::optional<android::HWComposer::DeviceRequestedChanges>> p; - p.set_value(mOutput.editState().previousDeviceRequestedChanges); - - EXPECT_CALL(mOutput, getOutputLayerCount()).WillRepeatedly(Return(0u)); - EXPECT_CALL(mOutput, updateProtectedContentState()); - EXPECT_CALL(mOutput, dequeueRenderBuffer(_, _)).WillOnce(Return(true)); - EXPECT_CALL(*mRenderSurface, prepareFrame(false, true)); - EXPECT_CALL(mOutput, chooseCompositionStrategyAsync()).WillOnce([&] { return p.get_future(); }); - EXPECT_CALL(mOutput, composeSurfaces(_, Ref(mRefreshArgs), _, _)); - - impl::GpuCompositionResult result = mOutput.prepareFrameAsync(mRefreshArgs); - EXPECT_TRUE(result.succeeded); - EXPECT_FALSE(result.bufferAvailable()); -} - -TEST_F(OutputPrepareFrameAsyncTest, skipCompositionOnDequeueFailure) { - mOutput.editState().isEnabled = true; - mOutput.editState().usesClientComposition = false; - mOutput.editState().usesDeviceComposition = true; - mOutput.editState().previousDeviceRequestedChanges = - std::make_optional<android::HWComposer::DeviceRequestedChanges>({}); - std::promise<std::optional<android::HWComposer::DeviceRequestedChanges>> p; - p.set_value(mOutput.editState().previousDeviceRequestedChanges); - - EXPECT_CALL(mOutput, getOutputLayerCount()).WillRepeatedly(Return(0u)); - EXPECT_CALL(mOutput, updateProtectedContentState()); - EXPECT_CALL(mOutput, dequeueRenderBuffer(_, _)).WillOnce(Return(false)); - EXPECT_CALL(*mRenderSurface, prepareFrame(false, true)).Times(2); - EXPECT_CALL(mOutput, chooseCompositionStrategyAsync()).WillOnce([&] { return p.get_future(); }); - - impl::GpuCompositionResult result = mOutput.prepareFrameAsync(mRefreshArgs); - EXPECT_FALSE(result.succeeded); - EXPECT_FALSE(result.bufferAvailable()); -} - -// Tests that in the event of hwc error when choosing composition strategy, we would fall back -// client composition -TEST_F(OutputPrepareFrameAsyncTest, chooseCompositionStrategyFailureCallsPrepareFrame) { - mOutput.editState().isEnabled = true; - mOutput.editState().usesClientComposition = false; - mOutput.editState().usesDeviceComposition = true; - mOutput.editState().previousDeviceRequestedChanges = - std::make_optional<android::HWComposer::DeviceRequestedChanges>({}); - std::promise<std::optional<android::HWComposer::DeviceRequestedChanges>> p; - p.set_value({}); - std::shared_ptr<renderengine::ExternalTexture> tex = - std::make_shared<renderengine::mock::FakeExternalTexture>(1, 1, - HAL_PIXEL_FORMAT_RGBA_8888, 1, - 2); - - EXPECT_CALL(mOutput, getOutputLayerCount()).WillRepeatedly(Return(0u)); - EXPECT_CALL(mOutput, updateProtectedContentState()); - EXPECT_CALL(mOutput, dequeueRenderBuffer(_, _)) - .WillOnce(DoAll(SetArgPointee<1>(tex), Return(true))); - EXPECT_CALL(*mRenderSurface, prepareFrame(false, true)).Times(2); - EXPECT_CALL(mOutput, chooseCompositionStrategyAsync()).WillOnce([&] { return p.get_future(); }); - EXPECT_CALL(mOutput, composeSurfaces(_, Ref(mRefreshArgs), _, _)); - - impl::GpuCompositionResult result = mOutput.prepareFrameAsync(mRefreshArgs); - EXPECT_FALSE(result.succeeded); - EXPECT_TRUE(result.bufferAvailable()); -} - -TEST_F(OutputPrepareFrameAsyncTest, predictionMiss) { - mOutput.editState().isEnabled = true; - mOutput.editState().usesClientComposition = false; - mOutput.editState().usesDeviceComposition = true; - mOutput.editState().previousDeviceRequestedChanges = - std::make_optional<android::HWComposer::DeviceRequestedChanges>({}); - auto newDeviceRequestedChanges = - std::make_optional<android::HWComposer::DeviceRequestedChanges>({}); - newDeviceRequestedChanges->clientTargetBrightness = 5.f; - std::promise<std::optional<android::HWComposer::DeviceRequestedChanges>> p; - p.set_value(newDeviceRequestedChanges); - std::shared_ptr<renderengine::ExternalTexture> tex = - std::make_shared<renderengine::mock::FakeExternalTexture>(1, 1, - HAL_PIXEL_FORMAT_RGBA_8888, 1, - 2); - - EXPECT_CALL(mOutput, getOutputLayerCount()).WillRepeatedly(Return(0u)); - EXPECT_CALL(mOutput, updateProtectedContentState()); - EXPECT_CALL(mOutput, dequeueRenderBuffer(_, _)) - .WillOnce(DoAll(SetArgPointee<1>(tex), Return(true))); - EXPECT_CALL(*mRenderSurface, prepareFrame(false, true)).Times(2); - EXPECT_CALL(mOutput, chooseCompositionStrategyAsync()).WillOnce([&] { return p.get_future(); }); - EXPECT_CALL(mOutput, composeSurfaces(_, Ref(mRefreshArgs), _, _)); - - impl::GpuCompositionResult result = mOutput.prepareFrameAsync(mRefreshArgs); - EXPECT_FALSE(result.succeeded); - EXPECT_TRUE(result.bufferAvailable()); -} - /* * Output::prepare() */ @@ -1923,14 +1795,10 @@ struct OutputPresentTest : public testing::Test { MOCK_METHOD1(setColorTransform, void(const compositionengine::CompositionRefreshArgs&)); MOCK_METHOD0(beginFrame, void()); MOCK_METHOD0(prepareFrame, void()); - MOCK_METHOD1(prepareFrameAsync, GpuCompositionResult(const CompositionRefreshArgs&)); MOCK_METHOD1(devOptRepaintFlash, void(const compositionengine::CompositionRefreshArgs&)); - MOCK_METHOD2(finishFrame, - void(const compositionengine::CompositionRefreshArgs&, - GpuCompositionResult&&)); + MOCK_METHOD1(finishFrame, void(const compositionengine::CompositionRefreshArgs&)); MOCK_METHOD0(postFramebuffer, void()); MOCK_METHOD1(renderCachedSets, void(const compositionengine::CompositionRefreshArgs&)); - MOCK_METHOD1(canPredictCompositionStrategy, bool(const CompositionRefreshArgs&)); }; StrictMock<OutputPartialMock> mOutput; @@ -1946,30 +1814,9 @@ TEST_F(OutputPresentTest, justInvokesChildFunctionsInSequence) { EXPECT_CALL(mOutput, writeCompositionState(Ref(args))); EXPECT_CALL(mOutput, setColorTransform(Ref(args))); EXPECT_CALL(mOutput, beginFrame()); - EXPECT_CALL(mOutput, canPredictCompositionStrategy(Ref(args))).WillOnce(Return(false)); EXPECT_CALL(mOutput, prepareFrame()); EXPECT_CALL(mOutput, devOptRepaintFlash(Ref(args))); - EXPECT_CALL(mOutput, finishFrame(Ref(args), _)); - EXPECT_CALL(mOutput, postFramebuffer()); - EXPECT_CALL(mOutput, renderCachedSets(Ref(args))); - - mOutput.present(args); -} - -TEST_F(OutputPresentTest, predictingCompositionStrategyInvokesPrepareFrameAsync) { - CompositionRefreshArgs args; - - InSequence seq; - EXPECT_CALL(mOutput, updateColorProfile(Ref(args))); - EXPECT_CALL(mOutput, updateCompositionState(Ref(args))); - EXPECT_CALL(mOutput, planComposition()); - EXPECT_CALL(mOutput, writeCompositionState(Ref(args))); - EXPECT_CALL(mOutput, setColorTransform(Ref(args))); - EXPECT_CALL(mOutput, beginFrame()); - EXPECT_CALL(mOutput, canPredictCompositionStrategy(Ref(args))).WillOnce(Return(true)); - EXPECT_CALL(mOutput, prepareFrameAsync(Ref(args))); - EXPECT_CALL(mOutput, devOptRepaintFlash(Ref(args))); - EXPECT_CALL(mOutput, finishFrame(Ref(args), _)); + EXPECT_CALL(mOutput, finishFrame(Ref(args))); EXPECT_CALL(mOutput, postFramebuffer()); EXPECT_CALL(mOutput, renderCachedSets(Ref(args))); @@ -2867,15 +2714,11 @@ struct OutputDevOptRepaintFlashTest : public testing::Test { // Sets up the helper functions called by the function under test to use // mock implementations. MOCK_METHOD(Region, getDirtyRegion, (), (const)); - MOCK_METHOD4(composeSurfaces, + MOCK_METHOD2(composeSurfaces, std::optional<base::unique_fd>( - const Region&, const compositionengine::CompositionRefreshArgs&, - std::shared_ptr<renderengine::ExternalTexture>, base::unique_fd&)); + const Region&, const compositionengine::CompositionRefreshArgs&)); MOCK_METHOD0(postFramebuffer, void()); MOCK_METHOD0(prepareFrame, void()); - MOCK_METHOD0(updateProtectedContentState, void()); - MOCK_METHOD2(dequeueRenderBuffer, - bool(base::unique_fd*, std::shared_ptr<renderengine::ExternalTexture>*)); }; OutputDevOptRepaintFlashTest() { @@ -2932,9 +2775,7 @@ TEST_F(OutputDevOptRepaintFlashTest, alsoComposesSurfacesAndQueuesABufferIfDirty InSequence seq; EXPECT_CALL(mOutput, getDirtyRegion()).WillOnce(Return(kNotEmptyRegion)); - EXPECT_CALL(mOutput, updateProtectedContentState()); - EXPECT_CALL(mOutput, dequeueRenderBuffer(_, _)); - EXPECT_CALL(mOutput, composeSurfaces(RegionEq(kNotEmptyRegion), Ref(mRefreshArgs), _, _)); + EXPECT_CALL(mOutput, composeSurfaces(RegionEq(kNotEmptyRegion), Ref(mRefreshArgs))); EXPECT_CALL(*mRenderSurface, queueBuffer(_)); EXPECT_CALL(mOutput, postFramebuffer()); EXPECT_CALL(mOutput, prepareFrame()); @@ -2950,14 +2791,10 @@ struct OutputFinishFrameTest : public testing::Test { struct OutputPartialMock : public OutputPartialMockBase { // Sets up the helper functions called by the function under test to use // mock implementations. - MOCK_METHOD4(composeSurfaces, + MOCK_METHOD2(composeSurfaces, std::optional<base::unique_fd>( - const Region&, const compositionengine::CompositionRefreshArgs&, - std::shared_ptr<renderengine::ExternalTexture>, base::unique_fd&)); + const Region&, const compositionengine::CompositionRefreshArgs&)); MOCK_METHOD0(postFramebuffer, void()); - MOCK_METHOD0(updateProtectedContentState, void()); - MOCK_METHOD2(dequeueRenderBuffer, - bool(base::unique_fd*, std::shared_ptr<renderengine::ExternalTexture>*)); }; OutputFinishFrameTest() { @@ -2975,63 +2812,27 @@ struct OutputFinishFrameTest : public testing::Test { TEST_F(OutputFinishFrameTest, ifNotEnabledDoesNothing) { mOutput.mState.isEnabled = false; - impl::GpuCompositionResult result; - mOutput.finishFrame(mRefreshArgs, std::move(result)); + mOutput.finishFrame(mRefreshArgs); } TEST_F(OutputFinishFrameTest, takesEarlyOutifComposeSurfacesReturnsNoFence) { mOutput.mState.isEnabled = true; - EXPECT_CALL(mOutput, updateProtectedContentState()); - EXPECT_CALL(mOutput, dequeueRenderBuffer(_, _)).WillOnce(Return(true)); - EXPECT_CALL(mOutput, composeSurfaces(RegionEq(Region::INVALID_REGION), _, _, _)); - - impl::GpuCompositionResult result; - mOutput.finishFrame(mRefreshArgs, std::move(result)); -} - -TEST_F(OutputFinishFrameTest, queuesBufferIfComposeSurfacesReturnsAFence) { - mOutput.mState.isEnabled = true; - - InSequence seq; - EXPECT_CALL(mOutput, updateProtectedContentState()); - EXPECT_CALL(mOutput, dequeueRenderBuffer(_, _)).WillOnce(Return(true)); - EXPECT_CALL(mOutput, composeSurfaces(RegionEq(Region::INVALID_REGION), _, _, _)) - .WillOnce(Return(ByMove(base::unique_fd()))); - EXPECT_CALL(*mRenderSurface, queueBuffer(_)); - - impl::GpuCompositionResult result; - mOutput.finishFrame(mRefreshArgs, std::move(result)); -} - -TEST_F(OutputFinishFrameTest, predictionSucceeded) { - mOutput.mState.isEnabled = true; InSequence seq; - EXPECT_CALL(*mRenderSurface, queueBuffer(_)); + EXPECT_CALL(mOutput, composeSurfaces(RegionEq(Region::INVALID_REGION), _)); - impl::GpuCompositionResult result; - result.succeeded = true; - mOutput.finishFrame(mRefreshArgs, std::move(result)); + mOutput.finishFrame(mRefreshArgs); } -TEST_F(OutputFinishFrameTest, predictionFailedAndBufferIsReused) { +TEST_F(OutputFinishFrameTest, queuesBufferIfComposeSurfacesReturnsAFence) { mOutput.mState.isEnabled = true; InSequence seq; - - impl::GpuCompositionResult result; - result.succeeded = false; - result.buffer = - std::make_shared<renderengine::mock::FakeExternalTexture>(1, 1, - HAL_PIXEL_FORMAT_RGBA_8888, 1, - 2); - - EXPECT_CALL(mOutput, - composeSurfaces(RegionEq(Region::INVALID_REGION), _, result.buffer, - Eq(ByRef(result.fence)))) + EXPECT_CALL(mOutput, composeSurfaces(RegionEq(Region::INVALID_REGION), _)) .WillOnce(Return(ByMove(base::unique_fd()))); EXPECT_CALL(*mRenderSurface, queueBuffer(_)); - mOutput.finishFrame(mRefreshArgs, std::move(result)); + + mOutput.finishFrame(mRefreshArgs); } /* @@ -3278,15 +3079,8 @@ struct OutputComposeSurfacesTest : public testing::Test { struct ExecuteState : public CallOrderStateMachineHelper<TestType, ExecuteState> { auto execute() { - base::unique_fd fence; - std::shared_ptr<renderengine::ExternalTexture> externalTexture; - const bool success = - getInstance()->mOutput.dequeueRenderBuffer(&fence, &externalTexture); - if (success) { - getInstance()->mReadyFence = - getInstance()->mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs, - externalTexture, fence); - } + getInstance()->mReadyFence = + getInstance()->mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs); return nextState<FenceCheckState>(); } }; @@ -3847,11 +3641,7 @@ TEST_F(OutputComposeSurfacesTest_HandlesProtectedContent, ifDisplayIsNotSecure) EXPECT_CALL(mRenderEngine, isProtected).WillOnce(Return(true)); EXPECT_CALL(mRenderEngine, useProtectedContext(false)); - base::unique_fd fd; - std::shared_ptr<renderengine::ExternalTexture> tex; - mOutput.updateProtectedContentState(); - mOutput.dequeueRenderBuffer(&fd, &tex); - mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs, tex, fd); + mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs); } TEST_F(OutputComposeSurfacesTest_HandlesProtectedContent, ifRenderEngineDoesNotSupportIt) { @@ -3859,11 +3649,7 @@ TEST_F(OutputComposeSurfacesTest_HandlesProtectedContent, ifRenderEngineDoesNotS mLayer2.mLayerFEState.hasProtectedContent = true; EXPECT_CALL(mRenderEngine, supportsProtectedContent()).WillRepeatedly(Return(false)); - base::unique_fd fd; - std::shared_ptr<renderengine::ExternalTexture> tex; - mOutput.updateProtectedContentState(); - mOutput.dequeueRenderBuffer(&fd, &tex); - mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs, tex, fd); + mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs); } TEST_F(OutputComposeSurfacesTest_HandlesProtectedContent, ifNoProtectedContentLayers) { @@ -3875,11 +3661,7 @@ TEST_F(OutputComposeSurfacesTest_HandlesProtectedContent, ifNoProtectedContentLa EXPECT_CALL(mRenderEngine, useProtectedContext(false)); EXPECT_CALL(*mRenderSurface, setProtected(false)); - base::unique_fd fd; - std::shared_ptr<renderengine::ExternalTexture> tex; - mOutput.updateProtectedContentState(); - mOutput.dequeueRenderBuffer(&fd, &tex); - mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs, tex, fd); + mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs); } TEST_F(OutputComposeSurfacesTest_HandlesProtectedContent, ifNotEnabled) { @@ -3901,11 +3683,7 @@ TEST_F(OutputComposeSurfacesTest_HandlesProtectedContent, ifNotEnabled) { .WillOnce(Return(ByMove( futureOf<renderengine::RenderEngineResult>({NO_ERROR, base::unique_fd()})))); - base::unique_fd fd; - std::shared_ptr<renderengine::ExternalTexture> tex; - mOutput.updateProtectedContentState(); - mOutput.dequeueRenderBuffer(&fd, &tex); - mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs, tex, fd); + mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs); } TEST_F(OutputComposeSurfacesTest_HandlesProtectedContent, ifAlreadyEnabledEverywhere) { @@ -3915,11 +3693,7 @@ TEST_F(OutputComposeSurfacesTest_HandlesProtectedContent, ifAlreadyEnabledEveryw EXPECT_CALL(mRenderEngine, isProtected).WillOnce(Return(true)); EXPECT_CALL(*mRenderSurface, isProtected).WillOnce(Return(true)); - base::unique_fd fd; - std::shared_ptr<renderengine::ExternalTexture> tex; - mOutput.updateProtectedContentState(); - mOutput.dequeueRenderBuffer(&fd, &tex); - mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs, tex, fd); + mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs); } TEST_F(OutputComposeSurfacesTest_HandlesProtectedContent, ifFailsToEnableInRenderEngine) { @@ -3930,11 +3704,7 @@ TEST_F(OutputComposeSurfacesTest_HandlesProtectedContent, ifFailsToEnableInRende EXPECT_CALL(*mRenderSurface, isProtected).WillOnce(Return(false)); EXPECT_CALL(mRenderEngine, useProtectedContext(true)); - base::unique_fd fd; - std::shared_ptr<renderengine::ExternalTexture> tex; - mOutput.updateProtectedContentState(); - mOutput.dequeueRenderBuffer(&fd, &tex); - mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs, tex, fd); + mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs); } TEST_F(OutputComposeSurfacesTest_HandlesProtectedContent, ifAlreadyEnabledInRenderEngine) { @@ -3945,11 +3715,7 @@ TEST_F(OutputComposeSurfacesTest_HandlesProtectedContent, ifAlreadyEnabledInRend EXPECT_CALL(*mRenderSurface, isProtected).WillOnce(Return(false)); EXPECT_CALL(*mRenderSurface, setProtected(true)); - base::unique_fd fd; - std::shared_ptr<renderengine::ExternalTexture> tex; - mOutput.updateProtectedContentState(); - mOutput.dequeueRenderBuffer(&fd, &tex); - mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs, tex, fd); + mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs); } TEST_F(OutputComposeSurfacesTest_HandlesProtectedContent, ifAlreadyEnabledInRenderSurface) { @@ -3960,11 +3726,7 @@ TEST_F(OutputComposeSurfacesTest_HandlesProtectedContent, ifAlreadyEnabledInRend EXPECT_CALL(*mRenderSurface, isProtected).WillOnce(Return(true)); EXPECT_CALL(mRenderEngine, useProtectedContext(true)); - base::unique_fd fd; - std::shared_ptr<renderengine::ExternalTexture> tex; - mOutput.updateProtectedContentState(); - mOutput.dequeueRenderBuffer(&fd, &tex); - mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs, tex, fd); + mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs); } struct OutputComposeSurfacesTest_SetsExpensiveRendering : public OutputComposeSurfacesTest { @@ -3993,11 +3755,7 @@ TEST_F(OutputComposeSurfacesTest_SetsExpensiveRendering, IfExepensiveOutputDatas .WillOnce(Return(ByMove( futureOf<renderengine::RenderEngineResult>({NO_ERROR, base::unique_fd()})))); - base::unique_fd fd; - std::shared_ptr<renderengine::ExternalTexture> tex; - mOutput.updateProtectedContentState(); - mOutput.dequeueRenderBuffer(&fd, &tex); - mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs, tex, fd); + mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs); } struct OutputComposeSurfacesTest_SetsExpensiveRendering_ForBlur @@ -4032,12 +3790,7 @@ TEST_F(OutputComposeSurfacesTest_SetsExpensiveRendering_ForBlur, IfBlursAreExpen mOutput.writeCompositionState(mRefreshArgs); EXPECT_CALL(mOutput, setExpensiveRenderingExpected(true)); - - base::unique_fd fd; - std::shared_ptr<renderengine::ExternalTexture> tex; - mOutput.updateProtectedContentState(); - mOutput.dequeueRenderBuffer(&fd, &tex); - mOutput.composeSurfaces(kDebugRegion, mRefreshArgs, tex, fd); + mOutput.composeSurfaces(kDebugRegion, mRefreshArgs); } TEST_F(OutputComposeSurfacesTest_SetsExpensiveRendering_ForBlur, IfBlursAreNotExpensive) { @@ -4047,12 +3800,7 @@ TEST_F(OutputComposeSurfacesTest_SetsExpensiveRendering_ForBlur, IfBlursAreNotEx mOutput.writeCompositionState(mRefreshArgs); EXPECT_CALL(mOutput, setExpensiveRenderingExpected(true)).Times(0); - - base::unique_fd fd; - std::shared_ptr<renderengine::ExternalTexture> tex; - mOutput.updateProtectedContentState(); - mOutput.dequeueRenderBuffer(&fd, &tex); - mOutput.composeSurfaces(kDebugRegion, mRefreshArgs, tex, fd); + mOutput.composeSurfaces(kDebugRegion, mRefreshArgs); } /* diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp index 610d86f29a..45b98bb3d3 100644 --- a/services/surfaceflinger/DisplayDevice.cpp +++ b/services/surfaceflinger/DisplayDevice.cpp @@ -91,7 +91,6 @@ DisplayDevice::DisplayDevice(DisplayDeviceCreationArgs& args) static_cast<uint32_t>(SurfaceFlinger::maxFrameBufferAcquiredBuffers)); } - mCompositionDisplay->setPredictCompositionStrategy(mFlinger->mPredictCompositionStrategy); mCompositionDisplay->createDisplayColorProfile( compositionengine::DisplayColorProfileCreationArgsBuilder() .setHasWideColorGamut(args.hasWideColorGamut) diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h index a8d439b7e0..5b2e265eb6 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.h +++ b/services/surfaceflinger/DisplayHardware/HWComposer.h @@ -269,14 +269,6 @@ public: support) = 0; }; -static inline bool operator==(const android::HWComposer::DeviceRequestedChanges& lhs, - const android::HWComposer::DeviceRequestedChanges& rhs) { - return lhs.changedTypes == rhs.changedTypes && lhs.displayRequests == rhs.displayRequests && - lhs.layerRequests == rhs.layerRequests && - lhs.clientTargetProperty == rhs.clientTargetProperty && - lhs.clientTargetBrightness == rhs.clientTargetBrightness; -} - namespace impl { class HWComposer final : public android::HWComposer { diff --git a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h index e21095aa88..307da41667 100644 --- a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h +++ b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h @@ -89,9 +89,6 @@ public: virtual void dumpAsString(String8& result) const; virtual void resizeBuffers(const ui::Size&) override; virtual const sp<Fence>& getClientTargetAcquireFence() const override; - // Virtual display surface needs to prepare the frame based on composition type. Skip - // any client composition prediction. - virtual bool supportsCompositionStrategyPrediction() const override { return false; }; private: enum Source : size_t { diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index efaa975ff2..089875c91b 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -480,9 +480,6 @@ SurfaceFlinger::SurfaceFlinger(Factory& factory) : SurfaceFlinger(factory, SkipI property_get("debug.sf.disable_client_composition_cache", value, "0"); mDisableClientCompositionCache = atoi(value); - property_get("debug.sf.predict_hwc_composition_strategy", value, "0"); - mPredictCompositionStrategy = atoi(value); - // We should be reading 'persist.sys.sf.color_saturation' here // but since /data may be encrypted, we need to wait until after vold // comes online to attempt to read the property. The property is diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 86c83338ff..f5a695b07c 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -344,11 +344,6 @@ public: void disableExpensiveRendering(); FloatRect getMaxDisplayBounds(); - // If set, composition engine tries to predict the composition strategy provided by HWC - // based on the previous frame. If the strategy can be predicted, gpu composition will - // run parallel to the hwc validateDisplay call and re-run if the predition is incorrect. - bool mPredictCompositionStrategy = false; - protected: // We're reference counted, never destroy SurfaceFlinger directly virtual ~SurfaceFlinger(); |