xref: /aosp_15_r20/hardware/interfaces/graphics/composer/aidl/vts/VtsComposerClient.h (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 #pragma once
17*4d7e907cSAndroid Build Coastguard Worker 
18*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/graphics/common/BlendMode.h>
19*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/graphics/common/BufferUsage.h>
20*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/graphics/common/FRect.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/graphics/common/Rect.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/graphics/composer3/Composition.h>
23*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/graphics/composer3/IComposer.h>
24*4d7e907cSAndroid Build Coastguard Worker #include <android-base/properties.h>
25*4d7e907cSAndroid Build Coastguard Worker #include <android/binder_manager.h>
26*4d7e907cSAndroid Build Coastguard Worker #include <android/binder_process.h>
27*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/graphics/composer3/ComposerClientReader.h>
28*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/graphics/composer3/ComposerClientWriter.h>
29*4d7e907cSAndroid Build Coastguard Worker #include <binder/ProcessState.h>
30*4d7e907cSAndroid Build Coastguard Worker #include <gtest/gtest.h>
31*4d7e907cSAndroid Build Coastguard Worker #include <ui/Fence.h>
32*4d7e907cSAndroid Build Coastguard Worker #include <ui/GraphicBuffer.h>
33*4d7e907cSAndroid Build Coastguard Worker #include <ui/PixelFormat.h>
34*4d7e907cSAndroid Build Coastguard Worker #include <algorithm>
35*4d7e907cSAndroid Build Coastguard Worker #include <numeric>
36*4d7e907cSAndroid Build Coastguard Worker #include <string>
37*4d7e907cSAndroid Build Coastguard Worker #include <thread>
38*4d7e907cSAndroid Build Coastguard Worker #include <unordered_map>
39*4d7e907cSAndroid Build Coastguard Worker #include <unordered_set>
40*4d7e907cSAndroid Build Coastguard Worker #include "GraphicsComposerCallback.h"
41*4d7e907cSAndroid Build Coastguard Worker 
42*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::graphics::common::Dataspace;
43*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::graphics::common::DisplayDecorationSupport;
44*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::graphics::common::FRect;
45*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::graphics::common::PixelFormat;
46*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::graphics::common::Rect;
47*4d7e907cSAndroid Build Coastguard Worker using namespace ::ndk;
48*4d7e907cSAndroid Build Coastguard Worker 
49*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::graphics::composer3::vts {
50*4d7e907cSAndroid Build Coastguard Worker 
51*4d7e907cSAndroid Build Coastguard Worker class VtsDisplay;
52*4d7e907cSAndroid Build Coastguard Worker /**
53*4d7e907cSAndroid Build Coastguard Worker  * A wrapper to IComposerClient.
54*4d7e907cSAndroid Build Coastguard Worker  * This wrapper manages the IComposerClient instance and manages the resources for
55*4d7e907cSAndroid Build Coastguard Worker  * the tests with respect to the IComposerClient calls.
56*4d7e907cSAndroid Build Coastguard Worker  */
57*4d7e907cSAndroid Build Coastguard Worker class VtsComposerClient {
58*4d7e907cSAndroid Build Coastguard Worker   public:
59*4d7e907cSAndroid Build Coastguard Worker     VtsComposerClient(const std::string& name);
60*4d7e907cSAndroid Build Coastguard Worker 
61*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus createClient();
62*4d7e907cSAndroid Build Coastguard Worker 
63*4d7e907cSAndroid Build Coastguard Worker     bool tearDown(ComposerClientWriter*);
64*4d7e907cSAndroid Build Coastguard Worker 
65*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, int32_t> getInterfaceVersion() const;
66*4d7e907cSAndroid Build Coastguard Worker 
67*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, VirtualDisplay> createVirtualDisplay(int32_t width, int32_t height,
68*4d7e907cSAndroid Build Coastguard Worker                                                                   PixelFormat pixelFormat,
69*4d7e907cSAndroid Build Coastguard Worker                                                                   int32_t bufferSlotCount);
70*4d7e907cSAndroid Build Coastguard Worker 
71*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus destroyVirtualDisplay(int64_t display);
72*4d7e907cSAndroid Build Coastguard Worker 
73*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, int64_t> createLayer(int64_t display, int32_t bufferSlotCount,
74*4d7e907cSAndroid Build Coastguard Worker                                                   ComposerClientWriter*);
75*4d7e907cSAndroid Build Coastguard Worker 
76*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus destroyLayer(int64_t display, int64_t layer, ComposerClientWriter*);
77*4d7e907cSAndroid Build Coastguard Worker 
78*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, int32_t> getActiveConfig(int64_t display);
79*4d7e907cSAndroid Build Coastguard Worker 
80*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus setActiveConfig(VtsDisplay* vtsDisplay, int32_t config);
81*4d7e907cSAndroid Build Coastguard Worker 
82*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus setPeakRefreshRateConfig(VtsDisplay* vtsDisplay);
83*4d7e907cSAndroid Build Coastguard Worker 
84*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, int32_t> getDisplayAttribute(int64_t display, int32_t config,
85*4d7e907cSAndroid Build Coastguard Worker                                                           DisplayAttribute displayAttribute);
86*4d7e907cSAndroid Build Coastguard Worker 
87*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus setPowerMode(int64_t display, PowerMode powerMode);
88*4d7e907cSAndroid Build Coastguard Worker 
89*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus setVsync(int64_t display, bool enable);
90*4d7e907cSAndroid Build Coastguard Worker 
91*4d7e907cSAndroid Build Coastguard Worker     void setVsyncAllowed(bool isAllowed);
92*4d7e907cSAndroid Build Coastguard Worker 
93*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, std::vector<float>> getDataspaceSaturationMatrix(Dataspace dataspace);
94*4d7e907cSAndroid Build Coastguard Worker 
95*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, std::vector<CommandResultPayload>> executeCommands(
96*4d7e907cSAndroid Build Coastguard Worker             const std::vector<DisplayCommand>& commands);
97*4d7e907cSAndroid Build Coastguard Worker 
98*4d7e907cSAndroid Build Coastguard Worker     std::optional<VsyncPeriodChangeTimeline> takeLastVsyncPeriodChangeTimeline();
99*4d7e907cSAndroid Build Coastguard Worker 
100*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus setContentType(int64_t display, ContentType contentType);
101*4d7e907cSAndroid Build Coastguard Worker 
102*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, VsyncPeriodChangeTimeline> setActiveConfigWithConstraints(
103*4d7e907cSAndroid Build Coastguard Worker             VtsDisplay* vtsDisplay, int32_t config,
104*4d7e907cSAndroid Build Coastguard Worker             const VsyncPeriodChangeConstraints& constraints);
105*4d7e907cSAndroid Build Coastguard Worker 
106*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, std::vector<DisplayCapability>> getDisplayCapabilities(
107*4d7e907cSAndroid Build Coastguard Worker             int64_t display);
108*4d7e907cSAndroid Build Coastguard Worker 
109*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus dumpDebugInfo();
110*4d7e907cSAndroid Build Coastguard Worker 
111*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, DisplayIdentification> getDisplayIdentificationData(int64_t display);
112*4d7e907cSAndroid Build Coastguard Worker 
113*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, HdrCapabilities> getHdrCapabilities(int64_t display);
114*4d7e907cSAndroid Build Coastguard Worker 
115*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, std::vector<PerFrameMetadataKey>> getPerFrameMetadataKeys(
116*4d7e907cSAndroid Build Coastguard Worker             int64_t display);
117*4d7e907cSAndroid Build Coastguard Worker 
118*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, ReadbackBufferAttributes> getReadbackBufferAttributes(int64_t display);
119*4d7e907cSAndroid Build Coastguard Worker 
120*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus setReadbackBuffer(int64_t display, const native_handle_t* buffer,
121*4d7e907cSAndroid Build Coastguard Worker                                     const ScopedFileDescriptor& releaseFence);
122*4d7e907cSAndroid Build Coastguard Worker 
123*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, ScopedFileDescriptor> getReadbackBufferFence(int64_t display);
124*4d7e907cSAndroid Build Coastguard Worker 
125*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, std::vector<ColorMode>> getColorModes(int64_t display);
126*4d7e907cSAndroid Build Coastguard Worker 
127*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, std::vector<RenderIntent>> getRenderIntents(int64_t display,
128*4d7e907cSAndroid Build Coastguard Worker                                                                          ColorMode colorMode);
129*4d7e907cSAndroid Build Coastguard Worker 
130*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus setColorMode(int64_t display, ColorMode colorMode, RenderIntent renderIntent);
131*4d7e907cSAndroid Build Coastguard Worker 
132*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, DisplayContentSamplingAttributes>
133*4d7e907cSAndroid Build Coastguard Worker     getDisplayedContentSamplingAttributes(int64_t display);
134*4d7e907cSAndroid Build Coastguard Worker 
135*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus setDisplayedContentSamplingEnabled(int64_t display, bool isEnabled,
136*4d7e907cSAndroid Build Coastguard Worker                                                      FormatColorComponent formatColorComponent,
137*4d7e907cSAndroid Build Coastguard Worker                                                      int64_t maxFrames);
138*4d7e907cSAndroid Build Coastguard Worker 
139*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, DisplayContentSample> getDisplayedContentSample(int64_t display,
140*4d7e907cSAndroid Build Coastguard Worker                                                                              int64_t maxFrames,
141*4d7e907cSAndroid Build Coastguard Worker                                                                              int64_t timestamp);
142*4d7e907cSAndroid Build Coastguard Worker 
143*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, DisplayConnectionType> getDisplayConnectionType(int64_t display);
144*4d7e907cSAndroid Build Coastguard Worker 
145*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, std::vector<int32_t>> getDisplayConfigs(int64_t display);
146*4d7e907cSAndroid Build Coastguard Worker 
147*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, std::vector<DisplayConfiguration>> getDisplayConfigurations(
148*4d7e907cSAndroid Build Coastguard Worker             int64_t display);
149*4d7e907cSAndroid Build Coastguard Worker 
150*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus notifyExpectedPresent(int64_t display,
151*4d7e907cSAndroid Build Coastguard Worker                                         ClockMonotonicTimestamp expectedPresentTime,
152*4d7e907cSAndroid Build Coastguard Worker                                         int frameIntervalNs);
153*4d7e907cSAndroid Build Coastguard Worker 
154*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, int32_t> getDisplayVsyncPeriod(int64_t display);
155*4d7e907cSAndroid Build Coastguard Worker 
156*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus setAutoLowLatencyMode(int64_t display, bool isEnabled);
157*4d7e907cSAndroid Build Coastguard Worker 
158*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, std::vector<ContentType>> getSupportedContentTypes(int64_t display);
159*4d7e907cSAndroid Build Coastguard Worker 
160*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, std::optional<DisplayDecorationSupport>> getDisplayDecorationSupport(
161*4d7e907cSAndroid Build Coastguard Worker             int64_t display);
162*4d7e907cSAndroid Build Coastguard Worker 
163*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, int32_t> getMaxVirtualDisplayCount();
164*4d7e907cSAndroid Build Coastguard Worker 
165*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, std::string> getDisplayName(int64_t display);
166*4d7e907cSAndroid Build Coastguard Worker 
167*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus setClientTargetSlotCount(int64_t display, int32_t bufferSlotCount);
168*4d7e907cSAndroid Build Coastguard Worker 
169*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, std::vector<Capability>> getCapabilities();
170*4d7e907cSAndroid Build Coastguard Worker 
171*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus setBootDisplayConfig(int64_t display, int32_t config);
172*4d7e907cSAndroid Build Coastguard Worker 
173*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus clearBootDisplayConfig(int64_t display);
174*4d7e907cSAndroid Build Coastguard Worker 
175*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, int32_t> getPreferredBootDisplayConfig(int64_t display);
176*4d7e907cSAndroid Build Coastguard Worker 
177*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, std::vector<common::HdrConversionCapability>>
178*4d7e907cSAndroid Build Coastguard Worker     getHdrConversionCapabilities();
179*4d7e907cSAndroid Build Coastguard Worker 
180*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, common::Hdr> setHdrConversionStrategy(
181*4d7e907cSAndroid Build Coastguard Worker             const common::HdrConversionStrategy& conversionStrategy);
182*4d7e907cSAndroid Build Coastguard Worker 
183*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, common::Transform> getDisplayPhysicalOrientation(int64_t display);
184*4d7e907cSAndroid Build Coastguard Worker 
185*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus setIdleTimerEnabled(int64_t display, int32_t timeoutMs);
186*4d7e907cSAndroid Build Coastguard Worker 
187*4d7e907cSAndroid Build Coastguard Worker     int32_t getVsyncIdleCount();
188*4d7e907cSAndroid Build Coastguard Worker 
189*4d7e907cSAndroid Build Coastguard Worker     int64_t getVsyncIdleTime();
190*4d7e907cSAndroid Build Coastguard Worker 
191*4d7e907cSAndroid Build Coastguard Worker     int64_t getInvalidDisplayId();
192*4d7e907cSAndroid Build Coastguard Worker 
193*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, std::vector<VtsDisplay>> getDisplays();
194*4d7e907cSAndroid Build Coastguard Worker 
195*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, OverlayProperties> getOverlaySupport();
196*4d7e907cSAndroid Build Coastguard Worker 
197*4d7e907cSAndroid Build Coastguard Worker     ndk::ScopedAStatus setRefreshRateChangedCallbackDebugEnabled(int64_t display, bool enabled);
198*4d7e907cSAndroid Build Coastguard Worker 
199*4d7e907cSAndroid Build Coastguard Worker     std::vector<RefreshRateChangedDebugData> takeListOfRefreshRateChangedDebugData();
200*4d7e907cSAndroid Build Coastguard Worker 
201*4d7e907cSAndroid Build Coastguard Worker     std::pair<ScopedAStatus, int32_t> getMaxLayerPictureProfiles(int64_t display);
202*4d7e907cSAndroid Build Coastguard Worker 
203*4d7e907cSAndroid Build Coastguard Worker     static constexpr int32_t kMaxFrameIntervalNs = 50000000;  // 20fps
204*4d7e907cSAndroid Build Coastguard Worker     static constexpr int32_t kNoFrameIntervalNs = 0;
205*4d7e907cSAndroid Build Coastguard Worker 
206*4d7e907cSAndroid Build Coastguard Worker   private:
207*4d7e907cSAndroid Build Coastguard Worker     void addDisplayConfigs(VtsDisplay*, const std::vector<DisplayConfiguration>&);
208*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus addDisplayConfigLegacy(VtsDisplay*, int32_t config);
209*4d7e907cSAndroid Build Coastguard Worker     bool getDisplayConfigurationSupported() const;
210*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus updateDisplayProperties(VtsDisplay* vtsDisplay, int32_t config);
211*4d7e907cSAndroid Build Coastguard Worker 
212*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus addDisplayToDisplayResources(int64_t display, bool isVirtual);
213*4d7e907cSAndroid Build Coastguard Worker 
214*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus addLayerToDisplayResources(int64_t display, int64_t layer);
215*4d7e907cSAndroid Build Coastguard Worker 
216*4d7e907cSAndroid Build Coastguard Worker     void removeLayerFromDisplayResources(int64_t display, int64_t layer);
217*4d7e907cSAndroid Build Coastguard Worker 
218*4d7e907cSAndroid Build Coastguard Worker     bool destroyAllLayers(ComposerClientWriter*);
219*4d7e907cSAndroid Build Coastguard Worker 
220*4d7e907cSAndroid Build Coastguard Worker     bool verifyComposerCallbackParams();
221*4d7e907cSAndroid Build Coastguard Worker 
222*4d7e907cSAndroid Build Coastguard Worker     // Keep track of displays and layers. When a test fails/ends,
223*4d7e907cSAndroid Build Coastguard Worker     // the VtsComposerClient::tearDown should be called from the
224*4d7e907cSAndroid Build Coastguard Worker     // test tearDown to clean up the resources for the test.
225*4d7e907cSAndroid Build Coastguard Worker     struct DisplayResource {
DisplayResourceDisplayResource226*4d7e907cSAndroid Build Coastguard Worker         DisplayResource(bool isVirtual_) : isVirtual(isVirtual_) {}
227*4d7e907cSAndroid Build Coastguard Worker 
228*4d7e907cSAndroid Build Coastguard Worker         bool isVirtual;
229*4d7e907cSAndroid Build Coastguard Worker         std::unordered_set<int64_t> layers;
230*4d7e907cSAndroid Build Coastguard Worker     };
231*4d7e907cSAndroid Build Coastguard Worker 
232*4d7e907cSAndroid Build Coastguard Worker     std::shared_ptr<IComposer> mComposer;
233*4d7e907cSAndroid Build Coastguard Worker     std::shared_ptr<IComposerClient> mComposerClient;
234*4d7e907cSAndroid Build Coastguard Worker     std::shared_ptr<GraphicsComposerCallback> mComposerCallback;
235*4d7e907cSAndroid Build Coastguard Worker     std::unordered_map<int64_t, DisplayResource> mDisplayResources;
236*4d7e907cSAndroid Build Coastguard Worker     bool mSupportsBatchedCreateLayer = false;
237*4d7e907cSAndroid Build Coastguard Worker     std::atomic<int64_t> mNextLayerHandle = 1;
238*4d7e907cSAndroid Build Coastguard Worker };
239*4d7e907cSAndroid Build Coastguard Worker 
240*4d7e907cSAndroid Build Coastguard Worker class VtsDisplay {
241*4d7e907cSAndroid Build Coastguard Worker   public:
VtsDisplay(int64_t displayId)242*4d7e907cSAndroid Build Coastguard Worker     VtsDisplay(int64_t displayId) : mDisplayId(displayId), mDisplayWidth(0), mDisplayHeight(0) {}
243*4d7e907cSAndroid Build Coastguard Worker 
getDisplayId()244*4d7e907cSAndroid Build Coastguard Worker     int64_t getDisplayId() const { return mDisplayId; }
245*4d7e907cSAndroid Build Coastguard Worker 
getCrop()246*4d7e907cSAndroid Build Coastguard Worker     FRect getCrop() const {
247*4d7e907cSAndroid Build Coastguard Worker         return {0, 0, static_cast<float>(mDisplayWidth), static_cast<float>(mDisplayHeight)};
248*4d7e907cSAndroid Build Coastguard Worker     }
249*4d7e907cSAndroid Build Coastguard Worker 
getFrameRect()250*4d7e907cSAndroid Build Coastguard Worker     Rect getFrameRect() const { return {0, 0, mDisplayWidth, mDisplayHeight}; }
251*4d7e907cSAndroid Build Coastguard Worker 
setDimensions(int32_t displayWidth,int32_t displayHeight)252*4d7e907cSAndroid Build Coastguard Worker     void setDimensions(int32_t displayWidth, int32_t displayHeight) {
253*4d7e907cSAndroid Build Coastguard Worker         mDisplayWidth = displayWidth;
254*4d7e907cSAndroid Build Coastguard Worker         mDisplayHeight = displayHeight;
255*4d7e907cSAndroid Build Coastguard Worker     }
256*4d7e907cSAndroid Build Coastguard Worker 
getDisplayWidth()257*4d7e907cSAndroid Build Coastguard Worker     int32_t getDisplayWidth() const { return mDisplayWidth; }
258*4d7e907cSAndroid Build Coastguard Worker 
getDisplayHeight()259*4d7e907cSAndroid Build Coastguard Worker     int32_t getDisplayHeight() const { return mDisplayHeight; }
260*4d7e907cSAndroid Build Coastguard Worker 
261*4d7e907cSAndroid Build Coastguard Worker     struct DisplayConfig {
262*4d7e907cSAndroid Build Coastguard Worker         DisplayConfig(int32_t vsyncPeriod_, int32_t configGroup_,
263*4d7e907cSAndroid Build Coastguard Worker                       std::optional<VrrConfig> vrrConfigOpt_ = {})
vsyncPeriodDisplayConfig264*4d7e907cSAndroid Build Coastguard Worker             : vsyncPeriod(vsyncPeriod_),
265*4d7e907cSAndroid Build Coastguard Worker               configGroup(configGroup_),
266*4d7e907cSAndroid Build Coastguard Worker               vrrConfigOpt(std::move(vrrConfigOpt_)) {}
267*4d7e907cSAndroid Build Coastguard Worker         int32_t vsyncPeriod;
268*4d7e907cSAndroid Build Coastguard Worker         int32_t configGroup;
269*4d7e907cSAndroid Build Coastguard Worker         std::optional<VrrConfig> vrrConfigOpt;
270*4d7e907cSAndroid Build Coastguard Worker     };
271*4d7e907cSAndroid Build Coastguard Worker 
addDisplayConfig(int32_t config,DisplayConfig displayConfig)272*4d7e907cSAndroid Build Coastguard Worker     void addDisplayConfig(int32_t config, DisplayConfig displayConfig) {
273*4d7e907cSAndroid Build Coastguard Worker         mDisplayConfigs.insert({config, displayConfig});
274*4d7e907cSAndroid Build Coastguard Worker     }
275*4d7e907cSAndroid Build Coastguard Worker 
getDisplayConfig(int32_t config)276*4d7e907cSAndroid Build Coastguard Worker     DisplayConfig getDisplayConfig(int32_t config) { return mDisplayConfigs.find(config)->second; }
277*4d7e907cSAndroid Build Coastguard Worker 
isRateSameBetweenConfigs(int config1,int config2)278*4d7e907cSAndroid Build Coastguard Worker     bool isRateSameBetweenConfigs(int config1, int config2) {
279*4d7e907cSAndroid Build Coastguard Worker         const auto displayConfig1 = getDisplayConfig(config1);
280*4d7e907cSAndroid Build Coastguard Worker         const auto displayConfig2 = getDisplayConfig(config2);
281*4d7e907cSAndroid Build Coastguard Worker         const auto vrrConfigOpt1 = displayConfig1.vrrConfigOpt;
282*4d7e907cSAndroid Build Coastguard Worker         const auto vrrConfigOpt2 = displayConfig2.vrrConfigOpt;
283*4d7e907cSAndroid Build Coastguard Worker 
284*4d7e907cSAndroid Build Coastguard Worker         if (vrrConfigOpt1 && vrrConfigOpt2 &&
285*4d7e907cSAndroid Build Coastguard Worker             vrrConfigOpt1->minFrameIntervalNs == vrrConfigOpt2->minFrameIntervalNs) {
286*4d7e907cSAndroid Build Coastguard Worker             return true;
287*4d7e907cSAndroid Build Coastguard Worker         } else if (displayConfig1.vsyncPeriod == displayConfig2.vsyncPeriod) {
288*4d7e907cSAndroid Build Coastguard Worker             return true;
289*4d7e907cSAndroid Build Coastguard Worker         }
290*4d7e907cSAndroid Build Coastguard Worker         return false;
291*4d7e907cSAndroid Build Coastguard Worker     }
292*4d7e907cSAndroid Build Coastguard Worker 
printConfig(int config)293*4d7e907cSAndroid Build Coastguard Worker     std::string printConfig(int config) {
294*4d7e907cSAndroid Build Coastguard Worker         const auto displayConfig = getDisplayConfig(config);
295*4d7e907cSAndroid Build Coastguard Worker         const auto vrrConfigOpt = displayConfig.vrrConfigOpt;
296*4d7e907cSAndroid Build Coastguard Worker         std::stringstream ss;
297*4d7e907cSAndroid Build Coastguard Worker         if (displayConfig.vrrConfigOpt) {
298*4d7e907cSAndroid Build Coastguard Worker             ss << "{Config " << config << ": vsyncPeriod " << displayConfig.vsyncPeriod
299*4d7e907cSAndroid Build Coastguard Worker                 << ", minFrameIntervalNs " << vrrConfigOpt->minFrameIntervalNs << "}";
300*4d7e907cSAndroid Build Coastguard Worker         }
301*4d7e907cSAndroid Build Coastguard Worker         else {
302*4d7e907cSAndroid Build Coastguard Worker             ss << "{Config " << config << ": vsyncPeriod " << displayConfig.vsyncPeriod << "}";
303*4d7e907cSAndroid Build Coastguard Worker         }
304*4d7e907cSAndroid Build Coastguard Worker         return ss.str();
305*4d7e907cSAndroid Build Coastguard Worker     }
306*4d7e907cSAndroid Build Coastguard Worker 
getDisplayConfigs()307*4d7e907cSAndroid Build Coastguard Worker     std::unordered_map<int32_t, DisplayConfig> getDisplayConfigs() { return mDisplayConfigs; }
308*4d7e907cSAndroid Build Coastguard Worker 
309*4d7e907cSAndroid Build Coastguard Worker   private:
310*4d7e907cSAndroid Build Coastguard Worker     int64_t mDisplayId;
311*4d7e907cSAndroid Build Coastguard Worker     int32_t mDisplayWidth;
312*4d7e907cSAndroid Build Coastguard Worker     int32_t mDisplayHeight;
313*4d7e907cSAndroid Build Coastguard Worker     std::unordered_map<int32_t, DisplayConfig> mDisplayConfigs;
314*4d7e907cSAndroid Build Coastguard Worker };
315*4d7e907cSAndroid Build Coastguard Worker }  // namespace aidl::android::hardware::graphics::composer3::vts
316