xref: /aosp_15_r20/hardware/interfaces/graphics/composer/aidl/vts/VtsComposerClient.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /**
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (c) 2022, The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #include "VtsComposerClient.h"
18*4d7e907cSAndroid Build Coastguard Worker #include <aidlcommonsupport/NativeHandle.h>
19*4d7e907cSAndroid Build Coastguard Worker #include <android-base/logging.h>
20*4d7e907cSAndroid Build Coastguard Worker #include <log/log_main.h>
21*4d7e907cSAndroid Build Coastguard Worker 
22*4d7e907cSAndroid Build Coastguard Worker #undef LOG_TAG
23*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "VtsComposerClient"
24*4d7e907cSAndroid Build Coastguard Worker 
25*4d7e907cSAndroid Build Coastguard Worker using namespace std::chrono_literals;
26*4d7e907cSAndroid Build Coastguard Worker 
27*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::graphics::composer3::vts {
28*4d7e907cSAndroid Build Coastguard Worker 
VtsComposerClient(const std::string & name)29*4d7e907cSAndroid Build Coastguard Worker VtsComposerClient::VtsComposerClient(const std::string& name) {
30*4d7e907cSAndroid Build Coastguard Worker     SpAIBinder binder(AServiceManager_waitForService(name.c_str()));
31*4d7e907cSAndroid Build Coastguard Worker     ALOGE_IF(binder == nullptr, "Could not initialize the service binder");
32*4d7e907cSAndroid Build Coastguard Worker     if (binder != nullptr) {
33*4d7e907cSAndroid Build Coastguard Worker         mComposer = IComposer::fromBinder(binder);
34*4d7e907cSAndroid Build Coastguard Worker         ALOGE_IF(mComposer == nullptr, "Failed to acquire the composer from the binder");
35*4d7e907cSAndroid Build Coastguard Worker     }
36*4d7e907cSAndroid Build Coastguard Worker 
37*4d7e907cSAndroid Build Coastguard Worker     const auto& [status, capabilities] = getCapabilities();
38*4d7e907cSAndroid Build Coastguard Worker     EXPECT_TRUE(status.isOk());
39*4d7e907cSAndroid Build Coastguard Worker     if (std::any_of(capabilities.begin(), capabilities.end(), [&](const Capability& cap) {
40*4d7e907cSAndroid Build Coastguard Worker             return cap == Capability::LAYER_LIFECYCLE_BATCH_COMMAND;
41*4d7e907cSAndroid Build Coastguard Worker         })) {
42*4d7e907cSAndroid Build Coastguard Worker         mSupportsBatchedCreateLayer = true;
43*4d7e907cSAndroid Build Coastguard Worker     }
44*4d7e907cSAndroid Build Coastguard Worker }
45*4d7e907cSAndroid Build Coastguard Worker 
createClient()46*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::createClient() {
47*4d7e907cSAndroid Build Coastguard Worker     if (mComposer == nullptr) {
48*4d7e907cSAndroid Build Coastguard Worker         ALOGE("IComposer not initialized");
49*4d7e907cSAndroid Build Coastguard Worker         return ScopedAStatus::fromServiceSpecificError(IComposerClient::INVALID_CONFIGURATION);
50*4d7e907cSAndroid Build Coastguard Worker     }
51*4d7e907cSAndroid Build Coastguard Worker     auto status = mComposer->createClient(&mComposerClient);
52*4d7e907cSAndroid Build Coastguard Worker     if (!status.isOk() || mComposerClient == nullptr) {
53*4d7e907cSAndroid Build Coastguard Worker         ALOGE("Failed to create client for IComposerClient with %s",
54*4d7e907cSAndroid Build Coastguard Worker               status.getDescription().c_str());
55*4d7e907cSAndroid Build Coastguard Worker         return status;
56*4d7e907cSAndroid Build Coastguard Worker     }
57*4d7e907cSAndroid Build Coastguard Worker     mComposerCallback = SharedRefBase::make<GraphicsComposerCallback>();
58*4d7e907cSAndroid Build Coastguard Worker     if (mComposerCallback == nullptr) {
59*4d7e907cSAndroid Build Coastguard Worker         ALOGE("Unable to create ComposerCallback");
60*4d7e907cSAndroid Build Coastguard Worker         return ScopedAStatus::fromServiceSpecificError(IComposerClient::INVALID_CONFIGURATION);
61*4d7e907cSAndroid Build Coastguard Worker     }
62*4d7e907cSAndroid Build Coastguard Worker     return mComposerClient->registerCallback(mComposerCallback);
63*4d7e907cSAndroid Build Coastguard Worker }
64*4d7e907cSAndroid Build Coastguard Worker 
tearDown(ComposerClientWriter * writer)65*4d7e907cSAndroid Build Coastguard Worker bool VtsComposerClient::tearDown(ComposerClientWriter* writer) {
66*4d7e907cSAndroid Build Coastguard Worker     return verifyComposerCallbackParams() && destroyAllLayers(writer);
67*4d7e907cSAndroid Build Coastguard Worker }
68*4d7e907cSAndroid Build Coastguard Worker 
getInterfaceVersion() const69*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, int32_t> VtsComposerClient::getInterfaceVersion() const {
70*4d7e907cSAndroid Build Coastguard Worker     int32_t version = 1;
71*4d7e907cSAndroid Build Coastguard Worker     if (!mComposerClient) {
72*4d7e907cSAndroid Build Coastguard Worker         return {ScopedAStatus{nullptr}, version};
73*4d7e907cSAndroid Build Coastguard Worker     }
74*4d7e907cSAndroid Build Coastguard Worker     auto status = mComposerClient->getInterfaceVersion(&version);
75*4d7e907cSAndroid Build Coastguard Worker     return {std::move(status), version};
76*4d7e907cSAndroid Build Coastguard Worker }
77*4d7e907cSAndroid Build Coastguard Worker 
createVirtualDisplay(int32_t width,int32_t height,PixelFormat pixelFormat,int32_t bufferSlotCount)78*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, VirtualDisplay> VtsComposerClient::createVirtualDisplay(
79*4d7e907cSAndroid Build Coastguard Worker         int32_t width, int32_t height, PixelFormat pixelFormat, int32_t bufferSlotCount) {
80*4d7e907cSAndroid Build Coastguard Worker     VirtualDisplay outVirtualDisplay;
81*4d7e907cSAndroid Build Coastguard Worker     auto status = mComposerClient->createVirtualDisplay(width, height, pixelFormat, bufferSlotCount,
82*4d7e907cSAndroid Build Coastguard Worker                                                         &outVirtualDisplay);
83*4d7e907cSAndroid Build Coastguard Worker     if (!status.isOk()) {
84*4d7e907cSAndroid Build Coastguard Worker         return {std::move(status), outVirtualDisplay};
85*4d7e907cSAndroid Build Coastguard Worker     }
86*4d7e907cSAndroid Build Coastguard Worker     return {addDisplayToDisplayResources(outVirtualDisplay.display, /*isVirtual*/ true),
87*4d7e907cSAndroid Build Coastguard Worker             outVirtualDisplay};
88*4d7e907cSAndroid Build Coastguard Worker }
89*4d7e907cSAndroid Build Coastguard Worker 
destroyVirtualDisplay(int64_t display)90*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::destroyVirtualDisplay(int64_t display) {
91*4d7e907cSAndroid Build Coastguard Worker     auto status = mComposerClient->destroyVirtualDisplay(display);
92*4d7e907cSAndroid Build Coastguard Worker     if (!status.isOk()) {
93*4d7e907cSAndroid Build Coastguard Worker         return status;
94*4d7e907cSAndroid Build Coastguard Worker     }
95*4d7e907cSAndroid Build Coastguard Worker     mDisplayResources.erase(display);
96*4d7e907cSAndroid Build Coastguard Worker     return status;
97*4d7e907cSAndroid Build Coastguard Worker }
98*4d7e907cSAndroid Build Coastguard Worker 
createLayer(int64_t display,int32_t bufferSlotCount,ComposerClientWriter * writer)99*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, int64_t> VtsComposerClient::createLayer(int64_t display,
100*4d7e907cSAndroid Build Coastguard Worker                                                                  int32_t bufferSlotCount,
101*4d7e907cSAndroid Build Coastguard Worker                                                                  ComposerClientWriter* writer) {
102*4d7e907cSAndroid Build Coastguard Worker     if (mSupportsBatchedCreateLayer) {
103*4d7e907cSAndroid Build Coastguard Worker         int64_t layer = mNextLayerHandle++;
104*4d7e907cSAndroid Build Coastguard Worker         writer->setLayerLifecycleBatchCommandType(display, layer,
105*4d7e907cSAndroid Build Coastguard Worker                                                   LayerLifecycleBatchCommandType::CREATE);
106*4d7e907cSAndroid Build Coastguard Worker         writer->setNewBufferSlotCount(display, layer, bufferSlotCount);
107*4d7e907cSAndroid Build Coastguard Worker         return {addLayerToDisplayResources(display, layer), layer};
108*4d7e907cSAndroid Build Coastguard Worker     }
109*4d7e907cSAndroid Build Coastguard Worker 
110*4d7e907cSAndroid Build Coastguard Worker     int64_t outLayer;
111*4d7e907cSAndroid Build Coastguard Worker     auto status = mComposerClient->createLayer(display, bufferSlotCount, &outLayer);
112*4d7e907cSAndroid Build Coastguard Worker 
113*4d7e907cSAndroid Build Coastguard Worker     if (!status.isOk()) {
114*4d7e907cSAndroid Build Coastguard Worker         return {std::move(status), outLayer};
115*4d7e907cSAndroid Build Coastguard Worker     }
116*4d7e907cSAndroid Build Coastguard Worker     return {addLayerToDisplayResources(display, outLayer), outLayer};
117*4d7e907cSAndroid Build Coastguard Worker }
118*4d7e907cSAndroid Build Coastguard Worker 
destroyLayer(int64_t display,int64_t layer,ComposerClientWriter * writer)119*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::destroyLayer(int64_t display, int64_t layer,
120*4d7e907cSAndroid Build Coastguard Worker                                               ComposerClientWriter* writer) {
121*4d7e907cSAndroid Build Coastguard Worker     if (mSupportsBatchedCreateLayer) {
122*4d7e907cSAndroid Build Coastguard Worker         writer->setLayerLifecycleBatchCommandType(display, layer,
123*4d7e907cSAndroid Build Coastguard Worker                                                   LayerLifecycleBatchCommandType::DESTROY);
124*4d7e907cSAndroid Build Coastguard Worker     } else {
125*4d7e907cSAndroid Build Coastguard Worker         auto status = mComposerClient->destroyLayer(display, layer);
126*4d7e907cSAndroid Build Coastguard Worker         if (!status.isOk()) {
127*4d7e907cSAndroid Build Coastguard Worker             return status;
128*4d7e907cSAndroid Build Coastguard Worker         }
129*4d7e907cSAndroid Build Coastguard Worker     }
130*4d7e907cSAndroid Build Coastguard Worker 
131*4d7e907cSAndroid Build Coastguard Worker     removeLayerFromDisplayResources(display, layer);
132*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::ok();
133*4d7e907cSAndroid Build Coastguard Worker }
134*4d7e907cSAndroid Build Coastguard Worker 
getActiveConfig(int64_t display)135*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, int32_t> VtsComposerClient::getActiveConfig(int64_t display) {
136*4d7e907cSAndroid Build Coastguard Worker     int32_t outConfig;
137*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getActiveConfig(display, &outConfig), outConfig};
138*4d7e907cSAndroid Build Coastguard Worker }
139*4d7e907cSAndroid Build Coastguard Worker 
setActiveConfig(VtsDisplay * vtsDisplay,int32_t config)140*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::setActiveConfig(VtsDisplay* vtsDisplay, int32_t config) {
141*4d7e907cSAndroid Build Coastguard Worker     auto status = mComposerClient->setActiveConfig(vtsDisplay->getDisplayId(), config);
142*4d7e907cSAndroid Build Coastguard Worker     if (!status.isOk()) {
143*4d7e907cSAndroid Build Coastguard Worker         return status;
144*4d7e907cSAndroid Build Coastguard Worker     }
145*4d7e907cSAndroid Build Coastguard Worker     return updateDisplayProperties(vtsDisplay, config);
146*4d7e907cSAndroid Build Coastguard Worker }
147*4d7e907cSAndroid Build Coastguard Worker 
setPeakRefreshRateConfig(VtsDisplay * vtsDisplay)148*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::setPeakRefreshRateConfig(VtsDisplay* vtsDisplay) {
149*4d7e907cSAndroid Build Coastguard Worker     const auto displayId = vtsDisplay->getDisplayId();
150*4d7e907cSAndroid Build Coastguard Worker     auto [activeStatus, activeConfig] = getActiveConfig(displayId);
151*4d7e907cSAndroid Build Coastguard Worker     EXPECT_TRUE(activeStatus.isOk());
152*4d7e907cSAndroid Build Coastguard Worker     auto peakDisplayConfig = vtsDisplay->getDisplayConfig(activeConfig);
153*4d7e907cSAndroid Build Coastguard Worker     auto peakConfig = activeConfig;
154*4d7e907cSAndroid Build Coastguard Worker 
155*4d7e907cSAndroid Build Coastguard Worker     const auto displayConfigs = vtsDisplay->getDisplayConfigs();
156*4d7e907cSAndroid Build Coastguard Worker     for (const auto [config, displayConfig] : displayConfigs) {
157*4d7e907cSAndroid Build Coastguard Worker         if (displayConfig.configGroup == peakDisplayConfig.configGroup &&
158*4d7e907cSAndroid Build Coastguard Worker             displayConfig.vsyncPeriod < peakDisplayConfig.vsyncPeriod) {
159*4d7e907cSAndroid Build Coastguard Worker             peakDisplayConfig = displayConfig;
160*4d7e907cSAndroid Build Coastguard Worker             peakConfig = config;
161*4d7e907cSAndroid Build Coastguard Worker         }
162*4d7e907cSAndroid Build Coastguard Worker     }
163*4d7e907cSAndroid Build Coastguard Worker     return setActiveConfig(vtsDisplay, peakConfig);
164*4d7e907cSAndroid Build Coastguard Worker }
165*4d7e907cSAndroid Build Coastguard Worker 
getDisplayAttribute(int64_t display,int32_t config,DisplayAttribute displayAttribute)166*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, int32_t> VtsComposerClient::getDisplayAttribute(
167*4d7e907cSAndroid Build Coastguard Worker         int64_t display, int32_t config, DisplayAttribute displayAttribute) {
168*4d7e907cSAndroid Build Coastguard Worker     int32_t outDisplayAttribute;
169*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getDisplayAttribute(display, config, displayAttribute,
170*4d7e907cSAndroid Build Coastguard Worker                                                  &outDisplayAttribute),
171*4d7e907cSAndroid Build Coastguard Worker             outDisplayAttribute};
172*4d7e907cSAndroid Build Coastguard Worker }
173*4d7e907cSAndroid Build Coastguard Worker 
setPowerMode(int64_t display,PowerMode powerMode)174*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::setPowerMode(int64_t display, PowerMode powerMode) {
175*4d7e907cSAndroid Build Coastguard Worker     return mComposerClient->setPowerMode(display, powerMode);
176*4d7e907cSAndroid Build Coastguard Worker }
177*4d7e907cSAndroid Build Coastguard Worker 
setVsync(int64_t display,bool enable)178*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::setVsync(int64_t display, bool enable) {
179*4d7e907cSAndroid Build Coastguard Worker     return mComposerClient->setVsyncEnabled(display, enable);
180*4d7e907cSAndroid Build Coastguard Worker }
181*4d7e907cSAndroid Build Coastguard Worker 
setVsyncAllowed(bool isAllowed)182*4d7e907cSAndroid Build Coastguard Worker void VtsComposerClient::setVsyncAllowed(bool isAllowed) {
183*4d7e907cSAndroid Build Coastguard Worker     mComposerCallback->setVsyncAllowed(isAllowed);
184*4d7e907cSAndroid Build Coastguard Worker }
185*4d7e907cSAndroid Build Coastguard Worker 
getDataspaceSaturationMatrix(Dataspace dataspace)186*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, std::vector<float>> VtsComposerClient::getDataspaceSaturationMatrix(
187*4d7e907cSAndroid Build Coastguard Worker         Dataspace dataspace) {
188*4d7e907cSAndroid Build Coastguard Worker     std::vector<float> outMatrix;
189*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getDataspaceSaturationMatrix(dataspace, &outMatrix), outMatrix};
190*4d7e907cSAndroid Build Coastguard Worker }
191*4d7e907cSAndroid Build Coastguard Worker 
executeCommands(const std::vector<DisplayCommand> & commands)192*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, std::vector<CommandResultPayload>> VtsComposerClient::executeCommands(
193*4d7e907cSAndroid Build Coastguard Worker         const std::vector<DisplayCommand>& commands) {
194*4d7e907cSAndroid Build Coastguard Worker     std::vector<CommandResultPayload> outResultPayload;
195*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->executeCommands(commands, &outResultPayload),
196*4d7e907cSAndroid Build Coastguard Worker             std::move(outResultPayload)};
197*4d7e907cSAndroid Build Coastguard Worker }
198*4d7e907cSAndroid Build Coastguard Worker 
takeLastVsyncPeriodChangeTimeline()199*4d7e907cSAndroid Build Coastguard Worker std::optional<VsyncPeriodChangeTimeline> VtsComposerClient::takeLastVsyncPeriodChangeTimeline() {
200*4d7e907cSAndroid Build Coastguard Worker     return mComposerCallback->takeLastVsyncPeriodChangeTimeline();
201*4d7e907cSAndroid Build Coastguard Worker }
202*4d7e907cSAndroid Build Coastguard Worker 
setContentType(int64_t display,ContentType contentType)203*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::setContentType(int64_t display, ContentType contentType) {
204*4d7e907cSAndroid Build Coastguard Worker     return mComposerClient->setContentType(display, contentType);
205*4d7e907cSAndroid Build Coastguard Worker }
206*4d7e907cSAndroid Build Coastguard Worker 
207*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, VsyncPeriodChangeTimeline>
setActiveConfigWithConstraints(VtsDisplay * vtsDisplay,int32_t config,const VsyncPeriodChangeConstraints & constraints)208*4d7e907cSAndroid Build Coastguard Worker VtsComposerClient::setActiveConfigWithConstraints(VtsDisplay* vtsDisplay, int32_t config,
209*4d7e907cSAndroid Build Coastguard Worker                                                   const VsyncPeriodChangeConstraints& constraints) {
210*4d7e907cSAndroid Build Coastguard Worker     VsyncPeriodChangeTimeline outTimeline;
211*4d7e907cSAndroid Build Coastguard Worker     auto status = mComposerClient->setActiveConfigWithConstraints(
212*4d7e907cSAndroid Build Coastguard Worker             vtsDisplay->getDisplayId(), config, constraints, &outTimeline);
213*4d7e907cSAndroid Build Coastguard Worker     if (!status.isOk()) {
214*4d7e907cSAndroid Build Coastguard Worker         return {std::move(status), outTimeline};
215*4d7e907cSAndroid Build Coastguard Worker     }
216*4d7e907cSAndroid Build Coastguard Worker     return {updateDisplayProperties(vtsDisplay, config), outTimeline};
217*4d7e907cSAndroid Build Coastguard Worker }
218*4d7e907cSAndroid Build Coastguard Worker 
getDisplayCapabilities(int64_t display)219*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, std::vector<DisplayCapability>> VtsComposerClient::getDisplayCapabilities(
220*4d7e907cSAndroid Build Coastguard Worker         int64_t display) {
221*4d7e907cSAndroid Build Coastguard Worker     std::vector<DisplayCapability> outCapabilities;
222*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getDisplayCapabilities(display, &outCapabilities), outCapabilities};
223*4d7e907cSAndroid Build Coastguard Worker }
224*4d7e907cSAndroid Build Coastguard Worker 
dumpDebugInfo()225*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::dumpDebugInfo() {
226*4d7e907cSAndroid Build Coastguard Worker     int pipefds[2];
227*4d7e907cSAndroid Build Coastguard Worker     if (pipe(pipefds) < 0) {
228*4d7e907cSAndroid Build Coastguard Worker         return ScopedAStatus::fromServiceSpecificError(IComposer::EX_NO_RESOURCES);
229*4d7e907cSAndroid Build Coastguard Worker     }
230*4d7e907cSAndroid Build Coastguard Worker 
231*4d7e907cSAndroid Build Coastguard Worker     const auto status = mComposer->dump(pipefds[1], /*args*/ nullptr, /*numArgs*/ 0);
232*4d7e907cSAndroid Build Coastguard Worker     close(pipefds[0]);
233*4d7e907cSAndroid Build Coastguard Worker     close(pipefds[1]);
234*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::fromStatus(status);
235*4d7e907cSAndroid Build Coastguard Worker }
236*4d7e907cSAndroid Build Coastguard Worker 
getDisplayIdentificationData(int64_t display)237*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, DisplayIdentification> VtsComposerClient::getDisplayIdentificationData(
238*4d7e907cSAndroid Build Coastguard Worker         int64_t display) {
239*4d7e907cSAndroid Build Coastguard Worker     DisplayIdentification outDisplayIdentification;
240*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getDisplayIdentificationData(display, &outDisplayIdentification),
241*4d7e907cSAndroid Build Coastguard Worker             outDisplayIdentification};
242*4d7e907cSAndroid Build Coastguard Worker }
243*4d7e907cSAndroid Build Coastguard Worker 
getHdrCapabilities(int64_t display)244*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, HdrCapabilities> VtsComposerClient::getHdrCapabilities(int64_t display) {
245*4d7e907cSAndroid Build Coastguard Worker     HdrCapabilities outHdrCapabilities;
246*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getHdrCapabilities(display, &outHdrCapabilities), outHdrCapabilities};
247*4d7e907cSAndroid Build Coastguard Worker }
248*4d7e907cSAndroid Build Coastguard Worker 
249*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, std::vector<PerFrameMetadataKey>>
getPerFrameMetadataKeys(int64_t display)250*4d7e907cSAndroid Build Coastguard Worker VtsComposerClient::getPerFrameMetadataKeys(int64_t display) {
251*4d7e907cSAndroid Build Coastguard Worker     std::vector<PerFrameMetadataKey> outPerFrameMetadataKeys;
252*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getPerFrameMetadataKeys(display, &outPerFrameMetadataKeys),
253*4d7e907cSAndroid Build Coastguard Worker             outPerFrameMetadataKeys};
254*4d7e907cSAndroid Build Coastguard Worker }
255*4d7e907cSAndroid Build Coastguard Worker 
getReadbackBufferAttributes(int64_t display)256*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, ReadbackBufferAttributes> VtsComposerClient::getReadbackBufferAttributes(
257*4d7e907cSAndroid Build Coastguard Worker         int64_t display) {
258*4d7e907cSAndroid Build Coastguard Worker     ReadbackBufferAttributes outReadbackBufferAttributes;
259*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getReadbackBufferAttributes(display, &outReadbackBufferAttributes),
260*4d7e907cSAndroid Build Coastguard Worker             outReadbackBufferAttributes};
261*4d7e907cSAndroid Build Coastguard Worker }
262*4d7e907cSAndroid Build Coastguard Worker 
setReadbackBuffer(int64_t display,const native_handle_t * buffer,const ScopedFileDescriptor & releaseFence)263*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::setReadbackBuffer(int64_t display, const native_handle_t* buffer,
264*4d7e907cSAndroid Build Coastguard Worker                                                    const ScopedFileDescriptor& releaseFence) {
265*4d7e907cSAndroid Build Coastguard Worker     return mComposerClient->setReadbackBuffer(display, ::android::dupToAidl(buffer), releaseFence);
266*4d7e907cSAndroid Build Coastguard Worker }
267*4d7e907cSAndroid Build Coastguard Worker 
getReadbackBufferFence(int64_t display)268*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, ScopedFileDescriptor> VtsComposerClient::getReadbackBufferFence(
269*4d7e907cSAndroid Build Coastguard Worker         int64_t display) {
270*4d7e907cSAndroid Build Coastguard Worker     ScopedFileDescriptor outReleaseFence;
271*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getReadbackBufferFence(display, &outReleaseFence),
272*4d7e907cSAndroid Build Coastguard Worker             std::move(outReleaseFence)};
273*4d7e907cSAndroid Build Coastguard Worker }
274*4d7e907cSAndroid Build Coastguard Worker 
getColorModes(int64_t display)275*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, std::vector<ColorMode>> VtsComposerClient::getColorModes(int64_t display) {
276*4d7e907cSAndroid Build Coastguard Worker     std::vector<ColorMode> outColorModes;
277*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getColorModes(display, &outColorModes), outColorModes};
278*4d7e907cSAndroid Build Coastguard Worker }
279*4d7e907cSAndroid Build Coastguard Worker 
getRenderIntents(int64_t display,ColorMode colorMode)280*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, std::vector<RenderIntent>> VtsComposerClient::getRenderIntents(
281*4d7e907cSAndroid Build Coastguard Worker         int64_t display, ColorMode colorMode) {
282*4d7e907cSAndroid Build Coastguard Worker     std::vector<RenderIntent> outRenderIntents;
283*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getRenderIntents(display, colorMode, &outRenderIntents),
284*4d7e907cSAndroid Build Coastguard Worker             outRenderIntents};
285*4d7e907cSAndroid Build Coastguard Worker }
286*4d7e907cSAndroid Build Coastguard Worker 
setColorMode(int64_t display,ColorMode colorMode,RenderIntent renderIntent)287*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::setColorMode(int64_t display, ColorMode colorMode,
288*4d7e907cSAndroid Build Coastguard Worker                                               RenderIntent renderIntent) {
289*4d7e907cSAndroid Build Coastguard Worker     return mComposerClient->setColorMode(display, colorMode, renderIntent);
290*4d7e907cSAndroid Build Coastguard Worker }
291*4d7e907cSAndroid Build Coastguard Worker 
292*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, DisplayContentSamplingAttributes>
getDisplayedContentSamplingAttributes(int64_t display)293*4d7e907cSAndroid Build Coastguard Worker VtsComposerClient::getDisplayedContentSamplingAttributes(int64_t display) {
294*4d7e907cSAndroid Build Coastguard Worker     DisplayContentSamplingAttributes outAttributes;
295*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getDisplayedContentSamplingAttributes(display, &outAttributes),
296*4d7e907cSAndroid Build Coastguard Worker             outAttributes};
297*4d7e907cSAndroid Build Coastguard Worker }
298*4d7e907cSAndroid Build Coastguard Worker 
setDisplayedContentSamplingEnabled(int64_t display,bool isEnabled,FormatColorComponent formatColorComponent,int64_t maxFrames)299*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::setDisplayedContentSamplingEnabled(
300*4d7e907cSAndroid Build Coastguard Worker         int64_t display, bool isEnabled, FormatColorComponent formatColorComponent,
301*4d7e907cSAndroid Build Coastguard Worker         int64_t maxFrames) {
302*4d7e907cSAndroid Build Coastguard Worker     return mComposerClient->setDisplayedContentSamplingEnabled(display, isEnabled,
303*4d7e907cSAndroid Build Coastguard Worker                                                                formatColorComponent, maxFrames);
304*4d7e907cSAndroid Build Coastguard Worker }
305*4d7e907cSAndroid Build Coastguard Worker 
getDisplayedContentSample(int64_t display,int64_t maxFrames,int64_t timestamp)306*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, DisplayContentSample> VtsComposerClient::getDisplayedContentSample(
307*4d7e907cSAndroid Build Coastguard Worker         int64_t display, int64_t maxFrames, int64_t timestamp) {
308*4d7e907cSAndroid Build Coastguard Worker     DisplayContentSample outDisplayContentSample;
309*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getDisplayedContentSample(display, maxFrames, timestamp,
310*4d7e907cSAndroid Build Coastguard Worker                                                        &outDisplayContentSample),
311*4d7e907cSAndroid Build Coastguard Worker             outDisplayContentSample};
312*4d7e907cSAndroid Build Coastguard Worker }
313*4d7e907cSAndroid Build Coastguard Worker 
getDisplayConnectionType(int64_t display)314*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, DisplayConnectionType> VtsComposerClient::getDisplayConnectionType(
315*4d7e907cSAndroid Build Coastguard Worker         int64_t display) {
316*4d7e907cSAndroid Build Coastguard Worker     DisplayConnectionType outDisplayConnectionType;
317*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getDisplayConnectionType(display, &outDisplayConnectionType),
318*4d7e907cSAndroid Build Coastguard Worker             outDisplayConnectionType};
319*4d7e907cSAndroid Build Coastguard Worker }
320*4d7e907cSAndroid Build Coastguard Worker 
getDisplayConfigs(int64_t display)321*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, std::vector<int32_t>> VtsComposerClient::getDisplayConfigs(
322*4d7e907cSAndroid Build Coastguard Worker         int64_t display) {
323*4d7e907cSAndroid Build Coastguard Worker     std::vector<int32_t> outConfigs;
324*4d7e907cSAndroid Build Coastguard Worker     if (!getDisplayConfigurationSupported()) {
325*4d7e907cSAndroid Build Coastguard Worker         return {mComposerClient->getDisplayConfigs(display, &outConfigs), outConfigs};
326*4d7e907cSAndroid Build Coastguard Worker     }
327*4d7e907cSAndroid Build Coastguard Worker 
328*4d7e907cSAndroid Build Coastguard Worker     auto [status, configs] = getDisplayConfigurations(display);
329*4d7e907cSAndroid Build Coastguard Worker     if (!status.isOk()) {
330*4d7e907cSAndroid Build Coastguard Worker         return {std::move(status), outConfigs};
331*4d7e907cSAndroid Build Coastguard Worker     }
332*4d7e907cSAndroid Build Coastguard Worker     for (const auto& config : configs) {
333*4d7e907cSAndroid Build Coastguard Worker         outConfigs.emplace_back(config.configId);
334*4d7e907cSAndroid Build Coastguard Worker     }
335*4d7e907cSAndroid Build Coastguard Worker     return {std::move(status), outConfigs};
336*4d7e907cSAndroid Build Coastguard Worker }
337*4d7e907cSAndroid Build Coastguard Worker 
338*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, std::vector<DisplayConfiguration>>
getDisplayConfigurations(int64_t display)339*4d7e907cSAndroid Build Coastguard Worker VtsComposerClient::getDisplayConfigurations(int64_t display) {
340*4d7e907cSAndroid Build Coastguard Worker     std::vector<DisplayConfiguration> outConfigs;
341*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getDisplayConfigurations(display, kMaxFrameIntervalNs, &outConfigs),
342*4d7e907cSAndroid Build Coastguard Worker             outConfigs};
343*4d7e907cSAndroid Build Coastguard Worker }
344*4d7e907cSAndroid Build Coastguard Worker 
notifyExpectedPresent(int64_t display,ClockMonotonicTimestamp expectedPresentTime,int frameIntervalNs)345*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::notifyExpectedPresent(int64_t display,
346*4d7e907cSAndroid Build Coastguard Worker                                                        ClockMonotonicTimestamp expectedPresentTime,
347*4d7e907cSAndroid Build Coastguard Worker                                                        int frameIntervalNs) {
348*4d7e907cSAndroid Build Coastguard Worker     return mComposerClient->notifyExpectedPresent(display, expectedPresentTime, frameIntervalNs);
349*4d7e907cSAndroid Build Coastguard Worker }
350*4d7e907cSAndroid Build Coastguard Worker 
getDisplayVsyncPeriod(int64_t display)351*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, int32_t> VtsComposerClient::getDisplayVsyncPeriod(int64_t display) {
352*4d7e907cSAndroid Build Coastguard Worker     int32_t outVsyncPeriodNanos;
353*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getDisplayVsyncPeriod(display, &outVsyncPeriodNanos),
354*4d7e907cSAndroid Build Coastguard Worker             outVsyncPeriodNanos};
355*4d7e907cSAndroid Build Coastguard Worker }
356*4d7e907cSAndroid Build Coastguard Worker 
setAutoLowLatencyMode(int64_t display,bool isEnabled)357*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::setAutoLowLatencyMode(int64_t display, bool isEnabled) {
358*4d7e907cSAndroid Build Coastguard Worker     return mComposerClient->setAutoLowLatencyMode(display, isEnabled);
359*4d7e907cSAndroid Build Coastguard Worker }
360*4d7e907cSAndroid Build Coastguard Worker 
getSupportedContentTypes(int64_t display)361*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, std::vector<ContentType>> VtsComposerClient::getSupportedContentTypes(
362*4d7e907cSAndroid Build Coastguard Worker         int64_t display) {
363*4d7e907cSAndroid Build Coastguard Worker     std::vector<ContentType> outContentTypes;
364*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getSupportedContentTypes(display, &outContentTypes), outContentTypes};
365*4d7e907cSAndroid Build Coastguard Worker }
366*4d7e907cSAndroid Build Coastguard Worker 
367*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, std::optional<DisplayDecorationSupport>>
getDisplayDecorationSupport(int64_t display)368*4d7e907cSAndroid Build Coastguard Worker VtsComposerClient::getDisplayDecorationSupport(int64_t display) {
369*4d7e907cSAndroid Build Coastguard Worker     std::optional<DisplayDecorationSupport> outSupport;
370*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getDisplayDecorationSupport(display, &outSupport), outSupport};
371*4d7e907cSAndroid Build Coastguard Worker }
372*4d7e907cSAndroid Build Coastguard Worker 
getMaxVirtualDisplayCount()373*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, int32_t> VtsComposerClient::getMaxVirtualDisplayCount() {
374*4d7e907cSAndroid Build Coastguard Worker     int32_t outMaxVirtualDisplayCount;
375*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getMaxVirtualDisplayCount(&outMaxVirtualDisplayCount),
376*4d7e907cSAndroid Build Coastguard Worker             outMaxVirtualDisplayCount};
377*4d7e907cSAndroid Build Coastguard Worker }
378*4d7e907cSAndroid Build Coastguard Worker 
getDisplayName(int64_t display)379*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, std::string> VtsComposerClient::getDisplayName(int64_t display) {
380*4d7e907cSAndroid Build Coastguard Worker     std::string outDisplayName;
381*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getDisplayName(display, &outDisplayName), outDisplayName};
382*4d7e907cSAndroid Build Coastguard Worker }
383*4d7e907cSAndroid Build Coastguard Worker 
setClientTargetSlotCount(int64_t display,int32_t bufferSlotCount)384*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::setClientTargetSlotCount(int64_t display,
385*4d7e907cSAndroid Build Coastguard Worker                                                           int32_t bufferSlotCount) {
386*4d7e907cSAndroid Build Coastguard Worker     return mComposerClient->setClientTargetSlotCount(display, bufferSlotCount);
387*4d7e907cSAndroid Build Coastguard Worker }
388*4d7e907cSAndroid Build Coastguard Worker 
getCapabilities()389*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, std::vector<Capability>> VtsComposerClient::getCapabilities() {
390*4d7e907cSAndroid Build Coastguard Worker     std::vector<Capability> outCapabilities;
391*4d7e907cSAndroid Build Coastguard Worker     return {mComposer->getCapabilities(&outCapabilities), outCapabilities};
392*4d7e907cSAndroid Build Coastguard Worker }
393*4d7e907cSAndroid Build Coastguard Worker 
setBootDisplayConfig(int64_t display,int32_t config)394*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::setBootDisplayConfig(int64_t display, int32_t config) {
395*4d7e907cSAndroid Build Coastguard Worker     return mComposerClient->setBootDisplayConfig(display, config);
396*4d7e907cSAndroid Build Coastguard Worker }
397*4d7e907cSAndroid Build Coastguard Worker 
clearBootDisplayConfig(int64_t display)398*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::clearBootDisplayConfig(int64_t display) {
399*4d7e907cSAndroid Build Coastguard Worker     return mComposerClient->clearBootDisplayConfig(display);
400*4d7e907cSAndroid Build Coastguard Worker }
401*4d7e907cSAndroid Build Coastguard Worker 
getPreferredBootDisplayConfig(int64_t display)402*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, int32_t> VtsComposerClient::getPreferredBootDisplayConfig(
403*4d7e907cSAndroid Build Coastguard Worker         int64_t display) {
404*4d7e907cSAndroid Build Coastguard Worker     int32_t outConfig;
405*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getPreferredBootDisplayConfig(display, &outConfig), outConfig};
406*4d7e907cSAndroid Build Coastguard Worker }
407*4d7e907cSAndroid Build Coastguard Worker 
408*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, std::vector<common::HdrConversionCapability>>
getHdrConversionCapabilities()409*4d7e907cSAndroid Build Coastguard Worker VtsComposerClient::getHdrConversionCapabilities() {
410*4d7e907cSAndroid Build Coastguard Worker     std::vector<common::HdrConversionCapability> hdrConversionCapability;
411*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getHdrConversionCapabilities(&hdrConversionCapability),
412*4d7e907cSAndroid Build Coastguard Worker             hdrConversionCapability};
413*4d7e907cSAndroid Build Coastguard Worker }
414*4d7e907cSAndroid Build Coastguard Worker 
setHdrConversionStrategy(const common::HdrConversionStrategy & conversionStrategy)415*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, common::Hdr> VtsComposerClient::setHdrConversionStrategy(
416*4d7e907cSAndroid Build Coastguard Worker         const common::HdrConversionStrategy& conversionStrategy) {
417*4d7e907cSAndroid Build Coastguard Worker     common::Hdr preferredHdrOutputType;
418*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->setHdrConversionStrategy(conversionStrategy, &preferredHdrOutputType),
419*4d7e907cSAndroid Build Coastguard Worker             preferredHdrOutputType};
420*4d7e907cSAndroid Build Coastguard Worker }
421*4d7e907cSAndroid Build Coastguard Worker 
getDisplayPhysicalOrientation(int64_t display)422*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, common::Transform> VtsComposerClient::getDisplayPhysicalOrientation(
423*4d7e907cSAndroid Build Coastguard Worker         int64_t display) {
424*4d7e907cSAndroid Build Coastguard Worker     common::Transform outDisplayOrientation;
425*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getDisplayPhysicalOrientation(display, &outDisplayOrientation),
426*4d7e907cSAndroid Build Coastguard Worker             outDisplayOrientation};
427*4d7e907cSAndroid Build Coastguard Worker }
428*4d7e907cSAndroid Build Coastguard Worker 
getOverlaySupport()429*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, composer3::OverlayProperties> VtsComposerClient::getOverlaySupport() {
430*4d7e907cSAndroid Build Coastguard Worker     OverlayProperties properties;
431*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getOverlaySupport(&properties), properties};
432*4d7e907cSAndroid Build Coastguard Worker }
433*4d7e907cSAndroid Build Coastguard Worker 
setIdleTimerEnabled(int64_t display,int32_t timeoutMs)434*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::setIdleTimerEnabled(int64_t display, int32_t timeoutMs) {
435*4d7e907cSAndroid Build Coastguard Worker     return mComposerClient->setIdleTimerEnabled(display, timeoutMs);
436*4d7e907cSAndroid Build Coastguard Worker }
437*4d7e907cSAndroid Build Coastguard Worker 
getVsyncIdleCount()438*4d7e907cSAndroid Build Coastguard Worker int32_t VtsComposerClient::getVsyncIdleCount() {
439*4d7e907cSAndroid Build Coastguard Worker     return mComposerCallback->getVsyncIdleCount();
440*4d7e907cSAndroid Build Coastguard Worker }
441*4d7e907cSAndroid Build Coastguard Worker 
getVsyncIdleTime()442*4d7e907cSAndroid Build Coastguard Worker int64_t VtsComposerClient::getVsyncIdleTime() {
443*4d7e907cSAndroid Build Coastguard Worker     return mComposerCallback->getVsyncIdleTime();
444*4d7e907cSAndroid Build Coastguard Worker }
445*4d7e907cSAndroid Build Coastguard Worker 
setRefreshRateChangedCallbackDebugEnabled(int64_t display,bool enabled)446*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus VtsComposerClient::setRefreshRateChangedCallbackDebugEnabled(int64_t display,
447*4d7e907cSAndroid Build Coastguard Worker                                                                                 bool enabled) {
448*4d7e907cSAndroid Build Coastguard Worker     mComposerCallback->setRefreshRateChangedDebugDataEnabledCallbackAllowed(enabled);
449*4d7e907cSAndroid Build Coastguard Worker     return mComposerClient->setRefreshRateChangedCallbackDebugEnabled(display, enabled);
450*4d7e907cSAndroid Build Coastguard Worker }
451*4d7e907cSAndroid Build Coastguard Worker 
452*4d7e907cSAndroid Build Coastguard Worker std::vector<RefreshRateChangedDebugData>
takeListOfRefreshRateChangedDebugData()453*4d7e907cSAndroid Build Coastguard Worker VtsComposerClient::takeListOfRefreshRateChangedDebugData() {
454*4d7e907cSAndroid Build Coastguard Worker     return mComposerCallback->takeListOfRefreshRateChangedDebugData();
455*4d7e907cSAndroid Build Coastguard Worker }
456*4d7e907cSAndroid Build Coastguard Worker 
getInvalidDisplayId()457*4d7e907cSAndroid Build Coastguard Worker int64_t VtsComposerClient::getInvalidDisplayId() {
458*4d7e907cSAndroid Build Coastguard Worker     // returns an invalid display id (one that has not been registered to a
459*4d7e907cSAndroid Build Coastguard Worker     // display. Currently assuming that a device will never have close to
460*4d7e907cSAndroid Build Coastguard Worker     // std::numeric_limit<uint64_t>::max() displays registered while running tests
461*4d7e907cSAndroid Build Coastguard Worker     int64_t id = std::numeric_limits<int64_t>::max();
462*4d7e907cSAndroid Build Coastguard Worker     std::vector<int64_t> displays = mComposerCallback->getDisplays();
463*4d7e907cSAndroid Build Coastguard Worker     while (id > 0) {
464*4d7e907cSAndroid Build Coastguard Worker         if (std::none_of(displays.begin(), displays.end(),
465*4d7e907cSAndroid Build Coastguard Worker                          [id](const auto& display) { return id == display; })) {
466*4d7e907cSAndroid Build Coastguard Worker             return id;
467*4d7e907cSAndroid Build Coastguard Worker         }
468*4d7e907cSAndroid Build Coastguard Worker         id--;
469*4d7e907cSAndroid Build Coastguard Worker     }
470*4d7e907cSAndroid Build Coastguard Worker 
471*4d7e907cSAndroid Build Coastguard Worker     // Although 0 could be an invalid display, a return value of 0
472*4d7e907cSAndroid Build Coastguard Worker     // from getInvalidDisplayId means all other ids are in use, a condition which
473*4d7e907cSAndroid Build Coastguard Worker     // we are assuming a device will never have
474*4d7e907cSAndroid Build Coastguard Worker     EXPECT_NE(0, id);
475*4d7e907cSAndroid Build Coastguard Worker     return id;
476*4d7e907cSAndroid Build Coastguard Worker }
477*4d7e907cSAndroid Build Coastguard Worker 
getDisplays()478*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, std::vector<VtsDisplay>> VtsComposerClient::getDisplays() {
479*4d7e907cSAndroid Build Coastguard Worker     while (true) {
480*4d7e907cSAndroid Build Coastguard Worker         // Sleep for a small period of time to allow all built-in displays
481*4d7e907cSAndroid Build Coastguard Worker         // to post hotplug events
482*4d7e907cSAndroid Build Coastguard Worker         std::this_thread::sleep_for(5ms);
483*4d7e907cSAndroid Build Coastguard Worker         std::vector<int64_t> displays = mComposerCallback->getDisplays();
484*4d7e907cSAndroid Build Coastguard Worker         if (displays.empty()) {
485*4d7e907cSAndroid Build Coastguard Worker             continue;
486*4d7e907cSAndroid Build Coastguard Worker         }
487*4d7e907cSAndroid Build Coastguard Worker 
488*4d7e907cSAndroid Build Coastguard Worker         std::vector<VtsDisplay> vtsDisplays;
489*4d7e907cSAndroid Build Coastguard Worker         vtsDisplays.reserve(displays.size());
490*4d7e907cSAndroid Build Coastguard Worker         for (int64_t display : displays) {
491*4d7e907cSAndroid Build Coastguard Worker             auto vtsDisplay = VtsDisplay{display};
492*4d7e907cSAndroid Build Coastguard Worker             if (getDisplayConfigurationSupported()) {
493*4d7e907cSAndroid Build Coastguard Worker                 auto [status, configs] = getDisplayConfigurations(display);
494*4d7e907cSAndroid Build Coastguard Worker                 if (!status.isOk()) {
495*4d7e907cSAndroid Build Coastguard Worker                     ALOGE("Unable to get the displays for test, failed to get the DisplayConfigs "
496*4d7e907cSAndroid Build Coastguard Worker                           "for display %" PRId64,
497*4d7e907cSAndroid Build Coastguard Worker                           display);
498*4d7e907cSAndroid Build Coastguard Worker                     return {std::move(status), vtsDisplays};
499*4d7e907cSAndroid Build Coastguard Worker                 }
500*4d7e907cSAndroid Build Coastguard Worker                 addDisplayConfigs(&vtsDisplay, configs);
501*4d7e907cSAndroid Build Coastguard Worker             } else {
502*4d7e907cSAndroid Build Coastguard Worker                 auto [status, configs] = getDisplayConfigs(display);
503*4d7e907cSAndroid Build Coastguard Worker                 if (!status.isOk()) {
504*4d7e907cSAndroid Build Coastguard Worker                     ALOGE("Unable to get the displays for test, failed to get the configs "
505*4d7e907cSAndroid Build Coastguard Worker                           "for display %" PRId64,
506*4d7e907cSAndroid Build Coastguard Worker                           display);
507*4d7e907cSAndroid Build Coastguard Worker                     return {std::move(status), vtsDisplays};
508*4d7e907cSAndroid Build Coastguard Worker                 }
509*4d7e907cSAndroid Build Coastguard Worker                 for (int config : configs) {
510*4d7e907cSAndroid Build Coastguard Worker                     status = addDisplayConfigLegacy(&vtsDisplay, config);
511*4d7e907cSAndroid Build Coastguard Worker                     if (!status.isOk()) {
512*4d7e907cSAndroid Build Coastguard Worker                         ALOGE("Unable to get the displays for test, failed to add config "
513*4d7e907cSAndroid Build Coastguard Worker                               "for display %" PRId64,
514*4d7e907cSAndroid Build Coastguard Worker                               display);
515*4d7e907cSAndroid Build Coastguard Worker                         return {std::move(status), vtsDisplays};
516*4d7e907cSAndroid Build Coastguard Worker                     }
517*4d7e907cSAndroid Build Coastguard Worker                 }
518*4d7e907cSAndroid Build Coastguard Worker             }
519*4d7e907cSAndroid Build Coastguard Worker             auto activeConfig = getActiveConfig(display);
520*4d7e907cSAndroid Build Coastguard Worker             if (!activeConfig.first.isOk()) {
521*4d7e907cSAndroid Build Coastguard Worker                 ALOGE("Unable to get the displays for test, failed to get active config "
522*4d7e907cSAndroid Build Coastguard Worker                       "for display %" PRId64,
523*4d7e907cSAndroid Build Coastguard Worker                       display);
524*4d7e907cSAndroid Build Coastguard Worker                 return {std::move(activeConfig.first), vtsDisplays};
525*4d7e907cSAndroid Build Coastguard Worker             }
526*4d7e907cSAndroid Build Coastguard Worker             auto status = updateDisplayProperties(&vtsDisplay, activeConfig.second);
527*4d7e907cSAndroid Build Coastguard Worker             if (!status.isOk()) {
528*4d7e907cSAndroid Build Coastguard Worker                 ALOGE("Unable to get the displays for test, "
529*4d7e907cSAndroid Build Coastguard Worker                       "failed to update the properties "
530*4d7e907cSAndroid Build Coastguard Worker                       "for display %" PRId64,
531*4d7e907cSAndroid Build Coastguard Worker                       display);
532*4d7e907cSAndroid Build Coastguard Worker                 return {std::move(status), vtsDisplays};
533*4d7e907cSAndroid Build Coastguard Worker             }
534*4d7e907cSAndroid Build Coastguard Worker 
535*4d7e907cSAndroid Build Coastguard Worker             vtsDisplays.emplace_back(vtsDisplay);
536*4d7e907cSAndroid Build Coastguard Worker             addDisplayToDisplayResources(display, /*isVirtual*/ false);
537*4d7e907cSAndroid Build Coastguard Worker         }
538*4d7e907cSAndroid Build Coastguard Worker 
539*4d7e907cSAndroid Build Coastguard Worker         return {ScopedAStatus::ok(), vtsDisplays};
540*4d7e907cSAndroid Build Coastguard Worker     }
541*4d7e907cSAndroid Build Coastguard Worker }
542*4d7e907cSAndroid Build Coastguard Worker 
addDisplayConfigs(VtsDisplay * vtsDisplay,const std::vector<DisplayConfiguration> & configs)543*4d7e907cSAndroid Build Coastguard Worker void VtsComposerClient::addDisplayConfigs(VtsDisplay* vtsDisplay,
544*4d7e907cSAndroid Build Coastguard Worker                                           const std::vector<DisplayConfiguration>& configs) {
545*4d7e907cSAndroid Build Coastguard Worker     for (const auto& config : configs) {
546*4d7e907cSAndroid Build Coastguard Worker         vtsDisplay->addDisplayConfig(config.configId,
547*4d7e907cSAndroid Build Coastguard Worker                                      {config.vsyncPeriod, config.configGroup, config.vrrConfig});
548*4d7e907cSAndroid Build Coastguard Worker     }
549*4d7e907cSAndroid Build Coastguard Worker }
550*4d7e907cSAndroid Build Coastguard Worker 
addDisplayConfigLegacy(VtsDisplay * vtsDisplay,int32_t config)551*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::addDisplayConfigLegacy(VtsDisplay* vtsDisplay, int32_t config) {
552*4d7e907cSAndroid Build Coastguard Worker     const auto vsyncPeriod =
553*4d7e907cSAndroid Build Coastguard Worker             getDisplayAttribute(vtsDisplay->getDisplayId(), config, DisplayAttribute::VSYNC_PERIOD);
554*4d7e907cSAndroid Build Coastguard Worker     const auto configGroup =
555*4d7e907cSAndroid Build Coastguard Worker             getDisplayAttribute(vtsDisplay->getDisplayId(), config, DisplayAttribute::CONFIG_GROUP);
556*4d7e907cSAndroid Build Coastguard Worker     if (vsyncPeriod.first.isOk() && configGroup.first.isOk()) {
557*4d7e907cSAndroid Build Coastguard Worker         vtsDisplay->addDisplayConfig(config, {vsyncPeriod.second, configGroup.second});
558*4d7e907cSAndroid Build Coastguard Worker         return ScopedAStatus::ok();
559*4d7e907cSAndroid Build Coastguard Worker     }
560*4d7e907cSAndroid Build Coastguard Worker 
561*4d7e907cSAndroid Build Coastguard Worker     LOG(ERROR) << "Failed to update display property vsync: " << vsyncPeriod.first.isOk()
562*4d7e907cSAndroid Build Coastguard Worker                << ", config: " << configGroup.first.isOk();
563*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::fromServiceSpecificError(IComposerClient::EX_BAD_CONFIG);
564*4d7e907cSAndroid Build Coastguard Worker }
565*4d7e907cSAndroid Build Coastguard Worker 
updateDisplayProperties(VtsDisplay * vtsDisplay,int32_t config)566*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::updateDisplayProperties(VtsDisplay* vtsDisplay, int32_t config) {
567*4d7e907cSAndroid Build Coastguard Worker     if (getDisplayConfigurationSupported()) {
568*4d7e907cSAndroid Build Coastguard Worker         auto [status, configs] = getDisplayConfigurations(vtsDisplay->getDisplayId());
569*4d7e907cSAndroid Build Coastguard Worker         if (status.isOk()) {
570*4d7e907cSAndroid Build Coastguard Worker             for (const auto& displayConfig : configs) {
571*4d7e907cSAndroid Build Coastguard Worker                 if (displayConfig.configId == config) {
572*4d7e907cSAndroid Build Coastguard Worker                     vtsDisplay->setDimensions(displayConfig.width, displayConfig.height);
573*4d7e907cSAndroid Build Coastguard Worker                     return ScopedAStatus::ok();
574*4d7e907cSAndroid Build Coastguard Worker                 }
575*4d7e907cSAndroid Build Coastguard Worker             }
576*4d7e907cSAndroid Build Coastguard Worker         }
577*4d7e907cSAndroid Build Coastguard Worker         LOG(ERROR) << "Failed to update display property with DisplayConfig";
578*4d7e907cSAndroid Build Coastguard Worker     } else {
579*4d7e907cSAndroid Build Coastguard Worker         const auto width =
580*4d7e907cSAndroid Build Coastguard Worker                 getDisplayAttribute(vtsDisplay->getDisplayId(), config, DisplayAttribute::WIDTH);
581*4d7e907cSAndroid Build Coastguard Worker         const auto height =
582*4d7e907cSAndroid Build Coastguard Worker                 getDisplayAttribute(vtsDisplay->getDisplayId(), config, DisplayAttribute::HEIGHT);
583*4d7e907cSAndroid Build Coastguard Worker         if (width.first.isOk() && height.first.isOk()) {
584*4d7e907cSAndroid Build Coastguard Worker             vtsDisplay->setDimensions(width.second, height.second);
585*4d7e907cSAndroid Build Coastguard Worker             return ScopedAStatus::ok();
586*4d7e907cSAndroid Build Coastguard Worker         }
587*4d7e907cSAndroid Build Coastguard Worker 
588*4d7e907cSAndroid Build Coastguard Worker         LOG(ERROR) << "Failed to update display property for width: " << width.first.isOk()
589*4d7e907cSAndroid Build Coastguard Worker                    << ", height: " << height.first.isOk();
590*4d7e907cSAndroid Build Coastguard Worker     }
591*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::fromServiceSpecificError(IComposerClient::EX_BAD_CONFIG);
592*4d7e907cSAndroid Build Coastguard Worker }
593*4d7e907cSAndroid Build Coastguard Worker 
addDisplayToDisplayResources(int64_t display,bool isVirtual)594*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::addDisplayToDisplayResources(int64_t display, bool isVirtual) {
595*4d7e907cSAndroid Build Coastguard Worker     if (mDisplayResources.insert({display, DisplayResource(isVirtual)}).second) {
596*4d7e907cSAndroid Build Coastguard Worker         return ScopedAStatus::ok();
597*4d7e907cSAndroid Build Coastguard Worker     }
598*4d7e907cSAndroid Build Coastguard Worker 
599*4d7e907cSAndroid Build Coastguard Worker     ALOGE("Duplicate display id %" PRId64, display);
600*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::fromServiceSpecificError(IComposerClient::EX_BAD_DISPLAY);
601*4d7e907cSAndroid Build Coastguard Worker }
602*4d7e907cSAndroid Build Coastguard Worker 
addLayerToDisplayResources(int64_t display,int64_t layer)603*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus VtsComposerClient::addLayerToDisplayResources(int64_t display, int64_t layer) {
604*4d7e907cSAndroid Build Coastguard Worker     auto resource = mDisplayResources.find(display);
605*4d7e907cSAndroid Build Coastguard Worker     if (resource == mDisplayResources.end()) {
606*4d7e907cSAndroid Build Coastguard Worker         resource = mDisplayResources.insert({display, DisplayResource(false)}).first;
607*4d7e907cSAndroid Build Coastguard Worker     }
608*4d7e907cSAndroid Build Coastguard Worker 
609*4d7e907cSAndroid Build Coastguard Worker     if (!resource->second.layers.insert(layer).second) {
610*4d7e907cSAndroid Build Coastguard Worker         ALOGE("Duplicate layer id %" PRId64, layer);
611*4d7e907cSAndroid Build Coastguard Worker         return ScopedAStatus::fromServiceSpecificError(IComposerClient::EX_BAD_LAYER);
612*4d7e907cSAndroid Build Coastguard Worker     }
613*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::ok();
614*4d7e907cSAndroid Build Coastguard Worker }
615*4d7e907cSAndroid Build Coastguard Worker 
removeLayerFromDisplayResources(int64_t display,int64_t layer)616*4d7e907cSAndroid Build Coastguard Worker void VtsComposerClient::removeLayerFromDisplayResources(int64_t display, int64_t layer) {
617*4d7e907cSAndroid Build Coastguard Worker     auto resource = mDisplayResources.find(display);
618*4d7e907cSAndroid Build Coastguard Worker     if (resource != mDisplayResources.end()) {
619*4d7e907cSAndroid Build Coastguard Worker         resource->second.layers.erase(layer);
620*4d7e907cSAndroid Build Coastguard Worker     }
621*4d7e907cSAndroid Build Coastguard Worker }
622*4d7e907cSAndroid Build Coastguard Worker 
verifyComposerCallbackParams()623*4d7e907cSAndroid Build Coastguard Worker bool VtsComposerClient::verifyComposerCallbackParams() {
624*4d7e907cSAndroid Build Coastguard Worker     bool isValid = true;
625*4d7e907cSAndroid Build Coastguard Worker     if (mComposerCallback != nullptr) {
626*4d7e907cSAndroid Build Coastguard Worker         if (mComposerCallback->getInvalidHotplugCount() != 0) {
627*4d7e907cSAndroid Build Coastguard Worker             ALOGE("Invalid hotplug count");
628*4d7e907cSAndroid Build Coastguard Worker             isValid = false;
629*4d7e907cSAndroid Build Coastguard Worker         }
630*4d7e907cSAndroid Build Coastguard Worker         if (mComposerCallback->getInvalidRefreshCount() != 0) {
631*4d7e907cSAndroid Build Coastguard Worker             ALOGE("Invalid refresh count");
632*4d7e907cSAndroid Build Coastguard Worker             isValid = false;
633*4d7e907cSAndroid Build Coastguard Worker         }
634*4d7e907cSAndroid Build Coastguard Worker         if (mComposerCallback->getInvalidVsyncCount() != 0) {
635*4d7e907cSAndroid Build Coastguard Worker             ALOGE("Invalid vsync count");
636*4d7e907cSAndroid Build Coastguard Worker             isValid = false;
637*4d7e907cSAndroid Build Coastguard Worker         }
638*4d7e907cSAndroid Build Coastguard Worker         if (mComposerCallback->getInvalidVsyncPeriodChangeCount() != 0) {
639*4d7e907cSAndroid Build Coastguard Worker             ALOGE("Invalid vsync period change count");
640*4d7e907cSAndroid Build Coastguard Worker             isValid = false;
641*4d7e907cSAndroid Build Coastguard Worker         }
642*4d7e907cSAndroid Build Coastguard Worker         if (mComposerCallback->getInvalidSeamlessPossibleCount() != 0) {
643*4d7e907cSAndroid Build Coastguard Worker             ALOGE("Invalid seamless possible count");
644*4d7e907cSAndroid Build Coastguard Worker             isValid = false;
645*4d7e907cSAndroid Build Coastguard Worker         }
646*4d7e907cSAndroid Build Coastguard Worker         if (mComposerCallback->getInvalidRefreshRateDebugEnabledCallbackCount() != 0) {
647*4d7e907cSAndroid Build Coastguard Worker             ALOGE("Invalid refresh rate debug enabled callback count");
648*4d7e907cSAndroid Build Coastguard Worker             isValid = false;
649*4d7e907cSAndroid Build Coastguard Worker         }
650*4d7e907cSAndroid Build Coastguard Worker     }
651*4d7e907cSAndroid Build Coastguard Worker     return isValid;
652*4d7e907cSAndroid Build Coastguard Worker }
653*4d7e907cSAndroid Build Coastguard Worker 
getDisplayConfigurationSupported() const654*4d7e907cSAndroid Build Coastguard Worker bool VtsComposerClient::getDisplayConfigurationSupported() const {
655*4d7e907cSAndroid Build Coastguard Worker     auto [status, interfaceVersion] = getInterfaceVersion();
656*4d7e907cSAndroid Build Coastguard Worker     EXPECT_TRUE(status.isOk());
657*4d7e907cSAndroid Build Coastguard Worker     // getDisplayConfigurations api is supported starting interface version 3
658*4d7e907cSAndroid Build Coastguard Worker     return interfaceVersion >= 3;
659*4d7e907cSAndroid Build Coastguard Worker }
660*4d7e907cSAndroid Build Coastguard Worker 
destroyAllLayers(ComposerClientWriter * writer)661*4d7e907cSAndroid Build Coastguard Worker bool VtsComposerClient::destroyAllLayers(ComposerClientWriter* writer) {
662*4d7e907cSAndroid Build Coastguard Worker     std::unordered_map<int64_t, DisplayResource> physicalDisplays;
663*4d7e907cSAndroid Build Coastguard Worker     while (!mDisplayResources.empty()) {
664*4d7e907cSAndroid Build Coastguard Worker         const auto& it = mDisplayResources.begin();
665*4d7e907cSAndroid Build Coastguard Worker         const auto& [display, resource] = *it;
666*4d7e907cSAndroid Build Coastguard Worker 
667*4d7e907cSAndroid Build Coastguard Worker         while (!resource.layers.empty()) {
668*4d7e907cSAndroid Build Coastguard Worker             auto layer = *resource.layers.begin();
669*4d7e907cSAndroid Build Coastguard Worker             const auto status = destroyLayer(display, layer, writer);
670*4d7e907cSAndroid Build Coastguard Worker             if (!status.isOk()) {
671*4d7e907cSAndroid Build Coastguard Worker                 ALOGE("Unable to destroy all the layers, failed at layer %" PRId64 " with error %s",
672*4d7e907cSAndroid Build Coastguard Worker                       layer, status.getDescription().c_str());
673*4d7e907cSAndroid Build Coastguard Worker                 return false;
674*4d7e907cSAndroid Build Coastguard Worker             }
675*4d7e907cSAndroid Build Coastguard Worker         }
676*4d7e907cSAndroid Build Coastguard Worker 
677*4d7e907cSAndroid Build Coastguard Worker         if (resource.isVirtual) {
678*4d7e907cSAndroid Build Coastguard Worker             const auto status = destroyVirtualDisplay(display);
679*4d7e907cSAndroid Build Coastguard Worker             if (!status.isOk()) {
680*4d7e907cSAndroid Build Coastguard Worker                 ALOGE("Unable to destroy the display %" PRId64 " failed with error %s", display,
681*4d7e907cSAndroid Build Coastguard Worker                       status.getDescription().c_str());
682*4d7e907cSAndroid Build Coastguard Worker                 return false;
683*4d7e907cSAndroid Build Coastguard Worker             }
684*4d7e907cSAndroid Build Coastguard Worker         } else {
685*4d7e907cSAndroid Build Coastguard Worker             auto extractIter = mDisplayResources.extract(it);
686*4d7e907cSAndroid Build Coastguard Worker             physicalDisplays.insert(std::move(extractIter));
687*4d7e907cSAndroid Build Coastguard Worker         }
688*4d7e907cSAndroid Build Coastguard Worker     }
689*4d7e907cSAndroid Build Coastguard Worker     mDisplayResources.swap(physicalDisplays);
690*4d7e907cSAndroid Build Coastguard Worker     mDisplayResources.clear();
691*4d7e907cSAndroid Build Coastguard Worker     return true;
692*4d7e907cSAndroid Build Coastguard Worker }
693*4d7e907cSAndroid Build Coastguard Worker 
getMaxLayerPictureProfiles(int64_t display)694*4d7e907cSAndroid Build Coastguard Worker std::pair<ScopedAStatus, int32_t> VtsComposerClient::getMaxLayerPictureProfiles(int64_t display) {
695*4d7e907cSAndroid Build Coastguard Worker     int32_t outMaxProfiles = 0;
696*4d7e907cSAndroid Build Coastguard Worker     return {mComposerClient->getMaxLayerPictureProfiles(display, &outMaxProfiles), outMaxProfiles};
697*4d7e907cSAndroid Build Coastguard Worker }
698*4d7e907cSAndroid Build Coastguard Worker 
699*4d7e907cSAndroid Build Coastguard Worker }  // namespace aidl::android::hardware::graphics::composer3::vts
700