diff options
author | 2022-01-18 14:35:02 +0100 | |
---|---|---|
committer | 2022-01-28 18:41:22 +0100 | |
commit | 646f8ecfa96f04fb001d7edce54123946ab8929f (patch) | |
tree | 65df7d87cc43acd591f43a3103ddf942bb4939a4 | |
parent | 0054f4122db1b93d617e8a58c604fdba23684256 (diff) |
Removing getSystemPreferredDisplayMode and adding it as part of
DynamicDisplayInfo
Bug: 209598222
Test: atest CtsBootDisplayModeTestCases
Test: atest libcompositionengine_test
Change-Id: I1ce0a5a3916b14e25212dd1d2fc4f5e82674fcd1
18 files changed, 66 insertions, 98 deletions
diff --git a/libs/gui/ISurfaceComposer.cpp b/libs/gui/ISurfaceComposer.cpp index b7594df2fb..fb9ed22a33 100644 --- a/libs/gui/ISurfaceComposer.cpp +++ b/libs/gui/ISurfaceComposer.cpp @@ -495,27 +495,6 @@ public: return result; } - status_t getPreferredBootDisplayMode(const sp<IBinder>& display, - ui::DisplayModeId* displayModeId) override { - Parcel data, reply; - status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); - if (result != NO_ERROR) { - ALOGE("getPreferredBootDisplayMode failed to writeInterfaceToken: %d", result); - return result; - } - result = data.writeStrongBinder(display); - if (result != NO_ERROR) { - ALOGE("getPreferredBootDisplayMode failed to writeStrongBinder: %d", result); - return result; - } - result = remote()->transact(BnSurfaceComposer::GET_PREFERRED_BOOT_DISPLAY_MODE, data, - &reply); - if (result == NO_ERROR) { - reply.writeInt32(*displayModeId); - } - return result; - } - void setAutoLowLatencyMode(const sp<IBinder>& display, bool on) override { Parcel data, reply; status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); @@ -1659,21 +1638,6 @@ status_t BnSurfaceComposer::onTransact( } return clearBootDisplayMode(display); } - case GET_PREFERRED_BOOT_DISPLAY_MODE: { - CHECK_INTERFACE(ISurfaceComposer, data, reply); - sp<IBinder> display = nullptr; - status_t result = data.readStrongBinder(&display); - if (result != NO_ERROR) { - ALOGE("getPreferredBootDisplayMode failed to readStrongBinder: %d", result); - return result; - } - ui::DisplayModeId displayModeId; - result = getPreferredBootDisplayMode(display, &displayModeId); - if (result == NO_ERROR) { - reply->writeInt32(displayModeId); - } - return result; - } case SET_AUTO_LOW_LATENCY_MODE: { CHECK_INTERFACE(ISurfaceComposer, data, reply); sp<IBinder> display = nullptr; diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 31456cda7e..1bb53740b5 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -2088,12 +2088,6 @@ status_t SurfaceComposerClient::clearBootDisplayMode(const sp<IBinder>& display) return ComposerService::getComposerService()->clearBootDisplayMode(display); } -status_t SurfaceComposerClient::getPreferredBootDisplayMode(const sp<IBinder>& display, - ui::DisplayModeId* displayModeId) { - return ComposerService::getComposerService()->getPreferredBootDisplayMode(display, - displayModeId); -} - status_t SurfaceComposerClient::setOverrideFrameRate(uid_t uid, float frameRate) { return ComposerService::getComposerService()->setOverrideFrameRate(uid, frameRate); } diff --git a/libs/gui/include/gui/ISurfaceComposer.h b/libs/gui/include/gui/ISurfaceComposer.h index fb4fb7e2da..4b5cee256a 100644 --- a/libs/gui/include/gui/ISurfaceComposer.h +++ b/libs/gui/include/gui/ISurfaceComposer.h @@ -235,12 +235,6 @@ public: virtual status_t clearBootDisplayMode(const sp<IBinder>& display) = 0; /** - * Gets the display mode in which the device boots if there is no user-preferred display mode. - */ - virtual status_t getPreferredBootDisplayMode(const sp<IBinder>& display, - ui::DisplayModeId*) = 0; - - /** * Gets whether boot time display mode operations are supported on the device. * * outSupport @@ -684,7 +678,6 @@ public: GET_BOOT_DISPLAY_MODE_SUPPORT, SET_BOOT_DISPLAY_MODE, CLEAR_BOOT_DISPLAY_MODE, - GET_PREFERRED_BOOT_DISPLAY_MODE, SET_OVERRIDE_FRAME_RATE, // Always append new enum to the end. }; diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h index 4f928781d9..e9c753332b 100644 --- a/libs/gui/include/gui/SurfaceComposerClient.h +++ b/libs/gui/include/gui/SurfaceComposerClient.h @@ -174,8 +174,7 @@ public: static status_t setBootDisplayMode(const sp<IBinder>& display, ui::DisplayModeId); // Clears the user-preferred display mode static status_t clearBootDisplayMode(const sp<IBinder>& display); - // Gets the display mode in which the device boots if there is no user-preferred display mode - static status_t getPreferredBootDisplayMode(const sp<IBinder>& display, ui::DisplayModeId*); + // Sets the frame rate of a particular app (uid). This is currently called // by GameManager. static status_t setOverrideFrameRate(uid_t uid, float frameRate); diff --git a/libs/gui/tests/Surface_test.cpp b/libs/gui/tests/Surface_test.cpp index 0ebd11cf32..120ed48d49 100644 --- a/libs/gui/tests/Surface_test.cpp +++ b/libs/gui/tests/Surface_test.cpp @@ -762,10 +762,6 @@ public: return NO_ERROR; } status_t clearBootDisplayMode(const sp<IBinder>& /*display*/) override { return NO_ERROR; } - status_t getPreferredBootDisplayMode(const sp<IBinder>& /*display*/, - ui::DisplayModeId* /*id*/) override { - return NO_ERROR; - } void setAutoLowLatencyMode(const sp<IBinder>& /*display*/, bool /*on*/) override {} void setGameContentType(const sp<IBinder>& /*display*/, bool /*on*/) override {} diff --git a/libs/ui/DynamicDisplayInfo.cpp b/libs/ui/DynamicDisplayInfo.cpp index d5c4ef0c17..78ba9965b6 100644 --- a/libs/ui/DynamicDisplayInfo.cpp +++ b/libs/ui/DynamicDisplayInfo.cpp @@ -41,7 +41,8 @@ size_t DynamicDisplayInfo::getFlattenedSize() const { FlattenableHelpers::getFlattenedSize(activeColorMode) + FlattenableHelpers::getFlattenedSize(hdrCapabilities) + FlattenableHelpers::getFlattenedSize(autoLowLatencyModeSupported) + - FlattenableHelpers::getFlattenedSize(gameContentTypeSupported); + FlattenableHelpers::getFlattenedSize(gameContentTypeSupported) + + FlattenableHelpers::getFlattenedSize(preferredBootDisplayMode); } status_t DynamicDisplayInfo::flatten(void* buffer, size_t size) const { @@ -55,6 +56,7 @@ status_t DynamicDisplayInfo::flatten(void* buffer, size_t size) const { RETURN_IF_ERROR(FlattenableHelpers::flatten(&buffer, &size, hdrCapabilities)); RETURN_IF_ERROR(FlattenableHelpers::flatten(&buffer, &size, autoLowLatencyModeSupported)); RETURN_IF_ERROR(FlattenableHelpers::flatten(&buffer, &size, gameContentTypeSupported)); + RETURN_IF_ERROR(FlattenableHelpers::flatten(&buffer, &size, preferredBootDisplayMode)); return OK; } @@ -66,6 +68,7 @@ status_t DynamicDisplayInfo::unflatten(const void* buffer, size_t size) { RETURN_IF_ERROR(FlattenableHelpers::unflatten(&buffer, &size, &hdrCapabilities)); RETURN_IF_ERROR(FlattenableHelpers::unflatten(&buffer, &size, &autoLowLatencyModeSupported)); RETURN_IF_ERROR(FlattenableHelpers::unflatten(&buffer, &size, &gameContentTypeSupported)); + RETURN_IF_ERROR(FlattenableHelpers::unflatten(&buffer, &size, &preferredBootDisplayMode)); return OK; } diff --git a/libs/ui/include/ui/DynamicDisplayInfo.h b/libs/ui/include/ui/DynamicDisplayInfo.h index a4c2f71a4c..ce75a65214 100644 --- a/libs/ui/include/ui/DynamicDisplayInfo.h +++ b/libs/ui/include/ui/DynamicDisplayInfo.h @@ -35,7 +35,7 @@ struct DynamicDisplayInfo : LightFlattenable<DynamicDisplayInfo> { // This struct is going to be serialized over binder, so // we can't use size_t because it may have different width // in the client process. - int32_t activeDisplayModeId; + ui::DisplayModeId activeDisplayModeId; std::vector<ui::ColorMode> supportedColorModes; ui::ColorMode activeColorMode; @@ -49,6 +49,9 @@ struct DynamicDisplayInfo : LightFlattenable<DynamicDisplayInfo> { // For more information, see the HDMI 1.4 specification. bool gameContentTypeSupported; + // The boot display mode preferred by the implementation. + ui::DisplayModeId preferredBootDisplayMode; + std::optional<ui::DisplayMode> getActiveDisplayMode() const; bool isFixedSize() const { return false; } diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/Display.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/Display.h index 01dd5343b2..a43cc636fd 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/Display.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/Display.h @@ -56,6 +56,9 @@ public: // similar requests if needed. virtual void createClientCompositionCache(uint32_t cacheSize) = 0; + // Returns the boot display mode preferred by HWC. + virtual int32_t getPreferredBootModeId() const = 0; + protected: ~Display() = default; }; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Display.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Display.h index 3571e11ad1..9bfd78fc90 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Display.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Display.h @@ -61,6 +61,7 @@ public: bool isSecure() const override; bool isVirtual() const override; void disconnect() override; + int32_t getPreferredBootModeId() const override; void createDisplayColorProfile( const compositionengine::DisplayColorProfileCreationArgs&) override; void createRenderSurface(const compositionengine::RenderSurfaceCreationArgs&) override; @@ -86,6 +87,7 @@ private: DisplayId mId; bool mIsDisconnected = false; Hwc2::PowerAdvisor* mPowerAdvisor = nullptr; + int32_t mPreferredBootDisplayModeId = -1; }; // This template factory function standardizes the implementation details of the diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Display.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Display.h index 08a8b84306..f71f0e4d19 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Display.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Display.h @@ -35,6 +35,7 @@ public: MOCK_CONST_METHOD0(getId, DisplayId()); MOCK_CONST_METHOD0(isSecure, bool()); MOCK_CONST_METHOD0(isVirtual, bool()); + MOCK_CONST_METHOD0(getPreferredBootModeId, int32_t()); MOCK_METHOD0(disconnect, void()); diff --git a/services/surfaceflinger/CompositionEngine/src/Display.cpp b/services/surfaceflinger/CompositionEngine/src/Display.cpp index 186e191447..1ea13a7b2d 100644 --- a/services/surfaceflinger/CompositionEngine/src/Display.cpp +++ b/services/surfaceflinger/CompositionEngine/src/Display.cpp @@ -57,6 +57,12 @@ void Display::setConfiguration(const compositionengine::DisplayCreationArgs& arg editState().isSecure = args.isSecure; editState().displaySpace.setBounds(args.pixels); setName(args.name); + bool isBootModeSupported = getCompositionEngine().getHwComposer().getBootDisplayModeSupport(); + const auto physicalId = PhysicalDisplayId::tryCast(mId); + if (physicalId && isBootModeSupported) { + mPreferredBootDisplayModeId = static_cast<int32_t>( + getCompositionEngine().getHwComposer().getPreferredBootDisplayMode(*physicalId)); + } } bool Display::isValid() const { @@ -79,6 +85,10 @@ std::optional<DisplayId> Display::getDisplayId() const { return mId; } +int32_t Display::getPreferredBootModeId() const { + return mPreferredBootDisplayModeId; +} + void Display::disconnect() { if (mIsDisconnected) { return; diff --git a/services/surfaceflinger/CompositionEngine/tests/DisplayTest.cpp b/services/surfaceflinger/CompositionEngine/tests/DisplayTest.cpp index 7dd4c2187b..03c6f8dd81 100644 --- a/services/surfaceflinger/CompositionEngine/tests/DisplayTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/DisplayTest.cpp @@ -164,6 +164,7 @@ struct DisplayTestCommon : public testing::Test { EXPECT_CALL(mCompositionEngine, getRenderEngine()).WillRepeatedly(ReturnRef(mRenderEngine)); EXPECT_CALL(mRenderEngine, supportsProtectedContent()).WillRepeatedly(Return(false)); EXPECT_CALL(mRenderEngine, isProtected()).WillRepeatedly(Return(false)); + EXPECT_CALL(mHwComposer, getBootDisplayModeSupport()).WillRepeatedly(Return(false)); } DisplayCreationArgs getDisplayCreationArgsForPhysicalDisplay() { @@ -971,7 +972,8 @@ struct DisplayFunctionalTest : public testing::Test { DisplayFunctionalTest() { EXPECT_CALL(mCompositionEngine, getHwComposer()).WillRepeatedly(ReturnRef(mHwComposer)); - + mDisplay = createDisplay(); + mRenderSurface = createRenderSurface(); mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(mRenderSurface)); } @@ -980,24 +982,29 @@ struct DisplayFunctionalTest : public testing::Test { NiceMock<mock::CompositionEngine> mCompositionEngine; sp<mock::NativeWindow> mNativeWindow = new NiceMock<mock::NativeWindow>(); sp<mock::DisplaySurface> mDisplaySurface = new NiceMock<mock::DisplaySurface>(); + std::shared_ptr<Display> mDisplay; + impl::RenderSurface* mRenderSurface; + + std::shared_ptr<Display> createDisplay() { + return impl::createDisplayTemplated<Display>(mCompositionEngine, + DisplayCreationArgsBuilder() + .setId(DEFAULT_DISPLAY_ID) + .setPixels(DEFAULT_RESOLUTION) + .setIsSecure(true) + .setPowerAdvisor(&mPowerAdvisor) + .build()); + ; + } - std::shared_ptr<Display> mDisplay = impl::createDisplayTemplated< - Display>(mCompositionEngine, - DisplayCreationArgsBuilder() - .setId(DEFAULT_DISPLAY_ID) - .setPixels(DEFAULT_RESOLUTION) - .setIsSecure(true) - .setPowerAdvisor(&mPowerAdvisor) - .build()); - - impl::RenderSurface* mRenderSurface = - new impl::RenderSurface{mCompositionEngine, *mDisplay, - RenderSurfaceCreationArgsBuilder() - .setDisplayWidth(DEFAULT_RESOLUTION.width) - .setDisplayHeight(DEFAULT_RESOLUTION.height) - .setNativeWindow(mNativeWindow) - .setDisplaySurface(mDisplaySurface) - .build()}; + impl::RenderSurface* createRenderSurface() { + return new impl::RenderSurface{mCompositionEngine, *mDisplay, + RenderSurfaceCreationArgsBuilder() + .setDisplayWidth(DEFAULT_RESOLUTION.width) + .setDisplayHeight(DEFAULT_RESOLUTION.height) + .setNativeWindow(mNativeWindow) + .setDisplaySurface(mDisplaySurface) + .build()}; + } }; TEST_F(DisplayFunctionalTest, postFramebufferCriticalCallsAreOrdered) { diff --git a/services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h b/services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h index bd3022b425..394fe03335 100644 --- a/services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h +++ b/services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h @@ -109,6 +109,7 @@ public: MOCK_METHOD2(setBootDisplayMode, status_t(PhysicalDisplayId, hal::HWConfigId)); MOCK_METHOD1(clearBootDisplayMode, status_t(PhysicalDisplayId)); MOCK_METHOD1(getPreferredBootDisplayMode, hal::HWConfigId(PhysicalDisplayId)); + MOCK_METHOD0(getBootDisplayModeSupport, bool()); MOCK_METHOD2(setAutoLowLatencyMode, status_t(PhysicalDisplayId, bool)); MOCK_METHOD2(getSupportedContentTypes, status_t(PhysicalDisplayId, std::vector<hal::ContentType>*)); @@ -127,7 +128,6 @@ public: (const, override)); MOCK_METHOD(std::optional<hal::HWDisplayId>, fromPhysicalDisplayId, (PhysicalDisplayId), (const, override)); - MOCK_METHOD(bool, getBootDisplayModeSupport, (), (override)); }; } // namespace mock diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp index a36ea72b9f..f542161b93 100644 --- a/services/surfaceflinger/DisplayDevice.cpp +++ b/services/surfaceflinger/DisplayDevice.cpp @@ -92,10 +92,12 @@ DisplayDevice::DisplayDevice(DisplayDeviceCreationArgs& args) } mCompositionDisplay->createDisplayColorProfile( - compositionengine::DisplayColorProfileCreationArgs{args.hasWideColorGamut, - std::move(args.hdrCapabilities), - args.supportedPerFrameMetadata, - args.hwcColorModes}); + compositionengine::DisplayColorProfileCreationArgsBuilder() + .setHasWideColorGamut(args.hasWideColorGamut) + .setHdrCapabilities(std::move(args.hdrCapabilities)) + .setSupportedPerFrameMetadata(args.supportedPerFrameMetadata) + .setHwcColorModes(std::move(args.hwcColorModes)) + .Build()); if (!mCompositionDisplay->isValid()) { ALOGE("Composition Display did not validate!"); @@ -454,6 +456,10 @@ HdrCapabilities DisplayDevice::getHdrCapabilities() const { capabilities.getDesiredMinLuminance()); } +ui::DisplayModeId DisplayDevice::getPreferredBootModeId() const { + return mCompositionDisplay->getPreferredBootModeId(); +} + void DisplayDevice::enableRefreshRateOverlay(bool enable, bool showSpinnner) { if (!enable) { mRefreshRateOverlay.reset(); diff --git a/services/surfaceflinger/DisplayDevice.h b/services/surfaceflinger/DisplayDevice.h index d2accaa217..ad44b16813 100644 --- a/services/surfaceflinger/DisplayDevice.h +++ b/services/surfaceflinger/DisplayDevice.h @@ -157,6 +157,9 @@ public: // respectively if hardware composer doesn't return meaningful values. HdrCapabilities getHdrCapabilities() const; + // Returns the boot display mode preferred by the implementation. + ui::DisplayModeId getPreferredBootModeId() const; + // Return true if intent is supported by the display. bool hasRenderIntent(ui::RenderIntent intent) const; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index ea5025fc20..b58616916e 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1112,6 +1112,8 @@ status_t SurfaceFlinger::getDynamicDisplayInfo(const sp<IBinder>& displayToken, return type == hal::ContentType::GAME; }); + info->preferredBootDisplayMode = display->getPreferredBootModeId(); + return NO_ERROR; } @@ -1457,20 +1459,6 @@ status_t SurfaceFlinger::clearBootDisplayMode(const sp<IBinder>& displayToken) { return future.get(); } -status_t SurfaceFlinger::getPreferredBootDisplayMode(const sp<IBinder>& displayToken, - ui::DisplayModeId* id) { - auto future = mScheduler->schedule([=]() MAIN_THREAD mutable -> status_t { - if (const auto displayId = getPhysicalDisplayIdLocked(displayToken)) { - *id = getHwComposer().getPreferredBootDisplayMode(*displayId); - return NO_ERROR; - } else { - ALOGE("%s: Invalid display token %p", __FUNCTION__, displayToken.get()); - return BAD_VALUE; - } - }); - return future.get(); -} - void SurfaceFlinger::setAutoLowLatencyMode(const sp<IBinder>& displayToken, bool on) { const char* const whence = __func__; static_cast<void>(mScheduler->schedule([=]() MAIN_THREAD { @@ -5463,7 +5451,6 @@ status_t SurfaceFlinger::CheckTransactCodeCredentials(uint32_t code) { case GET_BOOT_DISPLAY_MODE_SUPPORT: case SET_BOOT_DISPLAY_MODE: case CLEAR_BOOT_DISPLAY_MODE: - case GET_PREFERRED_BOOT_DISPLAY_MODE: case GET_AUTO_LOW_LATENCY_MODE_SUPPORT: case SET_AUTO_LOW_LATENCY_MODE: case GET_GAME_CONTENT_TYPE_SUPPORT: diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 8ca9982b98..ed8d27ef1a 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -537,8 +537,6 @@ private: status_t getBootDisplayModeSupport(bool* outSupport) const override; status_t setBootDisplayMode(const sp<IBinder>& displayToken, ui::DisplayModeId id) override; status_t clearBootDisplayMode(const sp<IBinder>& displayToken) override; - status_t getPreferredBootDisplayMode(const sp<IBinder>& displayToken, - ui::DisplayModeId* id) override; void setAutoLowLatencyMode(const sp<IBinder>& displayToken, bool on) override; void setGameContentType(const sp<IBinder>& displayToken, bool on) override; void setPowerMode(const sp<IBinder>& displayToken, int mode) override; diff --git a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h index 4273401bc7..8a420ef949 100644 --- a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h +++ b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h @@ -135,7 +135,6 @@ public: V2_4::Error(Display, Config, const IComposerClient::VsyncPeriodChangeConstraints&, VsyncPeriodChangeTimeline*)); MOCK_METHOD2(setAutoLowLatencyMode, V2_4::Error(Display, bool)); - MOCK_METHOD2(getBootDisplayConfigSupport, Error(Display, bool*)); MOCK_METHOD2(setBootDisplayConfig, Error(Display, Config)); MOCK_METHOD1(clearBootDisplayConfig, Error(Display)); MOCK_METHOD2(getPreferredBootDisplayConfig, Error(Display, Config*)); |