diff options
| author | 2022-03-21 17:52:47 +0000 | |
|---|---|---|
| committer | 2022-03-21 17:52:47 +0000 | |
| commit | ade990bd4567888b74f8a317b46f5f2545f8e304 (patch) | |
| tree | 17f8b8e5e8e0a808978257698c7e362a4f8ca912 | |
| parent | 07ff07a9b4a9cf28920afdbf5f2bebc89e825b2f (diff) | |
| parent | 06e518e4985cba2b9098bb4e3a36cef1db5ee3c7 (diff) | |
Merge "[SF] Use HWC api getPhysicalDisplayOrientation" into tm-dev
15 files changed, 104 insertions, 35 deletions
diff --git a/services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h b/services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h index 1f1dd1afb2..9b9b29deaf 100644 --- a/services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h +++ b/services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h @@ -134,7 +134,9 @@ public: std::optional<aidl::android::hardware::graphics::common:: DisplayDecorationSupport>* support)); MOCK_METHOD2(setIdleTimerEnabled, status_t(PhysicalDisplayId, std::chrono::milliseconds)); - MOCK_METHOD1(hasDisplayIdleTimerCapability, bool(PhysicalDisplayId displayId)); + MOCK_METHOD(bool, hasDisplayIdleTimerCapability, (PhysicalDisplayId), (const, override)); + MOCK_METHOD(Hwc2::AidlTransform, getPhysicalDisplayOrientation, (PhysicalDisplayId), + (const, override)); }; } // namespace mock diff --git a/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp b/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp index 92592f7e09..8b376f11ec 100644 --- a/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp +++ b/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp @@ -249,6 +249,7 @@ bool AidlComposer::isSupported(OptionalFeature feature) const { case OptionalFeature::DisplayBrightnessCommand: case OptionalFeature::BootDisplayConfig: case OptionalFeature::KernelIdleTimer: + case OptionalFeature::PhysicalDisplayOrientation: return true; } } @@ -1126,5 +1127,17 @@ Error AidlComposer::setIdleTimerEnabled(Display displayId, std::chrono::millisec return Error::NONE; } +Error AidlComposer::getPhysicalDisplayOrientation(Display displayId, + AidlTransform* outDisplayOrientation) { + const auto status = + mAidlComposerClient->getDisplayPhysicalOrientation(translate<int64_t>(displayId), + outDisplayOrientation); + if (!status.isOk()) { + ALOGE("getPhysicalDisplayOrientation failed %s", status.getDescription().c_str()); + return static_cast<Error>(status.getServiceSpecificError()); + } + return Error::NONE; +} + } // namespace Hwc2 } // namespace android diff --git a/services/surfaceflinger/DisplayHardware/AidlComposerHal.h b/services/surfaceflinger/DisplayHardware/AidlComposerHal.h index 6c0f6362a0..28ff167811 100644 --- a/services/surfaceflinger/DisplayHardware/AidlComposerHal.h +++ b/services/surfaceflinger/DisplayHardware/AidlComposerHal.h @@ -223,6 +223,9 @@ public: std::optional<DisplayDecorationSupport>* support) override; Error setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) override; + Error getPhysicalDisplayOrientation(Display displayId, + AidlTransform* outDisplayOrientation) override; + private: // Many public functions above simply write a command into the command // queue to batch the calls. validateDisplay and presentDisplay will call diff --git a/services/surfaceflinger/DisplayHardware/ComposerHal.h b/services/surfaceflinger/DisplayHardware/ComposerHal.h index 6abe7d14e2..7d9946d23a 100644 --- a/services/surfaceflinger/DisplayHardware/ComposerHal.h +++ b/services/surfaceflinger/DisplayHardware/ComposerHal.h @@ -38,6 +38,7 @@ #include <aidl/android/hardware/graphics/composer3/DisplayCapability.h> #include <aidl/android/hardware/graphics/composer3/IComposerCallback.h> +#include <aidl/android/hardware/graphics/common/Transform.h> #include <optional> // TODO(b/129481165): remove the #pragma below and fix conversion issues @@ -80,6 +81,7 @@ using V2_4::VsyncPeriodNanos; using PerFrameMetadata = IComposerClient::PerFrameMetadata; using PerFrameMetadataKey = IComposerClient::PerFrameMetadataKey; using PerFrameMetadataBlob = IComposerClient::PerFrameMetadataBlob; +using AidlTransform = ::aidl::android::hardware::graphics::common::Transform; class Composer { public: @@ -94,6 +96,7 @@ public: DisplayBrightnessCommand, BootDisplayConfig, KernelIdleTimer, + PhysicalDisplayOrientation, }; virtual bool isSupported(OptionalFeature) const = 0; @@ -277,6 +280,8 @@ public: std::optional<::aidl::android::hardware::graphics::common::DisplayDecorationSupport>* support) = 0; virtual Error setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) = 0; + virtual Error getPhysicalDisplayOrientation(Display displayId, + AidlTransform* outDisplayOrientation) = 0; }; } // namespace Hwc2 diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp index 650127668d..c0432bf62a 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.cpp +++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp @@ -154,6 +154,11 @@ bool Display::hasDisplayIdleTimerCapability() const { isCapabilitySupported; } +Error Display::getPhysicalDisplayOrientation(Hwc2::AidlTransform* outTransform) const { + auto error = mComposer.getPhysicalDisplayOrientation(mId, outTransform); + return static_cast<Error>(error); +} + Error Display::getChangedCompositionTypes(std::unordered_map<HWC2::Layer*, Composition>* outTypes) { std::vector<Hwc2::Layer> layerIds; std::vector<Composition> types; diff --git a/services/surfaceflinger/DisplayHardware/HWC2.h b/services/surfaceflinger/DisplayHardware/HWC2.h index c03cede124..d78562d3a4 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.h +++ b/services/surfaceflinger/DisplayHardware/HWC2.h @@ -169,6 +169,8 @@ public: support) = 0; [[clang::warn_unused_result]] virtual hal::Error setIdleTimerEnabled( std::chrono::milliseconds timeout) = 0; + [[clang::warn_unused_result]] virtual hal::Error getPhysicalDisplayOrientation( + Hwc2::AidlTransform* outTransform) const = 0; }; namespace impl { @@ -256,6 +258,7 @@ public: bool isVsyncPeriodSwitchSupported() const override; bool hasDisplayIdleTimerCapability() const override; void onLayerDestroyed(hal::HWLayerId layerId) override; + hal::Error getPhysicalDisplayOrientation(Hwc2::AidlTransform* outTransform) const override; private: diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp index 02b3772baa..d4574df808 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp @@ -986,9 +986,19 @@ status_t HWComposer::setIdleTimerEnabled(PhysicalDisplayId displayId, return NO_ERROR; } -bool HWComposer::hasDisplayIdleTimerCapability(PhysicalDisplayId displayId) { +bool HWComposer::hasDisplayIdleTimerCapability(PhysicalDisplayId displayId) const { RETURN_IF_INVALID_DISPLAY(displayId, false); - return mDisplayData[displayId].hwcDisplay->hasDisplayIdleTimerCapability(); + return mDisplayData.at(displayId).hwcDisplay->hasDisplayIdleTimerCapability(); +} + +Hwc2::AidlTransform HWComposer::getPhysicalDisplayOrientation(PhysicalDisplayId displayId) const { + ATRACE_CALL(); + RETURN_IF_INVALID_DISPLAY(displayId, Hwc2::AidlTransform::NONE); + Hwc2::AidlTransform outTransform; + const auto& hwcDisplay = mDisplayData.at(displayId).hwcDisplay; + const auto error = hwcDisplay->getPhysicalDisplayOrientation(&outTransform); + RETURN_IF_HWC_ERROR(error, displayId, Hwc2::AidlTransform::NONE); + return outTransform; } void HWComposer::loadLayerMetadataSupport() { diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h index f9637f0772..20b7f4ea01 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.h +++ b/services/surfaceflinger/DisplayHardware/HWComposer.h @@ -268,7 +268,8 @@ public: std::optional<aidl::android::hardware::graphics::common::DisplayDecorationSupport>* support) = 0; virtual status_t setIdleTimerEnabled(PhysicalDisplayId, std::chrono::milliseconds timeout) = 0; - virtual bool hasDisplayIdleTimerCapability(PhysicalDisplayId) = 0; + virtual bool hasDisplayIdleTimerCapability(PhysicalDisplayId) const = 0; + virtual Hwc2::AidlTransform getPhysicalDisplayOrientation(PhysicalDisplayId) const = 0; }; namespace impl { @@ -405,7 +406,8 @@ public: std::optional<aidl::android::hardware::graphics::common::DisplayDecorationSupport>* support) override; status_t setIdleTimerEnabled(PhysicalDisplayId, std::chrono::milliseconds timeout) override; - bool hasDisplayIdleTimerCapability(PhysicalDisplayId) override; + bool hasDisplayIdleTimerCapability(PhysicalDisplayId) const override; + Hwc2::AidlTransform getPhysicalDisplayOrientation(PhysicalDisplayId) const override; // for debugging ---------------------------------------------------------- void dump(std::string& out) const override; diff --git a/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp b/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp index 33adcebc1a..e8dc084c79 100644 --- a/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp +++ b/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp @@ -237,6 +237,7 @@ bool HidlComposer::isSupported(OptionalFeature feature) const { case OptionalFeature::DisplayBrightnessCommand: case OptionalFeature::BootDisplayConfig: case OptionalFeature::KernelIdleTimer: + case OptionalFeature::PhysicalDisplayOrientation: return false; } } @@ -1331,6 +1332,11 @@ Error HidlComposer::setIdleTimerEnabled(Display, std::chrono::milliseconds) { "OptionalFeature::KernelIdleTimer is not supported on HIDL"); } +Error HidlComposer::getPhysicalDisplayOrientation(Display, AidlTransform*) { + LOG_ALWAYS_FATAL("getPhysicalDisplayOrientation should have never been called on this as " + "OptionalFeature::PhysicalDisplayOrientation is not supported on HIDL"); +} + void HidlComposer::registerCallback(ComposerCallback& callback) { const bool vsyncSwitchingSupported = isSupported(Hwc2::Composer::OptionalFeature::RefreshRateSwitching); diff --git a/services/surfaceflinger/DisplayHardware/HidlComposerHal.h b/services/surfaceflinger/DisplayHardware/HidlComposerHal.h index a1ea4f2e13..5869ae571b 100644 --- a/services/surfaceflinger/DisplayHardware/HidlComposerHal.h +++ b/services/surfaceflinger/DisplayHardware/HidlComposerHal.h @@ -334,6 +334,9 @@ public: support) override; Error setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) override; + Error getPhysicalDisplayOrientation(Display displayId, + AidlTransform* outDisplayOrientation) override; + private: class CommandWriter : public CommandWriterBase { public: diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index bd831ff9a7..dd190a234e 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -324,7 +324,6 @@ int64_t SurfaceFlinger::maxFrameBufferAcquiredBuffers; uint32_t SurfaceFlinger::maxGraphicsWidth; uint32_t SurfaceFlinger::maxGraphicsHeight; bool SurfaceFlinger::hasWideColorDisplay; -ui::Rotation SurfaceFlinger::internalDisplayOrientation = ui::ROTATION_0; bool SurfaceFlinger::useContextPriority; Dataspace SurfaceFlinger::defaultCompositionDataspace = Dataspace::V0_SRGB; ui::PixelFormat SurfaceFlinger::defaultCompositionPixelFormat = ui::PixelFormat::RGBA_8888; @@ -416,22 +415,6 @@ SurfaceFlinger::SurfaceFlinger(Factory& factory) : SurfaceFlinger(factory, SkipI useContextPriority = use_context_priority(true); - using Values = SurfaceFlingerProperties::primary_display_orientation_values; - switch (primary_display_orientation(Values::ORIENTATION_0)) { - case Values::ORIENTATION_0: - break; - case Values::ORIENTATION_90: - internalDisplayOrientation = ui::ROTATION_90; - break; - case Values::ORIENTATION_180: - internalDisplayOrientation = ui::ROTATION_180; - break; - case Values::ORIENTATION_270: - internalDisplayOrientation = ui::ROTATION_270; - break; - } - ALOGV("Internal Display Orientation: %s", toCString(internalDisplayOrientation)); - mInternalDisplayPrimaries = sysprop::getDisplayNativePrimaries(); // debugging stuff... @@ -1014,9 +997,7 @@ status_t SurfaceFlinger::getStaticDisplayInfo(const sp<IBinder>& displayToken, info->secure = display->isSecure(); info->deviceProductInfo = display->getDeviceProductInfo(); - - // TODO: Scale this to multiple displays. - info->installOrientation = display->isPrimary() ? internalDisplayOrientation : ui::ROTATION_0; + info->installOrientation = display->getPhysicalOrientation(); return NO_ERROR; } @@ -1054,9 +1035,8 @@ status_t SurfaceFlinger::getDynamicDisplayInfo(const sp<IBinder>& displayToken, auto xDpi = mode->getDpiX(); auto yDpi = mode->getDpiY(); - if (display->isPrimary() && - (internalDisplayOrientation == ui::ROTATION_90 || - internalDisplayOrientation == ui::ROTATION_270)) { + if (const auto physicalOrientation = display->getPhysicalOrientation(); + physicalOrientation == ui::ROTATION_90 || physicalOrientation == ui::ROTATION_270) { std::swap(width, height); std::swap(xDpi, yDpi); } @@ -2394,6 +2374,42 @@ bool SurfaceFlinger::isHdrLayer(Layer* layer) const { return true; } +ui::Rotation SurfaceFlinger::getPhysicalDisplayOrientation(DisplayId displayId, + bool isPrimary) const { + const auto id = PhysicalDisplayId::tryCast(displayId); + if (!id) { + return ui::ROTATION_0; + } + if (getHwComposer().getComposer()->isSupported( + Hwc2::Composer::OptionalFeature::PhysicalDisplayOrientation)) { + switch (getHwComposer().getPhysicalDisplayOrientation(*id)) { + case Hwc2::AidlTransform::ROT_90: + return ui::ROTATION_90; + case Hwc2::AidlTransform::ROT_180: + return ui::ROTATION_180; + case Hwc2::AidlTransform::ROT_270: + return ui::ROTATION_270; + default: + return ui::ROTATION_0; + } + } + + if (isPrimary) { + using Values = SurfaceFlingerProperties::primary_display_orientation_values; + switch (primary_display_orientation(Values::ORIENTATION_0)) { + case Values::ORIENTATION_90: + return ui::ROTATION_90; + case Values::ORIENTATION_180: + return ui::ROTATION_180; + case Values::ORIENTATION_270: + return ui::ROTATION_270; + default: + break; + } + } + return ui::ROTATION_0; +} + void SurfaceFlinger::postComposition() { ATRACE_CALL(); ALOGV("postComposition"); @@ -2873,7 +2889,8 @@ sp<DisplayDevice> SurfaceFlinger::setupNewDisplayDeviceInternal( } creationArgs.physicalOrientation = - creationArgs.isPrimary ? internalDisplayOrientation : ui::ROTATION_0; + getPhysicalDisplayOrientation(compositionDisplay->getId(), creationArgs.isPrimary); + ALOGV("Display Orientation: %s", toCString(creationArgs.physicalOrientation)); // virtual displays are always considered enabled creationArgs.initialPowerMode = state.isVirtual() ? hal::PowerMode::ON : hal::PowerMode::OFF; diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 81afa9b0fa..ed7796e049 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -256,8 +256,6 @@ public: // found on devices with wide color gamut (e.g. Display-P3) display. static bool hasWideColorDisplay; - static ui::Rotation internalDisplayOrientation; - // Indicate if device wants color management on its display. static const constexpr bool useColorManagement = true; @@ -1146,6 +1144,9 @@ private: bool isHdrLayer(Layer* layer) const; + ui::Rotation getPhysicalDisplayOrientation(DisplayId, bool isPrimary) const + REQUIRES(mStateLock); + sp<StartPropertySetThread> mStartPropertySetThread; surfaceflinger::Factory& mFactory; pid_t mPid; diff --git a/services/surfaceflinger/fuzzer/surfaceflinger_fuzzer.cpp b/services/surfaceflinger/fuzzer/surfaceflinger_fuzzer.cpp index afc1abdad7..a5a716d458 100644 --- a/services/surfaceflinger/fuzzer/surfaceflinger_fuzzer.cpp +++ b/services/surfaceflinger/fuzzer/surfaceflinger_fuzzer.cpp @@ -29,9 +29,6 @@ static constexpr LatchUnsignaledConfig kLatchUnsignaledConfig[] = { LatchUnsignaledConfig::Disabled, }; -static constexpr ui::Rotation kRotations[] = {ui::Rotation::Rotation0, ui::Rotation::Rotation90, - ui::Rotation::Rotation180, ui::Rotation::Rotation270}; - static constexpr BnSurfaceComposer::ISurfaceComposerTag kSurfaceComposerTags[]{ BnSurfaceComposer::BOOT_FINISHED, BnSurfaceComposer::CREATE_CONNECTION, @@ -134,7 +131,6 @@ void SurfaceFlingerFuzzer::invokeFlinger() { mFlinger->maxGraphicsWidth = mFdp.ConsumeIntegral<uint32_t>(); mFlinger->maxGraphicsHeight = mFdp.ConsumeIntegral<uint32_t>(); mFlinger->hasWideColorDisplay = mFdp.ConsumeBool(); - mFlinger->internalDisplayOrientation = mFdp.PickValueInArray(kRotations); mFlinger->useContextPriority = mFdp.ConsumeBool(); mFlinger->defaultCompositionDataspace = mFdp.PickValueInArray(kDataspaces); diff --git a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h index 996f835148..c1d41bbc28 100644 --- a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h +++ b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h @@ -160,6 +160,7 @@ public: Error(Display, std::optional<DisplayDecorationSupport>*)); MOCK_METHOD2(setIdleTimerEnabled, Error(Display, std::chrono::milliseconds)); MOCK_METHOD2(hasDisplayIdleTimerCapability, Error(Display, bool*)); + MOCK_METHOD2(getPhysicalDisplayOrientation, Error(Display, AidlTransform*)); }; } // namespace Hwc2::mock diff --git a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h index d9faa06ea3..ac2ab199c9 100644 --- a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h +++ b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h @@ -101,6 +101,8 @@ public: (override)); MOCK_METHOD(hal::Error, setIdleTimerEnabled, (std::chrono::milliseconds), (override)); MOCK_METHOD(bool, hasDisplayIdleTimerCapability, (), (const override)); + MOCK_METHOD(hal::Error, getPhysicalDisplayOrientation, (Hwc2::AidlTransform *), + (const override)); }; class Layer : public HWC2::Layer { |