blob: 44aa330b9f96e1490e5c4ae0f836c2be9448893d [file] [log] [blame]
Marissa Wall4d600052016-12-15 12:16:01 -08001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <array>
Marissa Wallcfb9a072017-02-17 20:53:18 -080018#include <unordered_set>
Marissa Wall4d600052016-12-15 12:16:01 -080019#include <gtest/gtest.h>
20#include <dlfcn.h>
Marissa Wall5a240aa2016-12-15 12:34:06 -080021#include <android-base/unique_fd.h>
Marissa Wall4d600052016-12-15 12:16:01 -080022#include <hardware/hardware.h>
23
24#define HWC2_INCLUDE_STRINGIFICATION
25#define HWC2_USE_CPP11
26#include <hardware/hwcomposer2.h>
27#undef HWC2_INCLUDE_STRINGIFICATION
28#undef HWC2_USE_CPP11
29
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080030#include "Hwc2TestLayer.h"
Marissa Wall273b1df2016-12-15 12:28:47 -080031#include "Hwc2TestLayers.h"
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080032
Marissa Wallcfb9a072017-02-17 20:53:18 -080033void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
34 hwc2_display_t display, int32_t connected);
Marissa Wall572a1ee2016-12-15 12:24:13 -080035void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
36 hwc2_display_t display, int64_t timestamp);
Marissa Wallcfb9a072017-02-17 20:53:18 -080037
Marissa Wall4d600052016-12-15 12:16:01 -080038class Hwc2Test : public testing::Test {
39public:
40
41 virtual void SetUp()
42 {
43 hw_module_t const* hwc2Module;
44
45 int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
46 ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
47 << strerror(-err);
48
49 /* The following method will fail if you have not run
50 * "adb shell stop" */
51 err = hwc2_open(hwc2Module, &mHwc2Device);
52 ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
53 << strerror(-err);
Marissa Wallcfb9a072017-02-17 20:53:18 -080054
55 populateDisplays();
Marissa Wall4d600052016-12-15 12:16:01 -080056 }
57
58 virtual void TearDown()
59 {
Marissa Wall1db2e372016-12-15 12:19:39 -080060
61 for (auto itr = mLayers.begin(); itr != mLayers.end();) {
62 hwc2_display_t display = itr->first;
63 hwc2_layer_t layer = itr->second;
64 itr++;
65 /* Destroys and removes the layer from mLayers */
66 destroyLayer(display, layer);
67 }
68
Marissa Wall03c91732016-12-15 12:23:16 -080069 for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
70 hwc2_display_t display = *itr;
71 itr++;
72 /* Sets power mode to off and removes the display from
73 * mActiveDisplays */
74 setPowerMode(display, HWC2_POWER_MODE_OFF);
75 }
76
Marissa Wall4d600052016-12-15 12:16:01 -080077 if (mHwc2Device)
78 hwc2_close(mHwc2Device);
79 }
80
Marissa Walla4b01482017-02-17 20:52:03 -080081 void registerCallback(hwc2_callback_descriptor_t descriptor,
82 hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
83 hwc2_error_t* outErr = nullptr)
84 {
85 auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
86 getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
87 ASSERT_TRUE(pfn) << "failed to get function";
88
89 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
90 callbackData, pointer));
91 if (outErr) {
92 *outErr = err;
93 } else {
94 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
95 }
96 }
97
Marissa Wallcfb9a072017-02-17 20:53:18 -080098 void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
99 hwc2_error_t* outErr = nullptr)
100 {
101 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
102 getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
103 ASSERT_TRUE(pfn) << "failed to get function";
104
105 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
106 reinterpret_cast<int32_t*>(outType)));
107 if (outErr) {
108 *outErr = err;
109 } else {
110 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
111 }
112 }
113
114 /* If the populateDisplays function is still receiving displays and the
115 * display is connected, the display handle is stored in mDisplays. */
116 void hotplugCallback(hwc2_display_t display, int32_t connected)
117 {
118 std::lock_guard<std::mutex> lock(mHotplugMutex);
119
120 if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
121 return;
122
123 if (connected == HWC2_CONNECTION_CONNECTED)
124 mDisplays.insert(display);
125
126 mHotplugCv.notify_all();
127 }
128
Marissa Wall1db2e372016-12-15 12:19:39 -0800129 void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
130 hwc2_error_t* outErr = nullptr)
131 {
132 auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
133 getFunction(HWC2_FUNCTION_CREATE_LAYER));
134 ASSERT_TRUE(pfn) << "failed to get function";
135
136 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
137 outLayer));
138
139 if (err == HWC2_ERROR_NONE)
140 mLayers.insert(std::make_pair(display, *outLayer));
141
142 if (outErr) {
143 *outErr = err;
144 } else {
145 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
146 }
147 }
148
149 void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
150 hwc2_error_t* outErr = nullptr)
151 {
152 auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
153 getFunction(HWC2_FUNCTION_DESTROY_LAYER));
154 ASSERT_TRUE(pfn) << "failed to get function";
155
156 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
157
158 if (err == HWC2_ERROR_NONE)
159 mLayers.erase(std::make_pair(display, layer));
160
161 if (outErr) {
162 *outErr = err;
163 } else {
164 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
165 << layer;
166 }
167 }
168
Marissa Wallcf935cb2016-12-15 12:20:47 -0800169 void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
170 hwc2_attribute_t attribute, int32_t* outValue,
171 hwc2_error_t* outErr = nullptr)
172 {
173 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
174 getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
175 ASSERT_TRUE(pfn) << "failed to get function";
176
177 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
178 attribute, outValue));
179
180 if (outErr) {
181 *outErr = err;
182 } else {
183 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
184 << getAttributeName(attribute) << " for config " << config;
185 }
186 }
187
188 void getDisplayConfigs(hwc2_display_t display,
189 std::vector<hwc2_config_t>* outConfigs,
190 hwc2_error_t* outErr = nullptr)
191 {
192 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
193 getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
194 ASSERT_TRUE(pfn) << "failed to get function";
195
196 uint32_t numConfigs = 0;
197
198 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
199 &numConfigs, nullptr));
200
201 if (err == HWC2_ERROR_NONE) {
202 outConfigs->resize(numConfigs);
203
204 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
205 &numConfigs, outConfigs->data()));
206 }
207
208 if (outErr) {
209 *outErr = err;
210 } else {
211 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
212 " display " << display;
213 }
214 }
215
Marissa Wall93dc04f2016-12-15 12:21:46 -0800216 void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
217 hwc2_error_t* outErr = nullptr)
218 {
219 auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
220 getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
221 ASSERT_TRUE(pfn) << "failed to get function";
222
223 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
224 outConfig));
225 if (outErr) {
226 *outErr = err;
227 } else {
228 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
229 " display " << display;
230 }
231 }
232
233 void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
234 hwc2_error_t* outErr = nullptr)
235 {
236 auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
237 getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
238 ASSERT_TRUE(pfn) << "failed to get function";
239
240 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
241 if (outErr) {
242 *outErr = err;
243 } else {
244 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
245 << config;
246 }
247 }
248
Marissa Wall03c91732016-12-15 12:23:16 -0800249 void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
250 hwc2_error_t* outErr = nullptr)
251 {
252 auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
253 getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
254 ASSERT_TRUE(pfn) << "failed to get function";
255
256 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
257 outSupport));
258 if (outErr) {
259 *outErr = err;
260 } else {
261 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
262 " display " << display;
263 }
264 }
265
266 void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
267 hwc2_error_t* outErr = nullptr)
268 {
269 auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
270 getFunction(HWC2_FUNCTION_SET_POWER_MODE));
271 ASSERT_TRUE(pfn) << "failed to get function";
272
273 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
274 mode));
275 if (outErr) {
276 *outErr = err;
277 if (err != HWC2_ERROR_NONE)
278 return;
279 } else {
280 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
281 << getPowerModeName(mode) << " on display " << display;
282 }
283
284 if (mode == HWC2_POWER_MODE_OFF) {
285 mActiveDisplays.erase(display);
286 } else {
287 mActiveDisplays.insert(display);
288 }
289 }
290
Marissa Wall572a1ee2016-12-15 12:24:13 -0800291 void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
292 hwc2_error_t* outErr = nullptr)
293 {
294 auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
295 getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
296 ASSERT_TRUE(pfn) << "failed to get function";
297
298 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
299 enabled));
300 if (outErr) {
301 *outErr = err;
302 } else {
303 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
304 << getVsyncName(enabled);
305 }
306 }
307
308 void vsyncCallback(hwc2_display_t display, int64_t timestamp)
309 {
310 std::lock_guard<std::mutex> lock(mVsyncMutex);
311 mVsyncDisplay = display;
312 mVsyncTimestamp = timestamp;
313 mVsyncCv.notify_all();
314 }
315
Marissa Walldd4087f2016-12-15 12:24:52 -0800316 void getDisplayName(hwc2_display_t display, std::string* outName,
317 hwc2_error_t* outErr = nullptr)
318 {
319 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
320 getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
321 ASSERT_TRUE(pfn) << "failed to get function";
322
323 uint32_t size = 0;
324
325 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
326 nullptr));
327
328 if (err == HWC2_ERROR_NONE) {
329 std::vector<char> name(size);
330
331 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
332 name.data()));
333
334 outName->assign(name.data());
335 }
336
337 if (outErr) {
338 *outErr = err;
339 } else {
340 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
341 << display;
342 }
343 }
344
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800345 void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
346 hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
347 {
348 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
349 getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
350 ASSERT_TRUE(pfn) << "failed to get function";
351
352 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
353 composition));
354 if (outErr) {
355 *outErr = err;
356 } else {
357 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
358 " type " << getCompositionName(composition);
359 }
360 }
361
Marissa Wall2a0aaf92016-12-15 12:31:37 -0800362 void setCursorPosition(hwc2_display_t display, hwc2_layer_t layer,
363 int32_t x, int32_t y, hwc2_error_t* outErr = nullptr)
364 {
365 auto pfn = reinterpret_cast<HWC2_PFN_SET_CURSOR_POSITION>(
366 getFunction(HWC2_FUNCTION_SET_CURSOR_POSITION));
367 ASSERT_TRUE(pfn) << "failed to get function";
368
369 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, x,
370 y));
371 if (outErr) {
372 *outErr = err;
373 } else {
374 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set cursor position";
375 }
376 }
377
Marissa Wallffc67da2016-12-15 12:26:09 -0800378 void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
379 hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
380 {
381 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
382 getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
383 ASSERT_TRUE(pfn) << "failed to get function";
384
385 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
386 mode));
387 if (outErr) {
388 *outErr = err;
389 } else {
390 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
391 << getBlendModeName(mode);
392 }
393 }
394
Marissa Wall5a240aa2016-12-15 12:34:06 -0800395 void setLayerBuffer(hwc2_display_t display, hwc2_layer_t layer,
396 buffer_handle_t buffer, int32_t acquireFence,
397 hwc2_error_t* outErr = nullptr)
398 {
399 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BUFFER>(
400 getFunction(HWC2_FUNCTION_SET_LAYER_BUFFER));
401 ASSERT_TRUE(pfn) << "failed to get function";
402
403 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
404 buffer, acquireFence));
405 if (outErr) {
406 *outErr = err;
407 } else {
408 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer buffer";
409 }
410 }
411
Marissa Wallee242782016-12-15 12:30:12 -0800412 void setLayerColor(hwc2_display_t display, hwc2_layer_t layer,
413 hwc_color_t color, hwc2_error_t* outErr = nullptr)
414 {
415 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COLOR>(
416 getFunction(HWC2_FUNCTION_SET_LAYER_COLOR));
417 ASSERT_TRUE(pfn) << "failed to get function";
418
419 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
420 color));
421 if (outErr) {
422 *outErr = err;
423 } else {
424 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer color";
425 }
426 }
427
Marissa Wallb72b5c92016-12-15 12:26:39 -0800428 void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
429 android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
430 {
431 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
432 getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
433 ASSERT_TRUE(pfn) << "failed to get function";
434
435 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
436 layer, dataspace));
437 if (outErr) {
438 *outErr = err;
439 } else {
440 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
441 }
442 }
443
Marissa Wall600a73b2016-12-15 12:30:39 -0800444 void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
445 const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
446 {
447 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
448 getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
449 ASSERT_TRUE(pfn) << "failed to get function";
450
451 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
452 displayFrame));
453 if (outErr) {
454 *outErr = err;
455 } else {
456 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
457 " frame";
458 }
459 }
460
Marissa Wall2b1f5302016-12-15 12:27:20 -0800461 void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
462 float alpha, hwc2_error_t* outErr = nullptr)
463 {
464 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
465 getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
466 ASSERT_TRUE(pfn) << "failed to get function";
467
468 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
469 alpha));
470 if (outErr) {
471 *outErr = err;
472 } else {
473 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
474 << alpha;
475 }
476 }
477
Marissa Wallc57468f2016-12-15 12:31:12 -0800478 void setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer,
479 const hwc_frect_t& sourceCrop, hwc2_error_t* outErr = nullptr)
480 {
481 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
482 getFunction(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP));
483 ASSERT_TRUE(pfn) << "failed to get function";
484
485 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
486 sourceCrop));
487 if (outErr) {
488 *outErr = err;
489 } else {
490 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer source crop";
491 }
492 }
493
Marissa Wallad761812016-12-15 12:32:24 -0800494 void setLayerSurfaceDamage(hwc2_display_t display, hwc2_layer_t layer,
495 const hwc_region_t& surfaceDamage, hwc2_error_t* outErr = nullptr)
496 {
497 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
498 getFunction(HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE));
499 ASSERT_TRUE(pfn) << "failed to get function";
500
501 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
502 surfaceDamage));
503 if (outErr) {
504 *outErr = err;
505 } else {
506 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer surface"
507 " damage";
508 }
509 }
510
Marissa Wallac108192016-12-15 12:27:48 -0800511 void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
512 hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
513 {
514 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
515 getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
516 ASSERT_TRUE(pfn) << "failed to get function";
517
518 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
519 transform));
520 if (outErr) {
521 *outErr = err;
522 } else {
523 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
524 << getTransformName(transform);
525 }
526 }
527
Marissa Wallf7618ed2016-12-15 12:34:39 -0800528 void setLayerVisibleRegion(hwc2_display_t display, hwc2_layer_t layer,
529 const hwc_region_t& visibleRegion, hwc2_error_t* outErr = nullptr)
530 {
531 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_VISIBLE_REGION>(
532 getFunction(HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION));
533 ASSERT_TRUE(pfn) << "failed to get function";
534
535 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
536 visibleRegion));
537 if (outErr) {
538 *outErr = err;
539 } else {
540 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer visible"
541 " region";
542 }
543 }
544
Marissa Wall273b1df2016-12-15 12:28:47 -0800545 void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
546 uint32_t zOrder, hwc2_error_t* outErr = nullptr)
547 {
548 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
549 getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
550 ASSERT_TRUE(pfn) << "failed to get function";
551
552 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
553 zOrder));
554 if (outErr) {
555 *outErr = err;
556 } else {
557 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
558 << zOrder;
559 }
560 }
561
Marissa Wall1cd789c2017-01-27 12:55:36 -0800562 void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
563 uint32_t* outNumRequests, hwc2_error_t* outErr)
564 {
565 auto pfn = reinterpret_cast<HWC2_PFN_VALIDATE_DISPLAY>(
566 getFunction(HWC2_FUNCTION_VALIDATE_DISPLAY));
567 ASSERT_TRUE(pfn) << "failed to get function";
568
569 *outErr = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
570 outNumTypes, outNumRequests));
571 }
572
573 void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
574 uint32_t* outNumRequests, bool* outHasChanges)
575 {
576 hwc2_error_t err = HWC2_ERROR_NONE;
577
578 EXPECT_NO_FATAL_FAILURE(validateDisplay(display, outNumTypes,
579 outNumRequests, &err));
580
581 if (err != HWC2_ERROR_HAS_CHANGES) {
582 *outHasChanges = false;
583 EXPECT_EQ(err, HWC2_ERROR_NONE) << "failed to validate display";
584 } else {
585 *outHasChanges = true;
586 }
587 }
588
Marissa Wall4d600052016-12-15 12:16:01 -0800589protected:
590 hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
591 {
592 return mHwc2Device->getFunction(mHwc2Device, descriptor);
593 }
594
595 void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
596 {
597 uint32_t num = 0;
598
599 mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
600
601 outCapabilities->resize(num);
602
603 mHwc2Device->getCapabilities(mHwc2Device, &num,
604 reinterpret_cast<int32_t*>(outCapabilities->data()));
605 }
606
Marissa Wallcfb9a072017-02-17 20:53:18 -0800607 /* Registers a hotplug callback and waits for hotplug callbacks. This
608 * function will have no effect if called more than once. */
609 void populateDisplays()
610 {
611 /* Sets the hotplug status to receiving */
612 {
613 std::lock_guard<std::mutex> lock(mHotplugMutex);
614
615 if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
616 return;
617 mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
618 }
619
620 /* Registers the callback. This function call cannot be locked because
621 * a callback could happen on the same thread */
622 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
623 reinterpret_cast<hwc2_function_pointer_t>(
624 hwc2TestHotplugCallback)));
625
626 /* Waits for hotplug events. If a hotplug event has not come within 1
627 * second, stop waiting. */
628 std::unique_lock<std::mutex> lock(mHotplugMutex);
629
630 while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
631 std::cv_status::timeout) { }
632
633 /* Sets the hotplug status to done. Future calls will have no effect */
634 mHotplugStatus = Hwc2TestHotplugStatus::Done;
635 }
636
637 void getBadDisplay(hwc2_display_t* outDisplay)
638 {
639 for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
640 if (mDisplays.count(display) == 0) {
641 *outDisplay = display;
642 return;
643 }
644 }
645 ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
646 " are registered. This should never happen.";
647 }
648
Marissa Wall1db2e372016-12-15 12:19:39 -0800649 /* NOTE: will create min(newlayerCnt, max supported layers) layers */
650 void createLayers(hwc2_display_t display,
651 std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
652 {
653 std::vector<hwc2_layer_t> newLayers;
654 hwc2_layer_t layer;
655 hwc2_error_t err = HWC2_ERROR_NONE;
656
657 for (size_t i = 0; i < newLayerCnt; i++) {
658
659 EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
660 if (err == HWC2_ERROR_NO_RESOURCES)
661 break;
662 if (err != HWC2_ERROR_NONE) {
663 newLayers.clear();
664 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
665 }
666 newLayers.push_back(layer);
667 }
668
669 *outLayers = std::move(newLayers);
670 }
671
672 void destroyLayers(hwc2_display_t display,
673 std::vector<hwc2_layer_t>&& layers)
674 {
675 for (hwc2_layer_t layer : layers) {
676 EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
677 }
678 }
679
Marissa Wallcf935cb2016-12-15 12:20:47 -0800680 void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
681 {
682 std::vector<hwc2_config_t> configs;
683
684 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
685
686 hwc2_config_t CONFIG_MAX = UINT32_MAX;
687
688 ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
689 " (2^32 values) has been taken which shouldn't happen";
690
691 hwc2_config_t config;
692 for (config = 0; config < CONFIG_MAX; config++) {
693 if (std::count(configs.begin(), configs.end(), config) == 0)
694 break;
695 }
696
697 *outConfig = config;
698 }
699
Marissa Wall572a1ee2016-12-15 12:24:13 -0800700 void enableVsync(hwc2_display_t display)
701 {
702 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
703 reinterpret_cast<hwc2_function_pointer_t>(
704 hwc2TestVsyncCallback)));
705 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
706 }
707
708 void disableVsync(hwc2_display_t display)
709 {
710 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
711 }
712
713 void waitForVsync(hwc2_display_t* outDisplay = nullptr,
714 int64_t* outTimestamp = nullptr)
715 {
716 std::unique_lock<std::mutex> lock(mVsyncMutex);
717 ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
718 std::cv_status::no_timeout) << "timed out attempting to get"
719 " vsync callback";
720 if (outDisplay)
721 *outDisplay = mVsyncDisplay;
722 if (outTimestamp)
723 *outTimestamp = mVsyncTimestamp;
724 }
725
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800726 /* Calls a set property function from Hwc2Test to set a property value from
727 * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
728 using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
729 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800730 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800731
Marissa Wall273b1df2016-12-15 12:28:47 -0800732 /* Calls a set property function from Hwc2Test to set property values from
733 * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
734 using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
735 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800736 Hwc2TestLayers* testLayers);
Marissa Wall273b1df2016-12-15 12:28:47 -0800737
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800738 /* Calls a set property function from Hwc2Test to set a bad property value
739 * on hwc2_layer_t on hwc2_display_t */
740 using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
741 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800742 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800743
744 /* Calls a set property function from Hwc2Test to set a bad property value
745 * on hwc2_layer_t on hwc2_display_t */
746 using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
747 hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
748
Marissa Wall1cd789c2017-01-27 12:55:36 -0800749 /* Is called after a display is powered on and all layer properties have
750 * been set. It should be used to test functions such as validate, accepting
751 * changes, present, etc. */
752 using TestDisplayLayersFunction = void (*)(Hwc2Test* test,
753 hwc2_display_t display, const std::vector<hwc2_layer_t>& layers);
754
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800755 /* Advances a property of Hwc2TestLayer */
756 using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
757
Marissa Wallf7618ed2016-12-15 12:34:39 -0800758 /* Advances properties of Hwc2TestLayers */
759 using AdvanceProperties = bool (*)(Hwc2TestLayers* testLayer);
760
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800761 /* For each active display it cycles through each display config and tests
762 * each property value. It creates a layer, sets the property and then
763 * destroys the layer */
764 void setLayerProperty(Hwc2TestCoverage coverage,
765 TestLayerPropertyFunction function, AdvanceProperty advance)
766 {
767 for (auto display : mDisplays) {
768 std::vector<hwc2_config_t> configs;
769
770 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
771
772 for (auto config : configs) {
773 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -0800774 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800775
776 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800777 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
778 &displayArea));
779 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800780
781 do {
782 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
783
784 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800785 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800786
787 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
788 } while (advance(&testLayer));
789 }
790 }
791 }
792
793 /* For each active display it cycles through each display config and tests
794 * each property value. It creates a layer, cycles through each property
795 * value and updates the layer property value and then destroys the layer */
796 void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
797 TestLayerPropertyFunction function, AdvanceProperty advance)
798 {
799 for (auto display : mDisplays) {
800 std::vector<hwc2_config_t> configs;
801
802 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
803
804 for (auto config : configs) {
805 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -0800806 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800807
808 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800809 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
810 &displayArea));
811 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800812
813 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
814
815 do {
816 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800817 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800818 } while (advance(&testLayer));
819
820 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
821 }
822 }
823 }
824
Marissa Wall273b1df2016-12-15 12:28:47 -0800825 /* For each active display it cycles through each display config and tests
826 * each property value. It creates multiple layers, calls the
827 * TestLayerPropertiesFunction to set property values and then
828 * destroys the layers */
829 void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
Marissa Wallf7618ed2016-12-15 12:34:39 -0800830 TestLayerPropertiesFunction function, AdvanceProperties advance)
Marissa Wall273b1df2016-12-15 12:28:47 -0800831 {
832 for (auto display : mDisplays) {
833 std::vector<hwc2_config_t> configs;
834
835 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
836
837 for (auto config : configs) {
838 std::vector<hwc2_layer_t> layers;
Marissa Wall600a73b2016-12-15 12:30:39 -0800839 Area displayArea;
Marissa Wall273b1df2016-12-15 12:28:47 -0800840
841 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800842 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
843 &displayArea));
Marissa Wall273b1df2016-12-15 12:28:47 -0800844
845 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
Marissa Wall600a73b2016-12-15 12:30:39 -0800846 Hwc2TestLayers testLayers(layers, coverage, displayArea);
Marissa Wall273b1df2016-12-15 12:28:47 -0800847
Marissa Wallf7618ed2016-12-15 12:34:39 -0800848 do {
849 for (auto layer : layers) {
850 EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
851 &testLayers));
852 }
853 } while (advance(&testLayers));
Marissa Wall273b1df2016-12-15 12:28:47 -0800854
855 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
856 }
857 }
858 }
859
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800860 /* For each active display it cycles through each display config.
861 * 1) It attempts to set a valid property value to bad layer handle.
862 * 2) It creates a layer x and attempts to set a valid property value to
863 * layer x + 1
864 * 3) It destroys the layer x and attempts to set a valid property value to
865 * the destroyed layer x.
866 */
867 void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
868 TestLayerPropertyBadLayerFunction function)
869 {
870 for (auto display : mDisplays) {
871 std::vector<hwc2_config_t> configs;
872
873 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
874
875 for (auto config : configs) {
876 hwc2_layer_t layer = 0;
Marissa Wall600a73b2016-12-15 12:30:39 -0800877 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800878 hwc2_error_t err = HWC2_ERROR_NONE;
879
880 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800881 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
882 &displayArea));
883 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800884
885 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800886 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800887 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
888
889 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
890
891 ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800892 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800893 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
894
895 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
896
897 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800898 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800899 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
900 }
901 }
902 }
903
904 /* For each active display it cycles through each display config and tests
905 * each property value. It creates a layer, sets a bad property value and
906 * then destroys the layer */
907 void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
908 {
909 for (auto display : mDisplays) {
910 std::vector<hwc2_config_t> configs;
911
912 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
913
914 for (auto config : configs) {
915 hwc2_layer_t layer;
916 hwc2_error_t err = HWC2_ERROR_NONE;
917
918 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
919
920 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
921
922 ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
923 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
924 " error code";
925
926 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
927 }
928 }
929 }
930
Marissa Wall1cd789c2017-01-27 12:55:36 -0800931 /* For each active display it powers on the display, cycles through each
932 * config and creates a set of layers with a certain amount of coverage.
933 * For each active display, for each config and for each set of layers,
934 * it calls the TestDisplayLayersFunction */
935 void displayLayers(Hwc2TestCoverage coverage, size_t layerCnt,
936 TestDisplayLayersFunction function)
937 {
938 for (auto display : mDisplays) {
939 std::vector<hwc2_config_t> configs;
940
941 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
942
943 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
944
945 for (auto config : configs) {
946 Area displayArea;
947 std::vector<hwc2_layer_t> layers;
948
949 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
950 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
951
952 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
953 Hwc2TestLayers testLayers(layers, coverage, displayArea);
954
955 do {
956 bool skip;
957
958 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
959 &testLayers, &skip));
960 if (!skip)
961 EXPECT_NO_FATAL_FAILURE(function(this, display, layers));
962
963 } while (testLayers.advance());
964
965 ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
966 std::move(layers)));
967 }
968
969 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
970 }
971 }
972
Marissa Wall600a73b2016-12-15 12:30:39 -0800973 void getActiveConfigAttribute(hwc2_display_t display,
974 hwc2_attribute_t attribute, int32_t* outValue)
975 {
976 hwc2_config_t config;
977 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
978 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
979 attribute, outValue));
980 ASSERT_GE(*outValue, 0) << "failed to get valid "
981 << getAttributeName(attribute);
982 }
983
984 void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
985 {
986 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
987 HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
988 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
989 HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
990 }
991
Marissa Wall1cd789c2017-01-27 12:55:36 -0800992 void setLayerProperties(hwc2_display_t display, hwc2_layer_t layer,
993 Hwc2TestLayers* testLayers, bool* outSkip)
994 {
995 hwc2_composition_t composition;
996 buffer_handle_t handle = nullptr;
997 int32_t acquireFence;
998 hwc2_error_t err = HWC2_ERROR_NONE;
999 *outSkip = true;
1000
1001 if (!testLayers->contains(layer))
1002 return;
1003
1004 composition = testLayers->getComposition(layer);
1005
1006 /* If the device cannot support a buffer format, then do not continue */
1007 if ((composition == HWC2_COMPOSITION_DEVICE
1008 || composition == HWC2_COMPOSITION_CURSOR)
1009 && testLayers->getBuffer(layer, &handle, &acquireFence) < 0)
1010 return;
1011
1012 EXPECT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1013 composition, &err));
1014 if (err == HWC2_ERROR_UNSUPPORTED)
1015 EXPECT_TRUE(composition != HWC2_COMPOSITION_CLIENT
1016 && composition != HWC2_COMPOSITION_DEVICE);
1017
1018 const hwc_rect_t cursor = testLayers->getCursorPosition(layer);
1019
1020 EXPECT_NO_FATAL_FAILURE(setLayerBuffer(display, layer, handle,
1021 acquireFence));
1022 EXPECT_NO_FATAL_FAILURE(setLayerBlendMode(display, layer,
1023 testLayers->getBlendMode(layer)));
1024 EXPECT_NO_FATAL_FAILURE(setLayerColor(display, layer,
1025 testLayers->getColor(layer)));
1026 EXPECT_NO_FATAL_FAILURE(setCursorPosition(display, layer, cursor.left,
1027 cursor.top));
1028 EXPECT_NO_FATAL_FAILURE(setLayerDataspace(display, layer,
1029 testLayers->getDataspace(layer)));
1030 EXPECT_NO_FATAL_FAILURE(setLayerDisplayFrame(display, layer,
1031 testLayers->getDisplayFrame(layer)));
1032 EXPECT_NO_FATAL_FAILURE(setLayerPlaneAlpha(display, layer,
1033 testLayers->getPlaneAlpha(layer)));
1034 EXPECT_NO_FATAL_FAILURE(setLayerSourceCrop(display, layer,
1035 testLayers->getSourceCrop(layer)));
1036 EXPECT_NO_FATAL_FAILURE(setLayerSurfaceDamage(display, layer,
1037 testLayers->getSurfaceDamage(layer)));
1038 EXPECT_NO_FATAL_FAILURE(setLayerTransform(display, layer,
1039 testLayers->getTransform(layer)));
1040 EXPECT_NO_FATAL_FAILURE(setLayerVisibleRegion(display, layer,
1041 testLayers->getVisibleRegion(layer)));
1042 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer,
1043 testLayers->getZOrder(layer)));
1044
1045 *outSkip = false;
1046 }
1047
1048 void setLayerProperties(hwc2_display_t display,
1049 const std::vector<hwc2_layer_t>& layers,
1050 Hwc2TestLayers* testLayers, bool* outSkip)
1051 {
1052 for (auto layer : layers) {
1053 EXPECT_NO_FATAL_FAILURE(setLayerProperties(display, layer,
1054 testLayers, outSkip));
1055 if (*outSkip)
1056 return;
1057 }
1058 }
1059
Marissa Wall4d600052016-12-15 12:16:01 -08001060 hwc2_device_t* mHwc2Device = nullptr;
Marissa Wallcfb9a072017-02-17 20:53:18 -08001061
1062 enum class Hwc2TestHotplugStatus {
1063 Init = 1,
1064 Receiving,
1065 Done,
1066 };
1067
1068 std::mutex mHotplugMutex;
1069 std::condition_variable mHotplugCv;
1070 Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
1071 std::unordered_set<hwc2_display_t> mDisplays;
Marissa Wall1db2e372016-12-15 12:19:39 -08001072
1073 /* Store all created layers that have not been destroyed. If an ASSERT_*
1074 * fails, then destroy the layers on exit */
1075 std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
Marissa Wall03c91732016-12-15 12:23:16 -08001076
1077 /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
1078 * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
1079 std::set<hwc2_display_t> mActiveDisplays;
Marissa Wall572a1ee2016-12-15 12:24:13 -08001080
1081 std::mutex mVsyncMutex;
1082 std::condition_variable mVsyncCv;
1083 hwc2_display_t mVsyncDisplay;
1084 int64_t mVsyncTimestamp = -1;
Marissa Wall4d600052016-12-15 12:16:01 -08001085};
1086
Marissa Wallcfb9a072017-02-17 20:53:18 -08001087void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
1088 hwc2_display_t display, int32_t connection)
1089{
1090 if (callbackData)
1091 static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
1092 connection);
1093}
1094
Marissa Wall572a1ee2016-12-15 12:24:13 -08001095void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
1096 hwc2_display_t display, int64_t timestamp)
1097{
1098 if (callbackData)
1099 static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
1100 timestamp);
1101}
1102
Marissa Wallffc67da2016-12-15 12:26:09 -08001103void setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001104 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallffc67da2016-12-15 12:26:09 -08001105{
1106 EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001107 testLayer->getBlendMode(), outErr));
1108}
1109
1110void setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1111 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1112{
1113 buffer_handle_t handle;
1114 android::base::unique_fd acquireFence;
1115 hwc2_composition_t composition = testLayer->getComposition();
1116
1117 if (composition == HWC2_COMPOSITION_CLIENT
1118 || composition == HWC2_COMPOSITION_SOLID_COLOR
1119 || composition == HWC2_COMPOSITION_SIDEBAND)
1120 return;
1121
1122 if (testLayer->getBuffer(&handle, &acquireFence) < 0)
1123 return;
1124
1125 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
1126 composition));
1127 EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
1128 handle, acquireFence, outErr));
Marissa Wallffc67da2016-12-15 12:26:09 -08001129}
1130
Marissa Wallee242782016-12-15 12:30:12 -08001131void setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001132 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallee242782016-12-15 12:30:12 -08001133{
1134 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1135 layer, HWC2_COMPOSITION_SOLID_COLOR));
1136 ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001137 layer, testLayer->getPlaneAlpha()));
Marissa Wallee242782016-12-15 12:30:12 -08001138 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001139 layer, testLayer->getBlendMode()));
Marissa Wallee242782016-12-15 12:30:12 -08001140 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001141 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08001142}
1143
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001144void setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001145 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001146{
Marissa Wall5a240aa2016-12-15 12:34:06 -08001147 hwc2_composition_t composition = testLayer->getComposition();
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001148 hwc2_error_t err = HWC2_ERROR_NONE;
1149
1150 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
1151 composition, &err));
1152 if (outErr) {
1153 *outErr = err;
1154 return;
1155 }
1156
1157 if (composition != HWC2_COMPOSITION_SIDEBAND) {
1158 EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
1159 } else {
1160 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
1161 << "returned wrong error code";
1162 }
1163}
1164
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001165void setCursorPosition(Hwc2Test* test, hwc2_display_t display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001166 hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001167{
1168 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1169 layer, HWC2_COMPOSITION_CURSOR));
1170
Marissa Wall5a240aa2016-12-15 12:34:06 -08001171 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001172 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
1173 cursorPosition.left, cursorPosition.top, outErr));
1174}
1175
Marissa Wallb72b5c92016-12-15 12:26:39 -08001176void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001177 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallb72b5c92016-12-15 12:26:39 -08001178{
1179 EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001180 testLayer->getDataspace(), outErr));
Marissa Wallb72b5c92016-12-15 12:26:39 -08001181}
1182
Marissa Wall600a73b2016-12-15 12:30:39 -08001183void setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001184 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall600a73b2016-12-15 12:30:39 -08001185{
1186 EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001187 testLayer->getDisplayFrame(), outErr));
Marissa Wall600a73b2016-12-15 12:30:39 -08001188}
1189
Marissa Wall2b1f5302016-12-15 12:27:20 -08001190void setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001191 Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
Marissa Wall2b1f5302016-12-15 12:27:20 -08001192{
1193 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001194 testLayer->getBlendMode()));
Marissa Wall2b1f5302016-12-15 12:27:20 -08001195 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001196 testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08001197}
1198
Marissa Wallc57468f2016-12-15 12:31:12 -08001199void setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001200 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallc57468f2016-12-15 12:31:12 -08001201{
1202 EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001203 testLayer->getSourceCrop(), outErr));
Marissa Wallc57468f2016-12-15 12:31:12 -08001204}
1205
Marissa Wallad761812016-12-15 12:32:24 -08001206void setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001207 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallad761812016-12-15 12:32:24 -08001208{
1209 EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001210 testLayer->getSurfaceDamage(), outErr));
Marissa Wallad761812016-12-15 12:32:24 -08001211}
1212
Marissa Wallac108192016-12-15 12:27:48 -08001213void setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001214 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallac108192016-12-15 12:27:48 -08001215{
1216 EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001217 testLayer->getTransform(), outErr));
Marissa Wallac108192016-12-15 12:27:48 -08001218}
1219
Marissa Wallf7618ed2016-12-15 12:34:39 -08001220void setVisibleRegion(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1221 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1222{
1223 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display, layer,
1224 testLayer->getVisibleRegion(), outErr));
1225}
1226
Marissa Wall273b1df2016-12-15 12:28:47 -08001227void setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001228 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall273b1df2016-12-15 12:28:47 -08001229{
1230 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001231 testLayer->getZOrder(), outErr));
Marissa Wall273b1df2016-12-15 12:28:47 -08001232}
1233
Marissa Wallffc67da2016-12-15 12:26:09 -08001234bool advanceBlendMode(Hwc2TestLayer* testLayer)
1235{
1236 return testLayer->advanceBlendMode();
1237}
1238
Marissa Wall5a240aa2016-12-15 12:34:06 -08001239bool advanceBuffer(Hwc2TestLayer* testLayer)
1240{
1241 if (testLayer->advanceComposition())
1242 return true;
1243 return testLayer->advanceBufferArea();
1244}
1245
Marissa Wallee242782016-12-15 12:30:12 -08001246bool advanceColor(Hwc2TestLayer* testLayer)
1247{
1248 /* Color depends on blend mode so advance blend mode last so color is not
1249 * force to update as often */
1250 if (testLayer->advancePlaneAlpha())
1251 return true;
1252 if (testLayer->advanceColor())
1253 return true;
1254 return testLayer->advanceBlendMode();
1255}
1256
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001257bool advanceComposition(Hwc2TestLayer* testLayer)
1258{
1259 return testLayer->advanceComposition();
1260}
1261
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001262bool advanceCursorPosition(Hwc2TestLayer* testLayer)
1263{
1264 return testLayer->advanceCursorPosition();
1265}
1266
Marissa Wallb72b5c92016-12-15 12:26:39 -08001267bool advanceDataspace(Hwc2TestLayer* testLayer)
1268{
1269 return testLayer->advanceDataspace();
1270}
1271
Marissa Wall600a73b2016-12-15 12:30:39 -08001272bool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1273{
1274 return testLayer->advanceDisplayFrame();
1275}
1276
Marissa Wall2b1f5302016-12-15 12:27:20 -08001277bool advancePlaneAlpha(Hwc2TestLayer* testLayer)
1278{
1279 return testLayer->advancePlaneAlpha();
1280}
1281
Marissa Wallc57468f2016-12-15 12:31:12 -08001282bool advanceSourceCrop(Hwc2TestLayer* testLayer)
1283{
1284 if (testLayer->advanceSourceCrop())
1285 return true;
1286 return testLayer->advanceBufferArea();
1287}
1288
Marissa Wallad761812016-12-15 12:32:24 -08001289bool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
1290{
1291 if (testLayer->advanceSurfaceDamage())
1292 return true;
1293 return testLayer->advanceBufferArea();
1294}
1295
Marissa Wallac108192016-12-15 12:27:48 -08001296bool advanceTransform(Hwc2TestLayer* testLayer)
1297{
1298 return testLayer->advanceTransform();
1299}
1300
Marissa Wallf7618ed2016-12-15 12:34:39 -08001301bool advanceVisibleRegions(Hwc2TestLayers* testLayers)
1302{
1303 return testLayers->advanceVisibleRegions();
1304}
1305
Marissa Wall4d600052016-12-15 12:16:01 -08001306
1307static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
1308 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
1309 HWC2_FUNCTION_CREATE_LAYER,
1310 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
1311 HWC2_FUNCTION_DESTROY_LAYER,
1312 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
1313 HWC2_FUNCTION_DUMP,
1314 HWC2_FUNCTION_GET_ACTIVE_CONFIG,
1315 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
1316 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
1317 HWC2_FUNCTION_GET_COLOR_MODES,
1318 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
1319 HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
1320 HWC2_FUNCTION_GET_DISPLAY_NAME,
1321 HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
1322 HWC2_FUNCTION_GET_DISPLAY_TYPE,
1323 HWC2_FUNCTION_GET_DOZE_SUPPORT,
1324 HWC2_FUNCTION_GET_HDR_CAPABILITIES,
1325 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
1326 HWC2_FUNCTION_GET_RELEASE_FENCES,
1327 HWC2_FUNCTION_PRESENT_DISPLAY,
1328 HWC2_FUNCTION_REGISTER_CALLBACK,
1329 HWC2_FUNCTION_SET_ACTIVE_CONFIG,
1330 HWC2_FUNCTION_SET_CLIENT_TARGET,
1331 HWC2_FUNCTION_SET_COLOR_MODE,
1332 HWC2_FUNCTION_SET_COLOR_TRANSFORM,
1333 HWC2_FUNCTION_SET_CURSOR_POSITION,
1334 HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
1335 HWC2_FUNCTION_SET_LAYER_BUFFER,
1336 HWC2_FUNCTION_SET_LAYER_COLOR,
1337 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
1338 HWC2_FUNCTION_SET_LAYER_DATASPACE,
1339 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
1340 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
1341 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
1342 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
1343 HWC2_FUNCTION_SET_LAYER_TRANSFORM,
1344 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
1345 HWC2_FUNCTION_SET_LAYER_Z_ORDER,
1346 HWC2_FUNCTION_SET_OUTPUT_BUFFER,
1347 HWC2_FUNCTION_SET_POWER_MODE,
1348 HWC2_FUNCTION_SET_VSYNC_ENABLED,
1349 HWC2_FUNCTION_VALIDATE_DISPLAY,
1350}};
1351
1352/* TESTCASE: Tests that the HWC2 supports all required functions. */
1353TEST_F(Hwc2Test, GET_FUNCTION)
1354{
1355 for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
1356 hwc2_function_pointer_t pfn = getFunction(descriptor);
1357 EXPECT_TRUE(pfn) << "failed to get function "
1358 << getFunctionDescriptorName(descriptor);
1359 }
1360}
1361
1362/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
1363TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
1364{
1365 hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
1366 EXPECT_FALSE(pfn) << "failed to get invalid function";
1367}
1368
1369/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
1370TEST_F(Hwc2Test, GET_CAPABILITIES)
1371{
1372 std::vector<hwc2_capability_t> capabilities;
1373
1374 getCapabilities(&capabilities);
1375
1376 EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
1377 HWC2_CAPABILITY_INVALID), 0);
1378}
Marissa Walla4b01482017-02-17 20:52:03 -08001379
1380static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1381 HWC2_CALLBACK_HOTPLUG,
1382 HWC2_CALLBACK_REFRESH,
1383 HWC2_CALLBACK_VSYNC,
1384}};
1385
1386/* TESTCASE: Tests that the HWC2 can successfully register all required
1387 * callback functions. */
1388TEST_F(Hwc2Test, REGISTER_CALLBACK)
1389{
1390 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1391 const_cast<char*>("data"));
1392
1393 for (auto descriptor : callbackDescriptors) {
1394 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1395 []() { return; }));
1396 }
1397}
1398
1399/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1400TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1401{
1402 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1403 const_cast<char*>("data"));
1404 hwc2_error_t err = HWC2_ERROR_NONE;
1405
1406 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1407 []() { return; }, &err));
1408 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1409}
1410
1411/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
1412TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
1413{
1414 hwc2_callback_data_t data = nullptr;
1415
1416 for (auto descriptor : callbackDescriptors) {
1417 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1418 []() { return; }));
1419 }
1420}
Marissa Wallcfb9a072017-02-17 20:53:18 -08001421
1422/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1423 * physical display. */
1424TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1425{
1426 for (auto display : mDisplays) {
1427 hwc2_display_type_t type;
1428
1429 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1430 EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1431 " correct display type";
1432 }
1433}
1434
1435/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1436 * display is requested. */
1437TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1438{
1439 hwc2_display_t display;
1440 hwc2_display_type_t type;
1441 hwc2_error_t err = HWC2_ERROR_NONE;
1442
1443 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1444
1445 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1446 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1447}
Marissa Wall1db2e372016-12-15 12:19:39 -08001448
1449/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
1450TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
1451{
1452 for (auto display : mDisplays) {
1453 hwc2_layer_t layer;
1454
1455 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1456
1457 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1458 }
1459}
1460
1461/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
1462TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
1463{
1464 hwc2_display_t display;
1465 hwc2_layer_t layer;
1466 hwc2_error_t err = HWC2_ERROR_NONE;
1467
1468 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1469
1470 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
1471 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1472}
1473
1474/* TESTCASE: Tests that the HWC2 will either support a large number of resources
1475 * or will return no resources. */
1476TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
1477{
1478 const size_t layerCnt = 1000;
1479
1480 for (auto display : mDisplays) {
1481 std::vector<hwc2_layer_t> layers;
1482
1483 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1484
1485 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1486 }
1487}
1488
1489/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
1490TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
1491{
1492 hwc2_display_t badDisplay;
1493
1494 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
1495
1496 for (auto display : mDisplays) {
1497 hwc2_layer_t layer = 0;
1498 hwc2_error_t err = HWC2_ERROR_NONE;
1499
1500 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1501 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1502
1503 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1504
1505 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1506 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1507
1508 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1509 }
1510}
1511
1512/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
1513TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
1514{
1515 for (auto display : mDisplays) {
1516 hwc2_layer_t layer;
1517 hwc2_error_t err = HWC2_ERROR_NONE;
1518
1519 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
1520 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1521
1522 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
1523 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1524
1525 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
1526 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1527
1528 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
1529 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1530
1531 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
1532 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1533
1534 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1535
1536 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
1537 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1538
1539 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1540
1541 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
1542 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1543 }
1544}
Marissa Wallcf935cb2016-12-15 12:20:47 -08001545
1546static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1547 HWC2_ATTRIBUTE_WIDTH,
1548 HWC2_ATTRIBUTE_HEIGHT,
1549}};
1550
1551static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1552 HWC2_ATTRIBUTE_VSYNC_PERIOD,
1553 HWC2_ATTRIBUTE_DPI_X,
1554 HWC2_ATTRIBUTE_DPI_Y,
1555}};
1556
1557/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1558 * config. */
1559TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1560{
1561 for (auto display : mDisplays) {
1562 std::vector<hwc2_config_t> configs;
1563
1564 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1565
1566 for (auto config : configs) {
1567 int32_t value;
1568
1569 for (auto attribute : requiredAttributes) {
1570 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1571 attribute, &value));
1572 EXPECT_GE(value, 0) << "missing required attribute "
1573 << getAttributeName(attribute) << " for config "
1574 << config;
1575 }
1576 for (auto attribute : optionalAttributes) {
1577 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1578 attribute, &value));
1579 }
1580 }
1581 }
1582}
1583
1584/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1585 * attribute */
1586TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1587{
1588 const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1589
1590 for (auto display : mDisplays) {
1591 std::vector<hwc2_config_t> configs;
1592
1593 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1594
1595 for (auto config : configs) {
1596 int32_t value;
1597 hwc2_error_t err = HWC2_ERROR_NONE;
1598
1599 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1600 attribute, &value, &err));
1601 EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1602 " attribute for config " << config;
1603 }
1604 }
1605}
1606
1607/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1608TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1609{
1610 hwc2_display_t display;
1611 const hwc2_config_t config = 0;
1612 int32_t value;
1613 hwc2_error_t err = HWC2_ERROR_NONE;
1614
1615 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1616
1617 for (auto attribute : requiredAttributes) {
1618 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1619 &value, &err));
1620 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1621 }
1622
1623 for (auto attribute : optionalAttributes) {
1624 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1625 &value, &err));
1626 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1627 }
1628}
1629
1630/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1631TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1632{
1633 for (auto display : mDisplays) {
1634 hwc2_config_t config;
1635 int32_t value;
1636 hwc2_error_t err = HWC2_ERROR_NONE;
1637
1638 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1639
1640 for (auto attribute : requiredAttributes) {
1641 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1642 attribute, &value, &err));
1643 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1644 }
1645
1646 for (auto attribute : optionalAttributes) {
1647 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1648 attribute, &value, &err));
1649 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1650 }
1651 }
1652}
1653
1654/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1655TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1656{
1657 for (auto display : mDisplays) {
1658 std::vector<hwc2_config_t> configs;
1659
1660 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1661 }
1662}
1663
1664/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1665TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1666{
1667 hwc2_display_t display;
1668 std::vector<hwc2_config_t> configs;
1669 hwc2_error_t err = HWC2_ERROR_NONE;
1670
1671 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1672
1673 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1674
1675 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1676 EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1677}
1678
1679/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1680 * times in a row. */
1681TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1682{
1683 for (auto display : mDisplays) {
1684 std::vector<hwc2_config_t> configs1, configs2;
1685
1686 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
1687 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
1688
1689 EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
1690 configs2.begin())) << "returned two different config sets";
1691 }
1692}
1693
1694/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
1695TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
1696{
1697 for (auto display : mDisplays) {
1698 std::vector<hwc2_config_t> configs;
1699
1700 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1701
1702 std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
1703 configs.end());
1704 EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
1705 " configs";
1706 }
1707}
Marissa Wall93dc04f2016-12-15 12:21:46 -08001708
1709/* TESTCASE: Tests that the HWC2 returns the active config for a display */
1710TEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
1711{
1712 for (auto display : mDisplays) {
1713 std::vector<hwc2_config_t> configs;
1714
1715 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1716
1717 for (auto config : configs) {
1718 hwc2_config_t activeConfig;
1719
1720 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1721 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
1722
1723 EXPECT_EQ(activeConfig, config) << "failed to get active config";
1724 }
1725 }
1726}
1727
1728/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
1729 * display. */
1730TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
1731{
1732 hwc2_display_t display;
1733 hwc2_config_t activeConfig;
1734 hwc2_error_t err = HWC2_ERROR_NONE;
1735
1736 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1737
1738 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1739
1740 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1741}
1742
1743/* TESTCASE: Tests that the HWC2 either begins with a valid active config
1744 * or returns an error when getActiveConfig is called. */
1745TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
1746{
1747 for (auto display : mDisplays) {
1748 std::vector<hwc2_config_t> configs;
1749 hwc2_config_t activeConfig;
1750 hwc2_error_t err = HWC2_ERROR_NONE;
1751
1752 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1753
1754 if (configs.empty())
1755 return;
1756
1757 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1758 if (err == HWC2_ERROR_NONE) {
1759 EXPECT_NE(std::count(configs.begin(), configs.end(),
1760 activeConfig), 0) << "active config is not found in "
1761 " configs for display";
1762 } else {
1763 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1764 }
1765 }
1766}
1767
1768/* TESTCASE: Tests that the HWC2 can set every display config as an active
1769 * config */
1770TEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
1771{
1772 for (auto display : mDisplays) {
1773 std::vector<hwc2_config_t> configs;
1774
1775 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1776
1777 for (auto config : configs) {
1778 EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1779 }
1780 }
1781}
1782
1783/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
1784TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
1785{
1786 hwc2_display_t display;
1787 const hwc2_config_t config = 0;
1788 hwc2_error_t err = HWC2_ERROR_NONE;
1789
1790 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1791
1792 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
1793 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1794}
1795
1796/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
1797TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
1798{
1799 for (auto display : mDisplays) {
1800 hwc2_config_t config;
1801 hwc2_error_t err = HWC2_ERROR_NONE;
1802
1803 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1804
1805 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
1806 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1807 }
1808}
Marissa Wall03c91732016-12-15 12:23:16 -08001809
1810/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
1811TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
1812{
1813 for (auto display : mDisplays) {
1814 int32_t support = -1;
1815
1816 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1817
1818 EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
1819 }
1820}
1821
1822/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
1823TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
1824{
1825 hwc2_display_t display;
1826 int32_t support = -1;
1827 hwc2_error_t err = HWC2_ERROR_NONE;
1828
1829 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1830
1831 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1832
1833 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1834}
1835
1836/* TESTCASE: Tests that the HWC2 can set all supported power modes */
1837TEST_F(Hwc2Test, SET_POWER_MODE)
1838{
1839 for (auto display : mDisplays) {
1840 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1841 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1842
1843 int32_t support = -1;
1844 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1845 if (support != 1)
1846 return;
1847
1848 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1849 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1850 HWC2_POWER_MODE_DOZE_SUSPEND));
1851
1852 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1853 }
1854}
1855
1856/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
1857TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
1858{
1859 hwc2_display_t display;
1860 hwc2_error_t err = HWC2_ERROR_NONE;
1861
1862 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1863
1864 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
1865 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1866
1867 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
1868 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1869
1870 int32_t support = -1;
1871 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1872 if (support != 1)
1873 return;
1874
1875 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
1876 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1877
1878 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
1879 &err));
1880 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1881}
1882
1883/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
1884TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
1885{
1886 for (auto display : mDisplays) {
1887 hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
1888 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
1889 hwc2_error_t err = HWC2_ERROR_NONE;
1890
1891 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
1892 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
1893 << mode;
1894 }
1895}
1896
1897/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
1898 * an optional power mode. */
1899TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
1900{
1901 for (auto display : mDisplays) {
1902 int32_t support = -1;
1903 hwc2_error_t err = HWC2_ERROR_NONE;
1904
1905 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1906 if (support == 1)
1907 return;
1908
1909 ASSERT_EQ(support, 0) << "invalid doze support value";
1910
1911 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
1912 &err));
1913 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1914
1915 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1916 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
1917 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1918 }
1919}
1920
1921/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
1922TEST_F(Hwc2Test, SET_POWER_MODE_stress)
1923{
1924 for (auto display : mDisplays) {
1925 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1926 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1927
1928 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1929 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1930
1931 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1932 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1933
1934 int32_t support = -1;
1935 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1936 if (support != 1)
1937 return;
1938
1939 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1940 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1941
1942 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1943 HWC2_POWER_MODE_DOZE_SUSPEND));
1944 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1945 HWC2_POWER_MODE_DOZE_SUSPEND));
1946
1947 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1948 }
1949}
Marissa Wall572a1ee2016-12-15 12:24:13 -08001950
1951/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
1952 * displays */
1953TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
1954{
1955 for (auto display : mDisplays) {
1956 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1957 const_cast<char*>("data"));
1958
1959 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1960
1961 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1962 []() { return; }));
1963
1964 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1965
1966 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1967
1968 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1969 }
1970}
1971
1972/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
1973TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
1974{
1975 for (auto display : mDisplays) {
1976 hwc2_display_t receivedDisplay;
1977 int64_t receivedTimestamp;
1978
1979 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1980
1981 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1982
1983 ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
1984 &receivedTimestamp));
1985
1986 EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
1987 EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
1988
1989 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1990
1991 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1992 }
1993}
1994
1995/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
1996TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
1997{
1998 hwc2_display_t display;
1999 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2000 const_cast<char*>("data"));
2001 hwc2_error_t err = HWC2_ERROR_NONE;
2002
2003 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2004
2005 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2006 []() { return; }));
2007
2008 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
2009 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2010
2011 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
2012 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2013}
2014
2015/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
2016TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
2017{
2018 for (auto display : mDisplays) {
2019 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2020 const_cast<char*>("data"));
2021 hwc2_error_t err = HWC2_ERROR_NONE;
2022
2023 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2024
2025 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2026 []() { return; }));
2027
2028 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
2029 &err));
2030 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2031
2032 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2033 }
2034}
2035
2036/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
2037 * times. */
2038TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
2039{
2040 for (auto display : mDisplays) {
2041 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2042 const_cast<char*>("data"));
2043
2044 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2045
2046 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2047 []() { return; }));
2048
2049 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2050
2051 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2052 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2053
2054 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2055 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2056
2057 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2058 }
2059}
2060
2061/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
2062 * is off and no callback is registered. */
2063TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
2064{
2065 const uint secs = 1;
2066
2067 for (auto display : mDisplays) {
2068 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2069
2070 sleep(secs);
2071
2072 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2073 }
2074}
2075
2076/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
2077 * is registered. */
2078TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
2079{
2080 const uint secs = 1;
2081
2082 for (auto display : mDisplays) {
2083 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2084
2085 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2086
2087 sleep(secs);
2088
2089 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2090
2091 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2092 }
2093}
Marissa Walldd4087f2016-12-15 12:24:52 -08002094
2095/* TESTCASE: Tests that the HWC2 returns a display name for each display */
2096TEST_F(Hwc2Test, GET_DISPLAY_NAME)
2097{
2098 for (auto display : mDisplays) {
2099 std::string name;
2100
2101 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
2102 }
2103}
2104
2105/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
2106 * display */
2107TEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
2108{
2109 hwc2_display_t display;
2110 std::string name;
2111 hwc2_error_t err = HWC2_ERROR_NONE;
2112
2113 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2114
2115 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
2116 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2117}
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08002118
2119/* TESTCASE: Tests that the HWC2 can set basic composition types. */
2120TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
2121{
2122 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2123 setComposition, advanceComposition));
2124}
2125
2126/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
2127 * layer. */
2128TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
2129{
2130 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2131 setComposition, advanceComposition));
2132}
2133
2134/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
2135TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
2136{
2137 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2138 setComposition));
2139}
2140
2141/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
2142TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
2143{
2144 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2145 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2146 hwc2_error_t* outErr) {
2147
2148 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
2149 layer, HWC2_COMPOSITION_INVALID, outErr));
2150 }
2151 ));
2152}
Marissa Wallffc67da2016-12-15 12:26:09 -08002153
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002154/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
2155TEST_F(Hwc2Test, SET_CURSOR_POSITION)
2156{
2157 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2158 ::setCursorPosition, advanceCursorPosition));
2159}
2160
2161/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
2162TEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
2163{
2164 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2165 ::setCursorPosition, advanceCursorPosition));
2166}
2167
2168/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
2169 * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
2170TEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
2171{
2172 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2173 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002174 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002175
Marissa Wall5a240aa2016-12-15 12:34:06 -08002176 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002177 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
2178 cursorPosition.left, cursorPosition.top, outErr));
2179 },
2180
2181 advanceCursorPosition));
2182}
2183
2184/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
2185 * display. */
2186TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
2187{
2188 hwc2_display_t display;
2189 hwc2_layer_t layer = 0;
2190 int32_t x = 0, y = 0;
2191 hwc2_error_t err = HWC2_ERROR_NONE;
2192
2193 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2194
2195 ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
2196 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2197}
2198
2199/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
2200TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
2201{
2202 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2203 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002204 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002205
Marissa Wall5a240aa2016-12-15 12:34:06 -08002206 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002207 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
2208 badLayer, cursorPosition.left, cursorPosition.top,
2209 outErr));
2210 }
2211 ));
2212}
2213
Marissa Wallffc67da2016-12-15 12:26:09 -08002214/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
2215TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
2216{
2217 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2218 setBlendMode, advanceBlendMode));
2219}
2220
2221/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
2222TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
2223{
2224 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2225 setBlendMode, advanceBlendMode));
2226}
2227
2228/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
2229TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
2230{
2231 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2232 setBlendMode));
2233}
2234
2235/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
2236TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
2237{
2238 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2239 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2240 hwc2_error_t* outErr) {
2241
2242 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
2243 layer, HWC2_BLEND_MODE_INVALID, outErr));
2244 }
2245 ));
2246}
Marissa Wallb72b5c92016-12-15 12:26:39 -08002247
Marissa Wall5a240aa2016-12-15 12:34:06 -08002248/* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
2249TEST_F(Hwc2Test, SET_LAYER_BUFFER)
2250{
2251 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2252 setBuffer, advanceBuffer));
2253}
2254
2255/* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
2256TEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
2257{
2258 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2259 setBuffer, advanceBuffer));
2260}
2261
2262/* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
2263TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
2264{
2265 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2266 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
2267 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2268
2269 buffer_handle_t handle = nullptr;
2270 android::base::unique_fd acquireFence;
2271
2272 /* If there is not available buffer for the given buffer
2273 * properties, it should not fail this test case */
2274 if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
2275 *outErr = HWC2_ERROR_BAD_LAYER;
2276 return;
2277 }
2278
2279 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
2280 handle, acquireFence, outErr));
2281 }
2282 ));
2283}
2284
2285/* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
2286TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
2287{
2288 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2289 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2290 hwc2_error_t* outErr) {
2291
2292 buffer_handle_t handle = nullptr;
2293 int32_t acquireFence = -1;
2294
2295 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
2296 handle, acquireFence, outErr));
2297 }
2298 ));
2299}
2300
Marissa Wallee242782016-12-15 12:30:12 -08002301/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
2302TEST_F(Hwc2Test, SET_LAYER_COLOR)
2303{
2304 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2305 setColor, advanceColor));
2306}
2307
2308/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
2309TEST_F(Hwc2Test, SET_LAYER_COLOR_update)
2310{
2311 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2312 setColor, advanceColor));
2313}
2314
2315/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
2316 * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
2317TEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
2318{
2319 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
2320 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002321 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08002322
2323 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002324 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08002325 },
2326
2327 advanceColor));
2328}
2329
2330/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
2331TEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
2332{
2333 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2334 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002335 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08002336
2337 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002338 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08002339 }
2340 ));
2341}
2342
Marissa Wallb72b5c92016-12-15 12:26:39 -08002343/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
2344TEST_F(Hwc2Test, SET_LAYER_DATASPACE)
2345{
2346 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2347 setDataspace, advanceDataspace));
2348}
2349
2350/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
2351TEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
2352{
2353 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2354 setDataspace, advanceDataspace));
2355}
2356
2357/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
2358TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
2359{
2360 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2361 setDataspace));
2362}
Marissa Wall2b1f5302016-12-15 12:27:20 -08002363
Marissa Wall600a73b2016-12-15 12:30:39 -08002364/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
2365TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
2366{
2367 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2368 setDisplayFrame, advanceDisplayFrame));
2369}
2370
2371/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
2372TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
2373{
2374 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2375 setDisplayFrame, advanceDisplayFrame));
2376}
2377
2378/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
2379TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
2380{
2381 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2382 setDisplayFrame));
2383}
2384
Marissa Wall2b1f5302016-12-15 12:27:20 -08002385/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
2386TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
2387{
2388 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2389 setPlaneAlpha, advancePlaneAlpha));
2390}
2391
2392/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
2393TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
2394{
2395 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2396 setPlaneAlpha, advancePlaneAlpha));
2397}
2398
2399/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
2400TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
2401{
2402 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2403 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002404 Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
Marissa Wall2b1f5302016-12-15 12:27:20 -08002405
2406 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002407 badLayer, testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08002408 }
2409 ));
2410}
Marissa Wallac108192016-12-15 12:27:48 -08002411
Marissa Wallc57468f2016-12-15 12:31:12 -08002412/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
2413TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
2414{
2415 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2416 setSourceCrop, advanceSourceCrop));
2417}
2418
2419/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
2420TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
2421{
2422 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2423 setSourceCrop, advanceSourceCrop));
2424}
2425
2426/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
2427TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
2428{
2429 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2430 setSourceCrop));
2431}
2432
Marissa Wallad761812016-12-15 12:32:24 -08002433/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
2434TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
2435{
2436 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2437 setSurfaceDamage, advanceSurfaceDamage));
2438}
2439
2440/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
2441TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
2442{
2443 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2444 setSurfaceDamage, advanceSurfaceDamage));
2445}
2446
2447/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
2448TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
2449{
2450 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2451 setSurfaceDamage));
2452}
2453
Marissa Wallac108192016-12-15 12:27:48 -08002454/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
2455TEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
2456{
2457 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2458 setTransform, advanceTransform));
2459}
2460
2461/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
2462TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
2463{
2464 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2465 setTransform, advanceTransform));
2466}
2467
2468/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
2469TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
2470{
2471 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2472 setTransform));
2473}
Marissa Wall273b1df2016-12-15 12:28:47 -08002474
Marissa Wallf7618ed2016-12-15 12:34:39 -08002475/* TESTCASE: Tests that the HWC2 can set the visible region of a layer. */
2476TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION)
2477{
2478 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Basic, 5,
2479 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2480 Hwc2TestLayers* testLayers) {
2481
2482 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display,
2483 layer, testLayers->getVisibleRegion(layer)));
2484 },
2485
2486 advanceVisibleRegions));
2487}
2488
2489/* TESTCASE: Tests that the HWC2 cannot set the visible region of a bad layer. */
2490TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION_bad_layer)
2491{
2492 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2493 setVisibleRegion));
2494}
2495
Marissa Wall273b1df2016-12-15 12:28:47 -08002496/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
2497TEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
2498{
2499 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
2500 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002501 Hwc2TestLayers* testLayers) {
Marissa Wall273b1df2016-12-15 12:28:47 -08002502
2503 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002504 testLayers->getZOrder(layer)));
Marissa Wallf7618ed2016-12-15 12:34:39 -08002505 },
2506
2507 /* TestLayer z orders are set during the construction of TestLayers
2508 * and cannot be updated. There is no need (or ability) to cycle
2509 * through additional z order configurations. */
2510 [] (Hwc2TestLayers* /*testLayers*/) {
2511 return false;
Marissa Wall273b1df2016-12-15 12:28:47 -08002512 }
2513 ));
2514}
2515
2516/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
2517TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
2518{
2519 const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
2520 static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
2521 static_cast<uint32_t>(UINT32_MAX / 2),
2522 static_cast<uint32_t>(UINT32_MAX) };
2523
2524 for (auto display : mDisplays) {
2525 std::vector<hwc2_config_t> configs;
2526
2527 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2528
2529 for (auto config : configs) {
2530 hwc2_layer_t layer;
2531
2532 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2533
2534 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2535
2536 for (uint32_t zOrder : zOrders) {
2537 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
2538 }
2539
2540 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2541 }
2542 }
2543}
2544
2545/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
2546TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
2547{
2548 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2549 setZOrder));
2550}
Marissa Wall1cd789c2017-01-27 12:55:36 -08002551
2552/* TESTCASE: Tests that the HWC2 can display a layer with basic property
2553 * coverage */
2554TEST_F(Hwc2Test, VALIDATE_DISPLAY_basic)
2555{
2556 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
2557 [] (Hwc2Test* test, hwc2_display_t display,
2558 const std::vector<hwc2_layer_t>& layers) {
2559
2560 uint32_t numTypes, numRequests;
2561 bool hasChanges = false;
2562
2563 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
2564 &numRequests, &hasChanges));
2565 if (hasChanges)
2566 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
2567 << "wrong number of requests";
2568 }
2569 ));
2570}
2571
2572/* TESTCASE: Tests that the HWC2 can display 5 layers with default coverage. */
2573TEST_F(Hwc2Test, VALIDATE_DISPLAY_default_5)
2574{
2575 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 5,
2576 [] (Hwc2Test* test, hwc2_display_t display,
2577 const std::vector<hwc2_layer_t>& layers) {
2578
2579 uint32_t numTypes, numRequests;
2580 bool hasChanges = false;
2581
2582 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
2583 &numRequests, &hasChanges));
2584 if (hasChanges)
2585 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
2586 << "wrong number of requests";
2587 }
2588 ));
2589}
2590
2591/* TESTCASE: Tests that the HWC2 cannot validate a bad display */
2592TEST_F(Hwc2Test, VALIDATE_DISPLAY_bad_display)
2593{
2594 hwc2_display_t display;
2595 uint32_t numTypes, numRequests;
2596 hwc2_error_t err = HWC2_ERROR_NONE;
2597
2598 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2599
2600 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes, &numRequests,
2601 &err));
2602 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2603}