From 30d818e8b36cda1533109c6087e66888dbdc82b3 Mon Sep 17 00:00:00 2001 From: Ady Abraham Date: Mon, 30 Dec 2019 12:59:08 -0800 Subject: [PATCH] composer: add seamlessPossible callback to composer 2.4 Add a callback to notify the client it should retry a setActiveConfigWithConstraints call in case of SEAMLESS_NOT_POSSIBLE error. Test: rev up composer to 2.4 Bug: 141329414 Change-Id: I6176638fde937e3916f58cc577d50cb755997c61 --- graphics/composer/2.4/IComposerCallback.hal | 10 ++++++++++ graphics/composer/2.4/IComposerClient.hal | 3 +++ .../hal/include/composer-hal/2.4/ComposerClient.h | 6 ++++++ .../utils/hal/include/composer-hal/2.4/ComposerHal.h | 1 + .../include/composer-passthrough/2.4/HwcHal.h | 11 ++++++++++- 5 files changed, 30 insertions(+), 1 deletion(-) diff --git a/graphics/composer/2.4/IComposerCallback.hal b/graphics/composer/2.4/IComposerCallback.hal index fea24a1cbf..f343ceef6e 100644 --- a/graphics/composer/2.4/IComposerCallback.hal +++ b/graphics/composer/2.4/IComposerCallback.hal @@ -42,4 +42,14 @@ interface IComposerCallback extends @2.1::IComposerCallback { * @param updatedTimeline is the new timeline for the vsync period change. */ oneway onVsyncPeriodTimingChanged(Display display, VsyncPeriodChangeTimeline updatedTimeline); + + /** + * Notifies the client that the conditions which previously led to returning + * SEAMLESS_NOT_POSSIBLE from setActiveConfigWithConstraints have changed and now seamless may + * be possible. Client should retry calling setActiveConfigWithConstraints. + * + * @param display is a display setActiveConfigWithConstraints previously failed with + * SEAMLESS_NOT_POSSIBLE. + */ + oneway onSeamlessPossible(Display display); }; diff --git a/graphics/composer/2.4/IComposerClient.hal b/graphics/composer/2.4/IComposerClient.hal index 06b4c5e53a..1b8170beb5 100644 --- a/graphics/composer/2.4/IComposerClient.hal +++ b/graphics/composer/2.4/IComposerClient.hal @@ -185,6 +185,9 @@ interface IComposerClient extends @2.3::IComposerClient { * share the same config group as the current config. * SEAMLESS_NOT_POSSIBLE when seamlessRequired was true but the display cannot achieve * the vsync period change without a noticeable visual artifact. + * When the conditions change and it may be possible to change + * the vsync period seamlessly, onSeamlessPossible callback + * must be called to indicate that caller should retry. * @return timeline is the timeline for the vsync period change. */ setActiveConfigWithConstraints(Display display, Config config, diff --git a/graphics/composer/2.4/utils/hal/include/composer-hal/2.4/ComposerClient.h b/graphics/composer/2.4/utils/hal/include/composer-hal/2.4/ComposerClient.h index dcd959dfb5..d48a9e7dd5 100644 --- a/graphics/composer/2.4/utils/hal/include/composer-hal/2.4/ComposerClient.h +++ b/graphics/composer/2.4/utils/hal/include/composer-hal/2.4/ComposerClient.h @@ -83,6 +83,12 @@ class ComposerClientImpl : public V2_3::hal::detail::ComposerClientImplonSeamlessPossible(display); + ALOGE_IF(!ret.isOk(), "failed to send onSealmessPossible: %s", + ret.description().c_str()); + } + protected: const sp mCallback; V2_1::hal::ComposerResources* const mResources; diff --git a/graphics/composer/2.4/utils/hal/include/composer-hal/2.4/ComposerHal.h b/graphics/composer/2.4/utils/hal/include/composer-hal/2.4/ComposerHal.h index a1e56ae6ed..bbc5405255 100644 --- a/graphics/composer/2.4/utils/hal/include/composer-hal/2.4/ComposerHal.h +++ b/graphics/composer/2.4/utils/hal/include/composer-hal/2.4/ComposerHal.h @@ -49,6 +49,7 @@ class ComposerHal : public V2_3::hal::ComposerHal { VsyncPeriodNanos vsyncPeriodNanos) = 0; virtual void onVsyncPeriodTimingChanged(Display display, const VsyncPeriodChangeTimeline& timeline) = 0; + virtual void onSeamlessPossible(Display display) = 0; }; virtual void registerEventCallback_2_4(EventCallback_2_4* callback) = 0; diff --git a/graphics/composer/2.4/utils/passthrough/include/composer-passthrough/2.4/HwcHal.h b/graphics/composer/2.4/utils/passthrough/include/composer-passthrough/2.4/HwcHal.h index a27582a0e7..53e4404ea0 100644 --- a/graphics/composer/2.4/utils/passthrough/include/composer-passthrough/2.4/HwcHal.h +++ b/graphics/composer/2.4/utils/passthrough/include/composer-passthrough/2.4/HwcHal.h @@ -64,10 +64,12 @@ class HwcHalImpl : public V2_3::passthrough::detail::HwcHalImpl { BaseType2_1::mDispatch.registerCallback( mDevice, HWC2_CALLBACK_VSYNC_2_4, this, reinterpret_cast(vsync_2_4_Hook)); - BaseType2_1::mDispatch.registerCallback( mDevice, HWC2_CALLBACK_VSYNC_PERIOD_TIMING_CHANGED, this, reinterpret_cast(vsyncPeriodTimingChangedHook)); + BaseType2_1::mDispatch.registerCallback( + mDevice, HWC2_CALLBACK_SEAMLESS_POSSIBLE, this, + reinterpret_cast(seamlessPossibleHook)); } void unregisterEventCallback_2_4() override { @@ -84,6 +86,8 @@ class HwcHalImpl : public V2_3::passthrough::detail::HwcHalImpl { BaseType2_1::mDispatch.registerCallback(mDevice, HWC2_CALLBACK_VSYNC_2_4, this, nullptr); BaseType2_1::mDispatch.registerCallback(mDevice, HWC2_CALLBACK_VSYNC_PERIOD_TIMING_CHANGED, this, nullptr); + BaseType2_1::mDispatch.registerCallback(mDevice, HWC2_CALLBACK_SEAMLESS_POSSIBLE, this, + nullptr); mEventCallback_2_4 = nullptr; } @@ -273,6 +277,11 @@ class HwcHalImpl : public V2_3::passthrough::detail::HwcHalImpl { hal->mEventCallback_2_4->onVsyncPeriodTimingChanged(display, timeline); } + static void seamlessPossibleHook(hwc2_callback_data_t callbackData, hwc2_display_t display) { + auto hal = static_cast(callbackData); + hal->mEventCallback_2_4->onSeamlessPossible(display); + } + private: struct { HWC2_PFN_GET_DISPLAY_CONNECTION_TYPE getDisplayConnectionType;