blob: 600c4540af0a1f46e6ee7571c5ef70a14fff8977 [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 Wall6bd8bfd2016-12-15 12:25:31 -080035
Marissa Wallcfb9a072017-02-17 20:53:18 -080036void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
37 hwc2_display_t display, int32_t connected);
Marissa Wall572a1ee2016-12-15 12:24:13 -080038void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
39 hwc2_display_t display, int64_t timestamp);
Marissa Wallcfb9a072017-02-17 20:53:18 -080040
Marissa Wall4d600052016-12-15 12:16:01 -080041class Hwc2Test : public testing::Test {
42public:
43
44 virtual void SetUp()
45 {
46 hw_module_t const* hwc2Module;
47
48 int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
49 ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
50 << strerror(-err);
51
52 /* The following method will fail if you have not run
53 * "adb shell stop" */
54 err = hwc2_open(hwc2Module, &mHwc2Device);
55 ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
56 << strerror(-err);
Marissa Wallcfb9a072017-02-17 20:53:18 -080057
58 populateDisplays();
Marissa Wall4d600052016-12-15 12:16:01 -080059 }
60
61 virtual void TearDown()
62 {
Marissa Wall1db2e372016-12-15 12:19:39 -080063
64 for (auto itr = mLayers.begin(); itr != mLayers.end();) {
65 hwc2_display_t display = itr->first;
66 hwc2_layer_t layer = itr->second;
67 itr++;
68 /* Destroys and removes the layer from mLayers */
69 destroyLayer(display, layer);
70 }
71
Marissa Wall03c91732016-12-15 12:23:16 -080072 for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
73 hwc2_display_t display = *itr;
74 itr++;
75 /* Sets power mode to off and removes the display from
76 * mActiveDisplays */
77 setPowerMode(display, HWC2_POWER_MODE_OFF);
78 }
79
Marissa Wall4d600052016-12-15 12:16:01 -080080 if (mHwc2Device)
81 hwc2_close(mHwc2Device);
82 }
83
Marissa Walla4b01482017-02-17 20:52:03 -080084 void registerCallback(hwc2_callback_descriptor_t descriptor,
85 hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
86 hwc2_error_t* outErr = nullptr)
87 {
88 auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
89 getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
90 ASSERT_TRUE(pfn) << "failed to get function";
91
92 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
93 callbackData, pointer));
94 if (outErr) {
95 *outErr = err;
96 } else {
97 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
98 }
99 }
100
Marissa Wallcfb9a072017-02-17 20:53:18 -0800101 void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
102 hwc2_error_t* outErr = nullptr)
103 {
104 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
105 getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
106 ASSERT_TRUE(pfn) << "failed to get function";
107
108 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
109 reinterpret_cast<int32_t*>(outType)));
110 if (outErr) {
111 *outErr = err;
112 } else {
113 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
114 }
115 }
116
117 /* If the populateDisplays function is still receiving displays and the
118 * display is connected, the display handle is stored in mDisplays. */
119 void hotplugCallback(hwc2_display_t display, int32_t connected)
120 {
121 std::lock_guard<std::mutex> lock(mHotplugMutex);
122
123 if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
124 return;
125
126 if (connected == HWC2_CONNECTION_CONNECTED)
127 mDisplays.insert(display);
128
129 mHotplugCv.notify_all();
130 }
131
Marissa Wall1db2e372016-12-15 12:19:39 -0800132 void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
133 hwc2_error_t* outErr = nullptr)
134 {
135 auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
136 getFunction(HWC2_FUNCTION_CREATE_LAYER));
137 ASSERT_TRUE(pfn) << "failed to get function";
138
139 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
140 outLayer));
141
142 if (err == HWC2_ERROR_NONE)
143 mLayers.insert(std::make_pair(display, *outLayer));
144
145 if (outErr) {
146 *outErr = err;
147 } else {
148 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
149 }
150 }
151
152 void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
153 hwc2_error_t* outErr = nullptr)
154 {
155 auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
156 getFunction(HWC2_FUNCTION_DESTROY_LAYER));
157 ASSERT_TRUE(pfn) << "failed to get function";
158
159 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
160
161 if (err == HWC2_ERROR_NONE)
162 mLayers.erase(std::make_pair(display, layer));
163
164 if (outErr) {
165 *outErr = err;
166 } else {
167 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
168 << layer;
169 }
170 }
171
Marissa Wallcf935cb2016-12-15 12:20:47 -0800172 void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
173 hwc2_attribute_t attribute, int32_t* outValue,
174 hwc2_error_t* outErr = nullptr)
175 {
176 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
177 getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
178 ASSERT_TRUE(pfn) << "failed to get function";
179
180 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
181 attribute, outValue));
182
183 if (outErr) {
184 *outErr = err;
185 } else {
186 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
187 << getAttributeName(attribute) << " for config " << config;
188 }
189 }
190
191 void getDisplayConfigs(hwc2_display_t display,
192 std::vector<hwc2_config_t>* outConfigs,
193 hwc2_error_t* outErr = nullptr)
194 {
195 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
196 getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
197 ASSERT_TRUE(pfn) << "failed to get function";
198
199 uint32_t numConfigs = 0;
200
201 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
202 &numConfigs, nullptr));
203
204 if (err == HWC2_ERROR_NONE) {
205 outConfigs->resize(numConfigs);
206
207 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
208 &numConfigs, outConfigs->data()));
209 }
210
211 if (outErr) {
212 *outErr = err;
213 } else {
214 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
215 " display " << display;
216 }
217 }
218
Marissa Wall93dc04f2016-12-15 12:21:46 -0800219 void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
220 hwc2_error_t* outErr = nullptr)
221 {
222 auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
223 getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
224 ASSERT_TRUE(pfn) << "failed to get function";
225
226 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
227 outConfig));
228 if (outErr) {
229 *outErr = err;
230 } else {
231 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
232 " display " << display;
233 }
234 }
235
236 void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
237 hwc2_error_t* outErr = nullptr)
238 {
239 auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
240 getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
241 ASSERT_TRUE(pfn) << "failed to get function";
242
243 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
244 if (outErr) {
245 *outErr = err;
246 } else {
247 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
248 << config;
249 }
250 }
251
Marissa Wall03c91732016-12-15 12:23:16 -0800252 void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
253 hwc2_error_t* outErr = nullptr)
254 {
255 auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
256 getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
257 ASSERT_TRUE(pfn) << "failed to get function";
258
259 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
260 outSupport));
261 if (outErr) {
262 *outErr = err;
263 } else {
264 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
265 " display " << display;
266 }
267 }
268
269 void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
270 hwc2_error_t* outErr = nullptr)
271 {
272 auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
273 getFunction(HWC2_FUNCTION_SET_POWER_MODE));
274 ASSERT_TRUE(pfn) << "failed to get function";
275
276 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
277 mode));
278 if (outErr) {
279 *outErr = err;
280 if (err != HWC2_ERROR_NONE)
281 return;
282 } else {
283 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
284 << getPowerModeName(mode) << " on display " << display;
285 }
286
287 if (mode == HWC2_POWER_MODE_OFF) {
288 mActiveDisplays.erase(display);
289 } else {
290 mActiveDisplays.insert(display);
291 }
292 }
293
Marissa Wall572a1ee2016-12-15 12:24:13 -0800294 void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
295 hwc2_error_t* outErr = nullptr)
296 {
297 auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
298 getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
299 ASSERT_TRUE(pfn) << "failed to get function";
300
301 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
302 enabled));
303 if (outErr) {
304 *outErr = err;
305 } else {
306 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
307 << getVsyncName(enabled);
308 }
309 }
310
311 void vsyncCallback(hwc2_display_t display, int64_t timestamp)
312 {
313 std::lock_guard<std::mutex> lock(mVsyncMutex);
314 mVsyncDisplay = display;
315 mVsyncTimestamp = timestamp;
316 mVsyncCv.notify_all();
317 }
318
Marissa Walldd4087f2016-12-15 12:24:52 -0800319 void getDisplayName(hwc2_display_t display, std::string* outName,
320 hwc2_error_t* outErr = nullptr)
321 {
322 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
323 getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
324 ASSERT_TRUE(pfn) << "failed to get function";
325
326 uint32_t size = 0;
327
328 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
329 nullptr));
330
331 if (err == HWC2_ERROR_NONE) {
332 std::vector<char> name(size);
333
334 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
335 name.data()));
336
337 outName->assign(name.data());
338 }
339
340 if (outErr) {
341 *outErr = err;
342 } else {
343 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
344 << display;
345 }
346 }
347
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800348 void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
349 hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
350 {
351 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
352 getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
353 ASSERT_TRUE(pfn) << "failed to get function";
354
355 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
356 composition));
357 if (outErr) {
358 *outErr = err;
359 } else {
360 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
361 " type " << getCompositionName(composition);
362 }
363 }
364
Marissa Wall2a0aaf92016-12-15 12:31:37 -0800365 void setCursorPosition(hwc2_display_t display, hwc2_layer_t layer,
366 int32_t x, int32_t y, hwc2_error_t* outErr = nullptr)
367 {
368 auto pfn = reinterpret_cast<HWC2_PFN_SET_CURSOR_POSITION>(
369 getFunction(HWC2_FUNCTION_SET_CURSOR_POSITION));
370 ASSERT_TRUE(pfn) << "failed to get function";
371
372 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, x,
373 y));
374 if (outErr) {
375 *outErr = err;
376 } else {
377 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set cursor position";
378 }
379 }
380
Marissa Wallffc67da2016-12-15 12:26:09 -0800381 void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
382 hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
383 {
384 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
385 getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
386 ASSERT_TRUE(pfn) << "failed to get function";
387
388 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
389 mode));
390 if (outErr) {
391 *outErr = err;
392 } else {
393 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
394 << getBlendModeName(mode);
395 }
396 }
397
Marissa Wall5a240aa2016-12-15 12:34:06 -0800398 void setLayerBuffer(hwc2_display_t display, hwc2_layer_t layer,
399 buffer_handle_t buffer, int32_t acquireFence,
400 hwc2_error_t* outErr = nullptr)
401 {
402 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BUFFER>(
403 getFunction(HWC2_FUNCTION_SET_LAYER_BUFFER));
404 ASSERT_TRUE(pfn) << "failed to get function";
405
406 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
407 buffer, acquireFence));
408 if (outErr) {
409 *outErr = err;
410 } else {
411 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer buffer";
412 }
413 }
414
Marissa Wallee242782016-12-15 12:30:12 -0800415 void setLayerColor(hwc2_display_t display, hwc2_layer_t layer,
416 hwc_color_t color, hwc2_error_t* outErr = nullptr)
417 {
418 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COLOR>(
419 getFunction(HWC2_FUNCTION_SET_LAYER_COLOR));
420 ASSERT_TRUE(pfn) << "failed to get function";
421
422 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
423 color));
424 if (outErr) {
425 *outErr = err;
426 } else {
427 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer color";
428 }
429 }
430
Marissa Wallb72b5c92016-12-15 12:26:39 -0800431 void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
432 android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
433 {
434 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
435 getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
436 ASSERT_TRUE(pfn) << "failed to get function";
437
438 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
439 layer, dataspace));
440 if (outErr) {
441 *outErr = err;
442 } else {
443 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
444 }
445 }
446
Marissa Wall600a73b2016-12-15 12:30:39 -0800447 void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
448 const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
449 {
450 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
451 getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
452 ASSERT_TRUE(pfn) << "failed to get function";
453
454 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
455 displayFrame));
456 if (outErr) {
457 *outErr = err;
458 } else {
459 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
460 " frame";
461 }
462 }
463
Marissa Wall2b1f5302016-12-15 12:27:20 -0800464 void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
465 float alpha, hwc2_error_t* outErr = nullptr)
466 {
467 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
468 getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
469 ASSERT_TRUE(pfn) << "failed to get function";
470
471 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
472 alpha));
473 if (outErr) {
474 *outErr = err;
475 } else {
476 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
477 << alpha;
478 }
479 }
480
Marissa Wallc57468f2016-12-15 12:31:12 -0800481 void setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer,
482 const hwc_frect_t& sourceCrop, hwc2_error_t* outErr = nullptr)
483 {
484 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
485 getFunction(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP));
486 ASSERT_TRUE(pfn) << "failed to get function";
487
488 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
489 sourceCrop));
490 if (outErr) {
491 *outErr = err;
492 } else {
493 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer source crop";
494 }
495 }
496
Marissa Wallad761812016-12-15 12:32:24 -0800497 void setLayerSurfaceDamage(hwc2_display_t display, hwc2_layer_t layer,
498 const hwc_region_t& surfaceDamage, hwc2_error_t* outErr = nullptr)
499 {
500 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
501 getFunction(HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE));
502 ASSERT_TRUE(pfn) << "failed to get function";
503
504 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
505 surfaceDamage));
506 if (outErr) {
507 *outErr = err;
508 } else {
509 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer surface"
510 " damage";
511 }
512 }
513
Marissa Wallac108192016-12-15 12:27:48 -0800514 void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
515 hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
516 {
517 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
518 getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
519 ASSERT_TRUE(pfn) << "failed to get function";
520
521 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
522 transform));
523 if (outErr) {
524 *outErr = err;
525 } else {
526 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
527 << getTransformName(transform);
528 }
529 }
530
Marissa Wallf7618ed2016-12-15 12:34:39 -0800531 void setLayerVisibleRegion(hwc2_display_t display, hwc2_layer_t layer,
532 const hwc_region_t& visibleRegion, hwc2_error_t* outErr = nullptr)
533 {
534 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_VISIBLE_REGION>(
535 getFunction(HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION));
536 ASSERT_TRUE(pfn) << "failed to get function";
537
538 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
539 visibleRegion));
540 if (outErr) {
541 *outErr = err;
542 } else {
543 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer visible"
544 " region";
545 }
546 }
547
Marissa Wall273b1df2016-12-15 12:28:47 -0800548 void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
549 uint32_t zOrder, hwc2_error_t* outErr = nullptr)
550 {
551 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
552 getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
553 ASSERT_TRUE(pfn) << "failed to get function";
554
555 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
556 zOrder));
557 if (outErr) {
558 *outErr = err;
559 } else {
560 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
561 << zOrder;
562 }
563 }
564
Marissa Wall1cd789c2017-01-27 12:55:36 -0800565 void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
566 uint32_t* outNumRequests, hwc2_error_t* outErr)
567 {
568 auto pfn = reinterpret_cast<HWC2_PFN_VALIDATE_DISPLAY>(
569 getFunction(HWC2_FUNCTION_VALIDATE_DISPLAY));
570 ASSERT_TRUE(pfn) << "failed to get function";
571
572 *outErr = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
573 outNumTypes, outNumRequests));
574 }
575
576 void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
577 uint32_t* outNumRequests, bool* outHasChanges)
578 {
579 hwc2_error_t err = HWC2_ERROR_NONE;
580
581 EXPECT_NO_FATAL_FAILURE(validateDisplay(display, outNumTypes,
582 outNumRequests, &err));
583
584 if (err != HWC2_ERROR_HAS_CHANGES) {
585 *outHasChanges = false;
586 EXPECT_EQ(err, HWC2_ERROR_NONE) << "failed to validate display";
587 } else {
588 *outHasChanges = true;
589 }
590 }
591
Marissa Wall706178d2016-12-15 12:39:14 -0800592 void getDisplayRequests(hwc2_display_t display,
593 hwc2_display_request_t* outDisplayRequests,
594 std::vector<hwc2_layer_t>* outLayers,
595 std::vector<hwc2_layer_request_t>* outLayerRequests,
596 hwc2_error_t* outErr = nullptr)
597 {
598 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_REQUESTS>(
599 getFunction(HWC2_FUNCTION_GET_DISPLAY_REQUESTS));
600 ASSERT_TRUE(pfn) << "failed to get function";
601
602 uint32_t numElements = 0;
603
604 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
605 reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
606 nullptr, nullptr));
607
608 if (err == HWC2_ERROR_NONE && numElements > 0) {
609 outLayers->resize(numElements);
610 outLayerRequests->resize(numElements);
611
612 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
613 reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
614 reinterpret_cast<uint64_t*>(outLayers->data()),
615 reinterpret_cast<int32_t*>(outLayerRequests->data())));
616 }
617
618 if (outErr) {
619 *outErr = err;
620 } else {
621 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display requests";
622 }
623 }
624
625 void handleRequests(hwc2_display_t display,
626 const std::vector<hwc2_layer_t>& layers, uint32_t numRequests,
627 std::set<hwc2_layer_t>* outClearLayers = nullptr,
628 bool* outFlipClientTarget = nullptr)
629 {
630 hwc2_display_request_t displayRequest =
631 static_cast<hwc2_display_request_t>(0);
632 std::vector<hwc2_layer_t> requestedLayers;
633 std::vector<hwc2_layer_request_t> requests;
634
635 ASSERT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequest,
636 &requestedLayers, &requests));
637
638 EXPECT_EQ(numRequests, requests.size()) << "validate returned "
639 << numRequests << " requests and get display requests returned "
640 << requests.size() << " requests";
641
642 for (size_t i = 0; i < requests.size(); i++) {
643 hwc2_layer_t requestedLayer = requestedLayers.at(i);
644 hwc2_layer_request_t request = requests.at(i);
645
646 EXPECT_EQ(std::count(layers.begin(), layers.end(), requestedLayer),
647 0) << "get display requests returned an unknown layer";
648 EXPECT_NE(request, 0) << "returned empty request for layer "
649 << requestedLayer;
650
651 if (outClearLayers && request
652 == HWC2_LAYER_REQUEST_CLEAR_CLIENT_TARGET)
653 outClearLayers->insert(requestedLayer);
654 }
655
656 if (outFlipClientTarget)
657 *outFlipClientTarget = displayRequest
658 & HWC2_DISPLAY_REQUEST_FLIP_CLIENT_TARGET;
659 }
660
661 void getChangedCompositionTypes(hwc2_display_t display,
662 std::vector<hwc2_layer_t>* outLayers,
663 std::vector<hwc2_composition_t>* outTypes,
664 hwc2_error_t* outErr = nullptr)
665 {
666 auto pfn = reinterpret_cast<HWC2_PFN_GET_CHANGED_COMPOSITION_TYPES>(
667 getFunction(HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES));
668 ASSERT_TRUE(pfn) << "failed to get function";
669
670 uint32_t numElements = 0;
671
672 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
673 &numElements, nullptr, nullptr));
674
675 if (err == HWC2_ERROR_NONE && numElements > 0) {
676 outLayers->resize(numElements);
677 outTypes->resize(numElements);
678
679 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
680 &numElements, reinterpret_cast<uint64_t*>(outLayers->data()),
681 reinterpret_cast<int32_t*>(outTypes->data())));
682 }
683
684 if (outErr) {
685 *outErr = err;
686 } else {
687 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get changed"
688 " composition types";
689 }
690 }
691
692 void handleCompositionChanges(hwc2_display_t display,
693 const Hwc2TestLayers& testLayers,
694 const std::vector<hwc2_layer_t>& layers, uint32_t numTypes,
695 std::set<hwc2_layer_t>* outClientLayers = nullptr)
696 {
697 std::vector<hwc2_layer_t> changedLayers;
698 std::vector<hwc2_composition_t> types;
699
700 ASSERT_NO_FATAL_FAILURE(getChangedCompositionTypes(display,
701 &changedLayers, &types));
702
703 EXPECT_EQ(numTypes, types.size()) << "validate returned "
704 << numTypes << " types and get changed composition types"
705 " returned " << types.size() << " types";
706
707 for (size_t i = 0; i < types.size(); i++) {
708
709 auto layer = std::find(layers.begin(), layers.end(),
710 changedLayers.at(i));
711
712 EXPECT_TRUE(layer != layers.end() || !testLayers.contains(*layer))
713 << "get changed composition types returned an unknown layer";
714
715 hwc2_composition_t requestedType = testLayers.getComposition(*layer);
716 hwc2_composition_t returnedType = types.at(i);
717
718 EXPECT_NE(returnedType, HWC2_COMPOSITION_INVALID) << "get changed"
719 " composition types returned invalid composition";
720
721 switch (requestedType) {
722 case HWC2_COMPOSITION_CLIENT:
723 EXPECT_TRUE(false) << getCompositionName(returnedType)
724 << " cannot be changed";
725 break;
726 case HWC2_COMPOSITION_DEVICE:
727 case HWC2_COMPOSITION_SOLID_COLOR:
728 EXPECT_EQ(returnedType, HWC2_COMPOSITION_CLIENT)
729 << "composition of type "
730 << getCompositionName(requestedType)
731 << " can only be changed to "
732 << getCompositionName(HWC2_COMPOSITION_CLIENT);
733 break;
734 case HWC2_COMPOSITION_CURSOR:
735 case HWC2_COMPOSITION_SIDEBAND:
736 EXPECT_TRUE(returnedType == HWC2_COMPOSITION_CLIENT
737 || returnedType == HWC2_COMPOSITION_DEVICE)
738 << "composition of type "
739 << getCompositionName(requestedType)
740 << " can only be changed to "
741 << getCompositionName(HWC2_COMPOSITION_CLIENT) << " or "
742 << getCompositionName(HWC2_COMPOSITION_DEVICE);
743 break;
744 default:
745 EXPECT_TRUE(false) << "unknown type "
746 << getCompositionName(requestedType);
747 break;
748 }
749
750 if (outClientLayers)
751 if (returnedType == HWC2_COMPOSITION_CLIENT)
752 outClientLayers->insert(*layer);
753 }
754
755 if (outClientLayers) {
756 for (auto layer : layers) {
757 if (testLayers.getComposition(layer) == HWC2_COMPOSITION_CLIENT)
758 outClientLayers->insert(layer);
759 }
760 }
761 }
762
763 void acceptDisplayChanges(hwc2_display_t display,
764 hwc2_error_t* outErr = nullptr)
765 {
766 auto pfn = reinterpret_cast<HWC2_PFN_ACCEPT_DISPLAY_CHANGES>(
767 getFunction(HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES));
768 ASSERT_TRUE(pfn) << "failed to get function";
769
770 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display));
771 if (outErr) {
772 *outErr = err;
773 } else {
774 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to accept display changes";
775 }
776 }
777
Marissa Wallf18cfb02017-02-21 14:01:05 -0800778 void getClientTargetSupport(hwc2_display_t display, int32_t width,
779 int32_t height, android_pixel_format_t format,
780 android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
781 {
782 auto pfn = reinterpret_cast<HWC2_PFN_GET_CLIENT_TARGET_SUPPORT>(
783 getFunction(HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT));
784 ASSERT_TRUE(pfn) << "failed to get function";
785
786 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, width,
787 height, format, dataspace));
788 if (outErr) {
789 *outErr = err;
790 } else {
791 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get client target"
792 " support";
793 }
794 }
795
796 void setClientTarget(hwc2_display_t display, buffer_handle_t handle,
797 int32_t acquireFence, android_dataspace_t dataspace,
798 hwc_region_t damage, hwc2_error_t* outErr = nullptr)
799 {
800 auto pfn = reinterpret_cast<HWC2_PFN_SET_CLIENT_TARGET>(
801 getFunction(HWC2_FUNCTION_SET_CLIENT_TARGET));
802 ASSERT_TRUE(pfn) << "failed to get function";
803
804 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, handle,
805 acquireFence, dataspace, damage));
806 if (outErr) {
807 *outErr = err;
808 } else {
809 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set client target";
810 }
811 }
812
Marissa Wall563030b2017-02-21 14:01:05 -0800813 void presentDisplay(hwc2_display_t display, int32_t* outPresentFence,
814 hwc2_error_t* outErr = nullptr)
815 {
816 auto pfn = reinterpret_cast<HWC2_PFN_PRESENT_DISPLAY>(
817 getFunction(HWC2_FUNCTION_PRESENT_DISPLAY));
818 ASSERT_TRUE(pfn) << "failed to get function";
819
820 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
821 outPresentFence));
822 if (outErr) {
823 *outErr = err;
824 } else {
825 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to present display";
826 }
827 }
828
829 void getReleaseFences(hwc2_display_t display,
830 std::vector<hwc2_layer_t>* outLayers,
831 std::vector<int32_t>* outFences, hwc2_error_t* outErr = nullptr)
832 {
833 auto pfn = reinterpret_cast<HWC2_PFN_GET_RELEASE_FENCES>(
834 getFunction(HWC2_FUNCTION_GET_RELEASE_FENCES));
835 ASSERT_TRUE(pfn) << "failed to get function";
836
837 uint32_t numElements = 0;
838
839 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
840 &numElements, nullptr, nullptr));
841
842 if (err == HWC2_ERROR_NONE) {
843 outLayers->resize(numElements);
844 outFences->resize(numElements);
845
846 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
847 &numElements, outLayers->data(), outFences->data()));
848 }
849
850 if (outErr) {
851 *outErr = err;
852 } else {
853 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get release fences";
854 }
855 }
856
Marissa Wallf18cfb02017-02-21 14:01:05 -0800857 void getBadDisplay(hwc2_display_t* outDisplay)
858 {
859 for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
860 if (mDisplays.count(display) == 0) {
861 *outDisplay = display;
862 return;
863 }
864 }
865 ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
866 " are registered. This should never happen.";
867 }
868
Marissa Wall563030b2017-02-21 14:01:05 -0800869 void waitForVsync(hwc2_display_t* outDisplay = nullptr,
870 int64_t* outTimestamp = nullptr)
871 {
872 std::unique_lock<std::mutex> lock(mVsyncMutex);
873 ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
874 std::cv_status::no_timeout) << "timed out attempting to get"
875 " vsync callback";
876 if (outDisplay)
877 *outDisplay = mVsyncDisplay;
878 if (outTimestamp)
879 *outTimestamp = mVsyncTimestamp;
880 }
881
882 void enableVsync(hwc2_display_t display)
883 {
884 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
885 reinterpret_cast<hwc2_function_pointer_t>(
886 hwc2TestVsyncCallback)));
887 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
888 }
889
890 void disableVsync(hwc2_display_t display)
891 {
892 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
893 }
894
Marissa Wall4d600052016-12-15 12:16:01 -0800895protected:
896 hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
897 {
898 return mHwc2Device->getFunction(mHwc2Device, descriptor);
899 }
900
901 void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
902 {
903 uint32_t num = 0;
904
905 mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
906
907 outCapabilities->resize(num);
908
909 mHwc2Device->getCapabilities(mHwc2Device, &num,
910 reinterpret_cast<int32_t*>(outCapabilities->data()));
911 }
912
Marissa Wallcfb9a072017-02-17 20:53:18 -0800913 /* Registers a hotplug callback and waits for hotplug callbacks. This
914 * function will have no effect if called more than once. */
915 void populateDisplays()
916 {
917 /* Sets the hotplug status to receiving */
918 {
919 std::lock_guard<std::mutex> lock(mHotplugMutex);
920
921 if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
922 return;
923 mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
924 }
925
926 /* Registers the callback. This function call cannot be locked because
927 * a callback could happen on the same thread */
928 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
929 reinterpret_cast<hwc2_function_pointer_t>(
930 hwc2TestHotplugCallback)));
931
932 /* Waits for hotplug events. If a hotplug event has not come within 1
933 * second, stop waiting. */
934 std::unique_lock<std::mutex> lock(mHotplugMutex);
935
936 while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
937 std::cv_status::timeout) { }
938
939 /* Sets the hotplug status to done. Future calls will have no effect */
940 mHotplugStatus = Hwc2TestHotplugStatus::Done;
941 }
942
Marissa Wall1db2e372016-12-15 12:19:39 -0800943 /* NOTE: will create min(newlayerCnt, max supported layers) layers */
944 void createLayers(hwc2_display_t display,
945 std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
946 {
947 std::vector<hwc2_layer_t> newLayers;
948 hwc2_layer_t layer;
949 hwc2_error_t err = HWC2_ERROR_NONE;
950
951 for (size_t i = 0; i < newLayerCnt; i++) {
952
953 EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
954 if (err == HWC2_ERROR_NO_RESOURCES)
955 break;
956 if (err != HWC2_ERROR_NONE) {
957 newLayers.clear();
958 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
959 }
960 newLayers.push_back(layer);
961 }
962
963 *outLayers = std::move(newLayers);
964 }
965
966 void destroyLayers(hwc2_display_t display,
967 std::vector<hwc2_layer_t>&& layers)
968 {
969 for (hwc2_layer_t layer : layers) {
970 EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
971 }
972 }
973
Marissa Wallcf935cb2016-12-15 12:20:47 -0800974 void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
975 {
976 std::vector<hwc2_config_t> configs;
977
978 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
979
980 hwc2_config_t CONFIG_MAX = UINT32_MAX;
981
982 ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
983 " (2^32 values) has been taken which shouldn't happen";
984
985 hwc2_config_t config;
986 for (config = 0; config < CONFIG_MAX; config++) {
987 if (std::count(configs.begin(), configs.end(), config) == 0)
988 break;
989 }
990
991 *outConfig = config;
992 }
993
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800994 /* Calls a set property function from Hwc2Test to set a property value from
995 * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
996 using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
997 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800998 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800999
Marissa Wall273b1df2016-12-15 12:28:47 -08001000 /* Calls a set property function from Hwc2Test to set property values from
1001 * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
1002 using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
1003 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001004 Hwc2TestLayers* testLayers);
Marissa Wall273b1df2016-12-15 12:28:47 -08001005
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001006 /* Calls a set property function from Hwc2Test to set a bad property value
1007 * on hwc2_layer_t on hwc2_display_t */
1008 using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
1009 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001010 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001011
1012 /* Calls a set property function from Hwc2Test to set a bad property value
1013 * on hwc2_layer_t on hwc2_display_t */
1014 using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
1015 hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
1016
Marissa Wall1cd789c2017-01-27 12:55:36 -08001017 /* Is called after a display is powered on and all layer properties have
1018 * been set. It should be used to test functions such as validate, accepting
1019 * changes, present, etc. */
1020 using TestDisplayLayersFunction = void (*)(Hwc2Test* test,
Marissa Wall706178d2016-12-15 12:39:14 -08001021 hwc2_display_t display, const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08001022 Hwc2TestLayers* testLayers);
Marissa Wall706178d2016-12-15 12:39:14 -08001023
1024 /* It is called on an non validated display */
1025 using TestDisplayNonValidatedLayersFunction = void (*)(Hwc2Test* test,
1026 hwc2_display_t display, std::vector<hwc2_layer_t>* layers);
Marissa Wall1cd789c2017-01-27 12:55:36 -08001027
Marissa Wallf18cfb02017-02-21 14:01:05 -08001028 /* Tests client target support on a particular display and config */
1029 using TestClientTargetSupportFunction = void (*)(Hwc2Test* test,
1030 hwc2_display_t display,
1031 const Hwc2TestClientTargetSupport& testClientTargetSupport);
1032
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001033 /* Advances a property of Hwc2TestLayer */
1034 using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
1035
Marissa Wallf7618ed2016-12-15 12:34:39 -08001036 /* Advances properties of Hwc2TestLayers */
1037 using AdvanceProperties = bool (*)(Hwc2TestLayers* testLayer);
1038
Marissa Wallf18cfb02017-02-21 14:01:05 -08001039 /* Advances properties of Hwc2TestClientTargetSupport */
1040 using AdvanceClientTargetSupport = bool (*)(
1041 Hwc2TestClientTargetSupport* testClientTargetSupport);
1042
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001043 /* For each active display it cycles through each display config and tests
1044 * each property value. It creates a layer, sets the property and then
1045 * destroys the layer */
1046 void setLayerProperty(Hwc2TestCoverage coverage,
1047 TestLayerPropertyFunction function, AdvanceProperty advance)
1048 {
1049 for (auto display : mDisplays) {
1050 std::vector<hwc2_config_t> configs;
1051
1052 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1053
1054 for (auto config : configs) {
1055 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -08001056 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001057
1058 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001059 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1060 &displayArea));
1061 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001062
1063 do {
1064 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1065
1066 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001067 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001068
1069 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1070 } while (advance(&testLayer));
1071 }
1072 }
1073 }
1074
1075 /* For each active display it cycles through each display config and tests
1076 * each property value. It creates a layer, cycles through each property
1077 * value and updates the layer property value and then destroys the layer */
1078 void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
1079 TestLayerPropertyFunction function, AdvanceProperty advance)
1080 {
1081 for (auto display : mDisplays) {
1082 std::vector<hwc2_config_t> configs;
1083
1084 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1085
1086 for (auto config : configs) {
1087 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -08001088 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001089
1090 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001091 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1092 &displayArea));
1093 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001094
1095 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1096
1097 do {
1098 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001099 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001100 } while (advance(&testLayer));
1101
1102 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1103 }
1104 }
1105 }
1106
Marissa Wall273b1df2016-12-15 12:28:47 -08001107 /* For each active display it cycles through each display config and tests
1108 * each property value. It creates multiple layers, calls the
1109 * TestLayerPropertiesFunction to set property values and then
1110 * destroys the layers */
1111 void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
Marissa Wallf7618ed2016-12-15 12:34:39 -08001112 TestLayerPropertiesFunction function, AdvanceProperties advance)
Marissa Wall273b1df2016-12-15 12:28:47 -08001113 {
1114 for (auto display : mDisplays) {
1115 std::vector<hwc2_config_t> configs;
1116
1117 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1118
1119 for (auto config : configs) {
1120 std::vector<hwc2_layer_t> layers;
Marissa Wall600a73b2016-12-15 12:30:39 -08001121 Area displayArea;
Marissa Wall273b1df2016-12-15 12:28:47 -08001122
1123 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001124 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1125 &displayArea));
Marissa Wall273b1df2016-12-15 12:28:47 -08001126
1127 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
Marissa Wall600a73b2016-12-15 12:30:39 -08001128 Hwc2TestLayers testLayers(layers, coverage, displayArea);
Marissa Wall273b1df2016-12-15 12:28:47 -08001129
Marissa Wallf7618ed2016-12-15 12:34:39 -08001130 do {
1131 for (auto layer : layers) {
1132 EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
1133 &testLayers));
1134 }
1135 } while (advance(&testLayers));
Marissa Wall273b1df2016-12-15 12:28:47 -08001136
1137 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1138 }
1139 }
1140 }
1141
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001142 /* For each active display it cycles through each display config.
1143 * 1) It attempts to set a valid property value to bad layer handle.
1144 * 2) It creates a layer x and attempts to set a valid property value to
1145 * layer x + 1
1146 * 3) It destroys the layer x and attempts to set a valid property value to
1147 * the destroyed layer x.
1148 */
1149 void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
1150 TestLayerPropertyBadLayerFunction function)
1151 {
1152 for (auto display : mDisplays) {
1153 std::vector<hwc2_config_t> configs;
1154
1155 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1156
1157 for (auto config : configs) {
1158 hwc2_layer_t layer = 0;
Marissa Wall600a73b2016-12-15 12:30:39 -08001159 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001160 hwc2_error_t err = HWC2_ERROR_NONE;
1161
1162 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001163 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1164 &displayArea));
1165 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001166
1167 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001168 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001169 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1170
1171 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1172
1173 ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001174 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001175 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1176
1177 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1178
1179 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001180 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001181 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1182 }
1183 }
1184 }
1185
1186 /* For each active display it cycles through each display config and tests
1187 * each property value. It creates a layer, sets a bad property value and
1188 * then destroys the layer */
1189 void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
1190 {
1191 for (auto display : mDisplays) {
1192 std::vector<hwc2_config_t> configs;
1193
1194 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1195
1196 for (auto config : configs) {
1197 hwc2_layer_t layer;
1198 hwc2_error_t err = HWC2_ERROR_NONE;
1199
1200 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1201
1202 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1203
1204 ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
1205 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
1206 " error code";
1207
1208 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1209 }
1210 }
1211 }
1212
Marissa Wall1cd789c2017-01-27 12:55:36 -08001213 /* For each active display it powers on the display, cycles through each
1214 * config and creates a set of layers with a certain amount of coverage.
1215 * For each active display, for each config and for each set of layers,
1216 * it calls the TestDisplayLayersFunction */
1217 void displayLayers(Hwc2TestCoverage coverage, size_t layerCnt,
1218 TestDisplayLayersFunction function)
1219 {
1220 for (auto display : mDisplays) {
1221 std::vector<hwc2_config_t> configs;
1222
1223 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1224
1225 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1226
1227 for (auto config : configs) {
1228 Area displayArea;
1229 std::vector<hwc2_layer_t> layers;
1230
1231 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1232 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
1233
1234 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1235 Hwc2TestLayers testLayers(layers, coverage, displayArea);
1236
1237 do {
1238 bool skip;
1239
1240 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
1241 &testLayers, &skip));
1242 if (!skip)
Marissa Wall706178d2016-12-15 12:39:14 -08001243 EXPECT_NO_FATAL_FAILURE(function(this, display, layers,
Marissa Wall563030b2017-02-21 14:01:05 -08001244 &testLayers));
Marissa Wall1cd789c2017-01-27 12:55:36 -08001245
1246 } while (testLayers.advance());
1247
1248 ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
1249 std::move(layers)));
1250 }
1251
1252 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1253 }
1254 }
1255
Marissa Wall706178d2016-12-15 12:39:14 -08001256 /* For each active display, it calls the
1257 * TestDisplayNonValidatedLayersFunction on a variety on non-validated
1258 * layer combinations */
1259 void displayNonValidatedLayers(size_t layerCnt,
1260 TestDisplayNonValidatedLayersFunction function)
1261 {
1262 for (auto display : mDisplays) {
1263 uint32_t numTypes, numRequests;
1264 std::vector<hwc2_layer_t> layers;
1265 bool hasChanges;
1266
1267 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1268
1269 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1270
1271 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1272
1273 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1274
1275 for (auto layer : layers) {
1276 ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1277 HWC2_COMPOSITION_CLIENT));
1278 }
1279
1280 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1281
1282 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1283 &numRequests, &hasChanges));
1284
1285 for (auto layer : layers) {
1286 ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1287 HWC2_COMPOSITION_DEVICE));
1288 }
1289
1290 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1291
1292 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1293
1294 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1295
1296 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1297 }
1298 }
1299
Marissa Wallf18cfb02017-02-21 14:01:05 -08001300 /* Test client target support on each config on each active display */
1301 void setClientTargetSupport(Hwc2TestCoverage coverage,
1302 TestClientTargetSupportFunction function,
1303 AdvanceClientTargetSupport advance)
1304 {
1305 for (auto display : mDisplays) {
1306 std::vector<hwc2_config_t> configs;
1307
1308 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1309
1310 for (auto config : configs) {
1311 Area displayArea;
1312
1313 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1314 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1315 &displayArea));
1316 Hwc2TestClientTargetSupport testClientTargetSupport(coverage,
1317 displayArea);
1318
1319 do {
1320 EXPECT_NO_FATAL_FAILURE(function(this, display,
1321 testClientTargetSupport));
1322
1323 } while (advance(&testClientTargetSupport));
1324 }
1325 }
1326 }
1327
Marissa Wall600a73b2016-12-15 12:30:39 -08001328 void getActiveConfigAttribute(hwc2_display_t display,
1329 hwc2_attribute_t attribute, int32_t* outValue)
1330 {
1331 hwc2_config_t config;
1332 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
1333 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1334 attribute, outValue));
1335 ASSERT_GE(*outValue, 0) << "failed to get valid "
1336 << getAttributeName(attribute);
1337 }
1338
1339 void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
1340 {
1341 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1342 HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
1343 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1344 HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
1345 }
1346
Marissa Wall563030b2017-02-21 14:01:05 -08001347 void closeFences(hwc2_display_t display, int32_t presentFence)
1348 {
1349 std::vector<hwc2_layer_t> layers;
1350 std::vector<int32_t> fences;
1351 const int msWait = 3000;
1352
1353 if (presentFence >= 0) {
1354 ASSERT_GE(sync_wait(presentFence, msWait), 0);
1355 close(presentFence);
1356 }
1357
1358 ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences));
1359 EXPECT_EQ(layers.size(), fences.size());
1360
1361 for (int32_t fence : fences) {
1362 EXPECT_GE(sync_wait(fence, msWait), 0);
1363 if (fence >= 0)
1364 close(fence);
1365 }
1366 }
1367
Marissa Wall1cd789c2017-01-27 12:55:36 -08001368 void setLayerProperties(hwc2_display_t display, hwc2_layer_t layer,
1369 Hwc2TestLayers* testLayers, bool* outSkip)
1370 {
1371 hwc2_composition_t composition;
1372 buffer_handle_t handle = nullptr;
1373 int32_t acquireFence;
1374 hwc2_error_t err = HWC2_ERROR_NONE;
1375 *outSkip = true;
1376
1377 if (!testLayers->contains(layer))
1378 return;
1379
1380 composition = testLayers->getComposition(layer);
1381
1382 /* If the device cannot support a buffer format, then do not continue */
1383 if ((composition == HWC2_COMPOSITION_DEVICE
1384 || composition == HWC2_COMPOSITION_CURSOR)
1385 && testLayers->getBuffer(layer, &handle, &acquireFence) < 0)
1386 return;
1387
1388 EXPECT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1389 composition, &err));
1390 if (err == HWC2_ERROR_UNSUPPORTED)
1391 EXPECT_TRUE(composition != HWC2_COMPOSITION_CLIENT
1392 && composition != HWC2_COMPOSITION_DEVICE);
1393
1394 const hwc_rect_t cursor = testLayers->getCursorPosition(layer);
1395
1396 EXPECT_NO_FATAL_FAILURE(setLayerBuffer(display, layer, handle,
1397 acquireFence));
1398 EXPECT_NO_FATAL_FAILURE(setLayerBlendMode(display, layer,
1399 testLayers->getBlendMode(layer)));
1400 EXPECT_NO_FATAL_FAILURE(setLayerColor(display, layer,
1401 testLayers->getColor(layer)));
1402 EXPECT_NO_FATAL_FAILURE(setCursorPosition(display, layer, cursor.left,
1403 cursor.top));
1404 EXPECT_NO_FATAL_FAILURE(setLayerDataspace(display, layer,
1405 testLayers->getDataspace(layer)));
1406 EXPECT_NO_FATAL_FAILURE(setLayerDisplayFrame(display, layer,
1407 testLayers->getDisplayFrame(layer)));
1408 EXPECT_NO_FATAL_FAILURE(setLayerPlaneAlpha(display, layer,
1409 testLayers->getPlaneAlpha(layer)));
1410 EXPECT_NO_FATAL_FAILURE(setLayerSourceCrop(display, layer,
1411 testLayers->getSourceCrop(layer)));
1412 EXPECT_NO_FATAL_FAILURE(setLayerSurfaceDamage(display, layer,
1413 testLayers->getSurfaceDamage(layer)));
1414 EXPECT_NO_FATAL_FAILURE(setLayerTransform(display, layer,
1415 testLayers->getTransform(layer)));
1416 EXPECT_NO_FATAL_FAILURE(setLayerVisibleRegion(display, layer,
1417 testLayers->getVisibleRegion(layer)));
1418 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer,
1419 testLayers->getZOrder(layer)));
1420
1421 *outSkip = false;
1422 }
1423
1424 void setLayerProperties(hwc2_display_t display,
1425 const std::vector<hwc2_layer_t>& layers,
1426 Hwc2TestLayers* testLayers, bool* outSkip)
1427 {
1428 for (auto layer : layers) {
1429 EXPECT_NO_FATAL_FAILURE(setLayerProperties(display, layer,
1430 testLayers, outSkip));
1431 if (*outSkip)
1432 return;
1433 }
1434 }
1435
Marissa Wall563030b2017-02-21 14:01:05 -08001436 void setClientTarget(hwc2_display_t display,
1437 Hwc2TestClientTarget* testClientTarget,
1438 const Hwc2TestLayers& testLayers,
1439 const std::set<hwc2_layer_t>& clientLayers,
1440 const std::set<hwc2_layer_t>& clearLayers, bool flipClientTarget,
1441 const Area& displayArea)
1442 {
1443 android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
1444 hwc_region_t damage = { };
1445 buffer_handle_t handle;
1446 int32_t acquireFence;
1447
1448 ASSERT_EQ(testClientTarget->getBuffer(testLayers, clientLayers,
1449 clearLayers, flipClientTarget, displayArea, &handle,
1450 &acquireFence), 0);
1451 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
1452 dataspace, damage));
1453 }
1454
1455 void presentDisplays(size_t layerCnt, Hwc2TestCoverage coverage,
1456 const std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>&
1457 coverageExceptions, bool optimize)
1458 {
1459 for (auto display : mDisplays) {
1460 std::vector<hwc2_config_t> configs;
1461
1462 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1463 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1464
1465 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1466
1467 for (auto config : configs) {
1468 Area displayArea;
1469 std::vector<hwc2_layer_t> layers;
1470
1471 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1472 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1473 &displayArea));
1474
1475 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1476 Hwc2TestLayers testLayers(layers, coverage, displayArea,
1477 coverageExceptions);
1478
1479 if (optimize && !testLayers.optimizeLayouts())
1480 continue;
1481
1482 std::set<hwc2_layer_t> clientLayers;
1483 std::set<hwc2_layer_t> clearLayers;
1484 Hwc2TestClientTarget testClientTarget;
1485
1486 do {
1487 uint32_t numTypes, numRequests;
1488 bool hasChanges, skip;
1489 bool flipClientTarget;
1490 int32_t presentFence;
1491
1492 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
1493 &testLayers, &skip));
1494 if (skip)
1495 continue;
1496
1497 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1498 &numRequests, &hasChanges));
1499 if (hasChanges)
1500 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
1501 << "wrong number of requests";
1502
1503 ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
1504 testLayers, layers, numTypes, &clientLayers));
1505 ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
1506 numRequests, &clearLayers, &flipClientTarget));
1507 ASSERT_NO_FATAL_FAILURE(setClientTarget(display,
1508 &testClientTarget, testLayers, clientLayers,
1509 clearLayers, flipClientTarget, displayArea));
1510 ASSERT_NO_FATAL_FAILURE(acceptDisplayChanges(display));
1511
1512 ASSERT_NO_FATAL_FAILURE(waitForVsync());
1513
1514 EXPECT_NO_FATAL_FAILURE(presentDisplay(display,
1515 &presentFence));
1516
1517 ASSERT_NO_FATAL_FAILURE(closeFences(display, presentFence));
1518
1519 } while (testLayers.advance());
1520
1521 ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
1522 std::move(layers)));
1523 }
1524
1525 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1526 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1527 }
1528 }
1529
Marissa Wall4d600052016-12-15 12:16:01 -08001530 hwc2_device_t* mHwc2Device = nullptr;
Marissa Wallcfb9a072017-02-17 20:53:18 -08001531
1532 enum class Hwc2TestHotplugStatus {
1533 Init = 1,
1534 Receiving,
1535 Done,
1536 };
1537
1538 std::mutex mHotplugMutex;
1539 std::condition_variable mHotplugCv;
1540 Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
1541 std::unordered_set<hwc2_display_t> mDisplays;
Marissa Wall1db2e372016-12-15 12:19:39 -08001542
1543 /* Store all created layers that have not been destroyed. If an ASSERT_*
1544 * fails, then destroy the layers on exit */
1545 std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
Marissa Wall03c91732016-12-15 12:23:16 -08001546
1547 /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
1548 * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
1549 std::set<hwc2_display_t> mActiveDisplays;
Marissa Wall572a1ee2016-12-15 12:24:13 -08001550
1551 std::mutex mVsyncMutex;
1552 std::condition_variable mVsyncCv;
1553 hwc2_display_t mVsyncDisplay;
1554 int64_t mVsyncTimestamp = -1;
Marissa Wall4d600052016-12-15 12:16:01 -08001555};
1556
Marissa Wallcfb9a072017-02-17 20:53:18 -08001557void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
1558 hwc2_display_t display, int32_t connection)
1559{
1560 if (callbackData)
1561 static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
1562 connection);
1563}
1564
Marissa Wall572a1ee2016-12-15 12:24:13 -08001565void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
1566 hwc2_display_t display, int64_t timestamp)
1567{
1568 if (callbackData)
1569 static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
1570 timestamp);
1571}
1572
Marissa Wallffc67da2016-12-15 12:26:09 -08001573void setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001574 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallffc67da2016-12-15 12:26:09 -08001575{
1576 EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001577 testLayer->getBlendMode(), outErr));
1578}
1579
1580void setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1581 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1582{
1583 buffer_handle_t handle;
1584 android::base::unique_fd acquireFence;
1585 hwc2_composition_t composition = testLayer->getComposition();
1586
1587 if (composition == HWC2_COMPOSITION_CLIENT
1588 || composition == HWC2_COMPOSITION_SOLID_COLOR
1589 || composition == HWC2_COMPOSITION_SIDEBAND)
1590 return;
1591
1592 if (testLayer->getBuffer(&handle, &acquireFence) < 0)
1593 return;
1594
1595 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
1596 composition));
1597 EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
1598 handle, acquireFence, outErr));
Marissa Wallffc67da2016-12-15 12:26:09 -08001599}
1600
Marissa Wallee242782016-12-15 12:30:12 -08001601void setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001602 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallee242782016-12-15 12:30:12 -08001603{
1604 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1605 layer, HWC2_COMPOSITION_SOLID_COLOR));
1606 ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001607 layer, testLayer->getPlaneAlpha()));
Marissa Wallee242782016-12-15 12:30:12 -08001608 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001609 layer, testLayer->getBlendMode()));
Marissa Wallee242782016-12-15 12:30:12 -08001610 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001611 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08001612}
1613
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001614void setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001615 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001616{
Marissa Wall5a240aa2016-12-15 12:34:06 -08001617 hwc2_composition_t composition = testLayer->getComposition();
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001618 hwc2_error_t err = HWC2_ERROR_NONE;
1619
1620 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
1621 composition, &err));
1622 if (outErr) {
1623 *outErr = err;
1624 return;
1625 }
1626
1627 if (composition != HWC2_COMPOSITION_SIDEBAND) {
1628 EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
1629 } else {
1630 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
1631 << "returned wrong error code";
1632 }
1633}
1634
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001635void setCursorPosition(Hwc2Test* test, hwc2_display_t display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001636 hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001637{
1638 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1639 layer, HWC2_COMPOSITION_CURSOR));
1640
Marissa Wall5a240aa2016-12-15 12:34:06 -08001641 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001642 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
1643 cursorPosition.left, cursorPosition.top, outErr));
1644}
1645
Marissa Wallb72b5c92016-12-15 12:26:39 -08001646void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001647 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallb72b5c92016-12-15 12:26:39 -08001648{
1649 EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001650 testLayer->getDataspace(), outErr));
Marissa Wallb72b5c92016-12-15 12:26:39 -08001651}
1652
Marissa Wall600a73b2016-12-15 12:30:39 -08001653void setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001654 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall600a73b2016-12-15 12:30:39 -08001655{
1656 EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001657 testLayer->getDisplayFrame(), outErr));
Marissa Wall600a73b2016-12-15 12:30:39 -08001658}
1659
Marissa Wall2b1f5302016-12-15 12:27:20 -08001660void setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001661 Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
Marissa Wall2b1f5302016-12-15 12:27:20 -08001662{
1663 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001664 testLayer->getBlendMode()));
Marissa Wall2b1f5302016-12-15 12:27:20 -08001665 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001666 testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08001667}
1668
Marissa Wallc57468f2016-12-15 12:31:12 -08001669void setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001670 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallc57468f2016-12-15 12:31:12 -08001671{
1672 EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001673 testLayer->getSourceCrop(), outErr));
Marissa Wallc57468f2016-12-15 12:31:12 -08001674}
1675
Marissa Wallad761812016-12-15 12:32:24 -08001676void setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001677 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallad761812016-12-15 12:32:24 -08001678{
1679 EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001680 testLayer->getSurfaceDamage(), outErr));
Marissa Wallad761812016-12-15 12:32:24 -08001681}
1682
Marissa Wallac108192016-12-15 12:27:48 -08001683void setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001684 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallac108192016-12-15 12:27:48 -08001685{
1686 EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001687 testLayer->getTransform(), outErr));
Marissa Wallac108192016-12-15 12:27:48 -08001688}
1689
Marissa Wallf7618ed2016-12-15 12:34:39 -08001690void setVisibleRegion(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1691 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1692{
1693 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display, layer,
1694 testLayer->getVisibleRegion(), outErr));
1695}
1696
Marissa Wall273b1df2016-12-15 12:28:47 -08001697void setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001698 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall273b1df2016-12-15 12:28:47 -08001699{
1700 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001701 testLayer->getZOrder(), outErr));
Marissa Wall273b1df2016-12-15 12:28:47 -08001702}
1703
Marissa Wallffc67da2016-12-15 12:26:09 -08001704bool advanceBlendMode(Hwc2TestLayer* testLayer)
1705{
1706 return testLayer->advanceBlendMode();
1707}
1708
Marissa Wall5a240aa2016-12-15 12:34:06 -08001709bool advanceBuffer(Hwc2TestLayer* testLayer)
1710{
1711 if (testLayer->advanceComposition())
1712 return true;
1713 return testLayer->advanceBufferArea();
1714}
1715
Marissa Wallee242782016-12-15 12:30:12 -08001716bool advanceColor(Hwc2TestLayer* testLayer)
1717{
1718 /* Color depends on blend mode so advance blend mode last so color is not
1719 * force to update as often */
1720 if (testLayer->advancePlaneAlpha())
1721 return true;
1722 if (testLayer->advanceColor())
1723 return true;
1724 return testLayer->advanceBlendMode();
1725}
1726
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001727bool advanceComposition(Hwc2TestLayer* testLayer)
1728{
1729 return testLayer->advanceComposition();
1730}
1731
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001732bool advanceCursorPosition(Hwc2TestLayer* testLayer)
1733{
1734 return testLayer->advanceCursorPosition();
1735}
1736
Marissa Wallb72b5c92016-12-15 12:26:39 -08001737bool advanceDataspace(Hwc2TestLayer* testLayer)
1738{
1739 return testLayer->advanceDataspace();
1740}
1741
Marissa Wall600a73b2016-12-15 12:30:39 -08001742bool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1743{
1744 return testLayer->advanceDisplayFrame();
1745}
1746
Marissa Wall2b1f5302016-12-15 12:27:20 -08001747bool advancePlaneAlpha(Hwc2TestLayer* testLayer)
1748{
1749 return testLayer->advancePlaneAlpha();
1750}
1751
Marissa Wallc57468f2016-12-15 12:31:12 -08001752bool advanceSourceCrop(Hwc2TestLayer* testLayer)
1753{
1754 if (testLayer->advanceSourceCrop())
1755 return true;
1756 return testLayer->advanceBufferArea();
1757}
1758
Marissa Wallad761812016-12-15 12:32:24 -08001759bool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
1760{
1761 if (testLayer->advanceSurfaceDamage())
1762 return true;
1763 return testLayer->advanceBufferArea();
1764}
1765
Marissa Wallac108192016-12-15 12:27:48 -08001766bool advanceTransform(Hwc2TestLayer* testLayer)
1767{
1768 return testLayer->advanceTransform();
1769}
1770
Marissa Wallf7618ed2016-12-15 12:34:39 -08001771bool advanceVisibleRegions(Hwc2TestLayers* testLayers)
1772{
1773 return testLayers->advanceVisibleRegions();
1774}
1775
Marissa Wallf18cfb02017-02-21 14:01:05 -08001776bool advanceClientTargetSupport(
1777 Hwc2TestClientTargetSupport* testClientTargetSupport)
1778{
1779 return testClientTargetSupport->advance();
1780}
Marissa Wall4d600052016-12-15 12:16:01 -08001781
1782static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
1783 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
1784 HWC2_FUNCTION_CREATE_LAYER,
1785 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
1786 HWC2_FUNCTION_DESTROY_LAYER,
1787 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
1788 HWC2_FUNCTION_DUMP,
1789 HWC2_FUNCTION_GET_ACTIVE_CONFIG,
1790 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
1791 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
1792 HWC2_FUNCTION_GET_COLOR_MODES,
1793 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
1794 HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
1795 HWC2_FUNCTION_GET_DISPLAY_NAME,
1796 HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
1797 HWC2_FUNCTION_GET_DISPLAY_TYPE,
1798 HWC2_FUNCTION_GET_DOZE_SUPPORT,
1799 HWC2_FUNCTION_GET_HDR_CAPABILITIES,
1800 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
1801 HWC2_FUNCTION_GET_RELEASE_FENCES,
1802 HWC2_FUNCTION_PRESENT_DISPLAY,
1803 HWC2_FUNCTION_REGISTER_CALLBACK,
1804 HWC2_FUNCTION_SET_ACTIVE_CONFIG,
1805 HWC2_FUNCTION_SET_CLIENT_TARGET,
1806 HWC2_FUNCTION_SET_COLOR_MODE,
1807 HWC2_FUNCTION_SET_COLOR_TRANSFORM,
1808 HWC2_FUNCTION_SET_CURSOR_POSITION,
1809 HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
1810 HWC2_FUNCTION_SET_LAYER_BUFFER,
1811 HWC2_FUNCTION_SET_LAYER_COLOR,
1812 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
1813 HWC2_FUNCTION_SET_LAYER_DATASPACE,
1814 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
1815 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
1816 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
1817 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
1818 HWC2_FUNCTION_SET_LAYER_TRANSFORM,
1819 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
1820 HWC2_FUNCTION_SET_LAYER_Z_ORDER,
1821 HWC2_FUNCTION_SET_OUTPUT_BUFFER,
1822 HWC2_FUNCTION_SET_POWER_MODE,
1823 HWC2_FUNCTION_SET_VSYNC_ENABLED,
1824 HWC2_FUNCTION_VALIDATE_DISPLAY,
1825}};
1826
1827/* TESTCASE: Tests that the HWC2 supports all required functions. */
1828TEST_F(Hwc2Test, GET_FUNCTION)
1829{
1830 for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
1831 hwc2_function_pointer_t pfn = getFunction(descriptor);
1832 EXPECT_TRUE(pfn) << "failed to get function "
1833 << getFunctionDescriptorName(descriptor);
1834 }
1835}
1836
1837/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
1838TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
1839{
1840 hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
1841 EXPECT_FALSE(pfn) << "failed to get invalid function";
1842}
1843
1844/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
1845TEST_F(Hwc2Test, GET_CAPABILITIES)
1846{
1847 std::vector<hwc2_capability_t> capabilities;
1848
1849 getCapabilities(&capabilities);
1850
1851 EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
1852 HWC2_CAPABILITY_INVALID), 0);
1853}
Marissa Walla4b01482017-02-17 20:52:03 -08001854
1855static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1856 HWC2_CALLBACK_HOTPLUG,
1857 HWC2_CALLBACK_REFRESH,
1858 HWC2_CALLBACK_VSYNC,
1859}};
1860
1861/* TESTCASE: Tests that the HWC2 can successfully register all required
1862 * callback functions. */
1863TEST_F(Hwc2Test, REGISTER_CALLBACK)
1864{
1865 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1866 const_cast<char*>("data"));
1867
1868 for (auto descriptor : callbackDescriptors) {
1869 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1870 []() { return; }));
1871 }
1872}
1873
1874/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1875TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1876{
1877 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1878 const_cast<char*>("data"));
1879 hwc2_error_t err = HWC2_ERROR_NONE;
1880
1881 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1882 []() { return; }, &err));
1883 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1884}
1885
1886/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
1887TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
1888{
1889 hwc2_callback_data_t data = nullptr;
1890
1891 for (auto descriptor : callbackDescriptors) {
1892 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1893 []() { return; }));
1894 }
1895}
Marissa Wallcfb9a072017-02-17 20:53:18 -08001896
1897/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1898 * physical display. */
1899TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1900{
1901 for (auto display : mDisplays) {
1902 hwc2_display_type_t type;
1903
1904 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1905 EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1906 " correct display type";
1907 }
1908}
1909
1910/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1911 * display is requested. */
1912TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1913{
1914 hwc2_display_t display;
1915 hwc2_display_type_t type;
1916 hwc2_error_t err = HWC2_ERROR_NONE;
1917
1918 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1919
1920 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1921 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1922}
Marissa Wall1db2e372016-12-15 12:19:39 -08001923
1924/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
1925TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
1926{
1927 for (auto display : mDisplays) {
1928 hwc2_layer_t layer;
1929
1930 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1931
1932 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1933 }
1934}
1935
1936/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
1937TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
1938{
1939 hwc2_display_t display;
1940 hwc2_layer_t layer;
1941 hwc2_error_t err = HWC2_ERROR_NONE;
1942
1943 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1944
1945 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
1946 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1947}
1948
1949/* TESTCASE: Tests that the HWC2 will either support a large number of resources
1950 * or will return no resources. */
1951TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
1952{
1953 const size_t layerCnt = 1000;
1954
1955 for (auto display : mDisplays) {
1956 std::vector<hwc2_layer_t> layers;
1957
1958 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1959
1960 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1961 }
1962}
1963
1964/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
1965TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
1966{
1967 hwc2_display_t badDisplay;
1968
1969 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
1970
1971 for (auto display : mDisplays) {
1972 hwc2_layer_t layer = 0;
1973 hwc2_error_t err = HWC2_ERROR_NONE;
1974
1975 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1976 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1977
1978 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1979
1980 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1981 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1982
1983 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1984 }
1985}
1986
1987/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
1988TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
1989{
1990 for (auto display : mDisplays) {
1991 hwc2_layer_t layer;
1992 hwc2_error_t err = HWC2_ERROR_NONE;
1993
1994 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
1995 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1996
1997 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
1998 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1999
2000 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
2001 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2002
2003 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
2004 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2005
2006 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
2007 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2008
2009 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2010
2011 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
2012 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2013
2014 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2015
2016 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
2017 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2018 }
2019}
Marissa Wallcf935cb2016-12-15 12:20:47 -08002020
2021static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
2022 HWC2_ATTRIBUTE_WIDTH,
2023 HWC2_ATTRIBUTE_HEIGHT,
2024}};
2025
2026static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
2027 HWC2_ATTRIBUTE_VSYNC_PERIOD,
2028 HWC2_ATTRIBUTE_DPI_X,
2029 HWC2_ATTRIBUTE_DPI_Y,
2030}};
2031
2032/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
2033 * config. */
2034TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
2035{
2036 for (auto display : mDisplays) {
2037 std::vector<hwc2_config_t> configs;
2038
2039 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2040
2041 for (auto config : configs) {
2042 int32_t value;
2043
2044 for (auto attribute : requiredAttributes) {
2045 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2046 attribute, &value));
2047 EXPECT_GE(value, 0) << "missing required attribute "
2048 << getAttributeName(attribute) << " for config "
2049 << config;
2050 }
2051 for (auto attribute : optionalAttributes) {
2052 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2053 attribute, &value));
2054 }
2055 }
2056 }
2057}
2058
2059/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
2060 * attribute */
2061TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
2062{
2063 const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
2064
2065 for (auto display : mDisplays) {
2066 std::vector<hwc2_config_t> configs;
2067
2068 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2069
2070 for (auto config : configs) {
2071 int32_t value;
2072 hwc2_error_t err = HWC2_ERROR_NONE;
2073
2074 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2075 attribute, &value, &err));
2076 EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
2077 " attribute for config " << config;
2078 }
2079 }
2080}
2081
2082/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
2083TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
2084{
2085 hwc2_display_t display;
2086 const hwc2_config_t config = 0;
2087 int32_t value;
2088 hwc2_error_t err = HWC2_ERROR_NONE;
2089
2090 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2091
2092 for (auto attribute : requiredAttributes) {
2093 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
2094 &value, &err));
2095 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2096 }
2097
2098 for (auto attribute : optionalAttributes) {
2099 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
2100 &value, &err));
2101 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2102 }
2103}
2104
2105/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
2106TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
2107{
2108 for (auto display : mDisplays) {
2109 hwc2_config_t config;
2110 int32_t value;
2111 hwc2_error_t err = HWC2_ERROR_NONE;
2112
2113 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
2114
2115 for (auto attribute : requiredAttributes) {
2116 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2117 attribute, &value, &err));
2118 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2119 }
2120
2121 for (auto attribute : optionalAttributes) {
2122 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2123 attribute, &value, &err));
2124 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2125 }
2126 }
2127}
2128
2129/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
2130TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
2131{
2132 for (auto display : mDisplays) {
2133 std::vector<hwc2_config_t> configs;
2134
2135 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2136 }
2137}
2138
2139/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
2140TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
2141{
2142 hwc2_display_t display;
2143 std::vector<hwc2_config_t> configs;
2144 hwc2_error_t err = HWC2_ERROR_NONE;
2145
2146 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2147
2148 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
2149
2150 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2151 EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
2152}
2153
2154/* TESTCASE: Tests that the HWC2 will return the same config list multiple
2155 * times in a row. */
2156TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
2157{
2158 for (auto display : mDisplays) {
2159 std::vector<hwc2_config_t> configs1, configs2;
2160
2161 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
2162 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
2163
2164 EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
2165 configs2.begin())) << "returned two different config sets";
2166 }
2167}
2168
2169/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
2170TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
2171{
2172 for (auto display : mDisplays) {
2173 std::vector<hwc2_config_t> configs;
2174
2175 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2176
2177 std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
2178 configs.end());
2179 EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
2180 " configs";
2181 }
2182}
Marissa Wall93dc04f2016-12-15 12:21:46 -08002183
2184/* TESTCASE: Tests that the HWC2 returns the active config for a display */
2185TEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
2186{
2187 for (auto display : mDisplays) {
2188 std::vector<hwc2_config_t> configs;
2189
2190 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2191
2192 for (auto config : configs) {
2193 hwc2_config_t activeConfig;
2194
2195 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2196 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
2197
2198 EXPECT_EQ(activeConfig, config) << "failed to get active config";
2199 }
2200 }
2201}
2202
2203/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
2204 * display. */
2205TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
2206{
2207 hwc2_display_t display;
2208 hwc2_config_t activeConfig;
2209 hwc2_error_t err = HWC2_ERROR_NONE;
2210
2211 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2212
2213 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
2214
2215 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2216}
2217
2218/* TESTCASE: Tests that the HWC2 either begins with a valid active config
2219 * or returns an error when getActiveConfig is called. */
2220TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
2221{
2222 for (auto display : mDisplays) {
2223 std::vector<hwc2_config_t> configs;
2224 hwc2_config_t activeConfig;
2225 hwc2_error_t err = HWC2_ERROR_NONE;
2226
2227 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2228
2229 if (configs.empty())
2230 return;
2231
2232 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
2233 if (err == HWC2_ERROR_NONE) {
2234 EXPECT_NE(std::count(configs.begin(), configs.end(),
2235 activeConfig), 0) << "active config is not found in "
2236 " configs for display";
2237 } else {
2238 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2239 }
2240 }
2241}
2242
2243/* TESTCASE: Tests that the HWC2 can set every display config as an active
2244 * config */
2245TEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
2246{
2247 for (auto display : mDisplays) {
2248 std::vector<hwc2_config_t> configs;
2249
2250 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2251
2252 for (auto config : configs) {
2253 EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2254 }
2255 }
2256}
2257
2258/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
2259TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
2260{
2261 hwc2_display_t display;
2262 const hwc2_config_t config = 0;
2263 hwc2_error_t err = HWC2_ERROR_NONE;
2264
2265 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2266
2267 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
2268 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2269}
2270
2271/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
2272TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
2273{
2274 for (auto display : mDisplays) {
2275 hwc2_config_t config;
2276 hwc2_error_t err = HWC2_ERROR_NONE;
2277
2278 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
2279
2280 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
2281 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2282 }
2283}
Marissa Wall03c91732016-12-15 12:23:16 -08002284
2285/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
2286TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
2287{
2288 for (auto display : mDisplays) {
2289 int32_t support = -1;
2290
2291 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2292
2293 EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
2294 }
2295}
2296
2297/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
2298TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
2299{
2300 hwc2_display_t display;
2301 int32_t support = -1;
2302 hwc2_error_t err = HWC2_ERROR_NONE;
2303
2304 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2305
2306 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2307
2308 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2309}
2310
2311/* TESTCASE: Tests that the HWC2 can set all supported power modes */
2312TEST_F(Hwc2Test, SET_POWER_MODE)
2313{
2314 for (auto display : mDisplays) {
2315 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2316 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2317
2318 int32_t support = -1;
2319 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2320 if (support != 1)
2321 return;
2322
2323 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2324 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2325 HWC2_POWER_MODE_DOZE_SUSPEND));
2326
2327 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2328 }
2329}
2330
2331/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
2332TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
2333{
2334 hwc2_display_t display;
2335 hwc2_error_t err = HWC2_ERROR_NONE;
2336
2337 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2338
2339 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
2340 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2341
2342 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
2343 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2344
2345 int32_t support = -1;
2346 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2347 if (support != 1)
2348 return;
2349
2350 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
2351 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2352
2353 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
2354 &err));
2355 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2356}
2357
2358/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
2359TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
2360{
2361 for (auto display : mDisplays) {
2362 hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
2363 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
2364 hwc2_error_t err = HWC2_ERROR_NONE;
2365
2366 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
2367 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
2368 << mode;
2369 }
2370}
2371
2372/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
2373 * an optional power mode. */
2374TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
2375{
2376 for (auto display : mDisplays) {
2377 int32_t support = -1;
2378 hwc2_error_t err = HWC2_ERROR_NONE;
2379
2380 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2381 if (support == 1)
2382 return;
2383
2384 ASSERT_EQ(support, 0) << "invalid doze support value";
2385
2386 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
2387 &err));
2388 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
2389
2390 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2391 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
2392 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
2393 }
2394}
2395
2396/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
2397TEST_F(Hwc2Test, SET_POWER_MODE_stress)
2398{
2399 for (auto display : mDisplays) {
2400 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2401 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2402
2403 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2404 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2405
2406 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2407 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2408
2409 int32_t support = -1;
2410 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2411 if (support != 1)
2412 return;
2413
2414 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2415 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2416
2417 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2418 HWC2_POWER_MODE_DOZE_SUSPEND));
2419 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2420 HWC2_POWER_MODE_DOZE_SUSPEND));
2421
2422 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2423 }
2424}
Marissa Wall572a1ee2016-12-15 12:24:13 -08002425
2426/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
2427 * displays */
2428TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
2429{
2430 for (auto display : mDisplays) {
2431 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2432 const_cast<char*>("data"));
2433
2434 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2435
2436 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2437 []() { return; }));
2438
2439 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2440
2441 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2442
2443 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2444 }
2445}
2446
2447/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
2448TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
2449{
2450 for (auto display : mDisplays) {
2451 hwc2_display_t receivedDisplay;
2452 int64_t receivedTimestamp;
2453
2454 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2455
2456 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
2457
2458 ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
2459 &receivedTimestamp));
2460
2461 EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
2462 EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
2463
2464 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
2465
2466 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2467 }
2468}
2469
2470/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
2471TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
2472{
2473 hwc2_display_t display;
2474 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2475 const_cast<char*>("data"));
2476 hwc2_error_t err = HWC2_ERROR_NONE;
2477
2478 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2479
2480 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2481 []() { return; }));
2482
2483 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
2484 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2485
2486 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
2487 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2488}
2489
2490/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
2491TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
2492{
2493 for (auto display : mDisplays) {
2494 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2495 const_cast<char*>("data"));
2496 hwc2_error_t err = HWC2_ERROR_NONE;
2497
2498 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2499
2500 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2501 []() { return; }));
2502
2503 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
2504 &err));
2505 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2506
2507 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2508 }
2509}
2510
2511/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
2512 * times. */
2513TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
2514{
2515 for (auto display : mDisplays) {
2516 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2517 const_cast<char*>("data"));
2518
2519 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2520
2521 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2522 []() { return; }));
2523
2524 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2525
2526 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2527 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2528
2529 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2530 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2531
2532 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2533 }
2534}
2535
2536/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
2537 * is off and no callback is registered. */
2538TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
2539{
2540 const uint secs = 1;
2541
2542 for (auto display : mDisplays) {
2543 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2544
2545 sleep(secs);
2546
2547 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2548 }
2549}
2550
2551/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
2552 * is registered. */
2553TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
2554{
2555 const uint secs = 1;
2556
2557 for (auto display : mDisplays) {
2558 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2559
2560 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2561
2562 sleep(secs);
2563
2564 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2565
2566 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2567 }
2568}
Marissa Walldd4087f2016-12-15 12:24:52 -08002569
2570/* TESTCASE: Tests that the HWC2 returns a display name for each display */
2571TEST_F(Hwc2Test, GET_DISPLAY_NAME)
2572{
2573 for (auto display : mDisplays) {
2574 std::string name;
2575
2576 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
2577 }
2578}
2579
2580/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
2581 * display */
2582TEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
2583{
2584 hwc2_display_t display;
2585 std::string name;
2586 hwc2_error_t err = HWC2_ERROR_NONE;
2587
2588 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2589
2590 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
2591 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2592}
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08002593
2594/* TESTCASE: Tests that the HWC2 can set basic composition types. */
2595TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
2596{
2597 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2598 setComposition, advanceComposition));
2599}
2600
2601/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
2602 * layer. */
2603TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
2604{
2605 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2606 setComposition, advanceComposition));
2607}
2608
2609/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
2610TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
2611{
2612 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2613 setComposition));
2614}
2615
2616/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
2617TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
2618{
2619 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2620 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2621 hwc2_error_t* outErr) {
2622
2623 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
2624 layer, HWC2_COMPOSITION_INVALID, outErr));
2625 }
2626 ));
2627}
Marissa Wallffc67da2016-12-15 12:26:09 -08002628
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002629/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
2630TEST_F(Hwc2Test, SET_CURSOR_POSITION)
2631{
2632 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2633 ::setCursorPosition, advanceCursorPosition));
2634}
2635
2636/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
2637TEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
2638{
2639 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2640 ::setCursorPosition, advanceCursorPosition));
2641}
2642
2643/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
2644 * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
2645TEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
2646{
2647 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2648 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002649 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002650
Marissa Wall5a240aa2016-12-15 12:34:06 -08002651 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002652 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
2653 cursorPosition.left, cursorPosition.top, outErr));
2654 },
2655
2656 advanceCursorPosition));
2657}
2658
2659/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
2660 * display. */
2661TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
2662{
2663 hwc2_display_t display;
2664 hwc2_layer_t layer = 0;
2665 int32_t x = 0, y = 0;
2666 hwc2_error_t err = HWC2_ERROR_NONE;
2667
2668 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2669
2670 ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
2671 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2672}
2673
2674/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
2675TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
2676{
2677 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2678 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002679 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002680
Marissa Wall5a240aa2016-12-15 12:34:06 -08002681 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002682 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
2683 badLayer, cursorPosition.left, cursorPosition.top,
2684 outErr));
2685 }
2686 ));
2687}
2688
Marissa Wallffc67da2016-12-15 12:26:09 -08002689/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
2690TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
2691{
2692 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2693 setBlendMode, advanceBlendMode));
2694}
2695
2696/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
2697TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
2698{
2699 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2700 setBlendMode, advanceBlendMode));
2701}
2702
2703/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
2704TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
2705{
2706 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2707 setBlendMode));
2708}
2709
2710/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
2711TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
2712{
2713 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2714 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2715 hwc2_error_t* outErr) {
2716
2717 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
2718 layer, HWC2_BLEND_MODE_INVALID, outErr));
2719 }
2720 ));
2721}
Marissa Wallb72b5c92016-12-15 12:26:39 -08002722
Marissa Wall5a240aa2016-12-15 12:34:06 -08002723/* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
2724TEST_F(Hwc2Test, SET_LAYER_BUFFER)
2725{
2726 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2727 setBuffer, advanceBuffer));
2728}
2729
2730/* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
2731TEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
2732{
2733 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2734 setBuffer, advanceBuffer));
2735}
2736
2737/* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
2738TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
2739{
2740 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2741 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
2742 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2743
2744 buffer_handle_t handle = nullptr;
2745 android::base::unique_fd acquireFence;
2746
2747 /* If there is not available buffer for the given buffer
2748 * properties, it should not fail this test case */
2749 if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
2750 *outErr = HWC2_ERROR_BAD_LAYER;
2751 return;
2752 }
2753
2754 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
2755 handle, acquireFence, outErr));
2756 }
2757 ));
2758}
2759
2760/* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
2761TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
2762{
2763 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2764 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2765 hwc2_error_t* outErr) {
2766
2767 buffer_handle_t handle = nullptr;
2768 int32_t acquireFence = -1;
2769
2770 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
2771 handle, acquireFence, outErr));
2772 }
2773 ));
2774}
2775
Marissa Wallee242782016-12-15 12:30:12 -08002776/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
2777TEST_F(Hwc2Test, SET_LAYER_COLOR)
2778{
2779 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2780 setColor, advanceColor));
2781}
2782
2783/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
2784TEST_F(Hwc2Test, SET_LAYER_COLOR_update)
2785{
2786 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2787 setColor, advanceColor));
2788}
2789
2790/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
2791 * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
2792TEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
2793{
2794 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
2795 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002796 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08002797
2798 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002799 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08002800 },
2801
2802 advanceColor));
2803}
2804
2805/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
2806TEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
2807{
2808 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2809 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002810 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08002811
2812 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002813 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08002814 }
2815 ));
2816}
2817
Marissa Wallb72b5c92016-12-15 12:26:39 -08002818/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
2819TEST_F(Hwc2Test, SET_LAYER_DATASPACE)
2820{
2821 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2822 setDataspace, advanceDataspace));
2823}
2824
2825/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
2826TEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
2827{
2828 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2829 setDataspace, advanceDataspace));
2830}
2831
2832/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
2833TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
2834{
2835 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2836 setDataspace));
2837}
Marissa Wall2b1f5302016-12-15 12:27:20 -08002838
Marissa Wall600a73b2016-12-15 12:30:39 -08002839/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
2840TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
2841{
2842 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2843 setDisplayFrame, advanceDisplayFrame));
2844}
2845
2846/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
2847TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
2848{
2849 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2850 setDisplayFrame, advanceDisplayFrame));
2851}
2852
2853/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
2854TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
2855{
2856 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2857 setDisplayFrame));
2858}
2859
Marissa Wall2b1f5302016-12-15 12:27:20 -08002860/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
2861TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
2862{
2863 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2864 setPlaneAlpha, advancePlaneAlpha));
2865}
2866
2867/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
2868TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
2869{
2870 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2871 setPlaneAlpha, advancePlaneAlpha));
2872}
2873
2874/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
2875TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
2876{
2877 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2878 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002879 Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
Marissa Wall2b1f5302016-12-15 12:27:20 -08002880
2881 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002882 badLayer, testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08002883 }
2884 ));
2885}
Marissa Wallac108192016-12-15 12:27:48 -08002886
Marissa Wallc57468f2016-12-15 12:31:12 -08002887/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
2888TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
2889{
2890 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2891 setSourceCrop, advanceSourceCrop));
2892}
2893
2894/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
2895TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
2896{
2897 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2898 setSourceCrop, advanceSourceCrop));
2899}
2900
2901/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
2902TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
2903{
2904 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2905 setSourceCrop));
2906}
2907
Marissa Wallad761812016-12-15 12:32:24 -08002908/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
2909TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
2910{
2911 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2912 setSurfaceDamage, advanceSurfaceDamage));
2913}
2914
2915/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
2916TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
2917{
2918 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2919 setSurfaceDamage, advanceSurfaceDamage));
2920}
2921
2922/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
2923TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
2924{
2925 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2926 setSurfaceDamage));
2927}
2928
Marissa Wallac108192016-12-15 12:27:48 -08002929/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
2930TEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
2931{
2932 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2933 setTransform, advanceTransform));
2934}
2935
2936/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
2937TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
2938{
2939 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2940 setTransform, advanceTransform));
2941}
2942
2943/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
2944TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
2945{
2946 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2947 setTransform));
2948}
Marissa Wall273b1df2016-12-15 12:28:47 -08002949
Marissa Wallf7618ed2016-12-15 12:34:39 -08002950/* TESTCASE: Tests that the HWC2 can set the visible region of a layer. */
2951TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION)
2952{
2953 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Basic, 5,
2954 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2955 Hwc2TestLayers* testLayers) {
2956
2957 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display,
2958 layer, testLayers->getVisibleRegion(layer)));
2959 },
2960
2961 advanceVisibleRegions));
2962}
2963
2964/* TESTCASE: Tests that the HWC2 cannot set the visible region of a bad layer. */
2965TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION_bad_layer)
2966{
2967 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2968 setVisibleRegion));
2969}
2970
Marissa Wall273b1df2016-12-15 12:28:47 -08002971/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
2972TEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
2973{
2974 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
2975 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002976 Hwc2TestLayers* testLayers) {
Marissa Wall273b1df2016-12-15 12:28:47 -08002977
2978 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002979 testLayers->getZOrder(layer)));
Marissa Wallf7618ed2016-12-15 12:34:39 -08002980 },
2981
2982 /* TestLayer z orders are set during the construction of TestLayers
2983 * and cannot be updated. There is no need (or ability) to cycle
2984 * through additional z order configurations. */
2985 [] (Hwc2TestLayers* /*testLayers*/) {
2986 return false;
Marissa Wall273b1df2016-12-15 12:28:47 -08002987 }
2988 ));
2989}
2990
2991/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
2992TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
2993{
2994 const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
2995 static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
2996 static_cast<uint32_t>(UINT32_MAX / 2),
2997 static_cast<uint32_t>(UINT32_MAX) };
2998
2999 for (auto display : mDisplays) {
3000 std::vector<hwc2_config_t> configs;
3001
3002 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3003
3004 for (auto config : configs) {
3005 hwc2_layer_t layer;
3006
3007 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3008
3009 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
3010
3011 for (uint32_t zOrder : zOrders) {
3012 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
3013 }
3014
3015 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
3016 }
3017 }
3018}
3019
3020/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
3021TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
3022{
3023 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3024 setZOrder));
3025}
Marissa Wall1cd789c2017-01-27 12:55:36 -08003026
3027/* TESTCASE: Tests that the HWC2 can display a layer with basic property
3028 * coverage */
3029TEST_F(Hwc2Test, VALIDATE_DISPLAY_basic)
3030{
3031 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3032 [] (Hwc2Test* test, hwc2_display_t display,
Marissa Wall706178d2016-12-15 12:39:14 -08003033 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003034 Hwc2TestLayers* /*testLayers*/) {
Marissa Wall1cd789c2017-01-27 12:55:36 -08003035
3036 uint32_t numTypes, numRequests;
3037 bool hasChanges = false;
3038
3039 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3040 &numRequests, &hasChanges));
3041 if (hasChanges)
3042 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
3043 << "wrong number of requests";
3044 }
3045 ));
3046}
3047
3048/* TESTCASE: Tests that the HWC2 can display 5 layers with default coverage. */
3049TEST_F(Hwc2Test, VALIDATE_DISPLAY_default_5)
3050{
3051 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 5,
3052 [] (Hwc2Test* test, hwc2_display_t display,
Marissa Wall706178d2016-12-15 12:39:14 -08003053 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003054 Hwc2TestLayers* /*testLayers*/) {
Marissa Wall1cd789c2017-01-27 12:55:36 -08003055
3056 uint32_t numTypes, numRequests;
3057 bool hasChanges = false;
3058
3059 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3060 &numRequests, &hasChanges));
3061 if (hasChanges)
3062 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
3063 << "wrong number of requests";
3064 }
3065 ));
3066}
3067
3068/* TESTCASE: Tests that the HWC2 cannot validate a bad display */
3069TEST_F(Hwc2Test, VALIDATE_DISPLAY_bad_display)
3070{
3071 hwc2_display_t display;
3072 uint32_t numTypes, numRequests;
3073 hwc2_error_t err = HWC2_ERROR_NONE;
3074
3075 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3076
3077 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes, &numRequests,
3078 &err));
3079 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3080}
Marissa Wall706178d2016-12-15 12:39:14 -08003081
3082/* TESTCASE: Tests that the HWC2 can get display requests after validating a
3083 * basic layer. */
3084TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_basic)
3085{
3086 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3087 [] (Hwc2Test* test, hwc2_display_t display,
3088 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003089 Hwc2TestLayers* /*testLayers*/) {
Marissa Wall706178d2016-12-15 12:39:14 -08003090
3091 uint32_t numTypes, numRequests;
3092 bool hasChanges = false;
3093
3094 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3095 &numRequests, &hasChanges));
3096 if (hasChanges)
3097 EXPECT_LE(numTypes, layers.size())
3098 << "wrong number of requests";
3099
3100 EXPECT_NO_FATAL_FAILURE(test->handleRequests(display, layers,
3101 numRequests));
3102 }
3103 ));
3104}
3105
3106/* TESTCASE: Tests that the HWC2 cannot get display requests from a bad display */
3107TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_bad_display)
3108{
3109 hwc2_display_t display;
3110 hwc2_display_request_t displayRequests;
3111 std::vector<hwc2_layer_t> layers;
3112 std::vector<hwc2_layer_request_t> layerRequests;
3113 hwc2_error_t err = HWC2_ERROR_NONE;
3114
3115 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3116
3117 EXPECT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequests,
3118 &layers, &layerRequests, &err));
3119 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3120}
3121
3122/* TESTCASE: Tests that the HWC2 cannot get display requests from an non
3123 * validated display. */
3124TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_not_validated)
3125{
3126 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3127 [] (Hwc2Test* test, hwc2_display_t display,
3128 std::vector<hwc2_layer_t>* layers) {
3129
3130 hwc2_display_request_t displayRequests;
3131 std::vector<hwc2_layer_request_t> layerRequests;
3132 hwc2_error_t err = HWC2_ERROR_NONE;
3133
3134 ASSERT_NO_FATAL_FAILURE(test->getDisplayRequests(display,
3135 &displayRequests, layers, &layerRequests, &err));
3136 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3137 << "returned wrong error code";
3138 }
3139 ));
3140}
3141
3142/* TESTCASE: Tests that the HWC2 can get changed composition types after
3143 * validating a basic layer. */
3144TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_basic)
3145{
3146 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3147 [] (Hwc2Test* test, hwc2_display_t display,
3148 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003149 Hwc2TestLayers* testLayers) {
Marissa Wall706178d2016-12-15 12:39:14 -08003150
3151 uint32_t numTypes, numRequests;
3152 bool hasChanges = false;
3153
3154 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3155 &numRequests, &hasChanges));
3156 if (hasChanges)
3157 EXPECT_LE(numTypes, layers.size())
3158 << "wrong number of requests";
3159
3160 EXPECT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
Marissa Wall563030b2017-02-21 14:01:05 -08003161 *testLayers, layers, numTypes));
Marissa Wall706178d2016-12-15 12:39:14 -08003162 }
3163 ));
3164}
3165
3166/* TESTCASE: Tests that the HWC2 cannot get changed composition types from a bad
3167 * display */
3168TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_bad_display)
3169{
3170 hwc2_display_t display;
3171 std::vector<hwc2_layer_t> layers;
3172 std::vector<hwc2_composition_t> types;
3173 hwc2_error_t err = HWC2_ERROR_NONE;
3174
3175 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3176
3177 EXPECT_NO_FATAL_FAILURE(getChangedCompositionTypes(display, &layers,
3178 &types, &err));
3179 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3180}
3181
3182/* TESTCASE: Tests that the HWC2 cannot get changed composition types from an non
3183 * validated display. */
3184TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_not_validated)
3185{
3186 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3187 [] (Hwc2Test* test, hwc2_display_t display,
3188 std::vector<hwc2_layer_t>* layers) {
3189
3190 std::vector<hwc2_composition_t> types;
3191 hwc2_error_t err = HWC2_ERROR_NONE;
3192
3193 ASSERT_NO_FATAL_FAILURE(test->getChangedCompositionTypes(
3194 display, layers, &types, &err));
3195 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3196 << "returned wrong error code";
3197 }
3198 ));
3199}
3200
3201/* TESTCASE: Tests that the HWC2 can accept display changes after validating a
3202 * basic layer. */
3203TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_basic)
3204{
3205 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3206 [] (Hwc2Test* test, hwc2_display_t display,
3207 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003208 Hwc2TestLayers* testLayers) {
Marissa Wall706178d2016-12-15 12:39:14 -08003209
3210 uint32_t numTypes, numRequests;
3211 bool hasChanges = false;
3212
3213 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3214 &numRequests, &hasChanges));
3215 if (hasChanges)
3216 EXPECT_LE(numTypes, layers.size())
3217 << "wrong number of requests";
3218
3219 ASSERT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
Marissa Wall563030b2017-02-21 14:01:05 -08003220 *testLayers, layers, numTypes));
Marissa Wall706178d2016-12-15 12:39:14 -08003221
3222 EXPECT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display));
3223 }
3224 ));
3225}
3226
3227/* TESTCASE: Tests that the HWC2 cannot accept display changes from a bad
3228 * display */
3229TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_bad_display)
3230{
3231 hwc2_display_t display;
3232 hwc2_error_t err = HWC2_ERROR_NONE;
3233
3234 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3235
3236 EXPECT_NO_FATAL_FAILURE(acceptDisplayChanges(display, &err));
3237 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3238}
3239
3240/* TESTCASE: Tests that the HWC2 cannot accept display changes from an non
3241 * validated display. */
3242TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_not_validated)
3243{
3244 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3245 [] (Hwc2Test* test, hwc2_display_t display,
3246 std::vector<hwc2_layer_t>* /*layers*/) {
3247
3248 hwc2_error_t err = HWC2_ERROR_NONE;
3249
3250 ASSERT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display, &err));
3251 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3252 << "returned wrong error code";
3253 }
3254 ));
3255}
Marissa Wallf18cfb02017-02-21 14:01:05 -08003256
3257/* TESTCASE: Tests that the HWC2 supports client target with required values */
3258TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT)
3259{
3260 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3261 [] (Hwc2Test* test, hwc2_display_t display,
3262 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3263
3264 const Area bufferArea = testClientTargetSupport.getBufferArea();
3265 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3266
3267 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3268 bufferArea.width, bufferArea.height, format,
3269 testClientTargetSupport.getDataspace()));
3270 },
3271
3272 advanceClientTargetSupport));
3273}
3274
3275/* TESTCASE: Tests that the HWC2 cannot get client target support for a bad
3276 * display. */
3277TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_bad_display)
3278{
3279 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3280 [] (Hwc2Test* test, hwc2_display_t /*display*/,
3281 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3282
3283 const Area bufferArea = testClientTargetSupport.getBufferArea();
3284 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3285 hwc2_display_t badDisplay;
3286 hwc2_error_t err = HWC2_ERROR_NONE;
3287
3288 ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
3289
3290 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(badDisplay,
3291 bufferArea.width, bufferArea.height, format,
3292 testClientTargetSupport.getDataspace(), &err));
3293 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3294 },
3295
3296 advanceClientTargetSupport));
3297}
3298
3299/* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
3300 * for a variety of client target values. */
3301TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_unsupported)
3302{
3303 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Complete,
3304 [] (Hwc2Test* test, hwc2_display_t display,
3305 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3306
3307 const Area bufferArea = testClientTargetSupport.getBufferArea();
3308 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3309 hwc2_error_t err = HWC2_ERROR_NONE;
3310
3311 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3312 bufferArea.width, bufferArea.height, format,
3313 testClientTargetSupport.getDataspace(), &err));
3314 EXPECT_TRUE(err == HWC2_ERROR_NONE
3315 || err == HWC2_ERROR_UNSUPPORTED)
3316 << "returned wrong error code";
3317 },
3318
3319 advanceClientTargetSupport));
3320}
3321
3322/* TESTCASE: Tests that the HWC2 can set a client target buffer for a basic
3323 * layer. */
3324TEST_F(Hwc2Test, SET_CLIENT_TARGET_basic)
3325{
3326 const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3327 const hwc_region_t damage = { };
3328 const size_t layerCnt = 1;
3329
3330 for (auto display : mDisplays) {
3331 std::vector<hwc2_config_t> configs;
3332
3333 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
3334
3335 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3336
3337 for (auto config : configs) {
3338 Area displayArea;
3339 std::vector<hwc2_layer_t> layers;
3340
3341 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3342 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
3343
3344 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
3345 Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Basic,
3346 displayArea);
3347
3348 if (!testLayers.optimizeLayouts())
3349 continue;
3350
3351 Hwc2TestClientTarget testClientTarget;
3352
3353 do {
3354 std::set<hwc2_layer_t> clientLayers;
3355 std::set<hwc2_layer_t> clearLayers;
3356 uint32_t numTypes, numRequests;
3357 bool hasChanges, skip;
3358 bool flipClientTarget;
3359 buffer_handle_t handle;
3360 int32_t acquireFence;
3361
3362 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
3363 &testLayers, &skip));
3364 if (skip)
3365 continue;
3366
3367 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
3368 &numRequests, &hasChanges));
3369 if (hasChanges)
3370 EXPECT_LE(numTypes, layers.size())
3371 << "wrong number of requests";
3372
3373 ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
3374 testLayers, layers, numTypes, &clientLayers));
3375 ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
3376 numRequests, &clearLayers, &flipClientTarget));
3377 ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3378 clearLayers, flipClientTarget, displayArea, &handle,
3379 &acquireFence), 0);
3380 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle,
3381 acquireFence, dataspace, damage));
3382
3383 if (acquireFence >= 0)
3384 close(acquireFence);
3385
3386 } while (testLayers.advance());
3387
3388 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
3389 }
3390
3391 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
3392 }
3393}
3394
3395/* TESTCASE: Tests that the HWC2 cannot set a client target for a bad display. */
3396TEST_F(Hwc2Test, SET_CLIENT_TARGET_bad_display)
3397{
3398 hwc2_display_t display;
3399 std::vector<hwc2_layer_t> layers;
3400 const Area displayArea = {0, 0};
3401 Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Default, displayArea);
3402 std::set<hwc2_layer_t> clientLayers;
3403 std::set<hwc2_layer_t> flipClientTargetLayers;
3404 bool flipClientTarget = true;
3405 const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3406 const hwc_region_t damage = { };
3407 buffer_handle_t handle;
3408 int32_t acquireFence;
3409 hwc2_error_t err = HWC2_ERROR_NONE;
3410
3411 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3412
3413 Hwc2TestClientTarget testClientTarget;
3414
3415 ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3416 flipClientTargetLayers, flipClientTarget, displayArea, &handle,
3417 &acquireFence), 0);
3418
3419 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
3420 dataspace, damage, &err));
3421
3422 if (acquireFence >= 0)
3423 close(acquireFence);
3424
3425 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3426}
Marissa Wall563030b2017-02-21 14:01:05 -08003427
3428/* TESTCASE: Tests that the HWC2 can present 1 default layer. */
3429TEST_F(Hwc2Test, PRESENT_DISPLAY_default_1)
3430{
3431 const size_t layerCnt = 1;
3432 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3433 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3434 bool optimize = false;
3435
3436 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3437 optimize));
3438}
3439
3440/* TESTCASE: Tests that the HWC2 can present 2 default layers. */
3441TEST_F(Hwc2Test, PRESENT_DISPLAY_default_2)
3442{
3443 const size_t layerCnt = 2;
3444 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3445 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3446 bool optimize = false;
3447
3448 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3449 optimize));
3450}
3451
3452/* TESTCASE: Tests that the HWC2 can present 3 default layers. */
3453TEST_F(Hwc2Test, PRESENT_DISPLAY_default_3)
3454{
3455 const size_t layerCnt = 3;
3456 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3457 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3458 bool optimize = false;
3459
3460 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3461 optimize));
3462}
3463
3464/* TESTCASE: Tests that the HWC2 can present 4 default layers. */
3465TEST_F(Hwc2Test, PRESENT_DISPLAY_default_4)
3466{
3467 const size_t layerCnt = 4;
3468 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3469 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3470 bool optimize = false;
3471
3472 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3473 optimize));
3474}
3475
3476/* TESTCASE: Tests that the HWC2 can present 5 default layers. */
3477TEST_F(Hwc2Test, PRESENT_DISPLAY_default_5)
3478{
3479 const size_t layerCnt = 5;
3480 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3481 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3482 bool optimize = false;
3483
3484 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3485 optimize));
3486}
3487
3488/* TESTCASE: Tests that the HWC2 can present 6 default layers. */
3489TEST_F(Hwc2Test, PRESENT_DISPLAY_default_6)
3490{
3491 const size_t layerCnt = 6;
3492 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3493 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3494 bool optimize = false;
3495
3496 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3497 optimize));
3498}
3499
3500/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3501 * blend mode. */
3502TEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_1)
3503{
3504 const size_t layerCnt = 1;
3505 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3506 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3507 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
3508 {Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Basic},
3509 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
3510 bool optimize = false;
3511
3512 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3513 optimize));
3514}
3515
3516/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3517 * blend mode. */
3518TEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_2)
3519{
3520 const size_t layerCnt = 2;
3521 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3522 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3523 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
3524 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
3525 bool optimize = false;
3526
3527 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3528 optimize));
3529}
3530
3531/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3532 * buffer. */
3533TEST_F(Hwc2Test, PRESENT_DISPLAY_buffer_1)
3534{
3535 const size_t layerCnt = 1;
3536 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3537 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3538 {{Hwc2TestPropertyName::BufferArea, Hwc2TestCoverage::Complete}};
3539 bool optimize = true;
3540
3541 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3542 optimize));
3543}
3544
3545/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3546 * color. */
3547TEST_F(Hwc2Test, PRESENT_DISPLAY_color_1)
3548{
3549 const size_t layerCnt = 1;
3550 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3551 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3552 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3553 {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Complete}};
3554 bool optimize = true;
3555
3556 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3557 optimize));
3558}
3559
3560/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3561 * color. */
3562TEST_F(Hwc2Test, PRESENT_DISPLAY_color_2)
3563{
3564 const size_t layerCnt = 2;
3565 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3566 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3567 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3568 {Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3569 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic},
3570 {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Basic}};
3571 bool optimize = true;
3572
3573 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3574 optimize));
3575}
3576
3577/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3578 * composition. */
3579TEST_F(Hwc2Test, PRESENT_DISPLAY_composition_1)
3580{
3581 const size_t layerCnt = 1;
3582 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3583 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3584 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete}};
3585 bool optimize = true;
3586
3587 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3588 optimize));
3589}
3590
3591/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3592 * cursor. */
3593TEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_1)
3594{
3595 const size_t layerCnt = 1;
3596 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3597 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3598 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3599 {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete}};
3600 bool optimize = true;
3601
3602 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3603 optimize));
3604}
3605
3606/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3607 * cursor. */
3608TEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_2)
3609{
3610 const size_t layerCnt = 2;
3611 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3612 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3613 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3614 {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete},
3615 {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
3616 bool optimize = true;
3617
3618 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3619 optimize));
3620}
3621
3622/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3623 * dataspace. */
3624TEST_F(Hwc2Test, PRESENT_DISPLAY_dataspace_1)
3625{
3626 const size_t layerCnt = 1;
3627 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3628 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3629 {{Hwc2TestPropertyName::Dataspace, Hwc2TestCoverage::Complete}};
3630 bool optimize = true;
3631
3632 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3633 optimize));
3634}
3635
3636/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3637 * display frame. */
3638TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_1)
3639{
3640 const size_t layerCnt = 1;
3641 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3642 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3643 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3644 bool optimize = true;
3645
3646 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3647 optimize));
3648}
3649
3650/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3651 * display frame. */
3652TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_2)
3653{
3654 const size_t layerCnt = 2;
3655 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3656 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3657 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3658 bool optimize = true;
3659
3660 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3661 optimize));
3662}
3663
3664/* TESTCASE: Tests that the HWC2 can present 3 layers with complete coverage of
3665 * display frame. */
3666TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_3)
3667{
3668 const size_t layerCnt = 3;
3669 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3670 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3671 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3672 bool optimize = true;
3673
3674 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3675 optimize));
3676}
3677
3678/* TESTCASE: Tests that the HWC2 can present 4 layers with complete coverage of
3679 * display frame. */
3680TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_4)
3681{
3682 const size_t layerCnt = 4;
3683 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3684 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3685 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3686 bool optimize = true;
3687
3688 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3689 optimize));
3690}
3691
3692/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3693 * plane alpha. */
3694TEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_1)
3695{
3696 const size_t layerCnt = 1;
3697 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3698 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3699 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3700 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
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 2 layers with complete coverage of
3708 * plane alpha. */
3709TEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_2)
3710{
3711 const size_t layerCnt = 2;
3712 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3713 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3714 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3715 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
3716 bool optimize = false;
3717
3718 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3719 optimize));
3720}
3721
3722/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3723 * source crop. */
3724TEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_1)
3725{
3726 const size_t layerCnt = 1;
3727 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3728 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3729 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
3730 {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
3731 bool optimize = true;
3732
3733 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3734 optimize));
3735}
3736
3737/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3738 * source crop. */
3739TEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_2)
3740{
3741 const size_t layerCnt = 2;
3742 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3743 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3744 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
3745 {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
3746 bool optimize = true;
3747
3748 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3749 optimize));
3750}
3751
3752
3753/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3754 * surface damage. */
3755TEST_F(Hwc2Test, PRESENT_DISPLAY_surface_damage_1)
3756{
3757 const size_t layerCnt = 1;
3758 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3759 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3760 {{Hwc2TestPropertyName::SurfaceDamage, Hwc2TestCoverage::Complete}};
3761 bool optimize = true;
3762
3763 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3764 optimize));
3765}
3766
3767/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3768 * transform. */
3769TEST_F(Hwc2Test, PRESENT_DISPLAY_transform_1)
3770{
3771 const size_t layerCnt = 1;
3772 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3773 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3774 {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete}};
3775 bool optimize = true;
3776
3777 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3778 optimize));
3779}
3780
3781/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3782 * transform. */
3783TEST_F(Hwc2Test, PRESENT_DISPLAY_transform_2)
3784{
3785 const size_t layerCnt = 2;
3786 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3787 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3788 {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete},
3789 {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
3790 bool optimize = true;
3791
3792 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3793 optimize));
3794}
3795
3796/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3797 * basic. */
3798TEST_F(Hwc2Test, PRESENT_DISPLAY_basic_1)
3799{
3800 const size_t layerCnt = 1;
3801 Hwc2TestCoverage coverage = Hwc2TestCoverage::Basic;
3802 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3803 bool optimize = true;
3804
3805 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3806 optimize));
3807}
3808
3809/* TESTCASE: Tests that the HWC2 cannot present a bad display. */
3810TEST_F(Hwc2Test, PRESENT_DISPLAY_bad_display)
3811{
3812 hwc2_display_t display;
3813 int32_t presentFence;
3814 hwc2_error_t err = HWC2_ERROR_NONE;
3815
3816 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3817
3818 ASSERT_NO_FATAL_FAILURE(presentDisplay(display, &presentFence, &err));
3819 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3820}
3821
3822/* TESTCASE: Tests that the HWC2 cannot present an unvalidated display. */
3823TEST_F(Hwc2Test, PRESENT_DISPLAY_not_validated)
3824{
3825 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 1,
3826 [] (Hwc2Test* test, hwc2_display_t display,
3827 const std::vector<hwc2_layer_t>& /*layers*/,
3828 Hwc2TestLayers* /*testLayers*/) {
3829
3830 int32_t presentFence;
3831 hwc2_error_t err = HWC2_ERROR_NONE;
3832
3833 ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
3834 HWC2_POWER_MODE_ON));
3835 ASSERT_NO_FATAL_FAILURE(test->enableVsync(display));
3836
3837 ASSERT_NO_FATAL_FAILURE(test->waitForVsync());
3838
3839 ASSERT_NO_FATAL_FAILURE(test->presentDisplay(display,
3840 &presentFence, &err));
3841 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3842 << "returned wrong error code";
3843
3844 ASSERT_NO_FATAL_FAILURE(test->disableVsync(display));
3845 ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
3846 HWC2_POWER_MODE_OFF));
3847 }
3848 ));
3849}
3850
3851/* TESTCASE: Tests that the HWC2 cannot get release fences from a bad display. */
3852TEST_F(Hwc2Test, GET_RELEASE_FENCES_bad_display)
3853{
3854 hwc2_display_t display;
3855 std::vector<hwc2_layer_t> layers;
3856 std::vector<int32_t> fences;
3857 hwc2_error_t err = HWC2_ERROR_NONE;
3858
3859 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3860
3861 ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences, &err));
3862 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3863}