| Ana Krulec | afb4584 | 2019-02-13 13:33:03 -0800 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright 2019 The Android Open Source Project | 
 | 3 |  * | 
 | 4 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 | 5 |  * you may not use this file except in compliance with the License. | 
 | 6 |  * You may obtain a copy of the License at | 
 | 7 |  * | 
 | 8 |  *      http://www.apache.org/licenses/LICENSE-2.0 | 
 | 9 |  * | 
 | 10 |  * Unless required by applicable law or agreed to in writing, software | 
 | 11 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 | 12 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | 13 |  * See the License for the specific language governing permissions and | 
 | 14 |  * limitations under the License. | 
 | 15 |  */ | 
 | 16 |  | 
 | 17 | #pragma once | 
 | 18 |  | 
| Ana Krulec | 6ddd261 | 2020-09-24 13:06:33 -0700 | [diff] [blame] | 19 | #include <Scheduler/Scheduler.h> | 
| Ana Krulec | afb4584 | 2019-02-13 13:33:03 -0800 | [diff] [blame] | 20 | #include <gmock/gmock.h> | 
| Ady Abraham | 0f4a1b1 | 2019-06-04 16:04:04 -0700 | [diff] [blame] | 21 | #include <gui/ISurfaceComposer.h> | 
| Ana Krulec | afb4584 | 2019-02-13 13:33:03 -0800 | [diff] [blame] | 22 |  | 
 | 23 | #include "Scheduler/EventThread.h" | 
| Dominik Laskowski | 49cea51 | 2019-11-12 14:13:23 -0800 | [diff] [blame] | 24 | #include "Scheduler/LayerHistory.h" | 
| Ana Krulec | afb4584 | 2019-02-13 13:33:03 -0800 | [diff] [blame] | 25 | #include "Scheduler/Scheduler.h" | 
| Dominik Laskowski | 8b01cc0 | 2020-07-14 19:02:41 -0700 | [diff] [blame] | 26 | #include "Scheduler/VSyncTracker.h" | 
| Ady Abraham | 8cb2188 | 2020-08-26 18:22:05 -0700 | [diff] [blame] | 27 | #include "Scheduler/VsyncController.h" | 
 | 28 | #include "mock/MockVSyncTracker.h" | 
 | 29 | #include "mock/MockVsyncController.h" | 
