blob: 751a9cc9ccb2ba602c4cf109cea4f60ef9d5092a [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 Wall563030b2017-02-21 14:01:05 -080019#include <unordered_map>
Marissa Wall4d600052016-12-15 12:16:01 -080020#include <gtest/gtest.h>
21#include <dlfcn.h>
Marissa Wall5a240aa2016-12-15 12:34:06 -080022#include <android-base/unique_fd.h>
Marissa Wall4d600052016-12-15 12:16:01 -080023#include <hardware/hardware.h>
Marissa Wall563030b2017-02-21 14:01:05 -080024#include <sync/sync.h>
Marissa Wall4d600052016-12-15 12:16:01 -080025
26#define HWC2_INCLUDE_STRINGIFICATION
27#define HWC2_USE_CPP11
28#include <hardware/hwcomposer2.h>
29#undef HWC2_INCLUDE_STRINGIFICATION
30#undef HWC2_USE_CPP11
31
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080032#include "Hwc2TestLayer.h"
Marissa Wall273b1df2016-12-15 12:28:47 -080033#include "Hwc2TestLayers.h"
Marissa Wallf18cfb02017-02-21 14:01:05 -080034#include "Hwc2TestClientTarget.h"
Marissa Wallbad1bc72017-02-21 14:33:46 -080035#include "Hwc2TestVirtualDisplay.h"
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080036
Marissa Wallcfb9a072017-02-17 20:53:18 -080037void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
38 hwc2_display_t display, int32_t connected);
Marissa Wall572a1ee2016-12-15 12:24:13 -080039void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
40 hwc2_display_t display, int64_t timestamp);
Marissa Wallcfb9a072017-02-17 20:53:18 -080041
Marissa Wall4d600052016-12-15 12:16:01 -080042class Hwc2Test : public testing::Test {
43public:
44
45 virtual void SetUp()
46 {
47 hw_module_t const* hwc2Module;
48
49 int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
50 ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
51 << strerror(-err);
52
53 /* The following method will fail if you have not run
54 * "adb shell stop" */
55 err = hwc2_open(hwc2Module, &mHwc2Device);
56 ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
57 << strerror(-err);
Marissa Wallcfb9a072017-02-17 20:53:18 -080058
59 populateDisplays();
Marissa Wall4d600052016-12-15 12:16:01 -080060 }
61
62 virtual void TearDown()
63 {
Marissa Wall1db2e372016-12-15 12:19:39 -080064
65 for (auto itr = mLayers.begin(); itr != mLayers.end();) {
66 hwc2_display_t display = itr->first;
67 hwc2_layer_t layer = itr->second;
68 itr++;
69 /* Destroys and removes the layer from mLayers */
70 destroyLayer(display, layer);
71 }
72
Marissa Wall03c91732016-12-15 12:23:16 -080073 for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
74 hwc2_display_t display = *itr;
75 itr++;
76 /* Sets power mode to off and removes the display from
77 * mActiveDisplays */
78 setPowerMode(display, HWC2_POWER_MODE_OFF);
79 }
80
Marissa Wallbad1bc72017-02-21 14:33:46 -080081 for (auto itr = mVirtualDisplays.begin(); itr != mVirtualDisplays.end();) {
82 hwc2_display_t display = *itr;
83 itr++;
84 /* Destroys virtual displays */
85 destroyVirtualDisplay(display);
86 }
87
Marissa Wall4d600052016-12-15 12:16:01 -080088 if (mHwc2Device)
89 hwc2_close(mHwc2Device);
90 }
91
Marissa Walla4b01482017-02-17 20:52:03 -080092 void registerCallback(hwc2_callback_descriptor_t descriptor,
93 hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
94 hwc2_error_t* outErr = nullptr)
95 {
96 auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
97 getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
98 ASSERT_TRUE(pfn) << "failed to get function";
99
100 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
101 callbackData, pointer));
102 if (outErr) {
103 *outErr = err;
104 } else {
105 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
106 }
107 }
108
Marissa Wallcfb9a072017-02-17 20:53:18 -0800109 void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
110 hwc2_error_t* outErr = nullptr)
111 {
112 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
113 getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
114 ASSERT_TRUE(pfn) << "failed to get function";
115
116 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
117 reinterpret_cast<int32_t*>(outType)));
118 if (outErr) {
119 *outErr = err;
120 } else {
121 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
122 }
123 }
124
125 /* If the populateDisplays function is still receiving displays and the
126 * display is connected, the display handle is stored in mDisplays. */
127 void hotplugCallback(hwc2_display_t display, int32_t connected)
128 {
129 std::lock_guard<std::mutex> lock(mHotplugMutex);
130
131 if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
132 return;
133
134 if (connected == HWC2_CONNECTION_CONNECTED)
135 mDisplays.insert(display);
136
137 mHotplugCv.notify_all();
138 }
139
Marissa Wall1db2e372016-12-15 12:19:39 -0800140 void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
141 hwc2_error_t* outErr = nullptr)
142 {
143 auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
144 getFunction(HWC2_FUNCTION_CREATE_LAYER));
145 ASSERT_TRUE(pfn) << "failed to get function";
146
147 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
148 outLayer));
149
150 if (err == HWC2_ERROR_NONE)
151 mLayers.insert(std::make_pair(display, *outLayer));
152
153 if (outErr) {
154 *outErr = err;
155 } else {
156 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
157 }
158 }
159
160 void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
161 hwc2_error_t* outErr = nullptr)
162 {
163 auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
164 getFunction(HWC2_FUNCTION_DESTROY_LAYER));
165 ASSERT_TRUE(pfn) << "failed to get function";
166
167 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
168
169 if (err == HWC2_ERROR_NONE)
170 mLayers.erase(std::make_pair(display, layer));
171
172 if (outErr) {
173 *outErr = err;
174 } else {
175 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
176 << layer;
177 }
178 }
179
Marissa Wallcf935cb2016-12-15 12:20:47 -0800180 void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
181 hwc2_attribute_t attribute, int32_t* outValue,
182 hwc2_error_t* outErr = nullptr)
183 {
184 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
185 getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
186 ASSERT_TRUE(pfn) << "failed to get function";
187
188 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
189 attribute, outValue));
190
191 if (outErr) {
192 *outErr = err;
193 } else {
194 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
195 << getAttributeName(attribute) << " for config " << config;
196 }
197 }
198
199 void getDisplayConfigs(hwc2_display_t display,
200 std::vector<hwc2_config_t>* outConfigs,
201 hwc2_error_t* outErr = nullptr)
202 {
203 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
204 getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
205 ASSERT_TRUE(pfn) << "failed to get function";
206
207 uint32_t numConfigs = 0;
208
209 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
210 &numConfigs, nullptr));
211
212 if (err == HWC2_ERROR_NONE) {
213 outConfigs->resize(numConfigs);
214
215 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
216 &numConfigs, outConfigs->data()));
217 }
218
219 if (outErr) {
220 *outErr = err;
221 } else {
222 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
223 " display " << display;
224 }
225 }
226
Marissa Wall93dc04f2016-12-15 12:21:46 -0800227 void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
228 hwc2_error_t* outErr = nullptr)
229 {
230 auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
231 getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
232 ASSERT_TRUE(pfn) << "failed to get function";
233
234 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
235 outConfig));
236 if (outErr) {
237 *outErr = err;
238 } else {
239 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
240 " display " << display;
241 }
242 }
243
244 void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
245 hwc2_error_t* outErr = nullptr)
246 {
247 auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
248 getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
249 ASSERT_TRUE(pfn) << "failed to get function";
250
251 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
252 if (outErr) {
253 *outErr = err;
254 } else {
255 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
256 << config;
257 }
258 }
259
Marissa Wall03c91732016-12-15 12:23:16 -0800260 void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
261 hwc2_error_t* outErr = nullptr)
262 {
263 auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
264 getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
265 ASSERT_TRUE(pfn) << "failed to get function";
266
267 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
268 outSupport));
269 if (outErr) {
270 *outErr = err;
271 } else {
272 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
273 " display " << display;
274 }
275 }
276
277 void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
278 hwc2_error_t* outErr = nullptr)
279 {
280 auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
281 getFunction(HWC2_FUNCTION_SET_POWER_MODE));
282 ASSERT_TRUE(pfn) << "failed to get function";
283
284 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
285 mode));
286 if (outErr) {
287 *outErr = err;
288 if (err != HWC2_ERROR_NONE)
289 return;
290 } else {
291 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
292 << getPowerModeName(mode) << " on display " << display;
293 }
294
295 if (mode == HWC2_POWER_MODE_OFF) {
296 mActiveDisplays.erase(display);
297 } else {
298 mActiveDisplays.insert(display);
299 }
300 }
301
Marissa Wall572a1ee2016-12-15 12:24:13 -0800302 void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
303 hwc2_error_t* outErr = nullptr)
304 {
305 auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
306 getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
307 ASSERT_TRUE(pfn) << "failed to get function";
308
309 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
310 enabled));
311 if (outErr) {
312 *outErr = err;
313 } else {
314 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
315 << getVsyncName(enabled);
316 }
317 }
318
319 void vsyncCallback(hwc2_display_t display, int64_t timestamp)
320 {
321 std::lock_guard<std::mutex> lock(mVsyncMutex);
322 mVsyncDisplay = display;
323 mVsyncTimestamp = timestamp;
324 mVsyncCv.notify_all();
325 }
326
Marissa Walldd4087f2016-12-15 12:24:52 -0800327 void getDisplayName(hwc2_display_t display, std::string* outName,
328 hwc2_error_t* outErr = nullptr)
329 {
330 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
331 getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
332 ASSERT_TRUE(pfn) << "failed to get function";
333
334 uint32_t size = 0;
335
336 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
337 nullptr));
338
339 if (err == HWC2_ERROR_NONE) {
340 std::vector<char> name(size);
341
342 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
343 name.data()));
344
345 outName->assign(name.data());
346 }
347
348 if (outErr) {
349 *outErr = err;
350 } else {
351 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
352 << display;
353 }
354 }
355
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800356 void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
357 hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
358 {
359 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
360 getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
361 ASSERT_TRUE(pfn) << "failed to get function";
362
363 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
364 composition));
365 if (outErr) {
366 *outErr = err;
367 } else {
368 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
369 " type " << getCompositionName(composition);
370 }
371 }
372
Marissa Wall2a0aaf92016-12-15 12:31:37 -0800373 void setCursorPosition(hwc2_display_t display, hwc2_layer_t layer,
374 int32_t x, int32_t y, hwc2_error_t* outErr = nullptr)
375 {
376 auto pfn = reinterpret_cast<HWC2_PFN_SET_CURSOR_POSITION>(
377 getFunction(HWC2_FUNCTION_SET_CURSOR_POSITION));
378 ASSERT_TRUE(pfn) << "failed to get function";
379
380 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, x,
381 y));
382 if (outErr) {
383 *outErr = err;
384 } else {
385 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set cursor position";
386 }
387 }
388
Marissa Wallffc67da2016-12-15 12:26:09 -0800389 void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
390 hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
391 {
392 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
393 getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
394 ASSERT_TRUE(pfn) << "failed to get function";
395
396 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
397 mode));
398 if (outErr) {
399 *outErr = err;
400 } else {
401 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
402 << getBlendModeName(mode);
403 }
404 }
405
Marissa Wall5a240aa2016-12-15 12:34:06 -0800406 void setLayerBuffer(hwc2_display_t display, hwc2_layer_t layer,
407 buffer_handle_t buffer, int32_t acquireFence,
408 hwc2_error_t* outErr = nullptr)
409 {
410 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BUFFER>(
411 getFunction(HWC2_FUNCTION_SET_LAYER_BUFFER));
412 ASSERT_TRUE(pfn) << "failed to get function";
413
414 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
415 buffer, acquireFence));
416 if (outErr) {
417 *outErr = err;
418 } else {
419 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer buffer";
420 }
421 }
422
Marissa Wallee242782016-12-15 12:30:12 -0800423 void setLayerColor(hwc2_display_t display, hwc2_layer_t layer,
424 hwc_color_t color, hwc2_error_t* outErr = nullptr)
425 {
426 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COLOR>(
427 getFunction(HWC2_FUNCTION_SET_LAYER_COLOR));
428 ASSERT_TRUE(pfn) << "failed to get function";
429
430 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
431 color));
432 if (outErr) {
433 *outErr = err;
434 } else {
435 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer color";
436 }
437 }
438
Marissa Wallb72b5c92016-12-15 12:26:39 -0800439 void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
440 android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
441 {
442 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
443 getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
444 ASSERT_TRUE(pfn) << "failed to get function";
445
446 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
447 layer, dataspace));
448 if (outErr) {
449 *outErr = err;
450 } else {
451 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
452 }
453 }
454
Marissa Wall600a73b2016-12-15 12:30:39 -0800455 void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
456 const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
457 {
458 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
459 getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
460 ASSERT_TRUE(pfn) << "failed to get function";
461
462 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
463 displayFrame));
464 if (outErr) {
465 *outErr = err;
466 } else {
467 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
468 " frame";
469 }
470 }
471
Marissa Wall2b1f5302016-12-15 12:27:20 -0800472 void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
473 float alpha, hwc2_error_t* outErr = nullptr)
474 {
475 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
476 getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
477 ASSERT_TRUE(pfn) << "failed to get function";
478
479 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
480 alpha));
481 if (outErr) {
482 *outErr = err;
483 } else {
484 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
485 << alpha;
486 }
487 }
488
Marissa Wallc57468f2016-12-15 12:31:12 -0800489 void setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer,
490 const hwc_frect_t& sourceCrop, hwc2_error_t* outErr = nullptr)
491 {
492 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
493 getFunction(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP));
494 ASSERT_TRUE(pfn) << "failed to get function";
495
496 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
497 sourceCrop));
498 if (outErr) {
499 *outErr = err;
500 } else {
501 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer source crop";
502 }
503 }
504
Marissa Wallad761812016-12-15 12:32:24 -0800505 void setLayerSurfaceDamage(hwc2_display_t display, hwc2_layer_t layer,
506 const hwc_region_t& surfaceDamage, hwc2_error_t* outErr = nullptr)
507 {
508 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
509 getFunction(HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE));
510 ASSERT_TRUE(pfn) << "failed to get function";
511
512 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
513 surfaceDamage));
514 if (outErr) {
515 *outErr = err;
516 } else {
517 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer surface"
518 " damage";
519 }
520 }
521
Marissa Wallac108192016-12-15 12:27:48 -0800522 void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
523 hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
524 {
525 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
526 getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
527 ASSERT_TRUE(pfn) << "failed to get function";
528
529 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
530 transform));
531 if (outErr) {
532 *outErr = err;
533 } else {
534 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
535 << getTransformName(transform);
536 }
537 }
538
Marissa Wallf7618ed2016-12-15 12:34:39 -0800539 void setLayerVisibleRegion(hwc2_display_t display, hwc2_layer_t layer,
540 const hwc_region_t& visibleRegion, hwc2_error_t* outErr = nullptr)
541 {
542 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_VISIBLE_REGION>(
543 getFunction(HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION));
544 ASSERT_TRUE(pfn) << "failed to get function";
545
546 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
547 visibleRegion));
548 if (outErr) {
549 *outErr = err;
550 } else {
551 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer visible"
552 " region";
553 }
554 }
555
Marissa Wall273b1df2016-12-15 12:28:47 -0800556 void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
557 uint32_t zOrder, hwc2_error_t* outErr = nullptr)
558 {
559 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
560 getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
561 ASSERT_TRUE(pfn) << "failed to get function";
562
563 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
564 zOrder));
565 if (outErr) {
566 *outErr = err;
567 } else {
568 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
569 << zOrder;
570 }
571 }
572
Marissa Wall1cd789c2017-01-27 12:55:36 -0800573 void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
574 uint32_t* outNumRequests, hwc2_error_t* outErr)
575 {
576 auto pfn = reinterpret_cast<HWC2_PFN_VALIDATE_DISPLAY>(
577 getFunction(HWC2_FUNCTION_VALIDATE_DISPLAY));
578 ASSERT_TRUE(pfn) << "failed to get function";
579
580 *outErr = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
581 outNumTypes, outNumRequests));
582 }
583
584 void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
585 uint32_t* outNumRequests, bool* outHasChanges)
586 {
587 hwc2_error_t err = HWC2_ERROR_NONE;
588
589 EXPECT_NO_FATAL_FAILURE(validateDisplay(display, outNumTypes,
590 outNumRequests, &err));
591
592 if (err != HWC2_ERROR_HAS_CHANGES) {
593 *outHasChanges = false;
594 EXPECT_EQ(err, HWC2_ERROR_NONE) << "failed to validate display";
595 } else {
596 *outHasChanges = true;
597 }
598 }
599
Marissa Wall706178d2016-12-15 12:39:14 -0800600 void getDisplayRequests(hwc2_display_t display,
601 hwc2_display_request_t* outDisplayRequests,
602 std::vector<hwc2_layer_t>* outLayers,
603 std::vector<hwc2_layer_request_t>* outLayerRequests,
604 hwc2_error_t* outErr = nullptr)
605 {
606 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_REQUESTS>(
607 getFunction(HWC2_FUNCTION_GET_DISPLAY_REQUESTS));
608 ASSERT_TRUE(pfn) << "failed to get function";
609
610 uint32_t numElements = 0;
611
612 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
613 reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
614 nullptr, nullptr));
615
616 if (err == HWC2_ERROR_NONE && numElements > 0) {
617 outLayers->resize(numElements);
618 outLayerRequests->resize(numElements);
619
620 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
621 reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
622 reinterpret_cast<uint64_t*>(outLayers->data()),
623 reinterpret_cast<int32_t*>(outLayerRequests->data())));
624 }
625
626 if (outErr) {
627 *outErr = err;
628 } else {
629 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display requests";
630 }
631 }
632
633 void handleRequests(hwc2_display_t display,
634 const std::vector<hwc2_layer_t>& layers, uint32_t numRequests,
635 std::set<hwc2_layer_t>* outClearLayers = nullptr,
636 bool* outFlipClientTarget = nullptr)
637 {
638 hwc2_display_request_t displayRequest =
639 static_cast<hwc2_display_request_t>(0);
640 std::vector<hwc2_layer_t> requestedLayers;
641 std::vector<hwc2_layer_request_t> requests;
642
643 ASSERT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequest,
644 &requestedLayers, &requests));
645
646 EXPECT_EQ(numRequests, requests.size()) << "validate returned "
647 << numRequests << " requests and get display requests returned "
648 << requests.size() << " requests";
649
650 for (size_t i = 0; i < requests.size(); i++) {
651 hwc2_layer_t requestedLayer = requestedLayers.at(i);
652 hwc2_layer_request_t request = requests.at(i);
653
654 EXPECT_EQ(std::count(layers.begin(), layers.end(), requestedLayer),
655 0) << "get display requests returned an unknown layer";
656 EXPECT_NE(request, 0) << "returned empty request for layer "
657 << requestedLayer;
658
659 if (outClearLayers && request
660 == HWC2_LAYER_REQUEST_CLEAR_CLIENT_TARGET)
661 outClearLayers->insert(requestedLayer);
662 }
663
664 if (outFlipClientTarget)
665 *outFlipClientTarget = displayRequest
666 & HWC2_DISPLAY_REQUEST_FLIP_CLIENT_TARGET;
667 }
668
669 void getChangedCompositionTypes(hwc2_display_t display,
670 std::vector<hwc2_layer_t>* outLayers,
671 std::vector<hwc2_composition_t>* outTypes,
672 hwc2_error_t* outErr = nullptr)
673 {
674 auto pfn = reinterpret_cast<HWC2_PFN_GET_CHANGED_COMPOSITION_TYPES>(
675 getFunction(HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES));
676 ASSERT_TRUE(pfn) << "failed to get function";
677
678 uint32_t numElements = 0;
679
680 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
681 &numElements, nullptr, nullptr));
682
683 if (err == HWC2_ERROR_NONE && numElements > 0) {
684 outLayers->resize(numElements);
685 outTypes->resize(numElements);
686
687 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
688 &numElements, reinterpret_cast<uint64_t*>(outLayers->data()),
689 reinterpret_cast<int32_t*>(outTypes->data())));
690 }
691
692 if (outErr) {
693 *outErr = err;
694 } else {
695 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get changed"
696 " composition types";
697 }
698 }
699
700 void handleCompositionChanges(hwc2_display_t display,
701 const Hwc2TestLayers& testLayers,
702 const std::vector<hwc2_layer_t>& layers, uint32_t numTypes,
703 std::set<hwc2_layer_t>* outClientLayers = nullptr)
704 {
705 std::vector<hwc2_layer_t> changedLayers;
706 std::vector<hwc2_composition_t> types;
707
708 ASSERT_NO_FATAL_FAILURE(getChangedCompositionTypes(display,
709 &changedLayers, &types));
710
711 EXPECT_EQ(numTypes, types.size()) << "validate returned "
712 << numTypes << " types and get changed composition types"
713 " returned " << types.size() << " types";
714
715 for (size_t i = 0; i < types.size(); i++) {
716
717 auto layer = std::find(layers.begin(), layers.end(),
718 changedLayers.at(i));
719
720 EXPECT_TRUE(layer != layers.end() || !testLayers.contains(*layer))
721 << "get changed composition types returned an unknown layer";
722
723 hwc2_composition_t requestedType = testLayers.getComposition(*layer);
724 hwc2_composition_t returnedType = types.at(i);
725
726 EXPECT_NE(returnedType, HWC2_COMPOSITION_INVALID) << "get changed"
727 " composition types returned invalid composition";
728
729 switch (requestedType) {
730 case HWC2_COMPOSITION_CLIENT:
731 EXPECT_TRUE(false) << getCompositionName(returnedType)
732 << " cannot be changed";
733 break;
734 case HWC2_COMPOSITION_DEVICE:
735 case HWC2_COMPOSITION_SOLID_COLOR:
736 EXPECT_EQ(returnedType, HWC2_COMPOSITION_CLIENT)
737 << "composition of type "
738 << getCompositionName(requestedType)
739 << " can only be changed to "
740 << getCompositionName(HWC2_COMPOSITION_CLIENT);
741 break;
742 case HWC2_COMPOSITION_CURSOR:
743 case HWC2_COMPOSITION_SIDEBAND:
744 EXPECT_TRUE(returnedType == HWC2_COMPOSITION_CLIENT
745 || returnedType == HWC2_COMPOSITION_DEVICE)
746 << "composition of type "
747 << getCompositionName(requestedType)
748 << " can only be changed to "
749 << getCompositionName(HWC2_COMPOSITION_CLIENT) << " or "
750 << getCompositionName(HWC2_COMPOSITION_DEVICE);
751 break;
752 default:
753 EXPECT_TRUE(false) << "unknown type "
754 << getCompositionName(requestedType);
755 break;
756 }
757
758 if (outClientLayers)
759 if (returnedType == HWC2_COMPOSITION_CLIENT)
760 outClientLayers->insert(*layer);
761 }
762
763 if (outClientLayers) {
764 for (auto layer : layers) {
765 if (testLayers.getComposition(layer) == HWC2_COMPOSITION_CLIENT)
766 outClientLayers->insert(layer);
767 }
768 }
769 }
770
771 void acceptDisplayChanges(hwc2_display_t display,
772 hwc2_error_t* outErr = nullptr)
773 {
774 auto pfn = reinterpret_cast<HWC2_PFN_ACCEPT_DISPLAY_CHANGES>(
775 getFunction(HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES));
776 ASSERT_TRUE(pfn) << "failed to get function";
777
778 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display));
779 if (outErr) {
780 *outErr = err;
781 } else {
782 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to accept display changes";
783 }
784 }
785
Marissa Wallf18cfb02017-02-21 14:01:05 -0800786 void getClientTargetSupport(hwc2_display_t display, int32_t width,
787 int32_t height, android_pixel_format_t format,
788 android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
789 {
790 auto pfn = reinterpret_cast<HWC2_PFN_GET_CLIENT_TARGET_SUPPORT>(
791 getFunction(HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT));
792 ASSERT_TRUE(pfn) << "failed to get function";
793
794 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, width,
795 height, format, dataspace));
796 if (outErr) {
797 *outErr = err;
798 } else {
799 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get client target"
800 " support";
801 }
802 }
803
804 void setClientTarget(hwc2_display_t display, buffer_handle_t handle,
805 int32_t acquireFence, android_dataspace_t dataspace,
806 hwc_region_t damage, hwc2_error_t* outErr = nullptr)
807 {
808 auto pfn = reinterpret_cast<HWC2_PFN_SET_CLIENT_TARGET>(
809 getFunction(HWC2_FUNCTION_SET_CLIENT_TARGET));
810 ASSERT_TRUE(pfn) << "failed to get function";
811
812 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, handle,
813 acquireFence, dataspace, damage));
814 if (outErr) {
815 *outErr = err;
816 } else {
817 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set client target";
818 }
819 }
820
Marissa Wall563030b2017-02-21 14:01:05 -0800821 void presentDisplay(hwc2_display_t display, int32_t* outPresentFence,
822 hwc2_error_t* outErr = nullptr)
823 {
824 auto pfn = reinterpret_cast<HWC2_PFN_PRESENT_DISPLAY>(
825 getFunction(HWC2_FUNCTION_PRESENT_DISPLAY));
826 ASSERT_TRUE(pfn) << "failed to get function";
827
828 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
829 outPresentFence));
830 if (outErr) {
831 *outErr = err;
832 } else {
833 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to present display";
834 }
835 }
836
837 void getReleaseFences(hwc2_display_t display,
838 std::vector<hwc2_layer_t>* outLayers,
839 std::vector<int32_t>* outFences, hwc2_error_t* outErr = nullptr)
840 {
841 auto pfn = reinterpret_cast<HWC2_PFN_GET_RELEASE_FENCES>(
842 getFunction(HWC2_FUNCTION_GET_RELEASE_FENCES));
843 ASSERT_TRUE(pfn) << "failed to get function";
844
845 uint32_t numElements = 0;
846
847 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
848 &numElements, nullptr, nullptr));
849
850 if (err == HWC2_ERROR_NONE) {
851 outLayers->resize(numElements);
852 outFences->resize(numElements);
853
854 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
855 &numElements, outLayers->data(), outFences->data()));
856 }
857
858 if (outErr) {
859 *outErr = err;
860 } else {
861 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get release fences";
862 }
863 }
864
Marissa Wall35040c52016-12-15 12:41:06 -0800865 void getColorModes(hwc2_display_t display,
866 std::vector<android_color_mode_t>* outColorModes,
867 hwc2_error_t* outErr = nullptr)
868 {
869 auto pfn = reinterpret_cast<HWC2_PFN_GET_COLOR_MODES>(
870 getFunction(HWC2_FUNCTION_GET_COLOR_MODES));
871 ASSERT_TRUE(pfn) << "failed to get function";
872
873 uint32_t numColorModes = 0;
874
875 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
876 &numColorModes, nullptr));
877 if (err == HWC2_ERROR_NONE) {
878 outColorModes->resize(numColorModes);
879
880 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
881 &numColorModes,
882 reinterpret_cast<int32_t*>(outColorModes->data())));
883 }
884
885 if (outErr) {
886 *outErr = err;
887 } else {
888 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get color modes for"
889 " display " << display;
890 }
891 }
892
893 void setColorMode(hwc2_display_t display, android_color_mode_t colorMode,
894 hwc2_error_t* outErr = nullptr)
895 {
896 auto pfn = reinterpret_cast<HWC2_PFN_SET_COLOR_MODE>(
897 getFunction(HWC2_FUNCTION_SET_COLOR_MODE));
898 ASSERT_TRUE(pfn) << "failed to get function";
899
900 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
901 static_cast<int32_t>(colorMode)));
902 if (outErr) {
903 *outErr = err;
904 } else {
905 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set color mode "
906 << colorMode;
907 }
908 }
909
910 void getHdrCapabilities(hwc2_display_t display,
911 std::vector<android_hdr_t>* outTypes, float* outMaxLuminance,
912 float* outMaxAverageLuminance, float* outMinLuminance,
913 hwc2_error_t* outErr = nullptr)
914 {
915 auto pfn = reinterpret_cast<HWC2_PFN_GET_HDR_CAPABILITIES>(
916 getFunction(HWC2_FUNCTION_GET_HDR_CAPABILITIES));
917 ASSERT_TRUE(pfn) << "failed to get function";
918
919 uint32_t numTypes = 0;
920
921 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
922 &numTypes, nullptr, outMaxLuminance, outMaxAverageLuminance,
923 outMinLuminance));
924
925 if (err == HWC2_ERROR_NONE) {
926 outTypes->resize(numTypes);
927
928 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &numTypes,
929 reinterpret_cast<int32_t*>(outTypes->data()), outMaxLuminance,
930 outMaxAverageLuminance, outMinLuminance));
931 }
932
933 if (outErr) {
934 *outErr = err;
935 } else {
936 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get hdr capabilities"
937 " for display " << display;
938 }
939 }
940
941 void setColorTransform(hwc2_display_t display,
942 const std::array<float, 16>& matrix, android_color_transform_t hint,
943 hwc2_error_t* outErr = nullptr)
944 {
945 auto pfn = reinterpret_cast<HWC2_PFN_SET_COLOR_TRANSFORM>(
946 getFunction(HWC2_FUNCTION_SET_COLOR_TRANSFORM));
947 ASSERT_TRUE(pfn) << "failed to get function";
948
949 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
950 matrix.data(), hint));
951
952 if (outErr) {
953 *outErr = err;
954 } else {
955 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set color transform "
956 << hint;
957 }
958 }
959
Marissa Wallbad1bc72017-02-21 14:33:46 -0800960 void createVirtualDisplay(uint32_t width, uint32_t height,
961 android_pixel_format_t* outFormat, hwc2_display_t* outDisplay,
962 hwc2_error_t* outErr = nullptr)
963 {
964 auto pfn = reinterpret_cast<HWC2_PFN_CREATE_VIRTUAL_DISPLAY>(
965 getFunction(HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY));
966 ASSERT_TRUE(pfn) << "failed to get function";
967
968 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, width, height,
969 reinterpret_cast<int32_t*>(outFormat), outDisplay));
970
971 if (err == HWC2_ERROR_NONE)
972 mVirtualDisplays.insert(*outDisplay);
973
974 if (outErr) {
975 *outErr = err;
976 } else {
977 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create virtual display";
978 }
979 }
980
981 void destroyVirtualDisplay(hwc2_display_t display,
982 hwc2_error_t* outErr = nullptr)
983 {
984 auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_VIRTUAL_DISPLAY>(
985 getFunction(HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY));
986 ASSERT_TRUE(pfn) << "failed to get function";
987
988 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display));
989
990 if (err == HWC2_ERROR_NONE)
991 mVirtualDisplays.erase(display);
992
993 if (outErr) {
994 *outErr = err;
995 } else {
996 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy virtual display";
997 }
998 }
999
1000 void getMaxVirtualDisplayCount(uint32_t* outMaxCnt)
1001 {
1002 auto pfn = reinterpret_cast<HWC2_PFN_GET_MAX_VIRTUAL_DISPLAY_COUNT>(
1003 getFunction(HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT));
1004 ASSERT_TRUE(pfn) << "failed to get function";
1005
1006 *outMaxCnt = pfn(mHwc2Device);
1007 }
1008
1009 void setOutputBuffer(hwc2_display_t display, buffer_handle_t buffer,
1010 int32_t releaseFence, hwc2_error_t* outErr = nullptr)
1011 {
1012 auto pfn = reinterpret_cast<HWC2_PFN_SET_OUTPUT_BUFFER>(
1013 getFunction(HWC2_FUNCTION_SET_OUTPUT_BUFFER));
1014 ASSERT_TRUE(pfn) << "failed to get function";
1015
1016 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, buffer,
1017 releaseFence));
1018 if (outErr) {
1019 *outErr = err;
1020 } else {
1021 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set output buffer";
1022 }
1023 }
1024
Marissa Wallf18cfb02017-02-21 14:01:05 -08001025 void getBadDisplay(hwc2_display_t* outDisplay)
1026 {
1027 for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
1028 if (mDisplays.count(display) == 0) {
1029 *outDisplay = display;
1030 return;
1031 }
1032 }
1033 ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
1034 " are registered. This should never happen.";
1035 }
1036
Marissa Wall563030b2017-02-21 14:01:05 -08001037 void waitForVsync(hwc2_display_t* outDisplay = nullptr,
1038 int64_t* outTimestamp = nullptr)
1039 {
1040 std::unique_lock<std::mutex> lock(mVsyncMutex);
1041 ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
1042 std::cv_status::no_timeout) << "timed out attempting to get"
1043 " vsync callback";
1044 if (outDisplay)
1045 *outDisplay = mVsyncDisplay;
1046 if (outTimestamp)
1047 *outTimestamp = mVsyncTimestamp;
1048 }
1049
1050 void enableVsync(hwc2_display_t display)
1051 {
1052 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
1053 reinterpret_cast<hwc2_function_pointer_t>(
1054 hwc2TestVsyncCallback)));
1055 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1056 }
1057
1058 void disableVsync(hwc2_display_t display)
1059 {
1060 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1061 }
1062
Marissa Wall4d600052016-12-15 12:16:01 -08001063protected:
1064 hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
1065 {
1066 return mHwc2Device->getFunction(mHwc2Device, descriptor);
1067 }
1068
1069 void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
1070 {
1071 uint32_t num = 0;
1072
1073 mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
1074
1075 outCapabilities->resize(num);
1076
1077 mHwc2Device->getCapabilities(mHwc2Device, &num,
1078 reinterpret_cast<int32_t*>(outCapabilities->data()));
1079 }
1080
Marissa Wallcfb9a072017-02-17 20:53:18 -08001081 /* Registers a hotplug callback and waits for hotplug callbacks. This
1082 * function will have no effect if called more than once. */
1083 void populateDisplays()
1084 {
1085 /* Sets the hotplug status to receiving */
1086 {
1087 std::lock_guard<std::mutex> lock(mHotplugMutex);
1088
1089 if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
1090 return;
1091 mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
1092 }
1093
1094 /* Registers the callback. This function call cannot be locked because
1095 * a callback could happen on the same thread */
1096 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
1097 reinterpret_cast<hwc2_function_pointer_t>(
1098 hwc2TestHotplugCallback)));
1099
1100 /* Waits for hotplug events. If a hotplug event has not come within 1
1101 * second, stop waiting. */
1102 std::unique_lock<std::mutex> lock(mHotplugMutex);
1103
1104 while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
1105 std::cv_status::timeout) { }
1106
1107 /* Sets the hotplug status to done. Future calls will have no effect */
1108 mHotplugStatus = Hwc2TestHotplugStatus::Done;
1109 }
1110
Marissa Wall1db2e372016-12-15 12:19:39 -08001111 /* NOTE: will create min(newlayerCnt, max supported layers) layers */
1112 void createLayers(hwc2_display_t display,
1113 std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
1114 {
1115 std::vector<hwc2_layer_t> newLayers;
1116 hwc2_layer_t layer;
1117 hwc2_error_t err = HWC2_ERROR_NONE;
1118
1119 for (size_t i = 0; i < newLayerCnt; i++) {
1120
1121 EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
1122 if (err == HWC2_ERROR_NO_RESOURCES)
1123 break;
1124 if (err != HWC2_ERROR_NONE) {
1125 newLayers.clear();
1126 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
1127 }
1128 newLayers.push_back(layer);
1129 }
1130
1131 *outLayers = std::move(newLayers);
1132 }
1133
1134 void destroyLayers(hwc2_display_t display,
1135 std::vector<hwc2_layer_t>&& layers)
1136 {
1137 for (hwc2_layer_t layer : layers) {
1138 EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1139 }
1140 }
1141
Marissa Wallcf935cb2016-12-15 12:20:47 -08001142 void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
1143 {
1144 std::vector<hwc2_config_t> configs;
1145
1146 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1147
1148 hwc2_config_t CONFIG_MAX = UINT32_MAX;
1149
1150 ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
1151 " (2^32 values) has been taken which shouldn't happen";
1152
1153 hwc2_config_t config;
1154 for (config = 0; config < CONFIG_MAX; config++) {
1155 if (std::count(configs.begin(), configs.end(), config) == 0)
1156 break;
1157 }
1158
1159 *outConfig = config;
1160 }
1161
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001162 /* Calls a set property function from Hwc2Test to set a property value from
1163 * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
1164 using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
1165 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001166 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001167
Marissa Wall273b1df2016-12-15 12:28:47 -08001168 /* Calls a set property function from Hwc2Test to set property values from
1169 * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
1170 using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
1171 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001172 Hwc2TestLayers* testLayers);
Marissa Wall273b1df2016-12-15 12:28:47 -08001173
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001174 /* Calls a set property function from Hwc2Test to set a bad property value
1175 * on hwc2_layer_t on hwc2_display_t */
1176 using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
1177 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001178 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001179
1180 /* Calls a set property function from Hwc2Test to set a bad property value
1181 * on hwc2_layer_t on hwc2_display_t */
1182 using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
1183 hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
1184
Marissa Wall1cd789c2017-01-27 12:55:36 -08001185 /* Is called after a display is powered on and all layer properties have
1186 * been set. It should be used to test functions such as validate, accepting
1187 * changes, present, etc. */
1188 using TestDisplayLayersFunction = void (*)(Hwc2Test* test,
Marissa Wall706178d2016-12-15 12:39:14 -08001189 hwc2_display_t display, const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08001190 Hwc2TestLayers* testLayers);
Marissa Wall706178d2016-12-15 12:39:14 -08001191
1192 /* It is called on an non validated display */
1193 using TestDisplayNonValidatedLayersFunction = void (*)(Hwc2Test* test,
1194 hwc2_display_t display, std::vector<hwc2_layer_t>* layers);
Marissa Wall1cd789c2017-01-27 12:55:36 -08001195
Marissa Wallf18cfb02017-02-21 14:01:05 -08001196 /* Tests client target support on a particular display and config */
1197 using TestClientTargetSupportFunction = void (*)(Hwc2Test* test,
1198 hwc2_display_t display,
1199 const Hwc2TestClientTargetSupport& testClientTargetSupport);
1200
Marissa Wall35040c52016-12-15 12:41:06 -08001201 /* Tests a particular active display config */
1202 using TestActiveDisplayConfigFunction = void (*)(Hwc2Test* test,
1203 hwc2_display_t display);
1204
Marissa Wallbad1bc72017-02-21 14:33:46 -08001205 /* Tests a newly created virtual display */
1206 using TestCreateVirtualDisplayFunction = void (*)(Hwc2Test* test,
1207 hwc2_display_t display, Hwc2TestVirtualDisplay* testVirtualDisplay);
1208
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001209 /* Advances a property of Hwc2TestLayer */
1210 using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
1211
Marissa Wallf7618ed2016-12-15 12:34:39 -08001212 /* Advances properties of Hwc2TestLayers */
1213 using AdvanceProperties = bool (*)(Hwc2TestLayers* testLayer);
1214
Marissa Wallf18cfb02017-02-21 14:01:05 -08001215 /* Advances properties of Hwc2TestClientTargetSupport */
1216 using AdvanceClientTargetSupport = bool (*)(
1217 Hwc2TestClientTargetSupport* testClientTargetSupport);
1218
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001219 /* For each active display it cycles through each display config and tests
1220 * each property value. It creates a layer, sets the property and then
1221 * destroys the layer */
1222 void setLayerProperty(Hwc2TestCoverage coverage,
1223 TestLayerPropertyFunction function, AdvanceProperty advance)
1224 {
1225 for (auto display : mDisplays) {
1226 std::vector<hwc2_config_t> configs;
1227
1228 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1229
1230 for (auto config : configs) {
1231 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -08001232 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001233
1234 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001235 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1236 &displayArea));
1237 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001238
1239 do {
1240 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1241
1242 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001243 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001244
1245 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1246 } while (advance(&testLayer));
1247 }
1248 }
1249 }
1250
1251 /* For each active display it cycles through each display config and tests
1252 * each property value. It creates a layer, cycles through each property
1253 * value and updates the layer property value and then destroys the layer */
1254 void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
1255 TestLayerPropertyFunction function, AdvanceProperty advance)
1256 {
1257 for (auto display : mDisplays) {
1258 std::vector<hwc2_config_t> configs;
1259
1260 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1261
1262 for (auto config : configs) {
1263 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -08001264 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001265
1266 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001267 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1268 &displayArea));
1269 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001270
1271 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1272
1273 do {
1274 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001275 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001276 } while (advance(&testLayer));
1277
1278 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1279 }
1280 }
1281 }
1282
Marissa Wall273b1df2016-12-15 12:28:47 -08001283 /* For each active display it cycles through each display config and tests
1284 * each property value. It creates multiple layers, calls the
1285 * TestLayerPropertiesFunction to set property values and then
1286 * destroys the layers */
1287 void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
Marissa Wallf7618ed2016-12-15 12:34:39 -08001288 TestLayerPropertiesFunction function, AdvanceProperties advance)
Marissa Wall273b1df2016-12-15 12:28:47 -08001289 {
1290 for (auto display : mDisplays) {
1291 std::vector<hwc2_config_t> configs;
1292
1293 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1294
1295 for (auto config : configs) {
1296 std::vector<hwc2_layer_t> layers;
Marissa Wall600a73b2016-12-15 12:30:39 -08001297 Area displayArea;
Marissa Wall273b1df2016-12-15 12:28:47 -08001298
1299 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001300 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1301 &displayArea));
Marissa Wall273b1df2016-12-15 12:28:47 -08001302
1303 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
Marissa Wall600a73b2016-12-15 12:30:39 -08001304 Hwc2TestLayers testLayers(layers, coverage, displayArea);
Marissa Wall273b1df2016-12-15 12:28:47 -08001305
Marissa Wallf7618ed2016-12-15 12:34:39 -08001306 do {
1307 for (auto layer : layers) {
1308 EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
1309 &testLayers));
1310 }
1311 } while (advance(&testLayers));
Marissa Wall273b1df2016-12-15 12:28:47 -08001312
1313 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1314 }
1315 }
1316 }
1317
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001318 /* For each active display it cycles through each display config.
1319 * 1) It attempts to set a valid property value to bad layer handle.
1320 * 2) It creates a layer x and attempts to set a valid property value to
1321 * layer x + 1
1322 * 3) It destroys the layer x and attempts to set a valid property value to
1323 * the destroyed layer x.
1324 */
1325 void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
1326 TestLayerPropertyBadLayerFunction function)
1327 {
1328 for (auto display : mDisplays) {
1329 std::vector<hwc2_config_t> configs;
1330
1331 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1332
1333 for (auto config : configs) {
1334 hwc2_layer_t layer = 0;
Marissa Wall600a73b2016-12-15 12:30:39 -08001335 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001336 hwc2_error_t err = HWC2_ERROR_NONE;
1337
1338 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001339 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1340 &displayArea));
1341 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001342
1343 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001344 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001345 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1346
1347 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1348
1349 ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001350 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001351 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1352
1353 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1354
1355 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001356 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001357 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1358 }
1359 }
1360 }
1361
1362 /* For each active display it cycles through each display config and tests
1363 * each property value. It creates a layer, sets a bad property value and
1364 * then destroys the layer */
1365 void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
1366 {
1367 for (auto display : mDisplays) {
1368 std::vector<hwc2_config_t> configs;
1369
1370 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1371
1372 for (auto config : configs) {
1373 hwc2_layer_t layer;
1374 hwc2_error_t err = HWC2_ERROR_NONE;
1375
1376 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1377
1378 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1379
1380 ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
1381 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
1382 " error code";
1383
1384 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1385 }
1386 }
1387 }
1388
Marissa Wall1cd789c2017-01-27 12:55:36 -08001389 /* For each active display it powers on the display, cycles through each
1390 * config and creates a set of layers with a certain amount of coverage.
1391 * For each active display, for each config and for each set of layers,
1392 * it calls the TestDisplayLayersFunction */
1393 void displayLayers(Hwc2TestCoverage coverage, size_t layerCnt,
1394 TestDisplayLayersFunction function)
1395 {
1396 for (auto display : mDisplays) {
1397 std::vector<hwc2_config_t> configs;
1398
1399 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1400
1401 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1402
1403 for (auto config : configs) {
1404 Area displayArea;
1405 std::vector<hwc2_layer_t> layers;
1406
1407 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1408 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
1409
1410 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1411 Hwc2TestLayers testLayers(layers, coverage, displayArea);
1412
1413 do {
1414 bool skip;
1415
1416 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
1417 &testLayers, &skip));
1418 if (!skip)
Marissa Wall706178d2016-12-15 12:39:14 -08001419 EXPECT_NO_FATAL_FAILURE(function(this, display, layers,
Marissa Wall563030b2017-02-21 14:01:05 -08001420 &testLayers));
Marissa Wall1cd789c2017-01-27 12:55:36 -08001421
1422 } while (testLayers.advance());
1423
1424 ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
1425 std::move(layers)));
1426 }
1427
1428 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1429 }
1430 }
1431
Marissa Wall706178d2016-12-15 12:39:14 -08001432 /* For each active display, it calls the
1433 * TestDisplayNonValidatedLayersFunction on a variety on non-validated
1434 * layer combinations */
1435 void displayNonValidatedLayers(size_t layerCnt,
1436 TestDisplayNonValidatedLayersFunction function)
1437 {
1438 for (auto display : mDisplays) {
1439 uint32_t numTypes, numRequests;
1440 std::vector<hwc2_layer_t> layers;
1441 bool hasChanges;
1442
1443 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1444
1445 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1446
1447 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1448
1449 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1450
1451 for (auto layer : layers) {
1452 ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1453 HWC2_COMPOSITION_CLIENT));
1454 }
1455
1456 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1457
1458 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1459 &numRequests, &hasChanges));
1460
1461 for (auto layer : layers) {
1462 ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1463 HWC2_COMPOSITION_DEVICE));
1464 }
1465
1466 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1467
1468 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1469
1470 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1471
1472 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1473 }
1474 }
1475
Marissa Wallf18cfb02017-02-21 14:01:05 -08001476 /* Test client target support on each config on each active display */
1477 void setClientTargetSupport(Hwc2TestCoverage coverage,
1478 TestClientTargetSupportFunction function,
1479 AdvanceClientTargetSupport advance)
1480 {
1481 for (auto display : mDisplays) {
1482 std::vector<hwc2_config_t> configs;
1483
1484 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1485
1486 for (auto config : configs) {
1487 Area displayArea;
1488
1489 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1490 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1491 &displayArea));
1492 Hwc2TestClientTargetSupport testClientTargetSupport(coverage,
1493 displayArea);
1494
1495 do {
1496 EXPECT_NO_FATAL_FAILURE(function(this, display,
1497 testClientTargetSupport));
1498
1499 } while (advance(&testClientTargetSupport));
1500 }
1501 }
1502 }
1503
Marissa Wall35040c52016-12-15 12:41:06 -08001504 /* Cycles through each config on each active display and calls
1505 * a TestActiveDisplayConfigFunction */
1506 void setActiveDisplayConfig(TestActiveDisplayConfigFunction function)
1507 {
1508 for (auto display : mDisplays) {
1509 std::vector<hwc2_config_t> configs;
1510
1511 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1512
1513 for (auto config : configs) {
1514 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1515
1516 EXPECT_NO_FATAL_FAILURE(function(this, display));
1517 }
1518 }
1519 }
1520
Marissa Wallbad1bc72017-02-21 14:33:46 -08001521 /* Creates a virtual display for testing */
1522 void createVirtualDisplay(Hwc2TestCoverage coverage,
1523 TestCreateVirtualDisplayFunction function)
1524 {
1525 Hwc2TestVirtualDisplay testVirtualDisplay(coverage);
1526
1527 do {
1528 hwc2_display_t display;
1529 hwc2_error_t err = HWC2_ERROR_NONE;
1530
1531 const UnsignedArea& dimension =
1532 testVirtualDisplay.getDisplayDimension();
1533 android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
1534
1535 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(dimension.width,
1536 dimension.height, &desiredFormat, &display, &err));
1537
1538 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_NO_RESOURCES
1539 || err == HWC2_ERROR_UNSUPPORTED)
1540 << "returned wrong error code";
1541 EXPECT_GE(desiredFormat, 0) << "invalid format";
1542
1543 if (err != HWC2_ERROR_NONE)
1544 continue;
1545
1546 EXPECT_NO_FATAL_FAILURE(function(this, display,
1547 &testVirtualDisplay));
1548
1549 ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
1550
1551 } while (testVirtualDisplay.advance());
1552 }
1553
1554
Marissa Wall600a73b2016-12-15 12:30:39 -08001555 void getActiveConfigAttribute(hwc2_display_t display,
1556 hwc2_attribute_t attribute, int32_t* outValue)
1557 {
1558 hwc2_config_t config;
1559 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
1560 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1561 attribute, outValue));
1562 ASSERT_GE(*outValue, 0) << "failed to get valid "
1563 << getAttributeName(attribute);
1564 }
1565
1566 void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
1567 {
1568 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1569 HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
1570 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1571 HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
1572 }
1573
Marissa Wall563030b2017-02-21 14:01:05 -08001574 void closeFences(hwc2_display_t display, int32_t presentFence)
1575 {
1576 std::vector<hwc2_layer_t> layers;
1577 std::vector<int32_t> fences;
1578 const int msWait = 3000;
1579
1580 if (presentFence >= 0) {
1581 ASSERT_GE(sync_wait(presentFence, msWait), 0);
1582 close(presentFence);
1583 }
1584
1585 ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences));
1586 EXPECT_EQ(layers.size(), fences.size());
1587
1588 for (int32_t fence : fences) {
1589 EXPECT_GE(sync_wait(fence, msWait), 0);
1590 if (fence >= 0)
1591 close(fence);
1592 }
1593 }
1594
Marissa Wall1cd789c2017-01-27 12:55:36 -08001595 void setLayerProperties(hwc2_display_t display, hwc2_layer_t layer,
1596 Hwc2TestLayers* testLayers, bool* outSkip)
1597 {
1598 hwc2_composition_t composition;
1599 buffer_handle_t handle = nullptr;
1600 int32_t acquireFence;
1601 hwc2_error_t err = HWC2_ERROR_NONE;
1602 *outSkip = true;
1603
1604 if (!testLayers->contains(layer))
1605 return;
1606
1607 composition = testLayers->getComposition(layer);
1608
1609 /* If the device cannot support a buffer format, then do not continue */
1610 if ((composition == HWC2_COMPOSITION_DEVICE
1611 || composition == HWC2_COMPOSITION_CURSOR)
1612 && testLayers->getBuffer(layer, &handle, &acquireFence) < 0)
1613 return;
1614
1615 EXPECT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1616 composition, &err));
1617 if (err == HWC2_ERROR_UNSUPPORTED)
1618 EXPECT_TRUE(composition != HWC2_COMPOSITION_CLIENT
1619 && composition != HWC2_COMPOSITION_DEVICE);
1620
1621 const hwc_rect_t cursor = testLayers->getCursorPosition(layer);
1622
1623 EXPECT_NO_FATAL_FAILURE(setLayerBuffer(display, layer, handle,
1624 acquireFence));
1625 EXPECT_NO_FATAL_FAILURE(setLayerBlendMode(display, layer,
1626 testLayers->getBlendMode(layer)));
1627 EXPECT_NO_FATAL_FAILURE(setLayerColor(display, layer,
1628 testLayers->getColor(layer)));
1629 EXPECT_NO_FATAL_FAILURE(setCursorPosition(display, layer, cursor.left,
1630 cursor.top));
1631 EXPECT_NO_FATAL_FAILURE(setLayerDataspace(display, layer,
1632 testLayers->getDataspace(layer)));
1633 EXPECT_NO_FATAL_FAILURE(setLayerDisplayFrame(display, layer,
1634 testLayers->getDisplayFrame(layer)));
1635 EXPECT_NO_FATAL_FAILURE(setLayerPlaneAlpha(display, layer,
1636 testLayers->getPlaneAlpha(layer)));
1637 EXPECT_NO_FATAL_FAILURE(setLayerSourceCrop(display, layer,
1638 testLayers->getSourceCrop(layer)));
1639 EXPECT_NO_FATAL_FAILURE(setLayerSurfaceDamage(display, layer,
1640 testLayers->getSurfaceDamage(layer)));
1641 EXPECT_NO_FATAL_FAILURE(setLayerTransform(display, layer,
1642 testLayers->getTransform(layer)));
1643 EXPECT_NO_FATAL_FAILURE(setLayerVisibleRegion(display, layer,
1644 testLayers->getVisibleRegion(layer)));
1645 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer,
1646 testLayers->getZOrder(layer)));
1647
1648 *outSkip = false;
1649 }
1650
1651 void setLayerProperties(hwc2_display_t display,
1652 const std::vector<hwc2_layer_t>& layers,
1653 Hwc2TestLayers* testLayers, bool* outSkip)
1654 {
1655 for (auto layer : layers) {
1656 EXPECT_NO_FATAL_FAILURE(setLayerProperties(display, layer,
1657 testLayers, outSkip));
1658 if (*outSkip)
1659 return;
1660 }
1661 }
1662
Marissa Wall563030b2017-02-21 14:01:05 -08001663 void setClientTarget(hwc2_display_t display,
1664 Hwc2TestClientTarget* testClientTarget,
1665 const Hwc2TestLayers& testLayers,
1666 const std::set<hwc2_layer_t>& clientLayers,
1667 const std::set<hwc2_layer_t>& clearLayers, bool flipClientTarget,
1668 const Area& displayArea)
1669 {
1670 android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
1671 hwc_region_t damage = { };
1672 buffer_handle_t handle;
1673 int32_t acquireFence;
1674
1675 ASSERT_EQ(testClientTarget->getBuffer(testLayers, clientLayers,
1676 clearLayers, flipClientTarget, displayArea, &handle,
1677 &acquireFence), 0);
1678 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
1679 dataspace, damage));
1680 }
1681
1682 void presentDisplays(size_t layerCnt, Hwc2TestCoverage coverage,
1683 const std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>&
1684 coverageExceptions, bool optimize)
1685 {
1686 for (auto display : mDisplays) {
1687 std::vector<hwc2_config_t> configs;
1688
1689 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1690 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1691
1692 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1693
1694 for (auto config : configs) {
1695 Area displayArea;
1696 std::vector<hwc2_layer_t> layers;
1697
1698 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1699 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1700 &displayArea));
1701
1702 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1703 Hwc2TestLayers testLayers(layers, coverage, displayArea,
1704 coverageExceptions);
1705
1706 if (optimize && !testLayers.optimizeLayouts())
1707 continue;
1708
1709 std::set<hwc2_layer_t> clientLayers;
1710 std::set<hwc2_layer_t> clearLayers;
1711 Hwc2TestClientTarget testClientTarget;
1712
1713 do {
1714 uint32_t numTypes, numRequests;
1715 bool hasChanges, skip;
1716 bool flipClientTarget;
1717 int32_t presentFence;
1718
1719 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
1720 &testLayers, &skip));
1721 if (skip)
1722 continue;
1723
1724 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1725 &numRequests, &hasChanges));
1726 if (hasChanges)
1727 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
1728 << "wrong number of requests";
1729
1730 ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
1731 testLayers, layers, numTypes, &clientLayers));
1732 ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
1733 numRequests, &clearLayers, &flipClientTarget));
1734 ASSERT_NO_FATAL_FAILURE(setClientTarget(display,
1735 &testClientTarget, testLayers, clientLayers,
1736 clearLayers, flipClientTarget, displayArea));
1737 ASSERT_NO_FATAL_FAILURE(acceptDisplayChanges(display));
1738
1739 ASSERT_NO_FATAL_FAILURE(waitForVsync());
1740
1741 EXPECT_NO_FATAL_FAILURE(presentDisplay(display,
1742 &presentFence));
1743
1744 ASSERT_NO_FATAL_FAILURE(closeFences(display, presentFence));
1745
1746 } while (testLayers.advance());
1747
1748 ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
1749 std::move(layers)));
1750 }
1751
1752 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1753 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1754 }
1755 }
1756
Marissa Wall4d600052016-12-15 12:16:01 -08001757 hwc2_device_t* mHwc2Device = nullptr;
Marissa Wallcfb9a072017-02-17 20:53:18 -08001758
1759 enum class Hwc2TestHotplugStatus {
1760 Init = 1,
1761 Receiving,
1762 Done,
1763 };
1764
1765 std::mutex mHotplugMutex;
1766 std::condition_variable mHotplugCv;
1767 Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
1768 std::unordered_set<hwc2_display_t> mDisplays;
Marissa Wall1db2e372016-12-15 12:19:39 -08001769
1770 /* Store all created layers that have not been destroyed. If an ASSERT_*
1771 * fails, then destroy the layers on exit */
1772 std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
Marissa Wall03c91732016-12-15 12:23:16 -08001773
1774 /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
1775 * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
1776 std::set<hwc2_display_t> mActiveDisplays;
Marissa Wall572a1ee2016-12-15 12:24:13 -08001777
Marissa Wallbad1bc72017-02-21 14:33:46 -08001778 /* Store all created virtual displays that have not been destroyed. If an
1779 * ASSERT_* fails, then destroy the virtual displays on exit */
1780 std::set<hwc2_display_t> mVirtualDisplays;
1781
Marissa Wall572a1ee2016-12-15 12:24:13 -08001782 std::mutex mVsyncMutex;
1783 std::condition_variable mVsyncCv;
1784 hwc2_display_t mVsyncDisplay;
1785 int64_t mVsyncTimestamp = -1;
Marissa Wall4d600052016-12-15 12:16:01 -08001786};
1787
Marissa Wallcfb9a072017-02-17 20:53:18 -08001788void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
1789 hwc2_display_t display, int32_t connection)
1790{
1791 if (callbackData)
1792 static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
1793 connection);
1794}
1795
Marissa Wall572a1ee2016-12-15 12:24:13 -08001796void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
1797 hwc2_display_t display, int64_t timestamp)
1798{
1799 if (callbackData)
1800 static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
1801 timestamp);
1802}
1803
Marissa Wallffc67da2016-12-15 12:26:09 -08001804void setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001805 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallffc67da2016-12-15 12:26:09 -08001806{
1807 EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001808 testLayer->getBlendMode(), outErr));
1809}
1810
1811void setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1812 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1813{
1814 buffer_handle_t handle;
1815 android::base::unique_fd acquireFence;
1816 hwc2_composition_t composition = testLayer->getComposition();
1817
1818 if (composition == HWC2_COMPOSITION_CLIENT
1819 || composition == HWC2_COMPOSITION_SOLID_COLOR
1820 || composition == HWC2_COMPOSITION_SIDEBAND)
1821 return;
1822
1823 if (testLayer->getBuffer(&handle, &acquireFence) < 0)
1824 return;
1825
1826 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
1827 composition));
1828 EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
1829 handle, acquireFence, outErr));
Marissa Wallffc67da2016-12-15 12:26:09 -08001830}
1831
Marissa Wallee242782016-12-15 12:30:12 -08001832void setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001833 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallee242782016-12-15 12:30:12 -08001834{
1835 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1836 layer, HWC2_COMPOSITION_SOLID_COLOR));
1837 ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001838 layer, testLayer->getPlaneAlpha()));
Marissa Wallee242782016-12-15 12:30:12 -08001839 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001840 layer, testLayer->getBlendMode()));
Marissa Wallee242782016-12-15 12:30:12 -08001841 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001842 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08001843}
1844
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001845void setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001846 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001847{
Marissa Wall5a240aa2016-12-15 12:34:06 -08001848 hwc2_composition_t composition = testLayer->getComposition();
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001849 hwc2_error_t err = HWC2_ERROR_NONE;
1850
1851 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
1852 composition, &err));
1853 if (outErr) {
1854 *outErr = err;
1855 return;
1856 }
1857
1858 if (composition != HWC2_COMPOSITION_SIDEBAND) {
1859 EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
1860 } else {
1861 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
1862 << "returned wrong error code";
1863 }
1864}
1865
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001866void setCursorPosition(Hwc2Test* test, hwc2_display_t display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001867 hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001868{
1869 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1870 layer, HWC2_COMPOSITION_CURSOR));
1871
Marissa Wall5a240aa2016-12-15 12:34:06 -08001872 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001873 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
1874 cursorPosition.left, cursorPosition.top, outErr));
1875}
1876
Marissa Wallb72b5c92016-12-15 12:26:39 -08001877void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001878 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallb72b5c92016-12-15 12:26:39 -08001879{
1880 EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001881 testLayer->getDataspace(), outErr));
Marissa Wallb72b5c92016-12-15 12:26:39 -08001882}
1883
Marissa Wall600a73b2016-12-15 12:30:39 -08001884void setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001885 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall600a73b2016-12-15 12:30:39 -08001886{
1887 EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001888 testLayer->getDisplayFrame(), outErr));
Marissa Wall600a73b2016-12-15 12:30:39 -08001889}
1890
Marissa Wall2b1f5302016-12-15 12:27:20 -08001891void setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001892 Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
Marissa Wall2b1f5302016-12-15 12:27:20 -08001893{
1894 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001895 testLayer->getBlendMode()));
Marissa Wall2b1f5302016-12-15 12:27:20 -08001896 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001897 testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08001898}
1899
Marissa Wallc57468f2016-12-15 12:31:12 -08001900void setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001901 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallc57468f2016-12-15 12:31:12 -08001902{
1903 EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001904 testLayer->getSourceCrop(), outErr));
Marissa Wallc57468f2016-12-15 12:31:12 -08001905}
1906
Marissa Wallad761812016-12-15 12:32:24 -08001907void setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001908 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallad761812016-12-15 12:32:24 -08001909{
1910 EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001911 testLayer->getSurfaceDamage(), outErr));
Marissa Wallad761812016-12-15 12:32:24 -08001912}
1913
Marissa Wallac108192016-12-15 12:27:48 -08001914void setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001915 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallac108192016-12-15 12:27:48 -08001916{
1917 EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001918 testLayer->getTransform(), outErr));
Marissa Wallac108192016-12-15 12:27:48 -08001919}
1920
Marissa Wallf7618ed2016-12-15 12:34:39 -08001921void setVisibleRegion(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1922 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1923{
1924 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display, layer,
1925 testLayer->getVisibleRegion(), outErr));
1926}
1927
Marissa Wall273b1df2016-12-15 12:28:47 -08001928void setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001929 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall273b1df2016-12-15 12:28:47 -08001930{
1931 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001932 testLayer->getZOrder(), outErr));
Marissa Wall273b1df2016-12-15 12:28:47 -08001933}
1934
Marissa Wallffc67da2016-12-15 12:26:09 -08001935bool advanceBlendMode(Hwc2TestLayer* testLayer)
1936{
1937 return testLayer->advanceBlendMode();
1938}
1939
Marissa Wall5a240aa2016-12-15 12:34:06 -08001940bool advanceBuffer(Hwc2TestLayer* testLayer)
1941{
1942 if (testLayer->advanceComposition())
1943 return true;
1944 return testLayer->advanceBufferArea();
1945}
1946
Marissa Wallee242782016-12-15 12:30:12 -08001947bool advanceColor(Hwc2TestLayer* testLayer)
1948{
1949 /* Color depends on blend mode so advance blend mode last so color is not
1950 * force to update as often */
1951 if (testLayer->advancePlaneAlpha())
1952 return true;
1953 if (testLayer->advanceColor())
1954 return true;
1955 return testLayer->advanceBlendMode();
1956}
1957
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001958bool advanceComposition(Hwc2TestLayer* testLayer)
1959{
1960 return testLayer->advanceComposition();
1961}
1962
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001963bool advanceCursorPosition(Hwc2TestLayer* testLayer)
1964{
1965 return testLayer->advanceCursorPosition();
1966}
1967
Marissa Wallb72b5c92016-12-15 12:26:39 -08001968bool advanceDataspace(Hwc2TestLayer* testLayer)
1969{
1970 return testLayer->advanceDataspace();
1971}
1972
Marissa Wall600a73b2016-12-15 12:30:39 -08001973bool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1974{
1975 return testLayer->advanceDisplayFrame();
1976}
1977
Marissa Wall2b1f5302016-12-15 12:27:20 -08001978bool advancePlaneAlpha(Hwc2TestLayer* testLayer)
1979{
1980 return testLayer->advancePlaneAlpha();
1981}
1982
Marissa Wallc57468f2016-12-15 12:31:12 -08001983bool advanceSourceCrop(Hwc2TestLayer* testLayer)
1984{
1985 if (testLayer->advanceSourceCrop())
1986 return true;
1987 return testLayer->advanceBufferArea();
1988}
1989
Marissa Wallad761812016-12-15 12:32:24 -08001990bool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
1991{
1992 if (testLayer->advanceSurfaceDamage())
1993 return true;
1994 return testLayer->advanceBufferArea();
1995}
1996
Marissa Wallac108192016-12-15 12:27:48 -08001997bool advanceTransform(Hwc2TestLayer* testLayer)
1998{
1999 return testLayer->advanceTransform();
2000}
2001
Marissa Wallf7618ed2016-12-15 12:34:39 -08002002bool advanceVisibleRegions(Hwc2TestLayers* testLayers)
2003{
2004 return testLayers->advanceVisibleRegions();
2005}
2006
Marissa Wallf18cfb02017-02-21 14:01:05 -08002007bool advanceClientTargetSupport(
2008 Hwc2TestClientTargetSupport* testClientTargetSupport)
2009{
2010 return testClientTargetSupport->advance();
2011}
Marissa Wall4d600052016-12-15 12:16:01 -08002012
2013static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
2014 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
2015 HWC2_FUNCTION_CREATE_LAYER,
2016 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
2017 HWC2_FUNCTION_DESTROY_LAYER,
2018 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
2019 HWC2_FUNCTION_DUMP,
2020 HWC2_FUNCTION_GET_ACTIVE_CONFIG,
2021 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
2022 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
2023 HWC2_FUNCTION_GET_COLOR_MODES,
2024 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
2025 HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
2026 HWC2_FUNCTION_GET_DISPLAY_NAME,
2027 HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
2028 HWC2_FUNCTION_GET_DISPLAY_TYPE,
2029 HWC2_FUNCTION_GET_DOZE_SUPPORT,
2030 HWC2_FUNCTION_GET_HDR_CAPABILITIES,
2031 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
2032 HWC2_FUNCTION_GET_RELEASE_FENCES,
2033 HWC2_FUNCTION_PRESENT_DISPLAY,
2034 HWC2_FUNCTION_REGISTER_CALLBACK,
2035 HWC2_FUNCTION_SET_ACTIVE_CONFIG,
2036 HWC2_FUNCTION_SET_CLIENT_TARGET,
2037 HWC2_FUNCTION_SET_COLOR_MODE,
2038 HWC2_FUNCTION_SET_COLOR_TRANSFORM,
2039 HWC2_FUNCTION_SET_CURSOR_POSITION,
2040 HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
2041 HWC2_FUNCTION_SET_LAYER_BUFFER,
2042 HWC2_FUNCTION_SET_LAYER_COLOR,
2043 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
2044 HWC2_FUNCTION_SET_LAYER_DATASPACE,
2045 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
2046 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
2047 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
2048 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
2049 HWC2_FUNCTION_SET_LAYER_TRANSFORM,
2050 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
2051 HWC2_FUNCTION_SET_LAYER_Z_ORDER,
2052 HWC2_FUNCTION_SET_OUTPUT_BUFFER,
2053 HWC2_FUNCTION_SET_POWER_MODE,
2054 HWC2_FUNCTION_SET_VSYNC_ENABLED,
2055 HWC2_FUNCTION_VALIDATE_DISPLAY,
2056}};
2057
2058/* TESTCASE: Tests that the HWC2 supports all required functions. */
2059TEST_F(Hwc2Test, GET_FUNCTION)
2060{
2061 for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
2062 hwc2_function_pointer_t pfn = getFunction(descriptor);
2063 EXPECT_TRUE(pfn) << "failed to get function "
2064 << getFunctionDescriptorName(descriptor);
2065 }
2066}
2067
2068/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
2069TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
2070{
2071 hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
2072 EXPECT_FALSE(pfn) << "failed to get invalid function";
2073}
2074
2075/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
2076TEST_F(Hwc2Test, GET_CAPABILITIES)
2077{
2078 std::vector<hwc2_capability_t> capabilities;
2079
2080 getCapabilities(&capabilities);
2081
2082 EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
2083 HWC2_CAPABILITY_INVALID), 0);
2084}
Marissa Walla4b01482017-02-17 20:52:03 -08002085
2086static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
2087 HWC2_CALLBACK_HOTPLUG,
2088 HWC2_CALLBACK_REFRESH,
2089 HWC2_CALLBACK_VSYNC,
2090}};
2091
2092/* TESTCASE: Tests that the HWC2 can successfully register all required
2093 * callback functions. */
2094TEST_F(Hwc2Test, REGISTER_CALLBACK)
2095{
2096 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2097 const_cast<char*>("data"));
2098
2099 for (auto descriptor : callbackDescriptors) {
2100 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
2101 []() { return; }));
2102 }
2103}
2104
2105/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
2106TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
2107{
2108 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2109 const_cast<char*>("data"));
2110 hwc2_error_t err = HWC2_ERROR_NONE;
2111
2112 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
2113 []() { return; }, &err));
2114 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2115}
2116
2117/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
2118TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
2119{
2120 hwc2_callback_data_t data = nullptr;
2121
2122 for (auto descriptor : callbackDescriptors) {
2123 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
2124 []() { return; }));
2125 }
2126}
Marissa Wallcfb9a072017-02-17 20:53:18 -08002127
2128/* TESTCASE: Tests that the HWC2 returns the correct display type for each
2129 * physical display. */
2130TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
2131{
2132 for (auto display : mDisplays) {
2133 hwc2_display_type_t type;
2134
2135 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
2136 EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
2137 " correct display type";
2138 }
2139}
2140
2141/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
2142 * display is requested. */
2143TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
2144{
2145 hwc2_display_t display;
2146 hwc2_display_type_t type;
2147 hwc2_error_t err = HWC2_ERROR_NONE;
2148
2149 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2150
2151 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
2152 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2153}
Marissa Wall1db2e372016-12-15 12:19:39 -08002154
2155/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
2156TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
2157{
2158 for (auto display : mDisplays) {
2159 hwc2_layer_t layer;
2160
2161 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2162
2163 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2164 }
2165}
2166
2167/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
2168TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
2169{
2170 hwc2_display_t display;
2171 hwc2_layer_t layer;
2172 hwc2_error_t err = HWC2_ERROR_NONE;
2173
2174 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2175
2176 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
2177 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2178}
2179
2180/* TESTCASE: Tests that the HWC2 will either support a large number of resources
2181 * or will return no resources. */
2182TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
2183{
2184 const size_t layerCnt = 1000;
2185
2186 for (auto display : mDisplays) {
2187 std::vector<hwc2_layer_t> layers;
2188
2189 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
2190
2191 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
2192 }
2193}
2194
2195/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
2196TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
2197{
2198 hwc2_display_t badDisplay;
2199
2200 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
2201
2202 for (auto display : mDisplays) {
2203 hwc2_layer_t layer = 0;
2204 hwc2_error_t err = HWC2_ERROR_NONE;
2205
2206 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
2207 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2208
2209 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2210
2211 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
2212 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2213
2214 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2215 }
2216}
2217
2218/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
2219TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
2220{
2221 for (auto display : mDisplays) {
2222 hwc2_layer_t layer;
2223 hwc2_error_t err = HWC2_ERROR_NONE;
2224
2225 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
2226 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2227
2228 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
2229 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2230
2231 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
2232 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2233
2234 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
2235 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2236
2237 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
2238 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2239
2240 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2241
2242 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
2243 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2244
2245 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2246
2247 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
2248 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2249 }
2250}
Marissa Wallcf935cb2016-12-15 12:20:47 -08002251
2252static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
2253 HWC2_ATTRIBUTE_WIDTH,
2254 HWC2_ATTRIBUTE_HEIGHT,
2255}};
2256
2257static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
2258 HWC2_ATTRIBUTE_VSYNC_PERIOD,
2259 HWC2_ATTRIBUTE_DPI_X,
2260 HWC2_ATTRIBUTE_DPI_Y,
2261}};
2262
2263/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
2264 * config. */
2265TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
2266{
2267 for (auto display : mDisplays) {
2268 std::vector<hwc2_config_t> configs;
2269
2270 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2271
2272 for (auto config : configs) {
2273 int32_t value;
2274
2275 for (auto attribute : requiredAttributes) {
2276 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2277 attribute, &value));
2278 EXPECT_GE(value, 0) << "missing required attribute "
2279 << getAttributeName(attribute) << " for config "
2280 << config;
2281 }
2282 for (auto attribute : optionalAttributes) {
2283 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2284 attribute, &value));
2285 }
2286 }
2287 }
2288}
2289
2290/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
2291 * attribute */
2292TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
2293{
2294 const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
2295
2296 for (auto display : mDisplays) {
2297 std::vector<hwc2_config_t> configs;
2298
2299 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2300
2301 for (auto config : configs) {
2302 int32_t value;
2303 hwc2_error_t err = HWC2_ERROR_NONE;
2304
2305 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2306 attribute, &value, &err));
2307 EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
2308 " attribute for config " << config;
2309 }
2310 }
2311}
2312
2313/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
2314TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
2315{
2316 hwc2_display_t display;
2317 const hwc2_config_t config = 0;
2318 int32_t value;
2319 hwc2_error_t err = HWC2_ERROR_NONE;
2320
2321 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2322
2323 for (auto attribute : requiredAttributes) {
2324 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
2325 &value, &err));
2326 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2327 }
2328
2329 for (auto attribute : optionalAttributes) {
2330 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
2331 &value, &err));
2332 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2333 }
2334}
2335
2336/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
2337TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
2338{
2339 for (auto display : mDisplays) {
2340 hwc2_config_t config;
2341 int32_t value;
2342 hwc2_error_t err = HWC2_ERROR_NONE;
2343
2344 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
2345
2346 for (auto attribute : requiredAttributes) {
2347 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2348 attribute, &value, &err));
2349 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2350 }
2351
2352 for (auto attribute : optionalAttributes) {
2353 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2354 attribute, &value, &err));
2355 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2356 }
2357 }
2358}
2359
2360/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
2361TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
2362{
2363 for (auto display : mDisplays) {
2364 std::vector<hwc2_config_t> configs;
2365
2366 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2367 }
2368}
2369
2370/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
2371TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
2372{
2373 hwc2_display_t display;
2374 std::vector<hwc2_config_t> configs;
2375 hwc2_error_t err = HWC2_ERROR_NONE;
2376
2377 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2378
2379 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
2380
2381 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2382 EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
2383}
2384
2385/* TESTCASE: Tests that the HWC2 will return the same config list multiple
2386 * times in a row. */
2387TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
2388{
2389 for (auto display : mDisplays) {
2390 std::vector<hwc2_config_t> configs1, configs2;
2391
2392 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
2393 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
2394
2395 EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
2396 configs2.begin())) << "returned two different config sets";
2397 }
2398}
2399
2400/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
2401TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
2402{
2403 for (auto display : mDisplays) {
2404 std::vector<hwc2_config_t> configs;
2405
2406 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2407
2408 std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
2409 configs.end());
2410 EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
2411 " configs";
2412 }
2413}
Marissa Wall93dc04f2016-12-15 12:21:46 -08002414
2415/* TESTCASE: Tests that the HWC2 returns the active config for a display */
2416TEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
2417{
2418 for (auto display : mDisplays) {
2419 std::vector<hwc2_config_t> configs;
2420
2421 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2422
2423 for (auto config : configs) {
2424 hwc2_config_t activeConfig;
2425
2426 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2427 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
2428
2429 EXPECT_EQ(activeConfig, config) << "failed to get active config";
2430 }
2431 }
2432}
2433
2434/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
2435 * display. */
2436TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
2437{
2438 hwc2_display_t display;
2439 hwc2_config_t activeConfig;
2440 hwc2_error_t err = HWC2_ERROR_NONE;
2441
2442 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2443
2444 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
2445
2446 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2447}
2448
2449/* TESTCASE: Tests that the HWC2 either begins with a valid active config
2450 * or returns an error when getActiveConfig is called. */
2451TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
2452{
2453 for (auto display : mDisplays) {
2454 std::vector<hwc2_config_t> configs;
2455 hwc2_config_t activeConfig;
2456 hwc2_error_t err = HWC2_ERROR_NONE;
2457
2458 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2459
2460 if (configs.empty())
2461 return;
2462
2463 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
2464 if (err == HWC2_ERROR_NONE) {
2465 EXPECT_NE(std::count(configs.begin(), configs.end(),
2466 activeConfig), 0) << "active config is not found in "
2467 " configs for display";
2468 } else {
2469 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2470 }
2471 }
2472}
2473
2474/* TESTCASE: Tests that the HWC2 can set every display config as an active
2475 * config */
2476TEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
2477{
2478 for (auto display : mDisplays) {
2479 std::vector<hwc2_config_t> configs;
2480
2481 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2482
2483 for (auto config : configs) {
2484 EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2485 }
2486 }
2487}
2488
2489/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
2490TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
2491{
2492 hwc2_display_t display;
2493 const hwc2_config_t config = 0;
2494 hwc2_error_t err = HWC2_ERROR_NONE;
2495
2496 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2497
2498 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
2499 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2500}
2501
2502/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
2503TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
2504{
2505 for (auto display : mDisplays) {
2506 hwc2_config_t config;
2507 hwc2_error_t err = HWC2_ERROR_NONE;
2508
2509 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
2510
2511 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
2512 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2513 }
2514}
Marissa Wall03c91732016-12-15 12:23:16 -08002515
2516/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
2517TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
2518{
2519 for (auto display : mDisplays) {
2520 int32_t support = -1;
2521
2522 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2523
2524 EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
2525 }
2526}
2527
2528/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
2529TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
2530{
2531 hwc2_display_t display;
2532 int32_t support = -1;
2533 hwc2_error_t err = HWC2_ERROR_NONE;
2534
2535 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2536
2537 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2538
2539 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2540}
2541
2542/* TESTCASE: Tests that the HWC2 can set all supported power modes */
2543TEST_F(Hwc2Test, SET_POWER_MODE)
2544{
2545 for (auto display : mDisplays) {
2546 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2547 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2548
2549 int32_t support = -1;
2550 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2551 if (support != 1)
2552 return;
2553
2554 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2555 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2556 HWC2_POWER_MODE_DOZE_SUSPEND));
2557
2558 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2559 }
2560}
2561
2562/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
2563TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
2564{
2565 hwc2_display_t display;
2566 hwc2_error_t err = HWC2_ERROR_NONE;
2567
2568 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2569
2570 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
2571 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2572
2573 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
2574 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2575
2576 int32_t support = -1;
2577 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2578 if (support != 1)
2579 return;
2580
2581 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
2582 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2583
2584 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
2585 &err));
2586 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2587}
2588
2589/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
2590TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
2591{
2592 for (auto display : mDisplays) {
2593 hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
2594 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
2595 hwc2_error_t err = HWC2_ERROR_NONE;
2596
2597 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
2598 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
2599 << mode;
2600 }
2601}
2602
2603/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
2604 * an optional power mode. */
2605TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
2606{
2607 for (auto display : mDisplays) {
2608 int32_t support = -1;
2609 hwc2_error_t err = HWC2_ERROR_NONE;
2610
2611 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2612 if (support == 1)
2613 return;
2614
2615 ASSERT_EQ(support, 0) << "invalid doze support value";
2616
2617 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
2618 &err));
2619 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
2620
2621 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2622 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
2623 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
2624 }
2625}
2626
2627/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
2628TEST_F(Hwc2Test, SET_POWER_MODE_stress)
2629{
2630 for (auto display : mDisplays) {
2631 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2632 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2633
2634 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2635 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2636
2637 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2638 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2639
2640 int32_t support = -1;
2641 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2642 if (support != 1)
2643 return;
2644
2645 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2646 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2647
2648 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2649 HWC2_POWER_MODE_DOZE_SUSPEND));
2650 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2651 HWC2_POWER_MODE_DOZE_SUSPEND));
2652
2653 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2654 }
2655}
Marissa Wall572a1ee2016-12-15 12:24:13 -08002656
2657/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
2658 * displays */
2659TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
2660{
2661 for (auto display : mDisplays) {
2662 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2663 const_cast<char*>("data"));
2664
2665 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2666
2667 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2668 []() { return; }));
2669
2670 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2671
2672 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2673
2674 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2675 }
2676}
2677
2678/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
2679TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
2680{
2681 for (auto display : mDisplays) {
2682 hwc2_display_t receivedDisplay;
2683 int64_t receivedTimestamp;
2684
2685 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2686
2687 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
2688
2689 ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
2690 &receivedTimestamp));
2691
2692 EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
2693 EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
2694
2695 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
2696
2697 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2698 }
2699}
2700
2701/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
2702TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
2703{
2704 hwc2_display_t display;
2705 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2706 const_cast<char*>("data"));
2707 hwc2_error_t err = HWC2_ERROR_NONE;
2708
2709 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2710
2711 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2712 []() { return; }));
2713
2714 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
2715 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2716
2717 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
2718 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2719}
2720
2721/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
2722TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
2723{
2724 for (auto display : mDisplays) {
2725 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2726 const_cast<char*>("data"));
2727 hwc2_error_t err = HWC2_ERROR_NONE;
2728
2729 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2730
2731 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2732 []() { return; }));
2733
2734 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
2735 &err));
2736 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2737
2738 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2739 }
2740}
2741
2742/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
2743 * times. */
2744TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
2745{
2746 for (auto display : mDisplays) {
2747 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2748 const_cast<char*>("data"));
2749
2750 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2751
2752 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2753 []() { return; }));
2754
2755 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2756
2757 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2758 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2759
2760 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2761 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2762
2763 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2764 }
2765}
2766
2767/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
2768 * is off and no callback is registered. */
2769TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
2770{
2771 const uint secs = 1;
2772
2773 for (auto display : mDisplays) {
2774 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2775
2776 sleep(secs);
2777
2778 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2779 }
2780}
2781
2782/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
2783 * is registered. */
2784TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
2785{
2786 const uint secs = 1;
2787
2788 for (auto display : mDisplays) {
2789 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2790
2791 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2792
2793 sleep(secs);
2794
2795 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2796
2797 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2798 }
2799}
Marissa Walldd4087f2016-12-15 12:24:52 -08002800
2801/* TESTCASE: Tests that the HWC2 returns a display name for each display */
2802TEST_F(Hwc2Test, GET_DISPLAY_NAME)
2803{
2804 for (auto display : mDisplays) {
2805 std::string name;
2806
2807 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
2808 }
2809}
2810
2811/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
2812 * display */
2813TEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
2814{
2815 hwc2_display_t display;
2816 std::string name;
2817 hwc2_error_t err = HWC2_ERROR_NONE;
2818
2819 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2820
2821 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
2822 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2823}
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08002824
2825/* TESTCASE: Tests that the HWC2 can set basic composition types. */
2826TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
2827{
2828 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2829 setComposition, advanceComposition));
2830}
2831
2832/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
2833 * layer. */
2834TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
2835{
2836 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2837 setComposition, advanceComposition));
2838}
2839
2840/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
2841TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
2842{
2843 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2844 setComposition));
2845}
2846
2847/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
2848TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
2849{
2850 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2851 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2852 hwc2_error_t* outErr) {
2853
2854 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
2855 layer, HWC2_COMPOSITION_INVALID, outErr));
2856 }
2857 ));
2858}
Marissa Wallffc67da2016-12-15 12:26:09 -08002859
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002860/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
2861TEST_F(Hwc2Test, SET_CURSOR_POSITION)
2862{
2863 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2864 ::setCursorPosition, advanceCursorPosition));
2865}
2866
2867/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
2868TEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
2869{
2870 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2871 ::setCursorPosition, advanceCursorPosition));
2872}
2873
2874/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
2875 * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
2876TEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
2877{
2878 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2879 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002880 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002881
Marissa Wall5a240aa2016-12-15 12:34:06 -08002882 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002883 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
2884 cursorPosition.left, cursorPosition.top, outErr));
2885 },
2886
2887 advanceCursorPosition));
2888}
2889
2890/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
2891 * display. */
2892TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
2893{
2894 hwc2_display_t display;
2895 hwc2_layer_t layer = 0;
2896 int32_t x = 0, y = 0;
2897 hwc2_error_t err = HWC2_ERROR_NONE;
2898
2899 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2900
2901 ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
2902 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2903}
2904
2905/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
2906TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
2907{
2908 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2909 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002910 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002911
Marissa Wall5a240aa2016-12-15 12:34:06 -08002912 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002913 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
2914 badLayer, cursorPosition.left, cursorPosition.top,
2915 outErr));
2916 }
2917 ));
2918}
2919
Marissa Wallffc67da2016-12-15 12:26:09 -08002920/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
2921TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
2922{
2923 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2924 setBlendMode, advanceBlendMode));
2925}
2926
2927/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
2928TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
2929{
2930 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2931 setBlendMode, advanceBlendMode));
2932}
2933
2934/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
2935TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
2936{
2937 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2938 setBlendMode));
2939}
2940
2941/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
2942TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
2943{
2944 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2945 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2946 hwc2_error_t* outErr) {
2947
2948 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
2949 layer, HWC2_BLEND_MODE_INVALID, outErr));
2950 }
2951 ));
2952}
Marissa Wallb72b5c92016-12-15 12:26:39 -08002953
Marissa Wall5a240aa2016-12-15 12:34:06 -08002954/* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
2955TEST_F(Hwc2Test, SET_LAYER_BUFFER)
2956{
2957 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2958 setBuffer, advanceBuffer));
2959}
2960
2961/* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
2962TEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
2963{
2964 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2965 setBuffer, advanceBuffer));
2966}
2967
2968/* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
2969TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
2970{
2971 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2972 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
2973 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2974
2975 buffer_handle_t handle = nullptr;
2976 android::base::unique_fd acquireFence;
2977
2978 /* If there is not available buffer for the given buffer
2979 * properties, it should not fail this test case */
2980 if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
2981 *outErr = HWC2_ERROR_BAD_LAYER;
2982 return;
2983 }
2984
2985 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
2986 handle, acquireFence, outErr));
2987 }
2988 ));
2989}
2990
2991/* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
2992TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
2993{
2994 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2995 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2996 hwc2_error_t* outErr) {
2997
2998 buffer_handle_t handle = nullptr;
2999 int32_t acquireFence = -1;
3000
3001 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
3002 handle, acquireFence, outErr));
3003 }
3004 ));
3005}
3006
Marissa Wallee242782016-12-15 12:30:12 -08003007/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
3008TEST_F(Hwc2Test, SET_LAYER_COLOR)
3009{
3010 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3011 setColor, advanceColor));
3012}
3013
3014/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
3015TEST_F(Hwc2Test, SET_LAYER_COLOR_update)
3016{
3017 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3018 setColor, advanceColor));
3019}
3020
3021/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
3022 * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
3023TEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
3024{
3025 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
3026 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003027 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08003028
3029 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003030 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08003031 },
3032
3033 advanceColor));
3034}
3035
3036/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
3037TEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
3038{
3039 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3040 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003041 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08003042
3043 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003044 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08003045 }
3046 ));
3047}
3048
Marissa Wallb72b5c92016-12-15 12:26:39 -08003049/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
3050TEST_F(Hwc2Test, SET_LAYER_DATASPACE)
3051{
3052 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3053 setDataspace, advanceDataspace));
3054}
3055
3056/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
3057TEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
3058{
3059 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3060 setDataspace, advanceDataspace));
3061}
3062
3063/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
3064TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
3065{
3066 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3067 setDataspace));
3068}
Marissa Wall2b1f5302016-12-15 12:27:20 -08003069
Marissa Wall600a73b2016-12-15 12:30:39 -08003070/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
3071TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
3072{
3073 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3074 setDisplayFrame, advanceDisplayFrame));
3075}
3076
3077/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
3078TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
3079{
3080 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3081 setDisplayFrame, advanceDisplayFrame));
3082}
3083
3084/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
3085TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
3086{
3087 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3088 setDisplayFrame));
3089}
3090
Marissa Wall2b1f5302016-12-15 12:27:20 -08003091/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
3092TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
3093{
3094 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3095 setPlaneAlpha, advancePlaneAlpha));
3096}
3097
3098/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
3099TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
3100{
3101 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3102 setPlaneAlpha, advancePlaneAlpha));
3103}
3104
3105/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
3106TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
3107{
3108 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3109 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003110 Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
Marissa Wall2b1f5302016-12-15 12:27:20 -08003111
3112 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003113 badLayer, testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08003114 }
3115 ));
3116}
Marissa Wallac108192016-12-15 12:27:48 -08003117
Marissa Wallc57468f2016-12-15 12:31:12 -08003118/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
3119TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
3120{
3121 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3122 setSourceCrop, advanceSourceCrop));
3123}
3124
3125/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
3126TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
3127{
3128 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3129 setSourceCrop, advanceSourceCrop));
3130}
3131
3132/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
3133TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
3134{
3135 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3136 setSourceCrop));
3137}
3138
Marissa Wallad761812016-12-15 12:32:24 -08003139/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
3140TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
3141{
3142 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3143 setSurfaceDamage, advanceSurfaceDamage));
3144}
3145
3146/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
3147TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
3148{
3149 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3150 setSurfaceDamage, advanceSurfaceDamage));
3151}
3152
3153/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
3154TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
3155{
3156 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3157 setSurfaceDamage));
3158}
3159
Marissa Wallac108192016-12-15 12:27:48 -08003160/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
3161TEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
3162{
3163 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3164 setTransform, advanceTransform));
3165}
3166
3167/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
3168TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
3169{
3170 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3171 setTransform, advanceTransform));
3172}
3173
3174/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
3175TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
3176{
3177 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3178 setTransform));
3179}
Marissa Wall273b1df2016-12-15 12:28:47 -08003180
Marissa Wallf7618ed2016-12-15 12:34:39 -08003181/* TESTCASE: Tests that the HWC2 can set the visible region of a layer. */
3182TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION)
3183{
3184 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Basic, 5,
3185 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
3186 Hwc2TestLayers* testLayers) {
3187
3188 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display,
3189 layer, testLayers->getVisibleRegion(layer)));
3190 },
3191
3192 advanceVisibleRegions));
3193}
3194
3195/* TESTCASE: Tests that the HWC2 cannot set the visible region of a bad layer. */
3196TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION_bad_layer)
3197{
3198 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3199 setVisibleRegion));
3200}
3201
Marissa Wall273b1df2016-12-15 12:28:47 -08003202/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
3203TEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
3204{
3205 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
3206 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003207 Hwc2TestLayers* testLayers) {
Marissa Wall273b1df2016-12-15 12:28:47 -08003208
3209 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003210 testLayers->getZOrder(layer)));
Marissa Wallf7618ed2016-12-15 12:34:39 -08003211 },
3212
3213 /* TestLayer z orders are set during the construction of TestLayers
3214 * and cannot be updated. There is no need (or ability) to cycle
3215 * through additional z order configurations. */
3216 [] (Hwc2TestLayers* /*testLayers*/) {
3217 return false;
Marissa Wall273b1df2016-12-15 12:28:47 -08003218 }
3219 ));
3220}
3221
3222/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
3223TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
3224{
3225 const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
3226 static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
3227 static_cast<uint32_t>(UINT32_MAX / 2),
3228 static_cast<uint32_t>(UINT32_MAX) };
3229
3230 for (auto display : mDisplays) {
3231 std::vector<hwc2_config_t> configs;
3232
3233 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3234
3235 for (auto config : configs) {
3236 hwc2_layer_t layer;
3237
3238 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3239
3240 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
3241
3242 for (uint32_t zOrder : zOrders) {
3243 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
3244 }
3245
3246 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
3247 }
3248 }
3249}
3250
3251/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
3252TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
3253{
3254 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3255 setZOrder));
3256}
Marissa Wall1cd789c2017-01-27 12:55:36 -08003257
3258/* TESTCASE: Tests that the HWC2 can display a layer with basic property
3259 * coverage */
3260TEST_F(Hwc2Test, VALIDATE_DISPLAY_basic)
3261{
3262 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3263 [] (Hwc2Test* test, hwc2_display_t display,
Marissa Wall706178d2016-12-15 12:39:14 -08003264 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003265 Hwc2TestLayers* /*testLayers*/) {
Marissa Wall1cd789c2017-01-27 12:55:36 -08003266
3267 uint32_t numTypes, numRequests;
3268 bool hasChanges = false;
3269
3270 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3271 &numRequests, &hasChanges));
3272 if (hasChanges)
3273 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
3274 << "wrong number of requests";
3275 }
3276 ));
3277}
3278
3279/* TESTCASE: Tests that the HWC2 can display 5 layers with default coverage. */
3280TEST_F(Hwc2Test, VALIDATE_DISPLAY_default_5)
3281{
3282 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 5,
3283 [] (Hwc2Test* test, hwc2_display_t display,
Marissa Wall706178d2016-12-15 12:39:14 -08003284 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003285 Hwc2TestLayers* /*testLayers*/) {
Marissa Wall1cd789c2017-01-27 12:55:36 -08003286
3287 uint32_t numTypes, numRequests;
3288 bool hasChanges = false;
3289
3290 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3291 &numRequests, &hasChanges));
3292 if (hasChanges)
3293 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
3294 << "wrong number of requests";
3295 }
3296 ));
3297}
3298
3299/* TESTCASE: Tests that the HWC2 cannot validate a bad display */
3300TEST_F(Hwc2Test, VALIDATE_DISPLAY_bad_display)
3301{
3302 hwc2_display_t display;
3303 uint32_t numTypes, numRequests;
3304 hwc2_error_t err = HWC2_ERROR_NONE;
3305
3306 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3307
3308 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes, &numRequests,
3309 &err));
3310 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3311}
Marissa Wall706178d2016-12-15 12:39:14 -08003312
3313/* TESTCASE: Tests that the HWC2 can get display requests after validating a
3314 * basic layer. */
3315TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_basic)
3316{
3317 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3318 [] (Hwc2Test* test, hwc2_display_t display,
3319 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003320 Hwc2TestLayers* /*testLayers*/) {
Marissa Wall706178d2016-12-15 12:39:14 -08003321
3322 uint32_t numTypes, numRequests;
3323 bool hasChanges = false;
3324
3325 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3326 &numRequests, &hasChanges));
3327 if (hasChanges)
3328 EXPECT_LE(numTypes, layers.size())
3329 << "wrong number of requests";
3330
3331 EXPECT_NO_FATAL_FAILURE(test->handleRequests(display, layers,
3332 numRequests));
3333 }
3334 ));
3335}
3336
3337/* TESTCASE: Tests that the HWC2 cannot get display requests from a bad display */
3338TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_bad_display)
3339{
3340 hwc2_display_t display;
3341 hwc2_display_request_t displayRequests;
3342 std::vector<hwc2_layer_t> layers;
3343 std::vector<hwc2_layer_request_t> layerRequests;
3344 hwc2_error_t err = HWC2_ERROR_NONE;
3345
3346 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3347
3348 EXPECT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequests,
3349 &layers, &layerRequests, &err));
3350 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3351}
3352
3353/* TESTCASE: Tests that the HWC2 cannot get display requests from an non
3354 * validated display. */
3355TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_not_validated)
3356{
3357 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3358 [] (Hwc2Test* test, hwc2_display_t display,
3359 std::vector<hwc2_layer_t>* layers) {
3360
3361 hwc2_display_request_t displayRequests;
3362 std::vector<hwc2_layer_request_t> layerRequests;
3363 hwc2_error_t err = HWC2_ERROR_NONE;
3364
3365 ASSERT_NO_FATAL_FAILURE(test->getDisplayRequests(display,
3366 &displayRequests, layers, &layerRequests, &err));
3367 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3368 << "returned wrong error code";
3369 }
3370 ));
3371}
3372
3373/* TESTCASE: Tests that the HWC2 can get changed composition types after
3374 * validating a basic layer. */
3375TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_basic)
3376{
3377 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3378 [] (Hwc2Test* test, hwc2_display_t display,
3379 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003380 Hwc2TestLayers* testLayers) {
Marissa Wall706178d2016-12-15 12:39:14 -08003381
3382 uint32_t numTypes, numRequests;
3383 bool hasChanges = false;
3384
3385 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3386 &numRequests, &hasChanges));
3387 if (hasChanges)
3388 EXPECT_LE(numTypes, layers.size())
3389 << "wrong number of requests";
3390
3391 EXPECT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
Marissa Wall563030b2017-02-21 14:01:05 -08003392 *testLayers, layers, numTypes));
Marissa Wall706178d2016-12-15 12:39:14 -08003393 }
3394 ));
3395}
3396
3397/* TESTCASE: Tests that the HWC2 cannot get changed composition types from a bad
3398 * display */
3399TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_bad_display)
3400{
3401 hwc2_display_t display;
3402 std::vector<hwc2_layer_t> layers;
3403 std::vector<hwc2_composition_t> types;
3404 hwc2_error_t err = HWC2_ERROR_NONE;
3405
3406 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3407
3408 EXPECT_NO_FATAL_FAILURE(getChangedCompositionTypes(display, &layers,
3409 &types, &err));
3410 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3411}
3412
3413/* TESTCASE: Tests that the HWC2 cannot get changed composition types from an non
3414 * validated display. */
3415TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_not_validated)
3416{
3417 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3418 [] (Hwc2Test* test, hwc2_display_t display,
3419 std::vector<hwc2_layer_t>* layers) {
3420
3421 std::vector<hwc2_composition_t> types;
3422 hwc2_error_t err = HWC2_ERROR_NONE;
3423
3424 ASSERT_NO_FATAL_FAILURE(test->getChangedCompositionTypes(
3425 display, layers, &types, &err));
3426 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3427 << "returned wrong error code";
3428 }
3429 ));
3430}
3431
3432/* TESTCASE: Tests that the HWC2 can accept display changes after validating a
3433 * basic layer. */
3434TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_basic)
3435{
3436 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3437 [] (Hwc2Test* test, hwc2_display_t display,
3438 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003439 Hwc2TestLayers* testLayers) {
Marissa Wall706178d2016-12-15 12:39:14 -08003440
3441 uint32_t numTypes, numRequests;
3442 bool hasChanges = false;
3443
3444 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3445 &numRequests, &hasChanges));
3446 if (hasChanges)
3447 EXPECT_LE(numTypes, layers.size())
3448 << "wrong number of requests";
3449
3450 ASSERT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
Marissa Wall563030b2017-02-21 14:01:05 -08003451 *testLayers, layers, numTypes));
Marissa Wall706178d2016-12-15 12:39:14 -08003452
3453 EXPECT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display));
3454 }
3455 ));
3456}
3457
3458/* TESTCASE: Tests that the HWC2 cannot accept display changes from a bad
3459 * display */
3460TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_bad_display)
3461{
3462 hwc2_display_t display;
3463 hwc2_error_t err = HWC2_ERROR_NONE;
3464
3465 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3466
3467 EXPECT_NO_FATAL_FAILURE(acceptDisplayChanges(display, &err));
3468 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3469}
3470
3471/* TESTCASE: Tests that the HWC2 cannot accept display changes from an non
3472 * validated display. */
3473TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_not_validated)
3474{
3475 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3476 [] (Hwc2Test* test, hwc2_display_t display,
3477 std::vector<hwc2_layer_t>* /*layers*/) {
3478
3479 hwc2_error_t err = HWC2_ERROR_NONE;
3480
3481 ASSERT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display, &err));
3482 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3483 << "returned wrong error code";
3484 }
3485 ));
3486}
Marissa Wallf18cfb02017-02-21 14:01:05 -08003487
3488/* TESTCASE: Tests that the HWC2 supports client target with required values */
3489TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT)
3490{
3491 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3492 [] (Hwc2Test* test, hwc2_display_t display,
3493 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3494
3495 const Area bufferArea = testClientTargetSupport.getBufferArea();
3496 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3497
3498 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3499 bufferArea.width, bufferArea.height, format,
3500 testClientTargetSupport.getDataspace()));
3501 },
3502
3503 advanceClientTargetSupport));
3504}
3505
3506/* TESTCASE: Tests that the HWC2 cannot get client target support for a bad
3507 * display. */
3508TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_bad_display)
3509{
3510 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3511 [] (Hwc2Test* test, hwc2_display_t /*display*/,
3512 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3513
3514 const Area bufferArea = testClientTargetSupport.getBufferArea();
3515 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3516 hwc2_display_t badDisplay;
3517 hwc2_error_t err = HWC2_ERROR_NONE;
3518
3519 ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
3520
3521 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(badDisplay,
3522 bufferArea.width, bufferArea.height, format,
3523 testClientTargetSupport.getDataspace(), &err));
3524 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3525 },
3526
3527 advanceClientTargetSupport));
3528}
3529
3530/* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
3531 * for a variety of client target values. */
3532TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_unsupported)
3533{
3534 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Complete,
3535 [] (Hwc2Test* test, hwc2_display_t display,
3536 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3537
3538 const Area bufferArea = testClientTargetSupport.getBufferArea();
3539 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3540 hwc2_error_t err = HWC2_ERROR_NONE;
3541
3542 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3543 bufferArea.width, bufferArea.height, format,
3544 testClientTargetSupport.getDataspace(), &err));
3545 EXPECT_TRUE(err == HWC2_ERROR_NONE
3546 || err == HWC2_ERROR_UNSUPPORTED)
3547 << "returned wrong error code";
3548 },
3549
3550 advanceClientTargetSupport));
3551}
3552
3553/* TESTCASE: Tests that the HWC2 can set a client target buffer for a basic
3554 * layer. */
3555TEST_F(Hwc2Test, SET_CLIENT_TARGET_basic)
3556{
3557 const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3558 const hwc_region_t damage = { };
3559 const size_t layerCnt = 1;
3560
3561 for (auto display : mDisplays) {
3562 std::vector<hwc2_config_t> configs;
3563
3564 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
3565
3566 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3567
3568 for (auto config : configs) {
3569 Area displayArea;
3570 std::vector<hwc2_layer_t> layers;
3571
3572 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3573 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
3574
3575 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
3576 Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Basic,
3577 displayArea);
3578
3579 if (!testLayers.optimizeLayouts())
3580 continue;
3581
3582 Hwc2TestClientTarget testClientTarget;
3583
3584 do {
3585 std::set<hwc2_layer_t> clientLayers;
3586 std::set<hwc2_layer_t> clearLayers;
3587 uint32_t numTypes, numRequests;
3588 bool hasChanges, skip;
3589 bool flipClientTarget;
3590 buffer_handle_t handle;
3591 int32_t acquireFence;
3592
3593 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
3594 &testLayers, &skip));
3595 if (skip)
3596 continue;
3597
3598 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
3599 &numRequests, &hasChanges));
3600 if (hasChanges)
3601 EXPECT_LE(numTypes, layers.size())
3602 << "wrong number of requests";
3603
3604 ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
3605 testLayers, layers, numTypes, &clientLayers));
3606 ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
3607 numRequests, &clearLayers, &flipClientTarget));
3608 ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3609 clearLayers, flipClientTarget, displayArea, &handle,
3610 &acquireFence), 0);
3611 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle,
3612 acquireFence, dataspace, damage));
3613
3614 if (acquireFence >= 0)
3615 close(acquireFence);
3616
3617 } while (testLayers.advance());
3618
3619 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
3620 }
3621
3622 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
3623 }
3624}
3625
3626/* TESTCASE: Tests that the HWC2 cannot set a client target for a bad display. */
3627TEST_F(Hwc2Test, SET_CLIENT_TARGET_bad_display)
3628{
3629 hwc2_display_t display;
3630 std::vector<hwc2_layer_t> layers;
3631 const Area displayArea = {0, 0};
3632 Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Default, displayArea);
3633 std::set<hwc2_layer_t> clientLayers;
3634 std::set<hwc2_layer_t> flipClientTargetLayers;
3635 bool flipClientTarget = true;
3636 const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3637 const hwc_region_t damage = { };
3638 buffer_handle_t handle;
3639 int32_t acquireFence;
3640 hwc2_error_t err = HWC2_ERROR_NONE;
3641
3642 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3643
3644 Hwc2TestClientTarget testClientTarget;
3645
3646 ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3647 flipClientTargetLayers, flipClientTarget, displayArea, &handle,
3648 &acquireFence), 0);
3649
3650 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
3651 dataspace, damage, &err));
3652
3653 if (acquireFence >= 0)
3654 close(acquireFence);
3655
3656 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3657}
Marissa Wall563030b2017-02-21 14:01:05 -08003658
3659/* TESTCASE: Tests that the HWC2 can present 1 default layer. */
3660TEST_F(Hwc2Test, PRESENT_DISPLAY_default_1)
3661{
3662 const size_t layerCnt = 1;
3663 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3664 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3665 bool optimize = false;
3666
3667 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3668 optimize));
3669}
3670
3671/* TESTCASE: Tests that the HWC2 can present 2 default layers. */
3672TEST_F(Hwc2Test, PRESENT_DISPLAY_default_2)
3673{
3674 const size_t layerCnt = 2;
3675 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3676 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3677 bool optimize = false;
3678
3679 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3680 optimize));
3681}
3682
3683/* TESTCASE: Tests that the HWC2 can present 3 default layers. */
3684TEST_F(Hwc2Test, PRESENT_DISPLAY_default_3)
3685{
3686 const size_t layerCnt = 3;
3687 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3688 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3689 bool optimize = false;
3690
3691 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3692 optimize));
3693}
3694
3695/* TESTCASE: Tests that the HWC2 can present 4 default layers. */
3696TEST_F(Hwc2Test, PRESENT_DISPLAY_default_4)
3697{
3698 const size_t layerCnt = 4;
3699 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3700 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3701 bool optimize = false;
3702
3703 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3704 optimize));
3705}
3706
3707/* TESTCASE: Tests that the HWC2 can present 5 default layers. */
3708TEST_F(Hwc2Test, PRESENT_DISPLAY_default_5)
3709{
3710 const size_t layerCnt = 5;
3711 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3712 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3713 bool optimize = false;
3714
3715 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3716 optimize));
3717}
3718
3719/* TESTCASE: Tests that the HWC2 can present 6 default layers. */
3720TEST_F(Hwc2Test, PRESENT_DISPLAY_default_6)
3721{
3722 const size_t layerCnt = 6;
3723 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3724 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3725 bool optimize = false;
3726
3727 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3728 optimize));
3729}
3730
3731/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3732 * blend mode. */
3733TEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_1)
3734{
3735 const size_t layerCnt = 1;
3736 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3737 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3738 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
3739 {Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Basic},
3740 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
3741 bool optimize = false;
3742
3743 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3744 optimize));
3745}
3746
3747/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3748 * blend mode. */
3749TEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_2)
3750{
3751 const size_t layerCnt = 2;
3752 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3753 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3754 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
3755 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
3756 bool optimize = false;
3757
3758 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3759 optimize));
3760}
3761
3762/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3763 * buffer. */
3764TEST_F(Hwc2Test, PRESENT_DISPLAY_buffer_1)
3765{
3766 const size_t layerCnt = 1;
3767 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3768 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3769 {{Hwc2TestPropertyName::BufferArea, Hwc2TestCoverage::Complete}};
3770 bool optimize = true;
3771
3772 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3773 optimize));
3774}
3775
3776/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3777 * color. */
3778TEST_F(Hwc2Test, PRESENT_DISPLAY_color_1)
3779{
3780 const size_t layerCnt = 1;
3781 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3782 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3783 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3784 {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Complete}};
3785 bool optimize = true;
3786
3787 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3788 optimize));
3789}
3790
3791/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3792 * color. */
3793TEST_F(Hwc2Test, PRESENT_DISPLAY_color_2)
3794{
3795 const size_t layerCnt = 2;
3796 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3797 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3798 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3799 {Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3800 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic},
3801 {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Basic}};
3802 bool optimize = true;
3803
3804 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3805 optimize));
3806}
3807
3808/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3809 * composition. */
3810TEST_F(Hwc2Test, PRESENT_DISPLAY_composition_1)
3811{
3812 const size_t layerCnt = 1;
3813 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3814 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3815 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete}};
3816 bool optimize = true;
3817
3818 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3819 optimize));
3820}
3821
3822/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3823 * cursor. */
3824TEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_1)
3825{
3826 const size_t layerCnt = 1;
3827 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3828 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3829 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3830 {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete}};
3831 bool optimize = true;
3832
3833 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3834 optimize));
3835}
3836
3837/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3838 * cursor. */
3839TEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_2)
3840{
3841 const size_t layerCnt = 2;
3842 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3843 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3844 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3845 {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete},
3846 {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
3847 bool optimize = true;
3848
3849 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3850 optimize));
3851}
3852
3853/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3854 * dataspace. */
3855TEST_F(Hwc2Test, PRESENT_DISPLAY_dataspace_1)
3856{
3857 const size_t layerCnt = 1;
3858 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3859 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3860 {{Hwc2TestPropertyName::Dataspace, Hwc2TestCoverage::Complete}};
3861 bool optimize = true;
3862
3863 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3864 optimize));
3865}
3866
3867/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3868 * display frame. */
3869TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_1)
3870{
3871 const size_t layerCnt = 1;
3872 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3873 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3874 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3875 bool optimize = true;
3876
3877 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3878 optimize));
3879}
3880
3881/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3882 * display frame. */
3883TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_2)
3884{
3885 const size_t layerCnt = 2;
3886 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3887 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3888 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3889 bool optimize = true;
3890
3891 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3892 optimize));
3893}
3894
3895/* TESTCASE: Tests that the HWC2 can present 3 layers with complete coverage of
3896 * display frame. */
3897TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_3)
3898{
3899 const size_t layerCnt = 3;
3900 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3901 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3902 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3903 bool optimize = true;
3904
3905 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3906 optimize));
3907}
3908
3909/* TESTCASE: Tests that the HWC2 can present 4 layers with complete coverage of
3910 * display frame. */
3911TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_4)
3912{
3913 const size_t layerCnt = 4;
3914 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3915 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3916 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3917 bool optimize = true;
3918
3919 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3920 optimize));
3921}
3922
3923/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3924 * plane alpha. */
3925TEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_1)
3926{
3927 const size_t layerCnt = 1;
3928 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3929 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3930 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3931 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
3932 bool optimize = false;
3933
3934 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3935 optimize));
3936}
3937
3938/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3939 * plane alpha. */
3940TEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_2)
3941{
3942 const size_t layerCnt = 2;
3943 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3944 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3945 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3946 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
3947 bool optimize = false;
3948
3949 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3950 optimize));
3951}
3952
3953/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3954 * source crop. */
3955TEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_1)
3956{
3957 const size_t layerCnt = 1;
3958 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3959 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3960 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
3961 {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
3962 bool optimize = true;
3963
3964 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3965 optimize));
3966}
3967
3968/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3969 * source crop. */
3970TEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_2)
3971{
3972 const size_t layerCnt = 2;
3973 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3974 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3975 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
3976 {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
3977 bool optimize = true;
3978
3979 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3980 optimize));
3981}
3982
3983
3984/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3985 * surface damage. */
3986TEST_F(Hwc2Test, PRESENT_DISPLAY_surface_damage_1)
3987{
3988 const size_t layerCnt = 1;
3989 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3990 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3991 {{Hwc2TestPropertyName::SurfaceDamage, Hwc2TestCoverage::Complete}};
3992 bool optimize = true;
3993
3994 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3995 optimize));
3996}
3997
3998/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3999 * transform. */
4000TEST_F(Hwc2Test, PRESENT_DISPLAY_transform_1)
4001{
4002 const size_t layerCnt = 1;
4003 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4004 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4005 {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete}};
4006 bool optimize = true;
4007
4008 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4009 optimize));
4010}
4011
4012/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
4013 * transform. */
4014TEST_F(Hwc2Test, PRESENT_DISPLAY_transform_2)
4015{
4016 const size_t layerCnt = 2;
4017 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4018 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4019 {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete},
4020 {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
4021 bool optimize = true;
4022
4023 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4024 optimize));
4025}
4026
4027/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4028 * basic. */
4029TEST_F(Hwc2Test, PRESENT_DISPLAY_basic_1)
4030{
4031 const size_t layerCnt = 1;
4032 Hwc2TestCoverage coverage = Hwc2TestCoverage::Basic;
4033 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
4034 bool optimize = true;
4035
4036 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4037 optimize));
4038}
4039
4040/* TESTCASE: Tests that the HWC2 cannot present a bad display. */
4041TEST_F(Hwc2Test, PRESENT_DISPLAY_bad_display)
4042{
4043 hwc2_display_t display;
4044 int32_t presentFence;
4045 hwc2_error_t err = HWC2_ERROR_NONE;
4046
4047 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4048
4049 ASSERT_NO_FATAL_FAILURE(presentDisplay(display, &presentFence, &err));
4050 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4051}
4052
4053/* TESTCASE: Tests that the HWC2 cannot present an unvalidated display. */
4054TEST_F(Hwc2Test, PRESENT_DISPLAY_not_validated)
4055{
4056 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 1,
4057 [] (Hwc2Test* test, hwc2_display_t display,
4058 const std::vector<hwc2_layer_t>& /*layers*/,
4059 Hwc2TestLayers* /*testLayers*/) {
4060
4061 int32_t presentFence;
4062 hwc2_error_t err = HWC2_ERROR_NONE;
4063
4064 ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
4065 HWC2_POWER_MODE_ON));
4066 ASSERT_NO_FATAL_FAILURE(test->enableVsync(display));
4067
4068 ASSERT_NO_FATAL_FAILURE(test->waitForVsync());
4069
4070 ASSERT_NO_FATAL_FAILURE(test->presentDisplay(display,
4071 &presentFence, &err));
4072 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
4073 << "returned wrong error code";
4074
4075 ASSERT_NO_FATAL_FAILURE(test->disableVsync(display));
4076 ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
4077 HWC2_POWER_MODE_OFF));
4078 }
4079 ));
4080}
4081
4082/* TESTCASE: Tests that the HWC2 cannot get release fences from a bad display. */
4083TEST_F(Hwc2Test, GET_RELEASE_FENCES_bad_display)
4084{
4085 hwc2_display_t display;
4086 std::vector<hwc2_layer_t> layers;
4087 std::vector<int32_t> fences;
4088 hwc2_error_t err = HWC2_ERROR_NONE;
4089
4090 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4091
4092 ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences, &err));
4093 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4094}
Marissa Wall35040c52016-12-15 12:41:06 -08004095
4096static const std::array<android_color_mode, 9> androidColorModes = {{
4097 HAL_COLOR_MODE_NATIVE,
4098 HAL_COLOR_MODE_STANDARD_BT601_625,
4099 HAL_COLOR_MODE_STANDARD_BT601_625_UNADJUSTED,
4100 HAL_COLOR_MODE_STANDARD_BT601_525,
4101 HAL_COLOR_MODE_STANDARD_BT601_525_UNADJUSTED,
4102 HAL_COLOR_MODE_STANDARD_BT709,
4103 HAL_COLOR_MODE_DCI_P3,
4104 HAL_COLOR_MODE_SRGB,
4105 HAL_COLOR_MODE_ADOBE_RGB,
4106}};
4107
4108/* TESTCASE: Tests that the HWC2 can get the color modes for a display. The
4109 * display must support HAL_COLOR_MODE_NATIVE */
4110TEST_F(Hwc2Test, GET_COLOR_MODES)
4111{
4112 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4113 [] (Hwc2Test* test, hwc2_display_t display) {
4114
4115 std::vector<android_color_mode_t> colorModes;
4116
4117 ASSERT_NO_FATAL_FAILURE(test->getColorModes(display,
4118 &colorModes));
4119
4120 EXPECT_NE(std::count(colorModes.begin(), colorModes.end(),
4121 HAL_COLOR_MODE_NATIVE), 0) << "all displays"
4122 " must support HAL_COLOR_MODE_NATIVE";
4123 }
4124 ));
4125}
4126
4127/* TESTCASE: Tests that the HWC2 cannot get color modes from a bad display. */
4128TEST_F(Hwc2Test, GET_COLOR_MODES_bad_display)
4129{
4130 hwc2_display_t display;
4131 std::vector<android_color_mode_t> colorModes;
4132 hwc2_error_t err = HWC2_ERROR_NONE;
4133
4134 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4135
4136 ASSERT_NO_FATAL_FAILURE(getColorModes(display, &colorModes, &err));
4137 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4138}
4139
4140/* TESTCASE: Tests that the HWC2 can set the required color mode on a display. */
4141TEST_F(Hwc2Test, SET_COLOR_MODES)
4142{
4143 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4144 [] (Hwc2Test* test, hwc2_display_t display) {
4145
4146 const android_color_mode_t colorMode = HAL_COLOR_MODE_NATIVE;
4147
4148 EXPECT_NO_FATAL_FAILURE(test->setColorMode(display, colorMode));
4149 }
4150 ));
4151}
4152
4153/* TESTCASE: Tests that the HWC2 cannot set a color mode on a bad display. */
4154TEST_F(Hwc2Test, SET_COLOR_MODES_bad_display)
4155{
4156 hwc2_display_t display;
4157 const android_color_mode_t colorMode = HAL_COLOR_MODE_NATIVE;
4158 hwc2_error_t err = HWC2_ERROR_NONE;
4159
4160 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4161
4162 ASSERT_NO_FATAL_FAILURE(setColorMode(display, colorMode, &err));
4163 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4164}
4165
4166/* TESTCASE: Tests that the HWC2 cannot set an invalid color mode. */
4167TEST_F(Hwc2Test, SET_COLOR_MODES_bad_parameter)
4168{
4169 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4170 [] (Hwc2Test* test, hwc2_display_t display) {
4171
4172 const android_color_mode_t colorMode =
4173 static_cast<android_color_mode_t>(-1);
4174 hwc2_error_t err = HWC2_ERROR_NONE;
4175
4176 ASSERT_NO_FATAL_FAILURE(test->setColorMode(display, colorMode,
4177 &err));
4178 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
4179 << "returned wrong error code";
4180 }
4181 ));
4182}
4183
4184/* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
4185 * for all valid color modes. */
4186TEST_F(Hwc2Test, SET_COLOR_MODES_unsupported)
4187{
4188 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4189 [] (Hwc2Test* test, hwc2_display_t display) {
4190
4191 for (auto colorMode : androidColorModes) {
4192 hwc2_error_t err = HWC2_ERROR_NONE;
4193
4194 ASSERT_NO_FATAL_FAILURE(test->setColorMode(display,
4195 colorMode, &err));
4196
4197 EXPECT_TRUE(err == HWC2_ERROR_NONE
4198 || err == HWC2_ERROR_UNSUPPORTED)
4199 << "returned wrong error code";
4200 }
4201 }
4202 ));
4203}
4204
4205/* TESTCASE: Tests that the HWC2 gets the HDR capabilities for a display and
4206 * test if they are valid. */
4207TEST_F(Hwc2Test, GET_HDR_CAPABILITIES)
4208{
4209 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4210 [] (Hwc2Test* test, hwc2_display_t display) {
4211
4212 std::vector<android_hdr_t> hdrCapabilities;
4213 float maxLuminance, maxAverageLuminance, minLuminance;
4214
4215 EXPECT_NO_FATAL_FAILURE(test->getHdrCapabilities(display,
4216 &hdrCapabilities, &maxLuminance, &maxAverageLuminance,
4217 &minLuminance));
4218
4219 if (hdrCapabilities.empty())
4220 return;
4221
4222 EXPECT_GE(maxLuminance, maxAverageLuminance);
4223 EXPECT_GE(maxAverageLuminance, minLuminance);
4224 }
4225 ));
4226}
4227
4228/* TESTCASE: Tests that the HWC2 cannot get hdr capabilities from a bad display */
4229TEST_F(Hwc2Test, GET_HDR_CAPABILITIES_bad_display)
4230{
4231 hwc2_display_t display;
4232 std::vector<android_hdr_t> hdrCapabilities;
4233 float maxLuminance, maxAverageLuminance, minLuminance;
4234 hwc2_error_t err = HWC2_ERROR_NONE;
4235
4236 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4237
4238 ASSERT_NO_FATAL_FAILURE(getHdrCapabilities(display, &hdrCapabilities,
4239 &maxLuminance, &maxAverageLuminance, &minLuminance, &err));
4240 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4241}
4242
4243static const std::array<float, 16> identityMatrix = {{
4244 1.0, 0.0, 0.0, 0.0,
4245 0.0, 1.0, 0.0, 0.0,
4246 0.0, 0.0, 1.0, 0.0,
4247 0.0, 0.0, 0.0, 1.0,
4248}};
4249
4250/* Values for the color transform matrices were precomputed using the source code
4251 * in surfaceflinger/Effects/Daltonizer.cpp. */
4252
4253static const std::array<const std::array<float, 16>, 5> exampleMatrices = {{
4254 identityMatrix,
4255 /* Converts RGB color to the XYZ space */
4256 {{ 0.4124, 0.2126, 0.0193, 0,
4257 0.3576, 0.7152, 0.1192, 0,
4258 0.1805, 0.0722, 0.9505, 0,
4259 0 , 0 , 0 , 1 }},
4260 /* Protanomaly */
4261 {{ 0.068493, 0.931506, 0, 0,
4262 0.068493, 0.931507, 0, 0,
4263 0.013626, -0.013626, 1, 0,
4264 0, 0, 0, 1 }},
4265 /* Deuteranomaly */
4266 {{ 0.288299, 0.711701, 0, 0,
4267 0.052709, 0.947291, 0, 0,
4268 -0.257912, 0.257912, 1, 0,
4269 0, 0, 0, 1 }},
4270 /* Tritanomaly */
4271 {{ 1, -0.805712, 0.805712, 0,
4272 0, 0.378838, 0.621162, 0,
4273 0, 0.104823, 0.895177, 0,
4274 0, 0, 0, 1 }},
4275}};
4276
4277/* TESTCASE: Tests that the HWC2 can set the identity color transform */
4278TEST_F(Hwc2Test, SET_COLOR_TRANSFORM)
4279{
4280 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4281 [] (Hwc2Test* test, hwc2_display_t display) {
4282
4283 EXPECT_NO_FATAL_FAILURE(test->setColorTransform(display,
4284 identityMatrix, HAL_COLOR_TRANSFORM_IDENTITY));
4285 }
4286 ));
4287}
4288
4289/* TESTCASE: Tests that the HWC2 cannot set the color transform for a bad
4290 * display. */
4291TEST_F(Hwc2Test, SET_COLOR_TRANSFORM_bad_display)
4292{
4293 hwc2_display_t display;
4294 hwc2_error_t err = HWC2_ERROR_NONE;
4295
4296 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4297
4298 ASSERT_NO_FATAL_FAILURE(setColorTransform(display, identityMatrix,
4299 HAL_COLOR_TRANSFORM_IDENTITY, &err));
4300 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4301}
4302
4303/* TESTCASE: Tests that the HWC2 cannot set an invalid color transform. */
4304TEST_F(Hwc2Test, SET_COLOR_TRANSFORM_bad_parameter)
4305{
4306 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4307 [] (Hwc2Test* test, hwc2_display_t display) {
4308
4309 const android_color_transform_t hint =
4310 static_cast<android_color_transform_t>(-1);
4311 hwc2_error_t err = HWC2_ERROR_NONE;
4312
4313 ASSERT_NO_FATAL_FAILURE(test->setColorTransform(display,
4314 identityMatrix, hint, &err));
4315 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
4316 << "returned wrong error code";
4317 }
4318 ));
4319}
4320
4321/* TESTCASE: Tests that the HWC2 can set an arbitrary color matrix. */
4322TEST_F(Hwc2Test, SET_COLOR_TRANSFORM_arbitrary_matrix)
4323{
4324 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4325 [] (Hwc2Test* test, hwc2_display_t display) {
4326
4327 const android_color_transform_t hint =
4328 HAL_COLOR_TRANSFORM_ARBITRARY_MATRIX;
4329
4330 for (const std::array<float, 16>& matrix : exampleMatrices) {
4331 EXPECT_NO_FATAL_FAILURE(test->setColorTransform(display,
4332 matrix, hint));
4333 }
4334 }
4335 ));
4336}
Marissa Wallbad1bc72017-02-21 14:33:46 -08004337
4338/* TESTCASE: Tests that the HWC2 create an destory virtual displays. */
4339TEST_F(Hwc2Test, CREATE_DESTROY_VIRTUAL_DISPLAY)
4340{
4341 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Complete,
4342 [] (Hwc2Test* /*test*/, hwc2_display_t /*display*/,
4343 Hwc2TestVirtualDisplay* /*testVirtualDisplay*/) { }));
4344}
4345
4346/* TESTCASE: Tests that the HWC2 can create and destroy multiple virtual
4347 * displays. */
4348TEST_F(Hwc2Test, CREATE_DESTROY_VIRTUAL_DISPLAY_multiple)
4349{
4350 Hwc2TestVirtualDisplay testVirtualDisplay(Hwc2TestCoverage::Complete);
4351 std::vector<hwc2_display_t> displays;
4352
4353 do {
4354 const UnsignedArea& dimension =
4355 testVirtualDisplay.getDisplayDimension();
4356 android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
4357 hwc2_display_t display;
4358 hwc2_error_t err = HWC2_ERROR_NONE;
4359
4360 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(dimension.width,
4361 dimension.height, &desiredFormat, &display, &err));
4362
4363 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_NO_RESOURCES
4364 || err == HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
4365 EXPECT_GE(desiredFormat, 0) << "invalid format";
4366
4367 if (err == HWC2_ERROR_NONE)
4368 displays.push_back(display);
4369
4370 } while (testVirtualDisplay.advance());
4371
4372 for (hwc2_display_t display : displays) {
4373 EXPECT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
4374 }
4375}
4376
4377/* TESTCASE: Tests that the HWC2 cannot destroy a bad virtual displays. */
4378TEST_F(Hwc2Test, DESTROY_VIRTUAL_DISPLAY_bad_display)
4379{
4380 hwc2_display_t display;
4381 hwc2_error_t err = HWC2_ERROR_NONE;
4382
4383 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4384
4385 ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display, &err));
4386 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4387}
4388
4389/* TESTCASE: Tests that the HWC2 cannot destroy a physical display. */
4390TEST_F(Hwc2Test, DESTROY_VIRTUAL_DISPLAY_bad_parameter)
4391{
4392 hwc2_display_t display = HWC_DISPLAY_PRIMARY;
4393 hwc2_error_t err = HWC2_ERROR_NONE;
4394
4395 ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display, &err));
4396 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
4397}
4398
4399/* TESTCASE: Tests that the HWC2 can get the max virtual display count. */
4400TEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT)
4401{
4402 uint32_t maxCnt;
4403
4404 ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt));
4405}
4406
4407/* TESTCASE: Tests that the HWC2 returns the same max virtual display count for
4408 * each call. */
4409TEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT_duplicate)
4410{
4411 uint32_t maxCnt1, maxCnt2;
4412
4413 ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt1));
4414 ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt2));
4415
4416 EXPECT_EQ(maxCnt1, maxCnt2) << "returned two different max virtual display"
4417 " counts";
4418}
4419
4420/* TESTCASE: Tests that the HWC2 can create the max number of virtual displays
4421 * that it reports. */
4422TEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT_create_max)
4423{
4424 std::vector<hwc2_display_t> displays;
4425 uint32_t maxCnt;
4426
4427 ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt));
4428
4429 while (displays.size() < maxCnt) {
4430 uint32_t width = 1920, height = 1080;
4431 android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
4432 hwc2_display_t display;
4433 hwc2_error_t err = HWC2_ERROR_NONE;
4434
4435 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(width, height,
4436 &desiredFormat, &display, &err));
4437
4438 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
4439 << "returned wrong error code";
4440 if (err != HWC2_ERROR_NONE)
4441 break;
4442
4443 displays.push_back(display);
4444 }
4445
4446 for (hwc2_display_t display : displays) {
4447 EXPECT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
4448 }
4449}
4450
4451/* TESTCASE: Tests that the HWC2 can set an output buffer for a virtual
4452 * display. */
4453TEST_F(Hwc2Test, SET_OUTPUT_BUFFER)
4454{
4455 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Complete,
4456 [] (Hwc2Test* test, hwc2_display_t display,
4457 Hwc2TestVirtualDisplay* testVirtualDisplay) {
4458
4459 buffer_handle_t handle;
4460 android::base::unique_fd acquireFence;
4461
4462 if (testVirtualDisplay->getBuffer(&handle, &acquireFence) >= 0)
4463 EXPECT_NO_FATAL_FAILURE(test->setOutputBuffer(display,
4464 handle, acquireFence));
4465 }));
4466}
4467
4468/* TESTCASE: Tests that the HWC2 cannot set an output buffer for a bad display */
4469TEST_F(Hwc2Test, SET_OUTPUT_BUFFER_bad_display)
4470{
4471 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Default,
4472 [] (Hwc2Test* test, hwc2_display_t /*display*/,
4473 Hwc2TestVirtualDisplay* testVirtualDisplay) {
4474
4475 hwc2_display_t badDisplay;
4476 buffer_handle_t handle;
4477 android::base::unique_fd acquireFence;
4478 hwc2_error_t err = HWC2_ERROR_NONE;
4479
4480 ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
4481
4482 if (testVirtualDisplay->getBuffer(&handle, &acquireFence) < 0)
4483 return;
4484
4485 ASSERT_NO_FATAL_FAILURE(test->setOutputBuffer(badDisplay,
4486 handle, acquireFence, &err));
4487 EXPECT_TRUE(err == HWC2_ERROR_BAD_DISPLAY)
4488 << "returned wrong error code";
4489 }));
4490}
4491
4492/* TESTCASE: Tests that the HWC2 cannot set an invalid output buffer. */
4493TEST_F(Hwc2Test, SET_OUTPUT_BUFFER_bad_parameter)
4494{
4495 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Default,
4496 [] (Hwc2Test* test, hwc2_display_t display,
4497 Hwc2TestVirtualDisplay* /*testVirtualDisplay*/) {
4498
4499 const buffer_handle_t handle = nullptr;
4500 uint32_t releaseFence = -1;
4501 hwc2_error_t err = HWC2_ERROR_NONE;
4502
4503 ASSERT_NO_FATAL_FAILURE(test->setOutputBuffer(display, handle,
4504 releaseFence, &err));
4505 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
4506 << "returned wrong error code";
4507 }));
4508}
4509
4510/* TESTCASE: Tests that the HWC2 cannot set an output buffer for non virtual
4511 * display */
4512TEST_F(Hwc2Test, SET_OUTPUT_BUFFER_unsupported)
4513{
4514 for (auto display : mDisplays) {
4515 Hwc2TestVirtualDisplay testVirtualDisplay(Hwc2TestCoverage::Complete);
4516
4517 do {
4518 buffer_handle_t handle;
4519 android::base::unique_fd acquireFence;
4520 hwc2_error_t err = HWC2_ERROR_NONE;
4521
4522 if (testVirtualDisplay.getBuffer(&handle, &acquireFence) < 0)
4523 continue;
4524
4525 ASSERT_NO_FATAL_FAILURE(setOutputBuffer(display, handle,
4526 acquireFence, &err));
4527 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
4528
4529 } while (testVirtualDisplay.advance());
4530 }
4531}