• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <composer-vts/2.1/ComposerVts.h>
18 
19 #include <VtsHalHidlTargetTestBase.h>
20 
21 namespace android {
22 namespace hardware {
23 namespace graphics {
24 namespace composer {
25 namespace V2_1 {
26 namespace vts {
27 
Composer()28 Composer::Composer() {
29     mComposer = ::testing::VtsHalHidlTargetTestBase::getService<IComposer>();
30     init();
31 }
32 
Composer(const std::string & name)33 Composer::Composer(const std::string& name) {
34     mComposer = ::testing::VtsHalHidlTargetTestBase::getService<IComposer>(name);
35     init();
36 }
37 
init()38 void Composer::init() {
39     ASSERT_NE(nullptr, mComposer.get()) << "failed to get composer service";
40 
41     std::vector<IComposer::Capability> capabilities = getCapabilities();
42     mCapabilities.insert(capabilities.begin(), capabilities.end());
43 }
44 
getRaw() const45 sp<IComposer> Composer::getRaw() const {
46     return mComposer;
47 }
48 
hasCapability(IComposer::Capability capability) const49 bool Composer::hasCapability(IComposer::Capability capability) const {
50     return mCapabilities.count(capability) > 0;
51 }
52 
getCapabilities()53 std::vector<IComposer::Capability> Composer::getCapabilities() {
54     std::vector<IComposer::Capability> capabilities;
55     mComposer->getCapabilities(
56         [&](const auto& tmpCapabilities) { capabilities = tmpCapabilities; });
57 
58     return capabilities;
59 }
60 
dumpDebugInfo()61 std::string Composer::dumpDebugInfo() {
62     std::string debugInfo;
63     mComposer->dumpDebugInfo([&](const auto& tmpDebugInfo) { debugInfo = tmpDebugInfo.c_str(); });
64 
65     return debugInfo;
66 }
67 
createClient()68 std::unique_ptr<ComposerClient> Composer::createClient() {
69     std::unique_ptr<ComposerClient> client;
70     mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {
71         ASSERT_EQ(Error::NONE, tmpError) << "failed to create client";
72         client = std::make_unique<ComposerClient>(tmpClient);
73     });
74 
75     return client;
76 }
77 
ComposerClient(const sp<IComposerClient> & client)78 ComposerClient::ComposerClient(const sp<IComposerClient>& client) : mClient(client) {}
79 
~ComposerClient()80 ComposerClient::~ComposerClient() {
81     for (auto it : mDisplayResources) {
82         Display display = it.first;
83         DisplayResource& resource = it.second;
84 
85         for (auto layer : resource.layers) {
86             EXPECT_EQ(Error::NONE, mClient->destroyLayer(display, layer))
87                 << "failed to destroy layer " << layer;
88         }
89 
90         if (resource.isVirtual) {
91             EXPECT_EQ(Error::NONE, mClient->destroyVirtualDisplay(display))
92                 << "failed to destroy virtual display " << display;
93         }
94     }
95     mDisplayResources.clear();
96 }
97 
getRaw() const98 sp<IComposerClient> ComposerClient::getRaw() const {
99     return mClient;
100 }
101 
registerCallback(const sp<IComposerCallback> & callback)102 void ComposerClient::registerCallback(const sp<IComposerCallback>& callback) {
103     mClient->registerCallback(callback);
104 }
105 
getMaxVirtualDisplayCount()106 uint32_t ComposerClient::getMaxVirtualDisplayCount() {
107     return mClient->getMaxVirtualDisplayCount();
108 }
109 
createVirtualDisplay(uint32_t width,uint32_t height,PixelFormat formatHint,uint32_t outputBufferSlotCount,PixelFormat * outFormat)110 Display ComposerClient::createVirtualDisplay(uint32_t width, uint32_t height,
111                                              PixelFormat formatHint, uint32_t outputBufferSlotCount,
112                                              PixelFormat* outFormat) {
113     Display display = 0;
114     mClient->createVirtualDisplay(
115         width, height, formatHint, outputBufferSlotCount,
116         [&](const auto& tmpError, const auto& tmpDisplay, const auto& tmpFormat) {
117             ASSERT_EQ(Error::NONE, tmpError) << "failed to create virtual display";
118             display = tmpDisplay;
119             *outFormat = tmpFormat;
120 
121             ASSERT_TRUE(mDisplayResources.insert({display, DisplayResource(true)}).second)
122                 << "duplicated virtual display id " << display;
123         });
124 
125     return display;
126 }
127 
destroyVirtualDisplay(Display display)128 void ComposerClient::destroyVirtualDisplay(Display display) {
129     Error error = mClient->destroyVirtualDisplay(display);
130     ASSERT_EQ(Error::NONE, error) << "failed to destroy virtual display " << display;
131 
132     mDisplayResources.erase(display);
133 }
134 
createLayer(Display display,uint32_t bufferSlotCount)135 Layer ComposerClient::createLayer(Display display, uint32_t bufferSlotCount) {
136     Layer layer = 0;
137     mClient->createLayer(display, bufferSlotCount, [&](const auto& tmpError, const auto& tmpLayer) {
138         ASSERT_EQ(Error::NONE, tmpError) << "failed to create layer";
139         layer = tmpLayer;
140 
141         auto resourceIt = mDisplayResources.find(display);
142         if (resourceIt == mDisplayResources.end()) {
143             resourceIt = mDisplayResources.insert({display, DisplayResource(false)}).first;
144         }
145 
146         ASSERT_TRUE(resourceIt->second.layers.insert(layer).second)
147             << "duplicated layer id " << layer;
148     });
149 
150     return layer;
151 }
152 
destroyLayer(Display display,Layer layer)153 void ComposerClient::destroyLayer(Display display, Layer layer) {
154     Error error = mClient->destroyLayer(display, layer);
155     ASSERT_EQ(Error::NONE, error) << "failed to destroy layer " << layer;
156 
157     auto resourceIt = mDisplayResources.find(display);
158     ASSERT_NE(mDisplayResources.end(), resourceIt);
159     resourceIt->second.layers.erase(layer);
160 }
161 
getActiveConfig(Display display)162 Config ComposerClient::getActiveConfig(Display display) {
163     Config config = 0;
164     mClient->getActiveConfig(display, [&](const auto& tmpError, const auto& tmpConfig) {
165         ASSERT_EQ(Error::NONE, tmpError) << "failed to get active config";
166         config = tmpConfig;
167     });
168 
169     return config;
170 }
171 
getClientTargetSupport(Display display,uint32_t width,uint32_t height,PixelFormat format,Dataspace dataspace)172 bool ComposerClient::getClientTargetSupport(Display display, uint32_t width, uint32_t height,
173                                             PixelFormat format, Dataspace dataspace) {
174     Error error = mClient->getClientTargetSupport(display, width, height, format, dataspace);
175     return error == Error::NONE;
176 }
177 
getColorModes(Display display)178 std::vector<ColorMode> ComposerClient::getColorModes(Display display) {
179     std::vector<ColorMode> modes;
180     mClient->getColorModes(display, [&](const auto& tmpError, const auto& tmpMode) {
181         ASSERT_EQ(Error::NONE, tmpError) << "failed to get color mode";
182         modes = tmpMode;
183     });
184 
185     return modes;
186 }
187 
getDisplayAttribute(Display display,Config config,IComposerClient::Attribute attribute)188 int32_t ComposerClient::getDisplayAttribute(Display display, Config config,
189                                             IComposerClient::Attribute attribute) {
190     int32_t value = 0;
191     mClient->getDisplayAttribute(
192         display, config, attribute, [&](const auto& tmpError, const auto& tmpValue) {
193             ASSERT_EQ(Error::NONE, tmpError) << "failed to get display attribute";
194             value = tmpValue;
195         });
196 
197     return value;
198 }
199 
getDisplayConfigs(Display display)200 std::vector<Config> ComposerClient::getDisplayConfigs(Display display) {
201     std::vector<Config> configs;
202     mClient->getDisplayConfigs(display, [&](const auto& tmpError, const auto& tmpConfigs) {
203         ASSERT_EQ(Error::NONE, tmpError) << "failed to get display configs";
204         configs = tmpConfigs;
205     });
206 
207     return configs;
208 }
209 
getDisplayName(Display display)210 std::string ComposerClient::getDisplayName(Display display) {
211     std::string name;
212     mClient->getDisplayName(display, [&](const auto& tmpError, const auto& tmpName) {
213         ASSERT_EQ(Error::NONE, tmpError) << "failed to get display name";
214         name = tmpName.c_str();
215     });
216 
217     return name;
218 }
219 
getDisplayType(Display display)220 IComposerClient::DisplayType ComposerClient::getDisplayType(Display display) {
221     IComposerClient::DisplayType type = IComposerClient::DisplayType::INVALID;
222     mClient->getDisplayType(display, [&](const auto& tmpError, const auto& tmpType) {
223         ASSERT_EQ(Error::NONE, tmpError) << "failed to get display type";
224         type = tmpType;
225     });
226 
227     return type;
228 }
229 
getDozeSupport(Display display)230 bool ComposerClient::getDozeSupport(Display display) {
231     bool support = false;
232     mClient->getDozeSupport(display, [&](const auto& tmpError, const auto& tmpSupport) {
233         ASSERT_EQ(Error::NONE, tmpError) << "failed to get doze support";
234         support = tmpSupport;
235     });
236 
237     return support;
238 }
239 
getHdrCapabilities(Display display,float * outMaxLuminance,float * outMaxAverageLuminance,float * outMinLuminance)240 std::vector<Hdr> ComposerClient::getHdrCapabilities(Display display, float* outMaxLuminance,
241                                                     float* outMaxAverageLuminance,
242                                                     float* outMinLuminance) {
243     std::vector<Hdr> types;
244     mClient->getHdrCapabilities(
245         display, [&](const auto& tmpError, const auto& tmpTypes, const auto& tmpMaxLuminance,
246                      const auto& tmpMaxAverageLuminance, const auto& tmpMinLuminance) {
247             ASSERT_EQ(Error::NONE, tmpError) << "failed to get HDR capabilities";
248             types = tmpTypes;
249             *outMaxLuminance = tmpMaxLuminance;
250             *outMaxAverageLuminance = tmpMaxAverageLuminance;
251             *outMinLuminance = tmpMinLuminance;
252         });
253 
254     return types;
255 }
256 
setClientTargetSlotCount(Display display,uint32_t clientTargetSlotCount)257 void ComposerClient::setClientTargetSlotCount(Display display, uint32_t clientTargetSlotCount) {
258     Error error = mClient->setClientTargetSlotCount(display, clientTargetSlotCount);
259     ASSERT_EQ(Error::NONE, error) << "failed to set client target slot count";
260 }
261 
setActiveConfig(Display display,Config config)262 void ComposerClient::setActiveConfig(Display display, Config config) {
263     Error error = mClient->setActiveConfig(display, config);
264     ASSERT_EQ(Error::NONE, error) << "failed to set active config";
265 }
266 
setColorMode(Display display,ColorMode mode)267 void ComposerClient::setColorMode(Display display, ColorMode mode) {
268     Error error = mClient->setColorMode(display, mode);
269     ASSERT_EQ(Error::NONE, error) << "failed to set color mode";
270 }
271 
setPowerMode(Display display,IComposerClient::PowerMode mode)272 void ComposerClient::setPowerMode(Display display, IComposerClient::PowerMode mode) {
273     Error error = mClient->setPowerMode(display, mode);
274     ASSERT_EQ(Error::NONE, error) << "failed to set power mode";
275 }
276 
setVsyncEnabled(Display display,bool enabled)277 void ComposerClient::setVsyncEnabled(Display display, bool enabled) {
278     IComposerClient::Vsync vsync =
279         (enabled) ? IComposerClient::Vsync::ENABLE : IComposerClient::Vsync::DISABLE;
280     Error error = mClient->setVsyncEnabled(display, vsync);
281     ASSERT_EQ(Error::NONE, error) << "failed to set vsync mode";
282 
283     // give the hwbinder thread some time to handle any pending vsync callback
284     if (!enabled) {
285         usleep(5 * 1000);
286     }
287 }
288 
execute(TestCommandReader * reader,CommandWriterBase * writer)289 void ComposerClient::execute(TestCommandReader* reader, CommandWriterBase* writer) {
290     bool queueChanged = false;
291     uint32_t commandLength = 0;
292     hidl_vec<hidl_handle> commandHandles;
293     ASSERT_TRUE(writer->writeQueue(&queueChanged, &commandLength, &commandHandles));
294 
295     if (queueChanged) {
296         auto ret = mClient->setInputCommandQueue(*writer->getMQDescriptor());
297         ASSERT_EQ(Error::NONE, static_cast<Error>(ret));
298         return;
299     }
300 
301     mClient->executeCommands(commandLength, commandHandles,
302                              [&](const auto& tmpError, const auto& tmpOutQueueChanged,
303                                  const auto& tmpOutLength, const auto& tmpOutHandles) {
304                                  ASSERT_EQ(Error::NONE, tmpError);
305 
306                                  if (tmpOutQueueChanged) {
307                                      mClient->getOutputCommandQueue(
308                                          [&](const auto& tmpError, const auto& tmpDescriptor) {
309                                              ASSERT_EQ(Error::NONE, tmpError);
310                                              reader->setMQDescriptor(tmpDescriptor);
311                                          });
312                                  }
313 
314                                  ASSERT_TRUE(reader->readQueue(tmpOutLength, tmpOutHandles));
315                                  reader->parse();
316                              });
317 }
318 
319 }  // namespace vts
320 }  // namespace V2_1
321 }  // namespace composer
322 }  // namespace graphics
323 }  // namespace hardware
324 }  // namespace android
325