blob: 544f69297a25fd7cb541b2de9121f7f2c5fa59d0 [file] [log] [blame]
ramindani1cb794e2021-10-13 20:45:23 +00001/**
2 * Copyright (c) 2021, 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
ramindani458e53e2022-02-23 17:30:16 +000017#include "GraphicsComposerCallback.h"
ramindani1cb794e2021-10-13 20:45:23 +000018#include <log/log_main.h>
Midas Chiena0b56bd2022-01-13 23:27:33 +080019#include <utils/Timers.h>
Huihong Luo5569efb2023-09-19 17:48:37 -070020#include <cinttypes>
ramindani1cb794e2021-10-13 20:45:23 +000021
22#pragma push_macro("LOG_TAG")
23#undef LOG_TAG
24#define LOG_TAG "GraphicsComposerCallback"
25
26namespace aidl::android::hardware::graphics::composer3::vts {
27
28void GraphicsComposerCallback::setVsyncAllowed(bool allowed) {
29 std::scoped_lock lock(mMutex);
30 mVsyncAllowed = allowed;
31}
32
ramindani9dd8c482023-02-21 18:07:56 -080033void GraphicsComposerCallback::setRefreshRateChangedDebugDataEnabledCallbackAllowed(bool allowed) {
34 std::scoped_lock lock(mMutex);
35 mRefreshRateChangedDebugDataEnabledCallbackAllowed = allowed;
36}
37
ramindani1cb794e2021-10-13 20:45:23 +000038std::vector<int64_t> GraphicsComposerCallback::getDisplays() const {
39 std::scoped_lock lock(mMutex);
ramindani7ce70fe2022-02-10 18:08:09 +000040 return mDisplays;
ramindani1cb794e2021-10-13 20:45:23 +000041}
42
43int32_t GraphicsComposerCallback::getInvalidHotplugCount() const {
44 std::scoped_lock lock(mMutex);
45 return mInvalidHotplugCount;
46}
47
48int32_t GraphicsComposerCallback::getInvalidRefreshCount() const {
49 std::scoped_lock lock(mMutex);
50 return mInvalidRefreshCount;
51}
52
53int32_t GraphicsComposerCallback::getInvalidVsyncCount() const {
54 std::scoped_lock lock(mMutex);
55 return mInvalidVsyncCount;
56}
57
58int32_t GraphicsComposerCallback::getInvalidVsyncPeriodChangeCount() const {
59 std::scoped_lock lock(mMutex);
60 return mInvalidVsyncPeriodChangeCount;
61}
62
63int32_t GraphicsComposerCallback::getInvalidSeamlessPossibleCount() const {
64 std::scoped_lock lock(mMutex);
65 return mInvalidSeamlessPossibleCount;
66}
67
Midas Chiena0b56bd2022-01-13 23:27:33 +080068int32_t GraphicsComposerCallback::getVsyncIdleCount() const {
69 std::scoped_lock lock(mMutex);
70 return mVsyncIdleCount;
71}
72
73int64_t GraphicsComposerCallback::getVsyncIdleTime() const {
74 std::scoped_lock lock(mMutex);
75 return mVsyncIdleTime;
76}
77
ramindani1cb794e2021-10-13 20:45:23 +000078std::optional<VsyncPeriodChangeTimeline>
79GraphicsComposerCallback::takeLastVsyncPeriodChangeTimeline() {
80 std::scoped_lock lock(mMutex);
81
82 std::optional<VsyncPeriodChangeTimeline> ret;
83 ret.swap(mTimeline);
84
85 return ret;
86}
87
ramindani9dd8c482023-02-21 18:07:56 -080088std::vector<RefreshRateChangedDebugData>
89GraphicsComposerCallback::takeListOfRefreshRateChangedDebugData() {
90 std::scoped_lock lock(mMutex);
91
92 std::vector<RefreshRateChangedDebugData> ret;
93 ret.swap(mRefreshRateChangedDebugData);
94
95 return ret;
96}
97
98int32_t GraphicsComposerCallback::getInvalidRefreshRateDebugEnabledCallbackCount() const {
99 std::scoped_lock lock(mMutex);
100 return mInvalidRefreshRateDebugEnabledCallbackCount;
101}
102
ramindani1cb794e2021-10-13 20:45:23 +0000103::ndk::ScopedAStatus GraphicsComposerCallback::onHotplug(int64_t in_display, bool in_connected) {
104 std::scoped_lock lock(mMutex);
ramindani7ce70fe2022-02-10 18:08:09 +0000105
106 const auto it = std::find(mDisplays.begin(), mDisplays.end(), in_display);
ramindani1cb794e2021-10-13 20:45:23 +0000107 if (in_connected) {
ramindani7ce70fe2022-02-10 18:08:09 +0000108 if (it == mDisplays.end()) {
109 mDisplays.push_back(in_display);
110 } else {
ramindani1cb794e2021-10-13 20:45:23 +0000111 mInvalidHotplugCount++;
112 }
113 } else {
ramindani7ce70fe2022-02-10 18:08:09 +0000114 if (it != mDisplays.end()) {
115 mDisplays.erase(it);
116 } else {
ramindani1cb794e2021-10-13 20:45:23 +0000117 mInvalidHotplugCount++;
118 }
119 }
120 return ::ndk::ScopedAStatus::ok();
121}
122
ramindani7ce70fe2022-02-10 18:08:09 +0000123::ndk::ScopedAStatus GraphicsComposerCallback::onRefresh(int64_t in_display) {
ramindani1cb794e2021-10-13 20:45:23 +0000124 std::scoped_lock lock(mMutex);
125
ramindani7ce70fe2022-02-10 18:08:09 +0000126 const auto it = std::find(mDisplays.begin(), mDisplays.end(), in_display);
127 if (it == mDisplays.end()) {
ramindani1cb794e2021-10-13 20:45:23 +0000128 mInvalidRefreshCount++;
129 }
130
131 return ::ndk::ScopedAStatus::ok();
132}
133
134::ndk::ScopedAStatus GraphicsComposerCallback::onVsync(int64_t in_display, int64_t in_timestamp,
135 int32_t in_vsyncPeriodNanos) {
136 std::scoped_lock lock(mMutex);
ramindani7ce70fe2022-02-10 18:08:09 +0000137
138 const auto it = std::find(mDisplays.begin(), mDisplays.end(), in_display);
139 if (!mVsyncAllowed || it == mDisplays.end()) {
ramindani1cb794e2021-10-13 20:45:23 +0000140 mInvalidVsyncCount++;
141 }
142
143 ALOGV("%ld, %d", static_cast<long>(in_timestamp), in_vsyncPeriodNanos);
144
145 return ::ndk::ScopedAStatus::ok();
146}
147
ramindani83450342023-02-03 12:52:08 -0800148::ndk::ScopedAStatus GraphicsComposerCallback::onRefreshRateChangedDebug(
ramindani9dd8c482023-02-21 18:07:56 -0800149 const RefreshRateChangedDebugData& data) {
150 std::scoped_lock lock(mMutex);
151
152 const auto it = std::find(mDisplays.begin(), mDisplays.end(), data.display);
153 if (mRefreshRateChangedDebugDataEnabledCallbackAllowed && it != mDisplays.end()) {
154 mRefreshRateChangedDebugData.push_back(data);
155 } else {
156 mInvalidRefreshRateDebugEnabledCallbackCount++;
157 }
158 return ::ndk::ScopedAStatus::ok();
ramindani83450342023-02-03 12:52:08 -0800159}
160
ramindani1cb794e2021-10-13 20:45:23 +0000161::ndk::ScopedAStatus GraphicsComposerCallback::onVsyncPeriodTimingChanged(
162 int64_t in_display,
163 const ::aidl::android::hardware::graphics::composer3::VsyncPeriodChangeTimeline&
164 in_updatedTimeline) {
165 std::scoped_lock lock(mMutex);
ramindani7ce70fe2022-02-10 18:08:09 +0000166
167 const auto it = std::find(mDisplays.begin(), mDisplays.end(), in_display);
168 if (it == mDisplays.end()) {
ramindani1cb794e2021-10-13 20:45:23 +0000169 mInvalidVsyncPeriodChangeCount++;
170 }
171 mTimeline = in_updatedTimeline;
172
173 return ::ndk::ScopedAStatus::ok();
174}
175
176::ndk::ScopedAStatus GraphicsComposerCallback::onSeamlessPossible(int64_t in_display) {
177 std::scoped_lock lock(mMutex);
ramindani7ce70fe2022-02-10 18:08:09 +0000178
179 const auto it = std::find(mDisplays.begin(), mDisplays.end(), in_display);
180 if (it != mDisplays.end()) {
ramindani1cb794e2021-10-13 20:45:23 +0000181 mInvalidSeamlessPossibleCount++;
182 }
183 return ::ndk::ScopedAStatus::ok();
184}
185
Midas Chiena0b56bd2022-01-13 23:27:33 +0800186::ndk::ScopedAStatus GraphicsComposerCallback::onVsyncIdle(int64_t in_display) {
187 std::scoped_lock lock(mMutex);
ramindani7ce70fe2022-02-10 18:08:09 +0000188
189 const auto it = std::find(mDisplays.begin(), mDisplays.end(), in_display);
190 if (it != mDisplays.end()) {
Midas Chiena0b56bd2022-01-13 23:27:33 +0800191 mVsyncIdleCount++;
192 mVsyncIdleTime = systemTime();
193 }
194 return ::ndk::ScopedAStatus::ok();
195}
196
Huihong Luo5569efb2023-09-19 17:48:37 -0700197::ndk::ScopedAStatus GraphicsComposerCallback::onHotplugEvent(int64_t in_display,
198 common::DisplayHotplugEvent event) {
199 switch (event) {
200 case common::DisplayHotplugEvent::CONNECTED:
201 return onHotplug(in_display, true);
202 case common::DisplayHotplugEvent::DISCONNECTED:
203 return onHotplug(in_display, false);
204 default:
205 ALOGE("%s(): display:%" PRIu64 ", event:%d", __func__, in_display,
206 static_cast<int32_t>(event));
207 return ::ndk::ScopedAStatus::ok();
208 }
209}
210
ramindani1cb794e2021-10-13 20:45:23 +0000211} // namespace aidl::android::hardware::graphics::composer3::vts