diff options
author | Long Ling <longling@google.com> | 2023-01-23 12:29:23 -0800 |
---|---|---|
committer | Long Ling <longling@google.com> | 2023-01-27 16:26:54 -0800 |
commit | 8bdb76a47ad0efea45c8eec22f1bd1e21a38d18e (patch) | |
tree | 89ccff6a61c9d5ca3b4e6beca1c8816de4a1eb19 /libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | |
parent | 1ac37cef27a09e094ae8b19459f13864a32b7e1d (diff) |
libhwc2.1: wait for peak refresh rate via sysfs node
Refresh_rate sysfs node will signal after the mipi commands for refresh
rate have been sent out, which means the next frame scanned out by next
TE will be displayed at the new refresh rate. Note there are cases panel
needs more time to reach the new refresh rate. Not a concern at this
time (neither lhbm nor compensation).
Bug: 263821118
Change-Id: I706fce33ce0eb9412b196cb63089cbc03044be30
Diffstat (limited to 'libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp')
-rw-r--r-- | libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp index dbb11bd..e436663 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp @@ -920,11 +920,12 @@ int32_t ExynosDisplayDrmInterface::getDisplayConfigs( /* key: (width<<32 | height) */ std::map<uint64_t, uint32_t> groupIds; uint32_t groupId = 0; - uint32_t min_vsync_period = UINT_MAX; + float peakRr = -1; for (const DrmMode &mode : mDrmConnector->modes()) { displayConfigs_t configs; - configs.vsyncPeriod = nsecsPerSec/ mode.v_refresh(); + float rr = mode.v_refresh(); + configs.vsyncPeriod = nsecsPerSec / rr; configs.width = mode.h_display(); configs.height = mode.v_display(); uint64_t key = ((uint64_t)configs.width<<32) | configs.height; @@ -941,14 +942,15 @@ int32_t ExynosDisplayDrmInterface::getDisplayConfigs( configs.Xdpi = mm_width ? (mode.h_display() * kUmPerInch) / mm_width : -1; // Dots per 1000 inches configs.Ydpi = mm_height ? (mode.v_display() * kUmPerInch) / mm_height : -1; - // find min vsync period - if (configs.vsyncPeriod <= min_vsync_period) min_vsync_period = configs.vsyncPeriod; + // find peak rr + if (rr > peakRr) + peakRr = rr; mExynosDisplay->mDisplayConfigs.insert(std::make_pair(mode.id(), configs)); ALOGD("config group(%d), w(%d), h(%d), vsync(%d), xdpi(%d), ydpi(%d)", configs.groupId, configs.width, configs.height, configs.vsyncPeriod, configs.Xdpi, configs.Ydpi); } - mExynosDisplay->setMinDisplayVsyncPeriod(min_vsync_period); + mExynosDisplay->setPeakRefreshRate(peakRr); } uint32_t num_modes = static_cast<uint32_t>(mDrmConnector->modes().size()); |