Skip to content

Commit 038a896

Browse files
committed
Refactor PowerHalController and add a binding for composition data
This patch refactors some of the calls to use the "hal::" syntax used elsewhere for ADPF, and adds (currently unused) wrappers for sending composition data. Bug: 360908317 Flag: EXEMPT refactor Test: atest libpowermanager_test Change-Id: Ib9b2fec37b8e1431ba2c4ba0658db658f28429fa
1 parent 233e338 commit 038a896

7 files changed

Lines changed: 118 additions & 40 deletions

File tree

include/powermanager/PowerHalController.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ class PowerHalController : public HalWrapper {
7373
int tgid, int uid) override;
7474
virtual HalResult<void> closeSessionChannel(int tgid, int uid) override;
7575
virtual HalResult<aidl::android::hardware::power::SupportInfo> getSupportInfo() override;
76+
virtual HalResult<void> sendCompositionData(
77+
const std::vector<hal::CompositionData>& data) override;
78+
virtual HalResult<void> sendCompositionUpdate(const hal::CompositionUpdate& update) override;
7679

7780
private:
7881
std::mutex mConnectedHalMutex;

include/powermanager/PowerHalWrapper.h

Lines changed: 31 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
#include <aidl/android/hardware/power/Boost.h>
2020
#include <aidl/android/hardware/power/ChannelConfig.h>
21+
#include <aidl/android/hardware/power/CompositionData.h>
22+
#include <aidl/android/hardware/power/CompositionUpdate.h>
2123
#include <aidl/android/hardware/power/IPower.h>
2224
#include <aidl/android/hardware/power/IPowerHintSession.h>
2325
#include <aidl/android/hardware/power/Mode.h>
@@ -37,6 +39,8 @@ namespace android {
3739

3840
namespace power {
3941

42+
namespace hal = aidl::android::hardware::power;
43+
4044
// State of Power HAL support for individual apis.
4145
enum class HalSupport {
4246
UNKNOWN = 0,
@@ -49,21 +53,20 @@ class HalWrapper {
4953
public:
5054
virtual ~HalWrapper() = default;
5155

52-
virtual HalResult<void> setBoost(aidl::android::hardware::power::Boost boost,
53-
int32_t durationMs) = 0;
54-
virtual HalResult<void> setMode(aidl::android::hardware::power::Mode mode, bool enabled) = 0;
56+
virtual HalResult<void> setBoost(hal::Boost boost, int32_t durationMs) = 0;
57+
virtual HalResult<void> setMode(hal::Mode mode, bool enabled) = 0;
5558
virtual HalResult<std::shared_ptr<PowerHintSessionWrapper>> createHintSession(
5659
int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds,
5760
int64_t durationNanos) = 0;
5861
virtual HalResult<std::shared_ptr<PowerHintSessionWrapper>> createHintSessionWithConfig(
5962
int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos,
60-
aidl::android::hardware::power::SessionTag tag,
61-
aidl::android::hardware::power::SessionConfig* config) = 0;
63+
hal::SessionTag tag, hal::SessionConfig* config) = 0;
6264
virtual HalResult<int64_t> getHintSessionPreferredRate() = 0;
63-
virtual HalResult<aidl::android::hardware::power::ChannelConfig> getSessionChannel(int tgid,
64-
int uid) = 0;
65+
virtual HalResult<hal::ChannelConfig> getSessionChannel(int tgid, int uid) = 0;
6566
virtual HalResult<void> closeSessionChannel(int tgid, int uid) = 0;
6667
virtual HalResult<aidl::android::hardware::power::SupportInfo> getSupportInfo() = 0;
68+
virtual HalResult<void> sendCompositionData(const std::vector<hal::CompositionData>& data) = 0;
69+
virtual HalResult<void> sendCompositionUpdate(const hal::CompositionUpdate& update) = 0;
6770
};
6871

6972
// Empty Power HAL wrapper that ignores all api calls.
@@ -72,21 +75,20 @@ class EmptyHalWrapper : public HalWrapper {
7275
EmptyHalWrapper() = default;
7376
~EmptyHalWrapper() override = default;
7477

75-
HalResult<void> setBoost(aidl::android::hardware::power::Boost boost,
76-
int32_t durationMs) override;
77-
HalResult<void> setMode(aidl::android::hardware::power::Mode mode, bool enabled) override;
78+
HalResult<void> setBoost(hal::Boost boost, int32_t durationMs) override;
79+
HalResult<void> setMode(hal::Mode mode, bool enabled) override;
7880
HalResult<std::shared_ptr<PowerHintSessionWrapper>> createHintSession(
7981
int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds,
8082
int64_t durationNanos) override;
8183
HalResult<std::shared_ptr<PowerHintSessionWrapper>> createHintSessionWithConfig(
8284
int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos,
83-
aidl::android::hardware::power::SessionTag tag,
84-
aidl::android::hardware::power::SessionConfig* config) override;
85+
hal::SessionTag tag, hal::SessionConfig* config) override;
8586
HalResult<int64_t> getHintSessionPreferredRate() override;
86-
HalResult<aidl::android::hardware::power::ChannelConfig> getSessionChannel(int tgid,
87-
int uid) override;
87+
HalResult<hal::ChannelConfig> getSessionChannel(int tgid, int uid) override;
8888
HalResult<void> closeSessionChannel(int tgid, int uid) override;
8989
HalResult<aidl::android::hardware::power::SupportInfo> getSupportInfo() override;
90+
HalResult<void> sendCompositionData(const std::vector<hal::CompositionData>& data) override;
91+
HalResult<void> sendCompositionUpdate(const hal::CompositionUpdate& update) override;
9092

9193
protected:
9294
virtual const char* getUnsupportedMessage();
@@ -99,9 +101,8 @@ class HidlHalWrapperV1_0 : public EmptyHalWrapper {
99101
: mHandleV1_0(std::move(handleV1_0)) {}
100102
~HidlHalWrapperV1_0() override = default;
101103

102-
HalResult<void> setBoost(aidl::android::hardware::power::Boost boost,
103-
int32_t durationMs) override;
104-
HalResult<void> setMode(aidl::android::hardware::power::Mode mode, bool enabled) override;
104+
HalResult<void> setBoost(hal::Boost boost, int32_t durationMs) override;
105+
HalResult<void> setMode(hal::Mode mode, bool enabled) override;
105106

106107
protected:
107108
const sp<hardware::power::V1_0::IPower> mHandleV1_0;
@@ -127,9 +128,8 @@ class HidlHalWrapperV1_1 : public HidlHalWrapperV1_0 {
127128
// Wrapper for the HIDL Power HAL v1.2.
128129
class HidlHalWrapperV1_2 : public HidlHalWrapperV1_1 {
129130
public:
130-
HalResult<void> setBoost(aidl::android::hardware::power::Boost boost,
131-
int32_t durationMs) override;
132-
HalResult<void> setMode(aidl::android::hardware::power::Mode mode, bool enabled) override;
131+
HalResult<void> setBoost(hal::Boost boost, int32_t durationMs) override;
132+
HalResult<void> setMode(hal::Mode mode, bool enabled) override;
133133
explicit HidlHalWrapperV1_2(sp<hardware::power::V1_2::IPower> handleV1_2)
134134
: HidlHalWrapperV1_1(std::move(handleV1_2)) {}
135135
~HidlHalWrapperV1_2() override = default;
@@ -141,7 +141,7 @@ class HidlHalWrapperV1_2 : public HidlHalWrapperV1_1 {
141141
// Wrapper for the HIDL Power HAL v1.3.
142142
class HidlHalWrapperV1_3 : public HidlHalWrapperV1_2 {
143143
public:
144-
HalResult<void> setMode(aidl::android::hardware::power::Mode mode, bool enabled) override;
144+
HalResult<void> setMode(hal::Mode mode, bool enabled) override;
145145
explicit HidlHalWrapperV1_3(sp<hardware::power::V1_3::IPower> handleV1_3)
146146
: HidlHalWrapperV1_2(std::move(handleV1_3)) {}
147147
~HidlHalWrapperV1_3() override = default;
@@ -153,26 +153,24 @@ class HidlHalWrapperV1_3 : public HidlHalWrapperV1_2 {
153153
// Wrapper for the AIDL Power HAL.
154154
class AidlHalWrapper : public EmptyHalWrapper {
155155
public:
156-
explicit AidlHalWrapper(std::shared_ptr<aidl::android::hardware::power::IPower> handle)
157-
: mHandle(std::move(handle)) {}
156+
explicit AidlHalWrapper(std::shared_ptr<hal::IPower> handle) : mHandle(std::move(handle)) {}
158157
~AidlHalWrapper() override = default;
159158

160-
HalResult<void> setBoost(aidl::android::hardware::power::Boost boost,
161-
int32_t durationMs) override;
162-
HalResult<void> setMode(aidl::android::hardware::power::Mode mode, bool enabled) override;
159+
HalResult<void> setBoost(hal::Boost boost, int32_t durationMs) override;
160+
HalResult<void> setMode(hal::Mode mode, bool enabled) override;
163161
HalResult<std::shared_ptr<PowerHintSessionWrapper>> createHintSession(
164162
int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds,
165163
int64_t durationNanos) override;
166164
HalResult<std::shared_ptr<PowerHintSessionWrapper>> createHintSessionWithConfig(
167165
int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos,
168-
aidl::android::hardware::power::SessionTag tag,
169-
aidl::android::hardware::power::SessionConfig* config) override;
166+
hal::SessionTag tag, hal::SessionConfig* config) override;
170167

171168
HalResult<int64_t> getHintSessionPreferredRate() override;
172-
HalResult<aidl::android::hardware::power::ChannelConfig> getSessionChannel(int tgid,
173-
int uid) override;
169+
HalResult<hal::ChannelConfig> getSessionChannel(int tgid, int uid) override;
174170
HalResult<void> closeSessionChannel(int tgid, int uid) override;
175171
HalResult<aidl::android::hardware::power::SupportInfo> getSupportInfo() override;
172+
HalResult<void> sendCompositionData(const std::vector<hal::CompositionData>& data) override;
173+
HalResult<void> sendCompositionUpdate(const hal::CompositionUpdate& update) override;
176174

177175
protected:
178176
const char* getUnsupportedMessage() override;
@@ -181,16 +179,10 @@ class AidlHalWrapper : public EmptyHalWrapper {
181179
// Control access to the boost and mode supported arrays.
182180
std::mutex mBoostMutex;
183181
std::mutex mModeMutex;
184-
std::shared_ptr<aidl::android::hardware::power::IPower> mHandle;
185-
std::array<HalSupport,
186-
static_cast<int32_t>(
187-
*(ndk::enum_range<aidl::android::hardware::power::Boost>().end() - 1)) +
188-
1>
182+
std::shared_ptr<hal::IPower> mHandle;
183+
std::array<HalSupport, static_cast<int32_t>(*(ndk::enum_range<hal::Boost>().end() - 1)) + 1>
189184
mBoostSupportedArray GUARDED_BY(mBoostMutex) = {HalSupport::UNKNOWN};
190-
std::array<HalSupport,
191-
static_cast<int32_t>(
192-
*(ndk::enum_range<aidl::android::hardware::power::Mode>().end() - 1)) +
193-
1>
185+
std::array<HalSupport, static_cast<int32_t>(*(ndk::enum_range<hal::Mode>().end() - 1)) + 1>
194186
mModeSupportedArray GUARDED_BY(mModeMutex) = {HalSupport::UNKNOWN};
195187
};
196188

include/powermanager/PowerHintSessionWrapper.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,11 @@ class PowerHintSessionWrapper {
4545
virtual HalResult<void> setMode(::aidl::android::hardware::power::SessionMode in_type,
4646
bool in_enabled);
4747
virtual HalResult<aidl::android::hardware::power::SessionConfig> getSessionConfig();
48+
std::optional<int> getSessionId();
4849

4950
private:
5051
std::shared_ptr<aidl::android::hardware::power::IPowerHintSession> mSession;
52+
std::optional<int> mSessionId;
5153
int32_t mInterfaceVersion;
5254
};
5355

services/powermanager/Android.bp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ cc_library_shared {
5252
],
5353

5454
whole_static_libs: [
55+
"android.adpf.sessionmanager_aidl-ndk",
5556
"android.os.hintmanager_aidl-ndk",
5657
],
5758

services/powermanager/PowerHalController.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,21 @@ HalResult<aidl::android::hardware::power::SupportInfo> PowerHalController::getSu
173173
return CACHE_SUPPORT(6, processHalResult(handle->getSupportInfo(), "getSupportInfo"));
174174
}
175175

176+
HalResult<void> PowerHalController::sendCompositionData(
177+
const std::vector<hal::CompositionData>& data) {
178+
std::shared_ptr<HalWrapper> handle = initHal();
179+
return CACHE_SUPPORT(6,
180+
processHalResult(handle->sendCompositionData(data),
181+
"sendCompositionData"));
182+
}
183+
184+
HalResult<void> PowerHalController::sendCompositionUpdate(const hal::CompositionUpdate& update) {
185+
std::shared_ptr<HalWrapper> handle = initHal();
186+
return CACHE_SUPPORT(6,
187+
processHalResult(handle->sendCompositionUpdate(update),
188+
"sendCompositionUpdate"));
189+
}
190+
176191
} // namespace power
177192

178193
} // namespace android

services/powermanager/PowerHalWrapper.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,16 @@ HalResult<Aidl::SupportInfo> EmptyHalWrapper::getSupportInfo() {
7979
return HalResult<Aidl::SupportInfo>::unsupported();
8080
}
8181

82+
HalResult<void> EmptyHalWrapper::sendCompositionData(const std::vector<hal::CompositionData>&) {
83+
ALOGV("Skipped sendCompositionData because %s", getUnsupportedMessage());
84+
return HalResult<void>::unsupported();
85+
}
86+
87+
HalResult<void> EmptyHalWrapper::sendCompositionUpdate(const hal::CompositionUpdate&) {
88+
ALOGV("Skipped sendCompositionUpdate because %s", getUnsupportedMessage());
89+
return HalResult<void>::unsupported();
90+
}
91+
8292
const char* EmptyHalWrapper::getUnsupportedMessage() {
8393
return "Power HAL is not supported";
8494
}
@@ -292,6 +302,14 @@ HalResult<Aidl::SupportInfo> AidlHalWrapper::getSupportInfo() {
292302
return HalResult<Aidl::SupportInfo>::fromStatus(result, std::move(support));
293303
}
294304

305+
HalResult<void> AidlHalWrapper::sendCompositionData(const std::vector<hal::CompositionData>& data) {
306+
return HalResult<void>::fromStatus(mHandle->sendCompositionData(data));
307+
}
308+
309+
HalResult<void> AidlHalWrapper::sendCompositionUpdate(const hal::CompositionUpdate& update) {
310+
return HalResult<void>::fromStatus(mHandle->sendCompositionUpdate(update));
311+
}
312+
295313
const char* AidlHalWrapper::getUnsupportedMessage() {
296314
return "Power HAL doesn't support it";
297315
}

services/powermanager/tests/PowerHalWrapperAidlTest.cpp

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626
#include <utils/Log.h>
2727

2828
#include <unistd.h>
29+
#include <memory>
2930
#include <thread>
3031

31-
3232
using android::binder::Status;
3333

3434
using namespace aidl::android::hardware::power;
@@ -347,3 +347,50 @@ TEST_F(PowerHalWrapperAidlTest, TestCreateHintSessionWithConfigUnsupported) {
347347
result = mWrapper->createHintSessionWithConfig(tgid, uid, threadIds, durationNanos, tag, &out);
348348
ASSERT_TRUE(result.isUnsupported());
349349
}
350+
351+
TEST_F(PowerHalWrapperAidlTest, TestSendingCompositionData) {
352+
int32_t tgid = 999;
353+
int32_t uid = 1001;
354+
std::vector<hal::CompositionData> dataOut;
355+
dataOut.emplace_back(hal::CompositionData{
356+
.timestampNanos = 0L,
357+
.scheduledPresentTimestampsNanos = {100},
358+
.latchTimestampNanos = 50,
359+
.outputIds = {0},
360+
});
361+
dataOut.emplace_back(hal::CompositionData{
362+
.timestampNanos = 200L,
363+
.scheduledPresentTimestampsNanos = {300},
364+
.latchTimestampNanos = 250,
365+
.outputIds = {0},
366+
});
367+
EXPECT_CALL(*mMockHal.get(), sendCompositionData(_))
368+
.Times(Exactly(1))
369+
.WillOnce([&](const std::vector<hal::CompositionData>& passedData) {
370+
if (!std::equal(passedData.begin(), passedData.end(), dataOut.begin())) {
371+
ADD_FAILURE() << "Passed composition data not the same";
372+
}
373+
return ndk::ScopedAStatus::ok();
374+
});
375+
376+
ASSERT_TRUE(mWrapper->sendCompositionData(dataOut).isOk());
377+
}
378+
379+
TEST_F(PowerHalWrapperAidlTest, TestSendingCompositionUpdate) {
380+
int32_t tgid = 999;
381+
int32_t uid = 1001;
382+
hal::CompositionUpdate dataOut{
383+
.timestampNanos = 123,
384+
.deadOutputIds = {1, 2, 3},
385+
};
386+
EXPECT_CALL(*mMockHal.get(), sendCompositionUpdate(_))
387+
.Times(Exactly(1))
388+
.WillOnce([&](const hal::CompositionUpdate& passedData) {
389+
if (passedData != dataOut) {
390+
ADD_FAILURE() << "Passed composition update data not the same";
391+
}
392+
return ndk::ScopedAStatus::ok();
393+
});
394+
395+
ASSERT_TRUE(mWrapper->sendCompositionUpdate(dataOut).isOk());
396+
}

0 commit comments

Comments
 (0)