diff options
author | 2019-04-12 20:23:20 +0000 | |
---|---|---|
committer | 2019-04-12 20:23:20 +0000 | |
commit | 1688f5246f156e815bd7b07ba7d5c39cc821e8d6 (patch) | |
tree | 57ba631a6c2016451a2a74bde9b2f77356bb8d8f | |
parent | 81890b23e4728726ed7f11b23dae2554d586555d (diff) | |
parent | 796beb0013a17e0fbaa9f6b15526b85576e31130 (diff) |
Merge "SurfaceFlinger: fix Sf/App offsets provided in getDisplayConfigs()" into qt-dev
7 files changed, 56 insertions, 19 deletions
diff --git a/services/surfaceflinger/Scheduler/PhaseOffsets.cpp b/services/surfaceflinger/Scheduler/PhaseOffsets.cpp index 7e2b03d1fe..16f67298ad 100644 --- a/services/surfaceflinger/Scheduler/PhaseOffsets.cpp +++ b/services/surfaceflinger/Scheduler/PhaseOffsets.cpp @@ -86,8 +86,9 @@ PhaseOffsets::PhaseOffsets() { mHighRefreshRateOffsets.late = {highFpsLateSfOffsetNs, highFpsLateAppOffsetNs}; } -PhaseOffsets::Offsets PhaseOffsets::getCurrentOffsets() const { - switch (mRefreshRateType) { +PhaseOffsets::Offsets PhaseOffsets::getOffsetsForRefreshRate( + android::scheduler::RefreshRateConfigs::RefreshRateType refreshRateType) const { + switch (refreshRateType) { case RefreshRateConfigs::RefreshRateType::PERFORMANCE: return mHighRefreshRateOffsets; default: diff --git a/services/surfaceflinger/Scheduler/PhaseOffsets.h b/services/surfaceflinger/Scheduler/PhaseOffsets.h index a85660a718..08747a5615 100644 --- a/services/surfaceflinger/Scheduler/PhaseOffsets.h +++ b/services/surfaceflinger/Scheduler/PhaseOffsets.h @@ -42,6 +42,8 @@ public: virtual nsecs_t getCurrentAppOffset() = 0; virtual nsecs_t getCurrentSfOffset() = 0; + virtual Offsets getOffsetsForRefreshRate( + RefreshRateConfigs::RefreshRateType refreshRateType) const = 0; virtual Offsets getCurrentOffsets() const = 0; virtual void setRefreshRateType(RefreshRateConfigs::RefreshRateType refreshRateType) = 0; virtual void dump(std::string& result) const = 0; @@ -55,8 +57,14 @@ public: nsecs_t getCurrentAppOffset() override; nsecs_t getCurrentSfOffset() override; + // Returns early, early GL, and late offsets for Apps and SF for a given refresh rate. + Offsets getOffsetsForRefreshRate( + RefreshRateConfigs::RefreshRateType refreshRateType) const override; + // Returns early, early GL, and late offsets for Apps and SF. - Offsets getCurrentOffsets() const override; + Offsets getCurrentOffsets() const override { + return getOffsetsForRefreshRate(mRefreshRateType); + } // This function should be called when the device is switching between different // refresh rates, to properly update the offsets. diff --git a/services/surfaceflinger/Scheduler/RefreshRateConfigs.h b/services/surfaceflinger/Scheduler/RefreshRateConfigs.h index eb9ae35cec..d7300583c3 100644 --- a/services/surfaceflinger/Scheduler/RefreshRateConfigs.h +++ b/services/surfaceflinger/Scheduler/RefreshRateConfigs.h @@ -47,6 +47,8 @@ public: std::string name; // Refresh rate in frames per second, rounded to the nearest integer. uint32_t fps = 0; + // config Id (returned from HWC2::Display::Config::getId()) + hwc2_config_t id; }; // TODO(b/122916473): Get this information from configs prepared by vendors, instead of @@ -62,13 +64,24 @@ public: return nullptr; } + RefreshRateType getRefreshRateType(hwc2_config_t id) const { + for (const auto& [type, refreshRate] : mRefreshRates) { + if (refreshRate->id == id) { + return type; + } + } + + return RefreshRateType::DEFAULT; + } + void populate(const std::vector<std::shared_ptr<const HWC2::Display::Config>>& configs) { mRefreshRates.clear(); // This is the rate that HWC encapsulates right now when the device is in DOZE mode. mRefreshRates.emplace(RefreshRateType::POWER_SAVING, std::make_shared<RefreshRate>( - RefreshRate{SCREEN_OFF_CONFIG_ID, "ScreenOff", 0})); + RefreshRate{SCREEN_OFF_CONFIG_ID, "ScreenOff", 0, + HWC2_SCREEN_OFF_CONFIG_ID})); if (configs.size() < 1) { ALOGE("Device does not have valid configs. Config size is 0."); @@ -91,11 +104,12 @@ public: nsecs_t vsyncPeriod = configIdToVsyncPeriod[0].second; if (vsyncPeriod != 0) { const float fps = 1e9 / vsyncPeriod; + const int configId = configIdToVsyncPeriod[0].first; mRefreshRates.emplace(RefreshRateType::DEFAULT, std::make_shared<RefreshRate>( - RefreshRate{configIdToVsyncPeriod[0].first, - base::StringPrintf("%2.ffps", fps), - static_cast<uint32_t>(fps)})); + RefreshRate{configId, base::StringPrintf("%2.ffps", fps), + static_cast<uint32_t>(fps), + configs.at(configId)->getId()})); } if (configs.size() < 2) { @@ -107,11 +121,12 @@ public: vsyncPeriod = configIdToVsyncPeriod[1].second; if (vsyncPeriod != 0) { const float fps = 1e9 / vsyncPeriod; + const int configId = configIdToVsyncPeriod[1].first; mRefreshRates.emplace(RefreshRateType::PERFORMANCE, std::make_shared<RefreshRate>( - RefreshRate{configIdToVsyncPeriod[1].first, - base::StringPrintf("%2.ffps", fps), - static_cast<uint32_t>(fps)})); + RefreshRate{configId, base::StringPrintf("%2.ffps", fps), + static_cast<uint32_t>(fps), + configs.at(configId)->getId()})); } } diff --git a/services/surfaceflinger/Scheduler/SchedulerUtils.h b/services/surfaceflinger/Scheduler/SchedulerUtils.h index a935cac1eb..3bf3922edd 100644 --- a/services/surfaceflinger/Scheduler/SchedulerUtils.h +++ b/services/surfaceflinger/Scheduler/SchedulerUtils.h @@ -34,6 +34,7 @@ static constexpr size_t ARRAY_SIZE = 30; // the config is not visible to SF, and is completely maintained by HWC. However, we would // still like to keep track of time when the device is in this config. static constexpr int SCREEN_OFF_CONFIG_ID = -1; +static constexpr uint32_t HWC2_SCREEN_OFF_CONFIG_ID = 0xffffffff; // This number is used when we try to determine how long does a given layer stay relevant. // Currently it is set to 100ms, because that would indicate 10Hz rendering. diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 53c615f929..606355549e 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -860,7 +860,9 @@ status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& displayToken, info.xdpi = xdpi; info.ydpi = ydpi; info.fps = 1e9 / hwConfig->getVsyncPeriod(); - info.appVsyncOffset = mPhaseOffsets->getCurrentAppOffset(); + const auto refreshRateType = mRefreshRateConfigs.getRefreshRateType(hwConfig->getId()); + const auto offset = mPhaseOffsets->getOffsetsForRefreshRate(refreshRateType); + info.appVsyncOffset = offset.late.app; // This is how far in advance a buffer must be queued for // presentation at a given time. If you want a buffer to appear @@ -874,8 +876,7 @@ status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& displayToken, // // We add an additional 1ms to allow for processing time and // differences between the ideal and actual refresh rate. - info.presentationDeadline = - hwConfig->getVsyncPeriod() - mPhaseOffsets->getCurrentSfOffset() + 1000000; + info.presentationDeadline = hwConfig->getVsyncPeriod() - offset.late.sf + 1000000; // All non-virtual displays are currently considered secure. info.secure = true; diff --git a/services/surfaceflinger/tests/unittests/FakePhaseOffsets.h b/services/surfaceflinger/tests/unittests/FakePhaseOffsets.h index 0739f15ae9..cfa8337577 100644 --- a/services/surfaceflinger/tests/unittests/FakePhaseOffsets.h +++ b/services/surfaceflinger/tests/unittests/FakePhaseOffsets.h @@ -33,6 +33,11 @@ public: nsecs_t getCurrentAppOffset() override { return FAKE_PHASE_OFFSET_NS; } nsecs_t getCurrentSfOffset() override { return FAKE_PHASE_OFFSET_NS; } + PhaseOffsets::Offsets getOffsetsForRefreshRate( + RefreshRateConfigs::RefreshRateType /*refreshRateType*/) const override { + return getCurrentOffsets(); + } + // Returns early, early GL, and late offsets for Apps and SF. PhaseOffsets::Offsets getCurrentOffsets() const override { return Offsets{{FAKE_PHASE_OFFSET_NS, FAKE_PHASE_OFFSET_NS}, diff --git a/services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp b/services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp index 8b37c22356..5067fe890b 100644 --- a/services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp +++ b/services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp @@ -37,7 +37,9 @@ using RefreshRate = RefreshRateConfigs::RefreshRate; class RefreshRateConfigsTest : public testing::Test { protected: static constexpr int CONFIG_ID_60 = 0; + static constexpr hwc2_config_t HWC2_CONFIG_ID_60 = 0; static constexpr int CONFIG_ID_90 = 1; + static constexpr hwc2_config_t HWC2_CONFIG_ID_90 = 1; static constexpr int64_t VSYNC_60 = 16666667; static constexpr int64_t VSYNC_90 = 11111111; @@ -81,7 +83,8 @@ TEST_F(RefreshRateConfigsTest, zeroDeviceConfigs_storesPowerSavingConfig) { ASSERT_EQ(rates.end(), rates.find(RefreshRateType::PERFORMANCE)); ASSERT_EQ(rates.end(), rates.find(RefreshRateType::DEFAULT)); - RefreshRate expectedConfig = RefreshRate{SCREEN_OFF_CONFIG_ID, "ScreenOff", 0}; + RefreshRate expectedConfig = + RefreshRate{SCREEN_OFF_CONFIG_ID, "ScreenOff", 0, HWC2_SCREEN_OFF_CONFIG_ID}; assertRatesEqual(expectedConfig, *powerSavingRate->second); ASSERT_TRUE(mConfigs.getRefreshRate(RefreshRateType::POWER_SAVING)); @@ -109,9 +112,10 @@ TEST_F(RefreshRateConfigsTest, oneDeviceConfig_storesDefaultConfig) { ASSERT_NE(rates.end(), defaultRate); ASSERT_EQ(rates.end(), rates.find(RefreshRateType::PERFORMANCE)); - RefreshRate expectedPowerSavingConfig = RefreshRate{SCREEN_OFF_CONFIG_ID, "ScreenOff", 0}; + RefreshRate expectedPowerSavingConfig = + RefreshRate{SCREEN_OFF_CONFIG_ID, "ScreenOff", 0, HWC2_SCREEN_OFF_CONFIG_ID}; assertRatesEqual(expectedPowerSavingConfig, *powerSavingRate->second); - RefreshRate expectedDefaultConfig = RefreshRate{CONFIG_ID_60, "60fps", 60}; + RefreshRate expectedDefaultConfig = RefreshRate{CONFIG_ID_60, "60fps", 60, HWC2_CONFIG_ID_60}; assertRatesEqual(expectedDefaultConfig, *defaultRate->second); ASSERT_TRUE(mConfigs.getRefreshRate(RefreshRateType::POWER_SAVING)); @@ -145,11 +149,13 @@ TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesPerformanceConfig) { ASSERT_NE(rates.end(), defaultRate); ASSERT_NE(rates.end(), performanceRate); - RefreshRate expectedPowerSavingConfig = RefreshRate{SCREEN_OFF_CONFIG_ID, "ScreenOff", 0}; + RefreshRate expectedPowerSavingConfig = + RefreshRate{SCREEN_OFF_CONFIG_ID, "ScreenOff", 0, HWC2_SCREEN_OFF_CONFIG_ID}; assertRatesEqual(expectedPowerSavingConfig, *powerSavingRate->second); - RefreshRate expectedDefaultConfig = RefreshRate{CONFIG_ID_60, "60fps", 60}; + RefreshRate expectedDefaultConfig = RefreshRate{CONFIG_ID_60, "60fps", 60, HWC2_CONFIG_ID_60}; assertRatesEqual(expectedDefaultConfig, *defaultRate->second); - RefreshRate expectedPerformanceConfig = RefreshRate{CONFIG_ID_90, "90fps", 90}; + RefreshRate expectedPerformanceConfig = + RefreshRate{CONFIG_ID_90, "90fps", 90, HWC2_CONFIG_ID_90}; assertRatesEqual(expectedPerformanceConfig, *performanceRate->second); ASSERT_TRUE(mConfigs.getRefreshRate(RefreshRateType::POWER_SAVING)); |