[SF] Use HWC api getPhysicalDisplayOrientation
With HWC3.0 we have the getPhysicalDisplayOrientation
api that can replace the sysprop ro.surface_flinger.primary_display_orientation
BUG: 184085132
Test: atest libsurfaceflinger_unittest
Change-Id: Ie2b0f8e1a81219dc8231a56b9e6174d549a4cbd1
diff --git a/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp b/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp
index 92592f7..8b376f1 100644
--- a/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp
+++ b/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp
@@ -249,6 +249,7 @@
case OptionalFeature::DisplayBrightnessCommand:
case OptionalFeature::BootDisplayConfig:
case OptionalFeature::KernelIdleTimer:
+ case OptionalFeature::PhysicalDisplayOrientation:
return true;
}
}
@@ -1126,5 +1127,17 @@
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 6c0f636..28ff167 100644
--- a/services/surfaceflinger/DisplayHardware/AidlComposerHal.h
+++ b/services/surfaceflinger/DisplayHardware/AidlComposerHal.h
@@ -223,6 +223,9 @@
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 6abe7d1..7d9946d 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 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 @@
DisplayBrightnessCommand,
BootDisplayConfig,
KernelIdleTimer,
+ PhysicalDisplayOrientation,
};
virtual bool isSupported(OptionalFeature) const = 0;
@@ -277,6 +280,8 @@
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 6501276..c0432bf 100644
--- a/services/surfaceflinger/DisplayHardware/HWC2.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp
@@ -154,6 +154,11 @@
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 c03cede..d78562d 100644
--- a/services/surfaceflinger/DisplayHardware/HWC2.h
+++ b/services/surfaceflinger/DisplayHardware/HWC2.h
@@ -169,6 +169,8 @@
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 @@
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 02b3772..d4574df 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
@@ -986,9 +986,19 @@
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 f9637f0..20b7f4e 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.h
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.h
@@ -268,7 +268,8 @@
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 @@
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 33adceb..e8dc084 100644
--- a/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp
+++ b/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp
@@ -237,6 +237,7 @@
case OptionalFeature::DisplayBrightnessCommand:
case OptionalFeature::BootDisplayConfig:
case OptionalFeature::KernelIdleTimer:
+ case OptionalFeature::PhysicalDisplayOrientation:
return false;
}
}
@@ -1331,6 +1332,11 @@
"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 a1ea4f2..5869ae5 100644
--- a/services/surfaceflinger/DisplayHardware/HidlComposerHal.h
+++ b/services/surfaceflinger/DisplayHardware/HidlComposerHal.h
@@ -334,6 +334,9 @@
support) override;
Error setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) override;
+ Error getPhysicalDisplayOrientation(Display displayId,
+ AidlTransform* outDisplayOrientation) override;
+
private:
class CommandWriter : public CommandWriterBase {
public: