| Michael Wright | 1509a23 | 2018-06-21 02:50:34 +0100 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright 2018 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 | #undef LOG_TAG | 
|  | 18 | #define LOG_TAG "PowerAdvisor" | 
|  | 19 |  | 
|  | 20 | #include <cinttypes> | 
|  | 21 |  | 
|  | 22 | #include <utils/Log.h> | 
|  | 23 | #include <utils/Mutex.h> | 
|  | 24 |  | 
|  | 25 | #include "PowerAdvisor.h" | 
|  | 26 |  | 
|  | 27 | namespace android { | 
|  | 28 | namespace Hwc2 { | 
|  | 29 |  | 
|  | 30 | PowerAdvisor::~PowerAdvisor() = default; | 
|  | 31 |  | 
|  | 32 | namespace impl { | 
|  | 33 |  | 
|  | 34 | namespace V1_0 = android::hardware::power::V1_0; | 
|  | 35 | using V1_3::PowerHint; | 
|  | 36 |  | 
|  | 37 | PowerAdvisor::~PowerAdvisor() = default; | 
|  | 38 |  | 
|  | 39 | PowerAdvisor::PowerAdvisor() = default; | 
|  | 40 |  | 
|  | 41 | void PowerAdvisor::setExpensiveRenderingExpected(hwc2_display_t displayId, bool expected) { | 
|  | 42 | if (expected) { | 
|  | 43 | mExpensiveDisplays.insert(displayId); | 
|  | 44 | } else { | 
|  | 45 | mExpensiveDisplays.erase(displayId); | 
|  | 46 | } | 
|  | 47 |  | 
| Michael Wright | 1509a23 | 2018-06-21 02:50:34 +0100 | [diff] [blame] | 48 | const bool expectsExpensiveRendering = !mExpensiveDisplays.empty(); | 
|  | 49 | if (mNotifiedExpensiveRendering != expectsExpensiveRendering) { | 
| Peiyong Lin | 8193497 | 2018-07-02 11:00:54 -0700 | [diff] [blame] | 50 | const sp<V1_3::IPower> powerHal = getPowerHal(); | 
|  | 51 | if (powerHal == nullptr) { | 
|  | 52 | return; | 
|  | 53 | } | 
| Michael Wright | 1509a23 | 2018-06-21 02:50:34 +0100 | [diff] [blame] | 54 | auto ret = powerHal->powerHintAsync_1_3(PowerHint::EXPENSIVE_RENDERING, | 
|  | 55 | expectsExpensiveRendering); | 
|  | 56 | // If Power HAL 1.3 was available previously but now fails, | 
|  | 57 | // it may restart, so attempt to reconnect next time | 
|  | 58 | if (!ret.isOk()) { | 
|  | 59 | mReconnectPowerHal = true; | 
|  | 60 | return; | 
|  | 61 | } | 
|  | 62 | mNotifiedExpensiveRendering = expectsExpensiveRendering; | 
|  | 63 | } | 
|  | 64 | } | 
|  | 65 |  | 
|  | 66 | sp<V1_3::IPower> PowerAdvisor::getPowerHal() { | 
|  | 67 | static sp<V1_3::IPower> sPowerHal_1_3 = nullptr; | 
|  | 68 | static bool sHasPowerHal_1_3 = true; | 
|  | 69 |  | 
|  | 70 | if (mReconnectPowerHal) { | 
|  | 71 | sPowerHal_1_3 = nullptr; | 
|  | 72 | mReconnectPowerHal = false; | 
|  | 73 | } | 
|  | 74 |  | 
|  | 75 | // Power HAL 1.3 is not guaranteed to be available, thus we need to query | 
|  | 76 | // Power HAL 1.0 first and try to cast it to Power HAL 1.3. | 
|  | 77 | // Power HAL 1.0 is always available, thus if we fail to query it, it means | 
|  | 78 | // Power HAL is not available temporarily and we should retry later. However, | 
|  | 79 | // if Power HAL 1.0 is available and we can't cast it to Power HAL 1.3, | 
|  | 80 | // it means Power HAL 1.3 is not available at all, so we should stop trying. | 
|  | 81 | if (sHasPowerHal_1_3 && sPowerHal_1_3 == nullptr) { | 
|  | 82 | sp<V1_0::IPower> powerHal_1_0 = V1_0::IPower::getService(); | 
|  | 83 | if (powerHal_1_0 != nullptr) { | 
|  | 84 | // Try to cast to Power HAL 1.3 | 
|  | 85 | sPowerHal_1_3 =  V1_3::IPower::castFrom(powerHal_1_0); | 
|  | 86 | if (sPowerHal_1_3 == nullptr) { | 
|  | 87 | ALOGW("No Power HAL 1.3 service in system"); | 
|  | 88 | sHasPowerHal_1_3 = false; | 
|  | 89 | } else { | 
|  | 90 | ALOGI("Loaded Power HAL 1.3 service"); | 
|  | 91 | } | 
|  | 92 | } | 
|  | 93 | } | 
|  | 94 | return sPowerHal_1_3; | 
|  | 95 | } | 
|  | 96 |  | 
|  | 97 | } // namespace impl | 
|  | 98 | } // namespace Hwc2 | 
|  | 99 | } // namespace android |