summaryrefslogtreecommitdiff
path: root/hwc3/impl/HalImpl.cpp
diff options
context:
space:
mode:
authorWiwit Rifa'i <wiwitrifai@google.com>2023-02-14 15:41:02 +0800
committerWiwit Rifa'i <wiwitrifai@google.com>2023-03-02 18:07:53 +0800
commit9832aef116ed05a1f0cb54dd65350652309c74c4 (patch)
tree1c800459fc6a187b290d5430e4635c83de7bed85 /hwc3/impl/HalImpl.cpp
parent95751650af91965ed09da35e4e3d040356399879 (diff)
hwc3: add support for refresh rate indicator callback
This will add support in HWC to expose the refresh rate in panel to SF using HWC3 callback API so that SF can update the refresh rate overlay indicator to the actual refresh rate in the panel. HWC will monitor the panel refresh rate based on some sysfs nodes. Bug: 267825022 Test: enable refresh rate indicator, wait for idle, AOD Change-Id: Ibc80d66eae6b21c3cf84d35fa819e97ccc509ede
Diffstat (limited to 'hwc3/impl/HalImpl.cpp')
-rw-r--r--hwc3/impl/HalImpl.cpp29
1 files changed, 25 insertions, 4 deletions
diff --git a/hwc3/impl/HalImpl.cpp b/hwc3/impl/HalImpl.cpp
index fb41a77..e48d390 100644
--- a/hwc3/impl/HalImpl.cpp
+++ b/hwc3/impl/HalImpl.cpp
@@ -99,6 +99,20 @@ void seamlessPossible(hwc2_callback_data_t callbackData, hwc2_display_t hwcDispl
hal->getEventCallback()->onSeamlessPossible(display);
}
+void refreshRateChangedDebug(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay,
+ hwc2_vsync_period_t hwcVsyncPeriodNanos) {
+ auto hal = static_cast<HalImpl*>(callbackData);
+ int64_t display;
+ int32_t vsyncPeriodNanos;
+
+ h2a::translate(hwcDisplay, display);
+ h2a::translate(hwcVsyncPeriodNanos, vsyncPeriodNanos);
+ hal->getEventCallback()->onRefreshRateChangedDebug(RefreshRateChangedDebugData{
+ .display = display,
+ .vsyncPeriodNanos = vsyncPeriodNanos,
+ });
+}
+
} // nampesapce hook
HalImpl::HalImpl(std::unique_ptr<ExynosDevice> device) : mDevice(std::move(device)) {
@@ -130,6 +144,7 @@ void HalImpl::initCaps() {
}
mCaps.insert(Capability::BOOT_DISPLAY_CONFIG);
+ mCaps.insert(Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG);
}
int32_t HalImpl::getHalDisplay(int64_t display, ExynosDisplay*& halDisplay) {
@@ -193,6 +208,9 @@ void HalImpl::registerEventCallback(EventCallback* callback) {
// register HWC3 Callback
mDevice->registerHwc3Callback(IComposerCallback::TRANSACTION_onVsyncIdle, this,
reinterpret_cast<hwc2_function_pointer_t>(hook::vsyncIdle));
+ mDevice->registerHwc3Callback(IComposerCallback::TRANSACTION_onRefreshRateChangedDebug, this,
+ reinterpret_cast<hwc2_function_pointer_t>(
+ hook::refreshRateChangedDebug));
}
void HalImpl::unregisterEventCallback() {
@@ -204,6 +222,8 @@ void HalImpl::unregisterEventCallback() {
// unregister HWC3 Callback
mDevice->registerHwc3Callback(IComposerCallback::TRANSACTION_onVsyncIdle, this, nullptr);
+ mDevice->registerHwc3Callback(IComposerCallback::TRANSACTION_onRefreshRateChangedDebug, this,
+ nullptr);
mEventCallback = nullptr;
}
@@ -1064,10 +1084,11 @@ int32_t HalImpl::getDisplayMultiThreadedPresentSupport(const int64_t& display, b
return halDisplay->getDisplayMultiThreadedPresentSupport(outSupport);
}
-int32_t HalImpl::setRefreshRateChangedCallbackDebugEnabled(int64_t /* display*/,
- bool /* enabled */) {
- // TODO(b/267825022) Add implementation for the HAL
- return EX_UNSUPPORTED_OPERATION;
+int32_t HalImpl::setRefreshRateChangedCallbackDebugEnabled(int64_t display, bool enabled) {
+ ExynosDisplay* halDisplay;
+ RET_IF_ERR(getHalDisplay(display, halDisplay));
+
+ return halDisplay->setRefreshRateChangedCallbackDebugEnabled(enabled);
}
} // namespace aidl::android::hardware::graphics::composer3::impl