| Ana Krulec | afb4584 | 2019-02-13 13:33:03 -0800 | [diff] [blame] | 30 |  | 
 | 31 | namespace android { | 
 | 32 |  | 
| Dominik Laskowski | 8b01cc0 | 2020-07-14 19:02:41 -0700 | [diff] [blame] | 33 | class TestableScheduler : public Scheduler { | 
| Ana Krulec | afb4584 | 2019-02-13 13:33:03 -0800 | [diff] [blame] | 34 | public: | 
| Ady Abraham | 3efa394 | 2021-06-24 19:01:25 -0700 | [diff] [blame] | 35 |     TestableScheduler(const std::shared_ptr<scheduler::RefreshRateConfigs>& refreshRateConfigs, | 
 | 36 |                       ISchedulerCallback& callback) | 
| Ady Abraham | 8cb2188 | 2020-08-26 18:22:05 -0700 | [diff] [blame] | 37 |           : TestableScheduler(std::make_unique<mock::VsyncController>(), | 
| Ady Abraham | 3efa394 | 2021-06-24 19:01:25 -0700 | [diff] [blame] | 38 |                               std::make_unique<mock::VSyncTracker>(), refreshRateConfigs, | 
 | 39 |                               callback) {} | 
| Dominik Laskowski | 9804183 | 2019-08-01 18:35:59 -0700 | [diff] [blame] | 40 |  | 
| Ady Abraham | 8cb2188 | 2020-08-26 18:22:05 -0700 | [diff] [blame] | 41 |     TestableScheduler(std::unique_ptr<scheduler::VsyncController> vsyncController, | 
 | 42 |                       std::unique_ptr<scheduler::VSyncTracker> vsyncTracker, | 
| Ady Abraham | 3efa394 | 2021-06-24 19:01:25 -0700 | [diff] [blame] | 43 |                       const std::shared_ptr<scheduler::RefreshRateConfigs>& refreshRateConfigs, | 
 | 44 |                       ISchedulerCallback& callback) | 
 | 45 |           : Scheduler({std::move(vsyncController), std::move(vsyncTracker), nullptr}, | 
 | 46 |                       refreshRateConfigs, callback, createLayerHistory(), | 
| Marin Shalamanov | 27fa3de | 2020-11-20 16:22:48 +0100 | [diff] [blame] | 47 |                       {.supportKernelTimer = false, .useContentDetection = true}) {} | 
| Ana Krulec | afb4584 | 2019-02-13 13:33:03 -0800 | [diff] [blame] | 48 |  | 
| Dominik Laskowski | 9804183 | 2019-08-01 18:35:59 -0700 | [diff] [blame] | 49 |     // Used to inject mock event thread. | 
 | 50 |     ConnectionHandle createConnection(std::unique_ptr<EventThread> eventThread) { | 
| Steven Thomas | 2bbaabe | 2019-08-28 16:08:35 -0700 | [diff] [blame] | 51 |         return Scheduler::createConnection(std::move(eventThread)); | 
| Ana Krulec | afb4584 | 2019-02-13 13:33:03 -0800 | [diff] [blame] | 52 |     } | 
 | 53 |  | 
 | 54 |     /* ------------------------------------------------------------------------ | 
 | 55 |      * Read-write access to private data to set up preconditions and assert | 
 | 56 |      * post-conditions. | 
 | 57 |      */ | 
 | 58 |     auto& mutablePrimaryHWVsyncEnabled() { return mPrimaryHWVsyncEnabled; } | 
| Ana Krulec | afb4584 | 2019-02-13 13:33:03 -0800 | [diff] [blame] | 59 |     auto& mutableHWVsyncAvailable() { return mHWVsyncAvailable; } | 
| Lais Andrade | 3a6e47d | 2020-04-02 11:20:16 +0100 | [diff] [blame] | 60 |  | 
| Dominik Laskowski | 983f2b5 | 2020-06-25 16:54:06 -0700 | [diff] [blame] | 61 |     bool hasLayerHistory() const { return static_cast<bool>(mLayerHistory); } | 
 | 62 |  | 
| Marin Shalamanov | 1bc43ee | 2020-11-20 16:56:52 +0100 | [diff] [blame] | 63 |     auto* mutableLayerHistory() { return mLayerHistory.get(); } | 
| Ana Krulec | afb4584 | 2019-02-13 13:33:03 -0800 | [diff] [blame] | 64 |  | 
| Dominik Laskowski | 983f2b5 | 2020-06-25 16:54:06 -0700 | [diff] [blame] | 65 |     size_t layerHistorySize() NO_THREAD_SAFETY_ANALYSIS { | 
 | 66 |         if (!mLayerHistory) return 0; | 
| Marin Shalamanov | 1bc43ee | 2020-11-20 16:56:52 +0100 | [diff] [blame] | 67 |         return mutableLayerHistory()->mLayerInfos.size(); | 
| Dominik Laskowski | 983f2b5 | 2020-06-25 16:54:06 -0700 | [diff] [blame] | 68 |     } | 
 | 69 |  | 
| Ady Abraham | 3efa394 | 2021-06-24 19:01:25 -0700 | [diff] [blame] | 70 |     auto refreshRateConfigs() { return holdRefreshRateConfigs(); } | 
 | 71 |  | 
| Marin Shalamanov | 2cde100 | 2021-06-08 19:50:10 +0200 | [diff] [blame] | 72 |     size_t getNumActiveLayers() NO_THREAD_SAFETY_ANALYSIS { | 
 | 73 |         if (!mLayerHistory) return 0; | 
 | 74 |         return mutableLayerHistory()->mActiveLayersEnd; | 
 | 75 |     } | 
 | 76 |  | 
| Lais Andrade | 3a6e47d | 2020-04-02 11:20:16 +0100 | [diff] [blame] | 77 |     void replaceTouchTimer(int64_t millis) { | 
 | 78 |         if (mTouchTimer) { | 
 | 79 |             mTouchTimer.reset(); | 
 | 80 |         } | 
 | 81 |         mTouchTimer.emplace( | 
| Ady Abraham | db3dfee | 2020-11-17 17:07:12 -0800 | [diff] [blame] | 82 |                 "Testable Touch timer", std::chrono::milliseconds(millis), | 
| Lais Andrade | 3a6e47d | 2020-04-02 11:20:16 +0100 | [diff] [blame] | 83 |                 [this] { touchTimerCallback(TimerState::Reset); }, | 
 | 84 |                 [this] { touchTimerCallback(TimerState::Expired); }); | 
 | 85 |         mTouchTimer->start(); | 
 | 86 |     } | 
 | 87 |  | 
 | 88 |     bool isTouchActive() { | 
 | 89 |         std::lock_guard<std::mutex> lock(mFeatureStateLock); | 
 | 90 |         return mFeatures.touch == Scheduler::TouchState::Active; | 
 | 91 |     } | 
 | 92 |  | 
| Marin Shalamanov | a7fe304 | 2021-01-29 21:02:08 +0100 | [diff] [blame] | 93 |     void dispatchCachedReportedMode() { | 
| Ana Krulec | 6ddd261 | 2020-09-24 13:06:33 -0700 | [diff] [blame] | 94 |         std::lock_guard<std::mutex> lock(mFeatureStateLock); | 
| Marin Shalamanov | a7fe304 | 2021-01-29 21:02:08 +0100 | [diff] [blame] | 95 |         return Scheduler::dispatchCachedReportedMode(); | 
| Ana Krulec | 6ddd261 | 2020-09-24 13:06:33 -0700 | [diff] [blame] | 96 |     } | 
 | 97 |  | 
 | 98 |     void clearOptionalFieldsInFeatures() { | 
 | 99 |         std::lock_guard<std::mutex> lock(mFeatureStateLock); | 
| Marin Shalamanov | a7fe304 | 2021-01-29 21:02:08 +0100 | [diff] [blame] | 100 |         mFeatures.cachedModeChangedParams.reset(); | 
| Ana Krulec | 6ddd261 | 2020-09-24 13:06:33 -0700 | [diff] [blame] | 101 |     } | 
 | 102 |  | 
| Ady Abraham | b493739 | 2021-06-23 18:05:03 -0700 | [diff] [blame] | 103 |     void onNonPrimaryDisplayModeChanged(ConnectionHandle handle, DisplayModePtr mode) { | 
 | 104 |         return Scheduler::onNonPrimaryDisplayModeChanged(handle, mode); | 
| Ana Krulec | 6ddd261 | 2020-09-24 13:06:33 -0700 | [diff] [blame] | 105 |     } | 
 | 106 |  | 
| Ana Krulec | afb4584 | 2019-02-13 13:33:03 -0800 | [diff] [blame] | 107 |     ~TestableScheduler() { | 
 | 108 |         // All these pointer and container clears help ensure that GMock does | 
 | 109 |         // not report a leaked object, since the Scheduler instance may | 
 | 110 |         // still be referenced by something despite our best efforts to destroy | 
 | 111 |         // it after each test is done. | 
| Ady Abraham | 8cb2188 | 2020-08-26 18:22:05 -0700 | [diff] [blame] | 112 |         mVsyncSchedule.controller.reset(); | 
| Ana Krulec | afb4584 | 2019-02-13 13:33:03 -0800 | [diff] [blame] | 113 |         mConnections.clear(); | 
| Dominik Laskowski | 7c9dbf9 | 2019-08-01 17:57:31 -0700 | [diff] [blame] | 114 |     } | 
| Ana Krulec | afb4584 | 2019-02-13 13:33:03 -0800 | [diff] [blame] | 115 | }; | 
 | 116 |  | 
 | 117 | } // namespace android |