blob: 024ba77795ada97c714eb8e17b005afa5317f2a5 [file] [log] [blame]
Marissa Wall4d600052016-12-15 12:16:01 -08001/*
2 * Copyright (C) 2016 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 <array>
Marissa Wallcfb9a072017-02-17 20:53:18 -080018#include <unordered_set>
Marissa Wall4d600052016-12-15 12:16:01 -080019#include <gtest/gtest.h>
20#include <dlfcn.h>
Marissa Wall5a240aa2016-12-15 12:34:06 -080021#include <android-base/unique_fd.h>
Marissa Wall4d600052016-12-15 12:16:01 -080022#include <hardware/hardware.h>
23
24#define HWC2_INCLUDE_STRINGIFICATION
25#define HWC2_USE_CPP11
26#include <hardware/hwcomposer2.h>
27#undef HWC2_INCLUDE_STRINGIFICATION
28#undef HWC2_USE_CPP11
29
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080030#include "Hwc2TestLayer.h"
Marissa Wall273b1df2016-12-15 12:28:47 -080031#include "Hwc2TestLayers.h"
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080032
Marissa Wallcfb9a072017-02-17 20:53:18 -080033void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
34 hwc2_display_t display, int32_t connected);
Marissa Wall572a1ee2016-12-15 12:24:13 -080035void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
36 hwc2_display_t display, int64_t timestamp);
Marissa Wallcfb9a072017-02-17 20:53:18 -080037
Marissa Wall4d600052016-12-15 12:16:01 -080038class Hwc2Test : public testing::Test {
39public:
40
41 virtual void SetUp()
42 {
43 hw_module_t const* hwc2Module;
44
45 int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
46 ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
47 << strerror(-err);
48
49 /* The following method will fail if you have not run
50 * "adb shell stop" */
51 err = hwc2_open(hwc2Module, &mHwc2Device);
52 ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
53 << strerror(-err);
Marissa Wallcfb9a072017-02-17 20:53:18 -080054
55 populateDisplays();
Marissa Wall4d600052016-12-15 12:16:01 -080056 }
57
58 virtual void TearDown()
59 {
Marissa Wall1db2e372016-12-15 12:19:39 -080060
61 for (auto itr = mLayers.begin(); itr != mLayers.end();) {
62 hwc2_display_t display = itr->first;
63 hwc2_layer_t layer = itr->second;
64 itr++;
65 /* Destroys and removes the layer from mLayers */
66 destroyLayer(display, layer);
67 }
68
Marissa Wall03c91732016-12-15 12:23:16 -080069 for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
70 hwc2_display_t display = *itr;
71 itr++;
72 /* Sets power mode to off and removes the display from
73 * mActiveDisplays */
74 setPowerMode(display, HWC2_POWER_MODE_OFF);
75 }
76
Marissa Wall4d600052016-12-15 12:16:01 -080077 if (mHwc2Device)
78 hwc2_close(mHwc2Device);
79 }
80
Marissa Walla4b01482017-02-17 20:52:03 -080081 void registerCallback(hwc2_callback_descriptor_t descriptor,
82 hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
83 hwc2_error_t* outErr = nullptr)
84 {
85 auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
86 getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
87 ASSERT_TRUE(pfn) << "failed to get function";
88
89 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
90 callbackData, pointer));
91 if (outErr) {
92 *outErr = err;
93 } else {
94 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
95 }
96 }
97
Marissa Wallcfb9a072017-02-17 20:53:18 -080098 void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
99 hwc2_error_t* outErr = nullptr)
100 {
101 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
102 getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
103 ASSERT_TRUE(pfn) << "failed to get function";
104
105 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
106 reinterpret_cast<int32_t*>(outType)));
107 if (outErr) {
108 *outErr = err;
109 } else {
110 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
111 }
112 }
113
114 /* If the populateDisplays function is still receiving displays and the
115 * display is connected, the display handle is stored in mDisplays. */
116 void hotplugCallback(hwc2_display_t display, int32_t connected)
117 {
118 std::lock_guard<std::mutex> lock(mHotplugMutex);
119
120 if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
121 return;
122
123 if (connected == HWC2_CONNECTION_CONNECTED)
124 mDisplays.insert(display);
125
126 mHotplugCv.notify_all();
127 }
128
Marissa Wall1db2e372016-12-15 12:19:39 -0800129 void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
130 hwc2_error_t* outErr = nullptr)
131 {
132 auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
133 getFunction(HWC2_FUNCTION_CREATE_LAYER));
134 ASSERT_TRUE(pfn) << "failed to get function";
135
136 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
137 outLayer));
138
139 if (err == HWC2_ERROR_NONE)
140 mLayers.insert(std::make_pair(display, *outLayer));
141
142 if (outErr) {
143 *outErr = err;
144 } else {
145 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
146 }
147 }
148
149 void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
150 hwc2_error_t* outErr = nullptr)
151 {
152 auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
153 getFunction(HWC2_FUNCTION_DESTROY_LAYER));
154 ASSERT_TRUE(pfn) << "failed to get function";
155
156 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
157
158 if (err == HWC2_ERROR_NONE)
159 mLayers.erase(std::make_pair(display, layer));
160
161 if (outErr) {
162 *outErr = err;
163 } else {
164 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
165 << layer;
166 }
167 }
168
Marissa Wallcf935cb2016-12-15 12:20:47 -0800169 void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
170 hwc2_attribute_t attribute, int32_t* outValue,
171 hwc2_error_t* outErr = nullptr)
172 {
173 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
174 getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
175 ASSERT_TRUE(pfn) << "failed to get function";
176
177 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
178 attribute, outValue));
179
180 if (outErr) {
181 *outErr = err;
182 } else {
183 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
184 << getAttributeName(attribute) << " for config " << config;
185 }
186 }
187
188 void getDisplayConfigs(hwc2_display_t display,
189 std::vector<hwc2_config_t>* outConfigs,
190 hwc2_error_t* outErr = nullptr)
191 {
192 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
193 getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
194 ASSERT_TRUE(pfn) << "failed to get function";
195
196 uint32_t numConfigs = 0;
197
198 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
199 &numConfigs, nullptr));
200
201 if (err == HWC2_ERROR_NONE) {
202 outConfigs->resize(numConfigs);
203
204 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
205 &numConfigs, outConfigs->data()));
206 }
207
208 if (outErr) {
209 *outErr = err;
210 } else {
211 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
212 " display " << display;
213 }
214 }
215
Marissa Wall93dc04f2016-12-15 12:21:46 -0800216 void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
217 hwc2_error_t* outErr = nullptr)
218 {
219 auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
220 getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
221 ASSERT_TRUE(pfn) << "failed to get function";
222
223 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
224 outConfig));
225 if (outErr) {
226 *outErr = err;
227 } else {
228 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
229 " display " << display;
230 }
231 }
232
233 void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
234 hwc2_error_t* outErr = nullptr)
235 {
236 auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
237 getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
238 ASSERT_TRUE(pfn) << "failed to get function";
239
240 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
241 if (outErr) {
242 *outErr = err;
243 } else {
244 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
245 << config;
246 }
247 }
248
Marissa Wall03c91732016-12-15 12:23:16 -0800249 void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
250 hwc2_error_t* outErr = nullptr)
251 {
252 auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
253 getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
254 ASSERT_TRUE(pfn) << "failed to get function";
255
256 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
257 outSupport));
258 if (outErr) {
259 *outErr = err;
260 } else {
261 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
262 " display " << display;
263 }
264 }
265
266 void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
267 hwc2_error_t* outErr = nullptr)
268 {
269 auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
270 getFunction(HWC2_FUNCTION_SET_POWER_MODE));
271 ASSERT_TRUE(pfn) << "failed to get function";
272
273 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
274 mode));
275 if (outErr) {
276 *outErr = err;
277 if (err != HWC2_ERROR_NONE)
278 return;
279 } else {
280 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
281 << getPowerModeName(mode) << " on display " << display;
282 }
283
284 if (mode == HWC2_POWER_MODE_OFF) {
285 mActiveDisplays.erase(display);
286 } else {
287 mActiveDisplays.insert(display);
288 }
289 }
290
Marissa Wall572a1ee2016-12-15 12:24:13 -0800291 void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
292 hwc2_error_t* outErr = nullptr)
293 {
294 auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
295 getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
296 ASSERT_TRUE(pfn) << "failed to get function";
297
298 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
299 enabled));
300 if (outErr) {
301 *outErr = err;
302 } else {
303 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
304 << getVsyncName(enabled);
305 }
306 }
307
308 void vsyncCallback(hwc2_display_t display, int64_t timestamp)
309 {
310 std::lock_guard<std::mutex> lock(mVsyncMutex);
311 mVsyncDisplay = display;
312 mVsyncTimestamp = timestamp;
313 mVsyncCv.notify_all();
314 }
315
Marissa Walldd4087f2016-12-15 12:24:52 -0800316 void getDisplayName(hwc2_display_t display, std::string* outName,
317 hwc2_error_t* outErr = nullptr)
318 {
319 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
320 getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
321 ASSERT_TRUE(pfn) << "failed to get function";
322
323 uint32_t size = 0;
324
325 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
326 nullptr));
327
328 if (err == HWC2_ERROR_NONE) {
329 std::vector<char> name(size);
330
331 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
332 name.data()));
333
334 outName->assign(name.data());
335 }
336
337 if (outErr) {
338 *outErr = err;
339 } else {
340 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
341 << display;
342 }
343 }
344
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800345 void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
346 hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
347 {
348 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
349 getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
350 ASSERT_TRUE(pfn) << "failed to get function";
351
352 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
353 composition));
354 if (outErr) {
355 *outErr = err;
356 } else {
357 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
358 " type " << getCompositionName(composition);
359 }
360 }
361
Marissa Wall2a0aaf92016-12-15 12:31:37 -0800362 void setCursorPosition(hwc2_display_t display, hwc2_layer_t layer,
363 int32_t x, int32_t y, hwc2_error_t* outErr = nullptr)
364 {
365 auto pfn = reinterpret_cast<HWC2_PFN_SET_CURSOR_POSITION>(
366 getFunction(HWC2_FUNCTION_SET_CURSOR_POSITION));
367 ASSERT_TRUE(pfn) << "failed to get function";
368
369 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, x,
370 y));
371 if (outErr) {
372 *outErr = err;
373 } else {
374 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set cursor position";
375 }
376 }
377
Marissa Wallffc67da2016-12-15 12:26:09 -0800378 void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
379 hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
380 {
381 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
382 getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
383 ASSERT_TRUE(pfn) << "failed to get function";
384
385 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
386 mode));
387 if (outErr) {
388 *outErr = err;
389 } else {
390 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
391 << getBlendModeName(mode);
392 }
393 }
394
Marissa Wall5a240aa2016-12-15 12:34:06 -0800395 void setLayerBuffer(hwc2_display_t display, hwc2_layer_t layer,
396 buffer_handle_t buffer, int32_t acquireFence,
397 hwc2_error_t* outErr = nullptr)
398 {
399 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BUFFER>(
400 getFunction(HWC2_FUNCTION_SET_LAYER_BUFFER));
401 ASSERT_TRUE(pfn) << "failed to get function";
402
403 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
404 buffer, acquireFence));
405 if (outErr) {
406 *outErr = err;
407 } else {
408 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer buffer";
409 }
410 }
411
Marissa Wallee242782016-12-15 12:30:12 -0800412 void setLayerColor(hwc2_display_t display, hwc2_layer_t layer,
413 hwc_color_t color, hwc2_error_t* outErr = nullptr)
414 {
415 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COLOR>(
416 getFunction(HWC2_FUNCTION_SET_LAYER_COLOR));
417 ASSERT_TRUE(pfn) << "failed to get function";
418
419 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
420 color));
421 if (outErr) {
422 *outErr = err;
423 } else {
424 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer color";
425 }
426 }
427
Marissa Wallb72b5c92016-12-15 12:26:39 -0800428 void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
429 android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
430 {
431 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
432 getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
433 ASSERT_TRUE(pfn) << "failed to get function";
434
435 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
436 layer, dataspace));
437 if (outErr) {
438 *outErr = err;
439 } else {
440 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
441 }
442 }
443
Marissa Wall600a73b2016-12-15 12:30:39 -0800444 void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
445 const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
446 {
447 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
448 getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
449 ASSERT_TRUE(pfn) << "failed to get function";
450
451 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
452 displayFrame));
453 if (outErr) {
454 *outErr = err;
455 } else {
456 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
457 " frame";
458 }
459 }
460
Marissa Wall2b1f5302016-12-15 12:27:20 -0800461 void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
462 float alpha, hwc2_error_t* outErr = nullptr)
463 {
464 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
465 getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
466 ASSERT_TRUE(pfn) << "failed to get function";
467
468 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
469 alpha));
470 if (outErr) {
471 *outErr = err;
472 } else {
473 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
474 << alpha;
475 }
476 }
477
Marissa Wallc57468f2016-12-15 12:31:12 -0800478 void setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer,
479 const hwc_frect_t& sourceCrop, hwc2_error_t* outErr = nullptr)
480 {
481 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
482 getFunction(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP));
483 ASSERT_TRUE(pfn) << "failed to get function";
484
485 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
486 sourceCrop));
487 if (outErr) {
488 *outErr = err;
489 } else {
490 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer source crop";
491 }
492 }
493
Marissa Wallad761812016-12-15 12:32:24 -0800494 void setLayerSurfaceDamage(hwc2_display_t display, hwc2_layer_t layer,
495 const hwc_region_t& surfaceDamage, hwc2_error_t* outErr = nullptr)
496 {
497 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
498 getFunction(HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE));
499 ASSERT_TRUE(pfn) << "failed to get function";
500
501 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
502 surfaceDamage));
503 if (outErr) {
504 *outErr = err;
505 } else {
506 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer surface"
507 " damage";
508 }
509 }
510
Marissa Wallac108192016-12-15 12:27:48 -0800511 void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
512 hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
513 {
514 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
515 getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
516 ASSERT_TRUE(pfn) << "failed to get function";
517
518 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
519 transform));
520 if (outErr) {
521 *outErr = err;
522 } else {
523 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
524 << getTransformName(transform);
525 }
526 }
527
Marissa Wallf7618ed2016-12-15 12:34:39 -0800528 void setLayerVisibleRegion(hwc2_display_t display, hwc2_layer_t layer,
529 const hwc_region_t& visibleRegion, hwc2_error_t* outErr = nullptr)
530 {
531 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_VISIBLE_REGION>(
532 getFunction(HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION));
533 ASSERT_TRUE(pfn) << "failed to get function";
534
535 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
536 visibleRegion));
537 if (outErr) {
538 *outErr = err;
539 } else {
540 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer visible"
541 " region";
542 }
543 }
544
Marissa Wall273b1df2016-12-15 12:28:47 -0800545 void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
546 uint32_t zOrder, hwc2_error_t* outErr = nullptr)
547 {
548 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
549 getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
550 ASSERT_TRUE(pfn) << "failed to get function";
551
552 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
553 zOrder));
554 if (outErr) {
555 *outErr = err;
556 } else {
557 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
558 << zOrder;
559 }
560 }
561
Marissa Wall4d600052016-12-15 12:16:01 -0800562protected:
563 hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
564 {
565 return mHwc2Device->getFunction(mHwc2Device, descriptor);
566 }
567
568 void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
569 {
570 uint32_t num = 0;
571
572 mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
573
574 outCapabilities->resize(num);
575
576 mHwc2Device->getCapabilities(mHwc2Device, &num,
577 reinterpret_cast<int32_t*>(outCapabilities->data()));
578 }
579
Marissa Wallcfb9a072017-02-17 20:53:18 -0800580 /* Registers a hotplug callback and waits for hotplug callbacks. This
581 * function will have no effect if called more than once. */
582 void populateDisplays()
583 {
584 /* Sets the hotplug status to receiving */
585 {
586 std::lock_guard<std::mutex> lock(mHotplugMutex);
587
588 if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
589 return;
590 mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
591 }
592
593 /* Registers the callback. This function call cannot be locked because
594 * a callback could happen on the same thread */
595 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
596 reinterpret_cast<hwc2_function_pointer_t>(
597 hwc2TestHotplugCallback)));
598
599 /* Waits for hotplug events. If a hotplug event has not come within 1
600 * second, stop waiting. */
601 std::unique_lock<std::mutex> lock(mHotplugMutex);
602
603 while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
604 std::cv_status::timeout) { }
605
606 /* Sets the hotplug status to done. Future calls will have no effect */
607 mHotplugStatus = Hwc2TestHotplugStatus::Done;
608 }
609
610 void getBadDisplay(hwc2_display_t* outDisplay)
611 {
612 for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
613 if (mDisplays.count(display) == 0) {
614 *outDisplay = display;
615 return;
616 }
617 }
618 ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
619 " are registered. This should never happen.";
620 }
621
Marissa Wall1db2e372016-12-15 12:19:39 -0800622 /* NOTE: will create min(newlayerCnt, max supported layers) layers */
623 void createLayers(hwc2_display_t display,
624 std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
625 {
626 std::vector<hwc2_layer_t> newLayers;
627 hwc2_layer_t layer;
628 hwc2_error_t err = HWC2_ERROR_NONE;
629
630 for (size_t i = 0; i < newLayerCnt; i++) {
631
632 EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
633 if (err == HWC2_ERROR_NO_RESOURCES)
634 break;
635 if (err != HWC2_ERROR_NONE) {
636 newLayers.clear();
637 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
638 }
639 newLayers.push_back(layer);
640 }
641
642 *outLayers = std::move(newLayers);
643 }
644
645 void destroyLayers(hwc2_display_t display,
646 std::vector<hwc2_layer_t>&& layers)
647 {
648 for (hwc2_layer_t layer : layers) {
649 EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
650 }
651 }
652
Marissa Wallcf935cb2016-12-15 12:20:47 -0800653 void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
654 {
655 std::vector<hwc2_config_t> configs;
656
657 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
658
659 hwc2_config_t CONFIG_MAX = UINT32_MAX;
660
661 ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
662 " (2^32 values) has been taken which shouldn't happen";
663
664 hwc2_config_t config;
665 for (config = 0; config < CONFIG_MAX; config++) {
666 if (std::count(configs.begin(), configs.end(), config) == 0)
667 break;
668 }
669
670 *outConfig = config;
671 }
672
Marissa Wall572a1ee2016-12-15 12:24:13 -0800673 void enableVsync(hwc2_display_t display)
674 {
675 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
676 reinterpret_cast<hwc2_function_pointer_t>(
677 hwc2TestVsyncCallback)));
678 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
679 }
680
681 void disableVsync(hwc2_display_t display)
682 {
683 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
684 }
685
686 void waitForVsync(hwc2_display_t* outDisplay = nullptr,
687 int64_t* outTimestamp = nullptr)
688 {
689 std::unique_lock<std::mutex> lock(mVsyncMutex);
690 ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
691 std::cv_status::no_timeout) << "timed out attempting to get"
692 " vsync callback";
693 if (outDisplay)
694 *outDisplay = mVsyncDisplay;
695 if (outTimestamp)
696 *outTimestamp = mVsyncTimestamp;
697 }
698
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800699 /* Calls a set property function from Hwc2Test to set a property value from
700 * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
701 using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
702 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800703 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800704
Marissa Wall273b1df2016-12-15 12:28:47 -0800705 /* Calls a set property function from Hwc2Test to set property values from
706 * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
707 using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
708 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800709 Hwc2TestLayers* testLayers);
Marissa Wall273b1df2016-12-15 12:28:47 -0800710
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800711 /* Calls a set property function from Hwc2Test to set a bad property value
712 * on hwc2_layer_t on hwc2_display_t */
713 using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
714 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800715 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800716
717 /* Calls a set property function from Hwc2Test to set a bad property value
718 * on hwc2_layer_t on hwc2_display_t */
719 using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
720 hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
721
722 /* Advances a property of Hwc2TestLayer */
723 using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
724
Marissa Wallf7618ed2016-12-15 12:34:39 -0800725 /* Advances properties of Hwc2TestLayers */
726 using AdvanceProperties = bool (*)(Hwc2TestLayers* testLayer);
727
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800728 /* For each active display it cycles through each display config and tests
729 * each property value. It creates a layer, sets the property and then
730 * destroys the layer */
731 void setLayerProperty(Hwc2TestCoverage coverage,
732 TestLayerPropertyFunction function, AdvanceProperty advance)
733 {
734 for (auto display : mDisplays) {
735 std::vector<hwc2_config_t> configs;
736
737 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
738
739 for (auto config : configs) {
740 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -0800741 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800742
743 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800744 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
745 &displayArea));
746 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800747
748 do {
749 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
750
751 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800752 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800753
754 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
755 } while (advance(&testLayer));
756 }
757 }
758 }
759
760 /* For each active display it cycles through each display config and tests
761 * each property value. It creates a layer, cycles through each property
762 * value and updates the layer property value and then destroys the layer */
763 void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
764 TestLayerPropertyFunction function, AdvanceProperty advance)
765 {
766 for (auto display : mDisplays) {
767 std::vector<hwc2_config_t> configs;
768
769 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
770
771 for (auto config : configs) {
772 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -0800773 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800774
775 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800776 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
777 &displayArea));
778 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800779
780 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
781
782 do {
783 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800784 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800785 } while (advance(&testLayer));
786
787 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
788 }
789 }
790 }
791
Marissa Wall273b1df2016-12-15 12:28:47 -0800792 /* For each active display it cycles through each display config and tests
793 * each property value. It creates multiple layers, calls the
794 * TestLayerPropertiesFunction to set property values and then
795 * destroys the layers */
796 void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
Marissa Wallf7618ed2016-12-15 12:34:39 -0800797 TestLayerPropertiesFunction function, AdvanceProperties advance)
Marissa Wall273b1df2016-12-15 12:28:47 -0800798 {
799 for (auto display : mDisplays) {
800 std::vector<hwc2_config_t> configs;
801
802 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
803
804 for (auto config : configs) {
805 std::vector<hwc2_layer_t> layers;
Marissa Wall600a73b2016-12-15 12:30:39 -0800806 Area displayArea;
Marissa Wall273b1df2016-12-15 12:28:47 -0800807
808 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800809 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
810 &displayArea));
Marissa Wall273b1df2016-12-15 12:28:47 -0800811
812 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
Marissa Wall600a73b2016-12-15 12:30:39 -0800813 Hwc2TestLayers testLayers(layers, coverage, displayArea);
Marissa Wall273b1df2016-12-15 12:28:47 -0800814
Marissa Wallf7618ed2016-12-15 12:34:39 -0800815 do {
816 for (auto layer : layers) {
817 EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
818 &testLayers));
819 }
820 } while (advance(&testLayers));
Marissa Wall273b1df2016-12-15 12:28:47 -0800821
822 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
823 }
824 }
825 }
826
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800827 /* For each active display it cycles through each display config.
828 * 1) It attempts to set a valid property value to bad layer handle.
829 * 2) It creates a layer x and attempts to set a valid property value to
830 * layer x + 1
831 * 3) It destroys the layer x and attempts to set a valid property value to
832 * the destroyed layer x.
833 */
834 void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
835 TestLayerPropertyBadLayerFunction function)
836 {
837 for (auto display : mDisplays) {
838 std::vector<hwc2_config_t> configs;
839
840 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
841
842 for (auto config : configs) {
843 hwc2_layer_t layer = 0;
Marissa Wall600a73b2016-12-15 12:30:39 -0800844 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800845 hwc2_error_t err = HWC2_ERROR_NONE;
846
847 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800848 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
849 &displayArea));
850 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800851
852 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800853 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800854 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
855
856 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
857
858 ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800859 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800860 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
861
862 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
863
864 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800865 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800866 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
867 }
868 }
869 }
870
871 /* For each active display it cycles through each display config and tests
872 * each property value. It creates a layer, sets a bad property value and
873 * then destroys the layer */
874 void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
875 {
876 for (auto display : mDisplays) {
877 std::vector<hwc2_config_t> configs;
878
879 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
880
881 for (auto config : configs) {
882 hwc2_layer_t layer;
883 hwc2_error_t err = HWC2_ERROR_NONE;
884
885 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
886
887 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
888
889 ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
890 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
891 " error code";
892
893 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
894 }
895 }
896 }
897
Marissa Wall600a73b2016-12-15 12:30:39 -0800898 void getActiveConfigAttribute(hwc2_display_t display,
899 hwc2_attribute_t attribute, int32_t* outValue)
900 {
901 hwc2_config_t config;
902 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
903 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
904 attribute, outValue));
905 ASSERT_GE(*outValue, 0) << "failed to get valid "
906 << getAttributeName(attribute);
907 }
908
909 void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
910 {
911 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
912 HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
913 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
914 HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
915 }
916
Marissa Wall4d600052016-12-15 12:16:01 -0800917 hwc2_device_t* mHwc2Device = nullptr;
Marissa Wallcfb9a072017-02-17 20:53:18 -0800918
919 enum class Hwc2TestHotplugStatus {
920 Init = 1,
921 Receiving,
922 Done,
923 };
924
925 std::mutex mHotplugMutex;
926 std::condition_variable mHotplugCv;
927 Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
928 std::unordered_set<hwc2_display_t> mDisplays;
Marissa Wall1db2e372016-12-15 12:19:39 -0800929
930 /* Store all created layers that have not been destroyed. If an ASSERT_*
931 * fails, then destroy the layers on exit */
932 std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
Marissa Wall03c91732016-12-15 12:23:16 -0800933
934 /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
935 * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
936 std::set<hwc2_display_t> mActiveDisplays;
Marissa Wall572a1ee2016-12-15 12:24:13 -0800937
938 std::mutex mVsyncMutex;
939 std::condition_variable mVsyncCv;
940 hwc2_display_t mVsyncDisplay;
941 int64_t mVsyncTimestamp = -1;
Marissa Wall4d600052016-12-15 12:16:01 -0800942};
943
Marissa Wallcfb9a072017-02-17 20:53:18 -0800944void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
945 hwc2_display_t display, int32_t connection)
946{
947 if (callbackData)
948 static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
949 connection);
950}
951
Marissa Wall572a1ee2016-12-15 12:24:13 -0800952void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
953 hwc2_display_t display, int64_t timestamp)
954{
955 if (callbackData)
956 static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
957 timestamp);
958}
959
Marissa Wallffc67da2016-12-15 12:26:09 -0800960void setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800961 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallffc67da2016-12-15 12:26:09 -0800962{
963 EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800964 testLayer->getBlendMode(), outErr));
965}
966
967void setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
968 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
969{
970 buffer_handle_t handle;
971 android::base::unique_fd acquireFence;
972 hwc2_composition_t composition = testLayer->getComposition();
973
974 if (composition == HWC2_COMPOSITION_CLIENT
975 || composition == HWC2_COMPOSITION_SOLID_COLOR
976 || composition == HWC2_COMPOSITION_SIDEBAND)
977 return;
978
979 if (testLayer->getBuffer(&handle, &acquireFence) < 0)
980 return;
981
982 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
983 composition));
984 EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
985 handle, acquireFence, outErr));
Marissa Wallffc67da2016-12-15 12:26:09 -0800986}
987
Marissa Wallee242782016-12-15 12:30:12 -0800988void setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800989 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallee242782016-12-15 12:30:12 -0800990{
991 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
992 layer, HWC2_COMPOSITION_SOLID_COLOR));
993 ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800994 layer, testLayer->getPlaneAlpha()));
Marissa Wallee242782016-12-15 12:30:12 -0800995 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800996 layer, testLayer->getBlendMode()));
Marissa Wallee242782016-12-15 12:30:12 -0800997 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800998 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -0800999}
1000
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001001void setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001002 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001003{
Marissa Wall5a240aa2016-12-15 12:34:06 -08001004 hwc2_composition_t composition = testLayer->getComposition();
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001005 hwc2_error_t err = HWC2_ERROR_NONE;
1006
1007 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
1008 composition, &err));
1009 if (outErr) {
1010 *outErr = err;
1011 return;
1012 }
1013
1014 if (composition != HWC2_COMPOSITION_SIDEBAND) {
1015 EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
1016 } else {
1017 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
1018 << "returned wrong error code";
1019 }
1020}
1021
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001022void setCursorPosition(Hwc2Test* test, hwc2_display_t display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001023 hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001024{
1025 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1026 layer, HWC2_COMPOSITION_CURSOR));
1027
Marissa Wall5a240aa2016-12-15 12:34:06 -08001028 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001029 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
1030 cursorPosition.left, cursorPosition.top, outErr));
1031}
1032
Marissa Wallb72b5c92016-12-15 12:26:39 -08001033void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001034 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallb72b5c92016-12-15 12:26:39 -08001035{
1036 EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001037 testLayer->getDataspace(), outErr));
Marissa Wallb72b5c92016-12-15 12:26:39 -08001038}
1039
Marissa Wall600a73b2016-12-15 12:30:39 -08001040void setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001041 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall600a73b2016-12-15 12:30:39 -08001042{
1043 EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001044 testLayer->getDisplayFrame(), outErr));
Marissa Wall600a73b2016-12-15 12:30:39 -08001045}
1046
Marissa Wall2b1f5302016-12-15 12:27:20 -08001047void setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001048 Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
Marissa Wall2b1f5302016-12-15 12:27:20 -08001049{
1050 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001051 testLayer->getBlendMode()));
Marissa Wall2b1f5302016-12-15 12:27:20 -08001052 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001053 testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08001054}
1055
Marissa Wallc57468f2016-12-15 12:31:12 -08001056void setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001057 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallc57468f2016-12-15 12:31:12 -08001058{
1059 EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001060 testLayer->getSourceCrop(), outErr));
Marissa Wallc57468f2016-12-15 12:31:12 -08001061}
1062
Marissa Wallad761812016-12-15 12:32:24 -08001063void setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001064 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallad761812016-12-15 12:32:24 -08001065{
1066 EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001067 testLayer->getSurfaceDamage(), outErr));
Marissa Wallad761812016-12-15 12:32:24 -08001068}
1069
Marissa Wallac108192016-12-15 12:27:48 -08001070void setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001071 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallac108192016-12-15 12:27:48 -08001072{
1073 EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001074 testLayer->getTransform(), outErr));
Marissa Wallac108192016-12-15 12:27:48 -08001075}
1076
Marissa Wallf7618ed2016-12-15 12:34:39 -08001077void setVisibleRegion(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1078 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1079{
1080 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display, layer,
1081 testLayer->getVisibleRegion(), outErr));
1082}
1083
Marissa Wall273b1df2016-12-15 12:28:47 -08001084void setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001085 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall273b1df2016-12-15 12:28:47 -08001086{
1087 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001088 testLayer->getZOrder(), outErr));
Marissa Wall273b1df2016-12-15 12:28:47 -08001089}
1090
Marissa Wallffc67da2016-12-15 12:26:09 -08001091bool advanceBlendMode(Hwc2TestLayer* testLayer)
1092{
1093 return testLayer->advanceBlendMode();
1094}
1095
Marissa Wall5a240aa2016-12-15 12:34:06 -08001096bool advanceBuffer(Hwc2TestLayer* testLayer)
1097{
1098 if (testLayer->advanceComposition())
1099 return true;
1100 return testLayer->advanceBufferArea();
1101}
1102
Marissa Wallee242782016-12-15 12:30:12 -08001103bool advanceColor(Hwc2TestLayer* testLayer)
1104{
1105 /* Color depends on blend mode so advance blend mode last so color is not
1106 * force to update as often */
1107 if (testLayer->advancePlaneAlpha())
1108 return true;
1109 if (testLayer->advanceColor())
1110 return true;
1111 return testLayer->advanceBlendMode();
1112}
1113
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001114bool advanceComposition(Hwc2TestLayer* testLayer)
1115{
1116 return testLayer->advanceComposition();
1117}
1118
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001119bool advanceCursorPosition(Hwc2TestLayer* testLayer)
1120{
1121 return testLayer->advanceCursorPosition();
1122}
1123
Marissa Wallb72b5c92016-12-15 12:26:39 -08001124bool advanceDataspace(Hwc2TestLayer* testLayer)
1125{
1126 return testLayer->advanceDataspace();
1127}
1128
Marissa Wall600a73b2016-12-15 12:30:39 -08001129bool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1130{
1131 return testLayer->advanceDisplayFrame();
1132}
1133
Marissa Wall2b1f5302016-12-15 12:27:20 -08001134bool advancePlaneAlpha(Hwc2TestLayer* testLayer)
1135{
1136 return testLayer->advancePlaneAlpha();
1137}
1138
Marissa Wallc57468f2016-12-15 12:31:12 -08001139bool advanceSourceCrop(Hwc2TestLayer* testLayer)
1140{
1141 if (testLayer->advanceSourceCrop())
1142 return true;
1143 return testLayer->advanceBufferArea();
1144}
1145
Marissa Wallad761812016-12-15 12:32:24 -08001146bool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
1147{
1148 if (testLayer->advanceSurfaceDamage())
1149 return true;
1150 return testLayer->advanceBufferArea();
1151}
1152
Marissa Wallac108192016-12-15 12:27:48 -08001153bool advanceTransform(Hwc2TestLayer* testLayer)
1154{
1155 return testLayer->advanceTransform();
1156}
1157
Marissa Wallf7618ed2016-12-15 12:34:39 -08001158bool advanceVisibleRegions(Hwc2TestLayers* testLayers)
1159{
1160 return testLayers->advanceVisibleRegions();
1161}
1162
Marissa Wall4d600052016-12-15 12:16:01 -08001163
1164static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
1165 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
1166 HWC2_FUNCTION_CREATE_LAYER,
1167 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
1168 HWC2_FUNCTION_DESTROY_LAYER,
1169 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
1170 HWC2_FUNCTION_DUMP,
1171 HWC2_FUNCTION_GET_ACTIVE_CONFIG,
1172 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
1173 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
1174 HWC2_FUNCTION_GET_COLOR_MODES,
1175 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
1176 HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
1177 HWC2_FUNCTION_GET_DISPLAY_NAME,
1178 HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
1179 HWC2_FUNCTION_GET_DISPLAY_TYPE,
1180 HWC2_FUNCTION_GET_DOZE_SUPPORT,
1181 HWC2_FUNCTION_GET_HDR_CAPABILITIES,
1182 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
1183 HWC2_FUNCTION_GET_RELEASE_FENCES,
1184 HWC2_FUNCTION_PRESENT_DISPLAY,
1185 HWC2_FUNCTION_REGISTER_CALLBACK,
1186 HWC2_FUNCTION_SET_ACTIVE_CONFIG,
1187 HWC2_FUNCTION_SET_CLIENT_TARGET,
1188 HWC2_FUNCTION_SET_COLOR_MODE,
1189 HWC2_FUNCTION_SET_COLOR_TRANSFORM,
1190 HWC2_FUNCTION_SET_CURSOR_POSITION,
1191 HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
1192 HWC2_FUNCTION_SET_LAYER_BUFFER,
1193 HWC2_FUNCTION_SET_LAYER_COLOR,
1194 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
1195 HWC2_FUNCTION_SET_LAYER_DATASPACE,
1196 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
1197 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
1198 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
1199 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
1200 HWC2_FUNCTION_SET_LAYER_TRANSFORM,
1201 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
1202 HWC2_FUNCTION_SET_LAYER_Z_ORDER,
1203 HWC2_FUNCTION_SET_OUTPUT_BUFFER,
1204 HWC2_FUNCTION_SET_POWER_MODE,
1205 HWC2_FUNCTION_SET_VSYNC_ENABLED,
1206 HWC2_FUNCTION_VALIDATE_DISPLAY,
1207}};
1208
1209/* TESTCASE: Tests that the HWC2 supports all required functions. */
1210TEST_F(Hwc2Test, GET_FUNCTION)
1211{
1212 for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
1213 hwc2_function_pointer_t pfn = getFunction(descriptor);
1214 EXPECT_TRUE(pfn) << "failed to get function "
1215 << getFunctionDescriptorName(descriptor);
1216 }
1217}
1218
1219/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
1220TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
1221{
1222 hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
1223 EXPECT_FALSE(pfn) << "failed to get invalid function";
1224}
1225
1226/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
1227TEST_F(Hwc2Test, GET_CAPABILITIES)
1228{
1229 std::vector<hwc2_capability_t> capabilities;
1230
1231 getCapabilities(&capabilities);
1232
1233 EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
1234 HWC2_CAPABILITY_INVALID), 0);
1235}
Marissa Walla4b01482017-02-17 20:52:03 -08001236
1237static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1238 HWC2_CALLBACK_HOTPLUG,
1239 HWC2_CALLBACK_REFRESH,
1240 HWC2_CALLBACK_VSYNC,
1241}};
1242
1243/* TESTCASE: Tests that the HWC2 can successfully register all required
1244 * callback functions. */
1245TEST_F(Hwc2Test, REGISTER_CALLBACK)
1246{
1247 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1248 const_cast<char*>("data"));
1249
1250 for (auto descriptor : callbackDescriptors) {
1251 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1252 []() { return; }));
1253 }
1254}
1255
1256/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1257TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1258{
1259 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1260 const_cast<char*>("data"));
1261 hwc2_error_t err = HWC2_ERROR_NONE;
1262
1263 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1264 []() { return; }, &err));
1265 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1266}
1267
1268/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
1269TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
1270{
1271 hwc2_callback_data_t data = nullptr;
1272
1273 for (auto descriptor : callbackDescriptors) {
1274 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1275 []() { return; }));
1276 }
1277}
Marissa Wallcfb9a072017-02-17 20:53:18 -08001278
1279/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1280 * physical display. */
1281TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1282{
1283 for (auto display : mDisplays) {
1284 hwc2_display_type_t type;
1285
1286 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1287 EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1288 " correct display type";
1289 }
1290}
1291
1292/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1293 * display is requested. */
1294TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1295{
1296 hwc2_display_t display;
1297 hwc2_display_type_t type;
1298 hwc2_error_t err = HWC2_ERROR_NONE;
1299
1300 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1301
1302 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1303 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1304}
Marissa Wall1db2e372016-12-15 12:19:39 -08001305
1306/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
1307TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
1308{
1309 for (auto display : mDisplays) {
1310 hwc2_layer_t layer;
1311
1312 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1313
1314 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1315 }
1316}
1317
1318/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
1319TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
1320{
1321 hwc2_display_t display;
1322 hwc2_layer_t layer;
1323 hwc2_error_t err = HWC2_ERROR_NONE;
1324
1325 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1326
1327 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
1328 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1329}
1330
1331/* TESTCASE: Tests that the HWC2 will either support a large number of resources
1332 * or will return no resources. */
1333TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
1334{
1335 const size_t layerCnt = 1000;
1336
1337 for (auto display : mDisplays) {
1338 std::vector<hwc2_layer_t> layers;
1339
1340 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1341
1342 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1343 }
1344}
1345
1346/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
1347TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
1348{
1349 hwc2_display_t badDisplay;
1350
1351 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
1352
1353 for (auto display : mDisplays) {
1354 hwc2_layer_t layer = 0;
1355 hwc2_error_t err = HWC2_ERROR_NONE;
1356
1357 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1358 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1359
1360 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1361
1362 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1363 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1364
1365 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1366 }
1367}
1368
1369/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
1370TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
1371{
1372 for (auto display : mDisplays) {
1373 hwc2_layer_t layer;
1374 hwc2_error_t err = HWC2_ERROR_NONE;
1375
1376 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
1377 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1378
1379 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
1380 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1381
1382 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
1383 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1384
1385 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
1386 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1387
1388 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
1389 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1390
1391 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1392
1393 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
1394 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1395
1396 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1397
1398 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
1399 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1400 }
1401}
Marissa Wallcf935cb2016-12-15 12:20:47 -08001402
1403static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1404 HWC2_ATTRIBUTE_WIDTH,
1405 HWC2_ATTRIBUTE_HEIGHT,
1406}};
1407
1408static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1409 HWC2_ATTRIBUTE_VSYNC_PERIOD,
1410 HWC2_ATTRIBUTE_DPI_X,
1411 HWC2_ATTRIBUTE_DPI_Y,
1412}};
1413
1414/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1415 * config. */
1416TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1417{
1418 for (auto display : mDisplays) {
1419 std::vector<hwc2_config_t> configs;
1420
1421 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1422
1423 for (auto config : configs) {
1424 int32_t value;
1425
1426 for (auto attribute : requiredAttributes) {
1427 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1428 attribute, &value));
1429 EXPECT_GE(value, 0) << "missing required attribute "
1430 << getAttributeName(attribute) << " for config "
1431 << config;
1432 }
1433 for (auto attribute : optionalAttributes) {
1434 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1435 attribute, &value));
1436 }
1437 }
1438 }
1439}
1440
1441/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1442 * attribute */
1443TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1444{
1445 const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1446
1447 for (auto display : mDisplays) {
1448 std::vector<hwc2_config_t> configs;
1449
1450 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1451
1452 for (auto config : configs) {
1453 int32_t value;
1454 hwc2_error_t err = HWC2_ERROR_NONE;
1455
1456 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1457 attribute, &value, &err));
1458 EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1459 " attribute for config " << config;
1460 }
1461 }
1462}
1463
1464/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1465TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1466{
1467 hwc2_display_t display;
1468 const hwc2_config_t config = 0;
1469 int32_t value;
1470 hwc2_error_t err = HWC2_ERROR_NONE;
1471
1472 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1473
1474 for (auto attribute : requiredAttributes) {
1475 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1476 &value, &err));
1477 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1478 }
1479
1480 for (auto attribute : optionalAttributes) {
1481 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1482 &value, &err));
1483 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1484 }
1485}
1486
1487/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1488TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1489{
1490 for (auto display : mDisplays) {
1491 hwc2_config_t config;
1492 int32_t value;
1493 hwc2_error_t err = HWC2_ERROR_NONE;
1494
1495 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1496
1497 for (auto attribute : requiredAttributes) {
1498 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1499 attribute, &value, &err));
1500 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1501 }
1502
1503 for (auto attribute : optionalAttributes) {
1504 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1505 attribute, &value, &err));
1506 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1507 }
1508 }
1509}
1510
1511/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1512TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1513{
1514 for (auto display : mDisplays) {
1515 std::vector<hwc2_config_t> configs;
1516
1517 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1518 }
1519}
1520
1521/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1522TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1523{
1524 hwc2_display_t display;
1525 std::vector<hwc2_config_t> configs;
1526 hwc2_error_t err = HWC2_ERROR_NONE;
1527
1528 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1529
1530 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1531
1532 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1533 EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1534}
1535
1536/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1537 * times in a row. */
1538TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1539{
1540 for (auto display : mDisplays) {
1541 std::vector<hwc2_config_t> configs1, configs2;
1542
1543 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
1544 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
1545
1546 EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
1547 configs2.begin())) << "returned two different config sets";
1548 }
1549}
1550
1551/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
1552TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
1553{
1554 for (auto display : mDisplays) {
1555 std::vector<hwc2_config_t> configs;
1556
1557 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1558
1559 std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
1560 configs.end());
1561 EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
1562 " configs";
1563 }
1564}
Marissa Wall93dc04f2016-12-15 12:21:46 -08001565
1566/* TESTCASE: Tests that the HWC2 returns the active config for a display */
1567TEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
1568{
1569 for (auto display : mDisplays) {
1570 std::vector<hwc2_config_t> configs;
1571
1572 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1573
1574 for (auto config : configs) {
1575 hwc2_config_t activeConfig;
1576
1577 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1578 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
1579
1580 EXPECT_EQ(activeConfig, config) << "failed to get active config";
1581 }
1582 }
1583}
1584
1585/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
1586 * display. */
1587TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
1588{
1589 hwc2_display_t display;
1590 hwc2_config_t activeConfig;
1591 hwc2_error_t err = HWC2_ERROR_NONE;
1592
1593 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1594
1595 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1596
1597 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1598}
1599
1600/* TESTCASE: Tests that the HWC2 either begins with a valid active config
1601 * or returns an error when getActiveConfig is called. */
1602TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
1603{
1604 for (auto display : mDisplays) {
1605 std::vector<hwc2_config_t> configs;
1606 hwc2_config_t activeConfig;
1607 hwc2_error_t err = HWC2_ERROR_NONE;
1608
1609 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1610
1611 if (configs.empty())
1612 return;
1613
1614 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1615 if (err == HWC2_ERROR_NONE) {
1616 EXPECT_NE(std::count(configs.begin(), configs.end(),
1617 activeConfig), 0) << "active config is not found in "
1618 " configs for display";
1619 } else {
1620 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1621 }
1622 }
1623}
1624
1625/* TESTCASE: Tests that the HWC2 can set every display config as an active
1626 * config */
1627TEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
1628{
1629 for (auto display : mDisplays) {
1630 std::vector<hwc2_config_t> configs;
1631
1632 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1633
1634 for (auto config : configs) {
1635 EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1636 }
1637 }
1638}
1639
1640/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
1641TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
1642{
1643 hwc2_display_t display;
1644 const hwc2_config_t config = 0;
1645 hwc2_error_t err = HWC2_ERROR_NONE;
1646
1647 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1648
1649 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
1650 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1651}
1652
1653/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
1654TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
1655{
1656 for (auto display : mDisplays) {
1657 hwc2_config_t config;
1658 hwc2_error_t err = HWC2_ERROR_NONE;
1659
1660 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1661
1662 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
1663 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1664 }
1665}
Marissa Wall03c91732016-12-15 12:23:16 -08001666
1667/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
1668TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
1669{
1670 for (auto display : mDisplays) {
1671 int32_t support = -1;
1672
1673 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1674
1675 EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
1676 }
1677}
1678
1679/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
1680TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
1681{
1682 hwc2_display_t display;
1683 int32_t support = -1;
1684 hwc2_error_t err = HWC2_ERROR_NONE;
1685
1686 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1687
1688 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1689
1690 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1691}
1692
1693/* TESTCASE: Tests that the HWC2 can set all supported power modes */
1694TEST_F(Hwc2Test, SET_POWER_MODE)
1695{
1696 for (auto display : mDisplays) {
1697 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1698 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1699
1700 int32_t support = -1;
1701 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1702 if (support != 1)
1703 return;
1704
1705 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1706 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1707 HWC2_POWER_MODE_DOZE_SUSPEND));
1708
1709 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1710 }
1711}
1712
1713/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
1714TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
1715{
1716 hwc2_display_t display;
1717 hwc2_error_t err = HWC2_ERROR_NONE;
1718
1719 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1720
1721 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
1722 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1723
1724 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
1725 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1726
1727 int32_t support = -1;
1728 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1729 if (support != 1)
1730 return;
1731
1732 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
1733 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1734
1735 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
1736 &err));
1737 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1738}
1739
1740/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
1741TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
1742{
1743 for (auto display : mDisplays) {
1744 hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
1745 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
1746 hwc2_error_t err = HWC2_ERROR_NONE;
1747
1748 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
1749 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
1750 << mode;
1751 }
1752}
1753
1754/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
1755 * an optional power mode. */
1756TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
1757{
1758 for (auto display : mDisplays) {
1759 int32_t support = -1;
1760 hwc2_error_t err = HWC2_ERROR_NONE;
1761
1762 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1763 if (support == 1)
1764 return;
1765
1766 ASSERT_EQ(support, 0) << "invalid doze support value";
1767
1768 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
1769 &err));
1770 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1771
1772 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1773 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
1774 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1775 }
1776}
1777
1778/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
1779TEST_F(Hwc2Test, SET_POWER_MODE_stress)
1780{
1781 for (auto display : mDisplays) {
1782 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1783 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1784
1785 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1786 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1787
1788 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1789 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1790
1791 int32_t support = -1;
1792 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1793 if (support != 1)
1794 return;
1795
1796 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1797 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1798
1799 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1800 HWC2_POWER_MODE_DOZE_SUSPEND));
1801 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1802 HWC2_POWER_MODE_DOZE_SUSPEND));
1803
1804 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1805 }
1806}
Marissa Wall572a1ee2016-12-15 12:24:13 -08001807
1808/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
1809 * displays */
1810TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
1811{
1812 for (auto display : mDisplays) {
1813 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1814 const_cast<char*>("data"));
1815
1816 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1817
1818 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1819 []() { return; }));
1820
1821 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1822
1823 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1824
1825 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1826 }
1827}
1828
1829/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
1830TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
1831{
1832 for (auto display : mDisplays) {
1833 hwc2_display_t receivedDisplay;
1834 int64_t receivedTimestamp;
1835
1836 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1837
1838 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1839
1840 ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
1841 &receivedTimestamp));
1842
1843 EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
1844 EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
1845
1846 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1847
1848 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1849 }
1850}
1851
1852/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
1853TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
1854{
1855 hwc2_display_t display;
1856 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1857 const_cast<char*>("data"));
1858 hwc2_error_t err = HWC2_ERROR_NONE;
1859
1860 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1861
1862 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1863 []() { return; }));
1864
1865 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
1866 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1867
1868 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
1869 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1870}
1871
1872/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
1873TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
1874{
1875 for (auto display : mDisplays) {
1876 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1877 const_cast<char*>("data"));
1878 hwc2_error_t err = HWC2_ERROR_NONE;
1879
1880 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1881
1882 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1883 []() { return; }));
1884
1885 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
1886 &err));
1887 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1888
1889 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1890 }
1891}
1892
1893/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
1894 * times. */
1895TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
1896{
1897 for (auto display : mDisplays) {
1898 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1899 const_cast<char*>("data"));
1900
1901 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1902
1903 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1904 []() { return; }));
1905
1906 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1907
1908 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1909 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1910
1911 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1912 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1913
1914 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1915 }
1916}
1917
1918/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
1919 * is off and no callback is registered. */
1920TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
1921{
1922 const uint secs = 1;
1923
1924 for (auto display : mDisplays) {
1925 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1926
1927 sleep(secs);
1928
1929 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1930 }
1931}
1932
1933/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
1934 * is registered. */
1935TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
1936{
1937 const uint secs = 1;
1938
1939 for (auto display : mDisplays) {
1940 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1941
1942 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1943
1944 sleep(secs);
1945
1946 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1947
1948 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1949 }
1950}
Marissa Walldd4087f2016-12-15 12:24:52 -08001951
1952/* TESTCASE: Tests that the HWC2 returns a display name for each display */
1953TEST_F(Hwc2Test, GET_DISPLAY_NAME)
1954{
1955 for (auto display : mDisplays) {
1956 std::string name;
1957
1958 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
1959 }
1960}
1961
1962/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
1963 * display */
1964TEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
1965{
1966 hwc2_display_t display;
1967 std::string name;
1968 hwc2_error_t err = HWC2_ERROR_NONE;
1969
1970 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1971
1972 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
1973 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1974}
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001975
1976/* TESTCASE: Tests that the HWC2 can set basic composition types. */
1977TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
1978{
1979 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1980 setComposition, advanceComposition));
1981}
1982
1983/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
1984 * layer. */
1985TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
1986{
1987 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1988 setComposition, advanceComposition));
1989}
1990
1991/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
1992TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
1993{
1994 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1995 setComposition));
1996}
1997
1998/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
1999TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
2000{
2001 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2002 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2003 hwc2_error_t* outErr) {
2004
2005 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
2006 layer, HWC2_COMPOSITION_INVALID, outErr));
2007 }
2008 ));
2009}
Marissa Wallffc67da2016-12-15 12:26:09 -08002010
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002011/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
2012TEST_F(Hwc2Test, SET_CURSOR_POSITION)
2013{
2014 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2015 ::setCursorPosition, advanceCursorPosition));
2016}
2017
2018/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
2019TEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
2020{
2021 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2022 ::setCursorPosition, advanceCursorPosition));
2023}
2024
2025/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
2026 * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
2027TEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
2028{
2029 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2030 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002031 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002032
Marissa Wall5a240aa2016-12-15 12:34:06 -08002033 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002034 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
2035 cursorPosition.left, cursorPosition.top, outErr));
2036 },
2037
2038 advanceCursorPosition));
2039}
2040
2041/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
2042 * display. */
2043TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
2044{
2045 hwc2_display_t display;
2046 hwc2_layer_t layer = 0;
2047 int32_t x = 0, y = 0;
2048 hwc2_error_t err = HWC2_ERROR_NONE;
2049
2050 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2051
2052 ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
2053 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2054}
2055
2056/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
2057TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
2058{
2059 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2060 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002061 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002062
Marissa Wall5a240aa2016-12-15 12:34:06 -08002063 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002064 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
2065 badLayer, cursorPosition.left, cursorPosition.top,
2066 outErr));
2067 }
2068 ));
2069}
2070
Marissa Wallffc67da2016-12-15 12:26:09 -08002071/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
2072TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
2073{
2074 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2075 setBlendMode, advanceBlendMode));
2076}
2077
2078/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
2079TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
2080{
2081 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2082 setBlendMode, advanceBlendMode));
2083}
2084
2085/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
2086TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
2087{
2088 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2089 setBlendMode));
2090}
2091
2092/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
2093TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
2094{
2095 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2096 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2097 hwc2_error_t* outErr) {
2098
2099 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
2100 layer, HWC2_BLEND_MODE_INVALID, outErr));
2101 }
2102 ));
2103}
Marissa Wallb72b5c92016-12-15 12:26:39 -08002104
Marissa Wall5a240aa2016-12-15 12:34:06 -08002105/* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
2106TEST_F(Hwc2Test, SET_LAYER_BUFFER)
2107{
2108 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2109 setBuffer, advanceBuffer));
2110}
2111
2112/* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
2113TEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
2114{
2115 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2116 setBuffer, advanceBuffer));
2117}
2118
2119/* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
2120TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
2121{
2122 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2123 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
2124 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2125
2126 buffer_handle_t handle = nullptr;
2127 android::base::unique_fd acquireFence;
2128
2129 /* If there is not available buffer for the given buffer
2130 * properties, it should not fail this test case */
2131 if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
2132 *outErr = HWC2_ERROR_BAD_LAYER;
2133 return;
2134 }
2135
2136 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
2137 handle, acquireFence, outErr));
2138 }
2139 ));
2140}
2141
2142/* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
2143TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
2144{
2145 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2146 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2147 hwc2_error_t* outErr) {
2148
2149 buffer_handle_t handle = nullptr;
2150 int32_t acquireFence = -1;
2151
2152 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
2153 handle, acquireFence, outErr));
2154 }
2155 ));
2156}
2157
Marissa Wallee242782016-12-15 12:30:12 -08002158/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
2159TEST_F(Hwc2Test, SET_LAYER_COLOR)
2160{
2161 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2162 setColor, advanceColor));
2163}
2164
2165/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
2166TEST_F(Hwc2Test, SET_LAYER_COLOR_update)
2167{
2168 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2169 setColor, advanceColor));
2170}
2171
2172/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
2173 * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
2174TEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
2175{
2176 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
2177 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002178 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08002179
2180 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002181 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08002182 },
2183
2184 advanceColor));
2185}
2186
2187/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
2188TEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
2189{
2190 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2191 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002192 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08002193
2194 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002195 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08002196 }
2197 ));
2198}
2199
Marissa Wallb72b5c92016-12-15 12:26:39 -08002200/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
2201TEST_F(Hwc2Test, SET_LAYER_DATASPACE)
2202{
2203 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2204 setDataspace, advanceDataspace));
2205}
2206
2207/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
2208TEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
2209{
2210 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2211 setDataspace, advanceDataspace));
2212}
2213
2214/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
2215TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
2216{
2217 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2218 setDataspace));
2219}
Marissa Wall2b1f5302016-12-15 12:27:20 -08002220
Marissa Wall600a73b2016-12-15 12:30:39 -08002221/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
2222TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
2223{
2224 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2225 setDisplayFrame, advanceDisplayFrame));
2226}
2227
2228/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
2229TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
2230{
2231 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2232 setDisplayFrame, advanceDisplayFrame));
2233}
2234
2235/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
2236TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
2237{
2238 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2239 setDisplayFrame));
2240}
2241
Marissa Wall2b1f5302016-12-15 12:27:20 -08002242/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
2243TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
2244{
2245 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2246 setPlaneAlpha, advancePlaneAlpha));
2247}
2248
2249/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
2250TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
2251{
2252 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2253 setPlaneAlpha, advancePlaneAlpha));
2254}
2255
2256/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
2257TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
2258{
2259 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2260 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002261 Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
Marissa Wall2b1f5302016-12-15 12:27:20 -08002262
2263 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002264 badLayer, testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08002265 }
2266 ));
2267}
Marissa Wallac108192016-12-15 12:27:48 -08002268
Marissa Wallc57468f2016-12-15 12:31:12 -08002269/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
2270TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
2271{
2272 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2273 setSourceCrop, advanceSourceCrop));
2274}
2275
2276/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
2277TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
2278{
2279 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2280 setSourceCrop, advanceSourceCrop));
2281}
2282
2283/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
2284TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
2285{
2286 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2287 setSourceCrop));
2288}
2289
Marissa Wallad761812016-12-15 12:32:24 -08002290/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
2291TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
2292{
2293 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2294 setSurfaceDamage, advanceSurfaceDamage));
2295}
2296
2297/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
2298TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
2299{
2300 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2301 setSurfaceDamage, advanceSurfaceDamage));
2302}
2303
2304/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
2305TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
2306{
2307 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2308 setSurfaceDamage));
2309}
2310
Marissa Wallac108192016-12-15 12:27:48 -08002311/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
2312TEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
2313{
2314 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2315 setTransform, advanceTransform));
2316}
2317
2318/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
2319TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
2320{
2321 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2322 setTransform, advanceTransform));
2323}
2324
2325/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
2326TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
2327{
2328 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2329 setTransform));
2330}
Marissa Wall273b1df2016-12-15 12:28:47 -08002331
Marissa Wallf7618ed2016-12-15 12:34:39 -08002332/* TESTCASE: Tests that the HWC2 can set the visible region of a layer. */
2333TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION)
2334{
2335 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Basic, 5,
2336 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2337 Hwc2TestLayers* testLayers) {
2338
2339 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display,
2340 layer, testLayers->getVisibleRegion(layer)));
2341 },
2342
2343 advanceVisibleRegions));
2344}
2345
2346/* TESTCASE: Tests that the HWC2 cannot set the visible region of a bad layer. */
2347TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION_bad_layer)
2348{
2349 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2350 setVisibleRegion));
2351}
2352
Marissa Wall273b1df2016-12-15 12:28:47 -08002353/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
2354TEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
2355{
2356 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
2357 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002358 Hwc2TestLayers* testLayers) {
Marissa Wall273b1df2016-12-15 12:28:47 -08002359
2360 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002361 testLayers->getZOrder(layer)));
Marissa Wallf7618ed2016-12-15 12:34:39 -08002362 },
2363
2364 /* TestLayer z orders are set during the construction of TestLayers
2365 * and cannot be updated. There is no need (or ability) to cycle
2366 * through additional z order configurations. */
2367 [] (Hwc2TestLayers* /*testLayers*/) {
2368 return false;
Marissa Wall273b1df2016-12-15 12:28:47 -08002369 }
2370 ));
2371}
2372
2373/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
2374TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
2375{
2376 const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
2377 static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
2378 static_cast<uint32_t>(UINT32_MAX / 2),
2379 static_cast<uint32_t>(UINT32_MAX) };
2380
2381 for (auto display : mDisplays) {
2382 std::vector<hwc2_config_t> configs;
2383
2384 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2385
2386 for (auto config : configs) {
2387 hwc2_layer_t layer;
2388
2389 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2390
2391 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2392
2393 for (uint32_t zOrder : zOrders) {
2394 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
2395 }
2396
2397 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2398 }
2399 }
2400}
2401
2402/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
2403TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
2404{
2405 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2406 setZOrder));
2407}