blob: 27f9abaa29bcdb087cb76e2a5cac0913ae9df42a [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 Wall706178d2016-12-15 12:39:14 -0800589 void getDisplayRequests(hwc2_display_t display,
590 hwc2_display_request_t* outDisplayRequests,
591 std::vector<hwc2_layer_t>* outLayers,
592 std::vector<hwc2_layer_request_t>* outLayerRequests,
593 hwc2_error_t* outErr = nullptr)
594 {
595 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_REQUESTS>(
596 getFunction(HWC2_FUNCTION_GET_DISPLAY_REQUESTS));
597 ASSERT_TRUE(pfn) << "failed to get function";
598
599 uint32_t numElements = 0;
600
601 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
602 reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
603 nullptr, nullptr));
604
605 if (err == HWC2_ERROR_NONE && numElements > 0) {
606 outLayers->resize(numElements);
607 outLayerRequests->resize(numElements);
608
609 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
610 reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
611 reinterpret_cast<uint64_t*>(outLayers->data()),
612 reinterpret_cast<int32_t*>(outLayerRequests->data())));
613 }
614
615 if (outErr) {
616 *outErr = err;
617 } else {
618 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display requests";
619 }
620 }
621
622 void handleRequests(hwc2_display_t display,
623 const std::vector<hwc2_layer_t>& layers, uint32_t numRequests,
624 std::set<hwc2_layer_t>* outClearLayers = nullptr,
625 bool* outFlipClientTarget = nullptr)
626 {
627 hwc2_display_request_t displayRequest =
628 static_cast<hwc2_display_request_t>(0);
629 std::vector<hwc2_layer_t> requestedLayers;
630 std::vector<hwc2_layer_request_t> requests;
631
632 ASSERT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequest,
633 &requestedLayers, &requests));
634
635 EXPECT_EQ(numRequests, requests.size()) << "validate returned "
636 << numRequests << " requests and get display requests returned "
637 << requests.size() << " requests";
638
639 for (size_t i = 0; i < requests.size(); i++) {
640 hwc2_layer_t requestedLayer = requestedLayers.at(i);
641 hwc2_layer_request_t request = requests.at(i);
642
643 EXPECT_EQ(std::count(layers.begin(), layers.end(), requestedLayer),
644 0) << "get display requests returned an unknown layer";
645 EXPECT_NE(request, 0) << "returned empty request for layer "
646 << requestedLayer;
647
648 if (outClearLayers && request
649 == HWC2_LAYER_REQUEST_CLEAR_CLIENT_TARGET)
650 outClearLayers->insert(requestedLayer);
651 }
652
653 if (outFlipClientTarget)
654 *outFlipClientTarget = displayRequest
655 & HWC2_DISPLAY_REQUEST_FLIP_CLIENT_TARGET;
656 }
657
658 void getChangedCompositionTypes(hwc2_display_t display,
659 std::vector<hwc2_layer_t>* outLayers,
660 std::vector<hwc2_composition_t>* outTypes,
661 hwc2_error_t* outErr = nullptr)
662 {
663 auto pfn = reinterpret_cast<HWC2_PFN_GET_CHANGED_COMPOSITION_TYPES>(
664 getFunction(HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES));
665 ASSERT_TRUE(pfn) << "failed to get function";
666
667 uint32_t numElements = 0;
668
669 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
670 &numElements, nullptr, nullptr));
671
672 if (err == HWC2_ERROR_NONE && numElements > 0) {
673 outLayers->resize(numElements);
674 outTypes->resize(numElements);
675
676 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
677 &numElements, reinterpret_cast<uint64_t*>(outLayers->data()),
678 reinterpret_cast<int32_t*>(outTypes->data())));
679 }
680
681 if (outErr) {
682 *outErr = err;
683 } else {
684 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get changed"
685 " composition types";
686 }
687 }
688
689 void handleCompositionChanges(hwc2_display_t display,
690 const Hwc2TestLayers& testLayers,
691 const std::vector<hwc2_layer_t>& layers, uint32_t numTypes,
692 std::set<hwc2_layer_t>* outClientLayers = nullptr)
693 {
694 std::vector<hwc2_layer_t> changedLayers;
695 std::vector<hwc2_composition_t> types;
696
697 ASSERT_NO_FATAL_FAILURE(getChangedCompositionTypes(display,
698 &changedLayers, &types));
699
700 EXPECT_EQ(numTypes, types.size()) << "validate returned "
701 << numTypes << " types and get changed composition types"
702 " returned " << types.size() << " types";
703
704 for (size_t i = 0; i < types.size(); i++) {
705
706 auto layer = std::find(layers.begin(), layers.end(),
707 changedLayers.at(i));
708
709 EXPECT_TRUE(layer != layers.end() || !testLayers.contains(*layer))
710 << "get changed composition types returned an unknown layer";
711
712 hwc2_composition_t requestedType = testLayers.getComposition(*layer);
713 hwc2_composition_t returnedType = types.at(i);
714
715 EXPECT_NE(returnedType, HWC2_COMPOSITION_INVALID) << "get changed"
716 " composition types returned invalid composition";
717
718 switch (requestedType) {
719 case HWC2_COMPOSITION_CLIENT:
720 EXPECT_TRUE(false) << getCompositionName(returnedType)
721 << " cannot be changed";
722 break;
723 case HWC2_COMPOSITION_DEVICE:
724 case HWC2_COMPOSITION_SOLID_COLOR:
725 EXPECT_EQ(returnedType, HWC2_COMPOSITION_CLIENT)
726 << "composition of type "
727 << getCompositionName(requestedType)
728 << " can only be changed to "
729 << getCompositionName(HWC2_COMPOSITION_CLIENT);
730 break;
731 case HWC2_COMPOSITION_CURSOR:
732 case HWC2_COMPOSITION_SIDEBAND:
733 EXPECT_TRUE(returnedType == HWC2_COMPOSITION_CLIENT
734 || returnedType == HWC2_COMPOSITION_DEVICE)
735 << "composition of type "
736 << getCompositionName(requestedType)
737 << " can only be changed to "
738 << getCompositionName(HWC2_COMPOSITION_CLIENT) << " or "
739 << getCompositionName(HWC2_COMPOSITION_DEVICE);
740 break;
741 default:
742 EXPECT_TRUE(false) << "unknown type "
743 << getCompositionName(requestedType);
744 break;
745 }
746
747 if (outClientLayers)
748 if (returnedType == HWC2_COMPOSITION_CLIENT)
749 outClientLayers->insert(*layer);
750 }
751
752 if (outClientLayers) {
753 for (auto layer : layers) {
754 if (testLayers.getComposition(layer) == HWC2_COMPOSITION_CLIENT)
755 outClientLayers->insert(layer);
756 }
757 }
758 }
759
760 void acceptDisplayChanges(hwc2_display_t display,
761 hwc2_error_t* outErr = nullptr)
762 {
763 auto pfn = reinterpret_cast<HWC2_PFN_ACCEPT_DISPLAY_CHANGES>(
764 getFunction(HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES));
765 ASSERT_TRUE(pfn) << "failed to get function";
766
767 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display));
768 if (outErr) {
769 *outErr = err;
770 } else {
771 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to accept display changes";
772 }
773 }
774
Marissa Wall4d600052016-12-15 12:16:01 -0800775protected:
776 hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
777 {
778 return mHwc2Device->getFunction(mHwc2Device, descriptor);
779 }
780
781 void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
782 {
783 uint32_t num = 0;
784
785 mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
786
787 outCapabilities->resize(num);
788
789 mHwc2Device->getCapabilities(mHwc2Device, &num,
790 reinterpret_cast<int32_t*>(outCapabilities->data()));
791 }
792
Marissa Wallcfb9a072017-02-17 20:53:18 -0800793 /* Registers a hotplug callback and waits for hotplug callbacks. This
794 * function will have no effect if called more than once. */
795 void populateDisplays()
796 {
797 /* Sets the hotplug status to receiving */
798 {
799 std::lock_guard<std::mutex> lock(mHotplugMutex);
800
801 if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
802 return;
803 mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
804 }
805
806 /* Registers the callback. This function call cannot be locked because
807 * a callback could happen on the same thread */
808 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
809 reinterpret_cast<hwc2_function_pointer_t>(
810 hwc2TestHotplugCallback)));
811
812 /* Waits for hotplug events. If a hotplug event has not come within 1
813 * second, stop waiting. */
814 std::unique_lock<std::mutex> lock(mHotplugMutex);
815
816 while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
817 std::cv_status::timeout) { }
818
819 /* Sets the hotplug status to done. Future calls will have no effect */
820 mHotplugStatus = Hwc2TestHotplugStatus::Done;
821 }
822
823 void getBadDisplay(hwc2_display_t* outDisplay)
824 {
825 for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
826 if (mDisplays.count(display) == 0) {
827 *outDisplay = display;
828 return;
829 }
830 }
831 ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
832 " are registered. This should never happen.";
833 }
834
Marissa Wall1db2e372016-12-15 12:19:39 -0800835 /* NOTE: will create min(newlayerCnt, max supported layers) layers */
836 void createLayers(hwc2_display_t display,
837 std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
838 {
839 std::vector<hwc2_layer_t> newLayers;
840 hwc2_layer_t layer;
841 hwc2_error_t err = HWC2_ERROR_NONE;
842
843 for (size_t i = 0; i < newLayerCnt; i++) {
844
845 EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
846 if (err == HWC2_ERROR_NO_RESOURCES)
847 break;
848 if (err != HWC2_ERROR_NONE) {
849 newLayers.clear();
850 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
851 }
852 newLayers.push_back(layer);
853 }
854
855 *outLayers = std::move(newLayers);
856 }
857
858 void destroyLayers(hwc2_display_t display,
859 std::vector<hwc2_layer_t>&& layers)
860 {
861 for (hwc2_layer_t layer : layers) {
862 EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
863 }
864 }
865
Marissa Wallcf935cb2016-12-15 12:20:47 -0800866 void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
867 {
868 std::vector<hwc2_config_t> configs;
869
870 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
871
872 hwc2_config_t CONFIG_MAX = UINT32_MAX;
873
874 ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
875 " (2^32 values) has been taken which shouldn't happen";
876
877 hwc2_config_t config;
878 for (config = 0; config < CONFIG_MAX; config++) {
879 if (std::count(configs.begin(), configs.end(), config) == 0)
880 break;
881 }
882
883 *outConfig = config;
884 }
885
Marissa Wall572a1ee2016-12-15 12:24:13 -0800886 void enableVsync(hwc2_display_t display)
887 {
888 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
889 reinterpret_cast<hwc2_function_pointer_t>(
890 hwc2TestVsyncCallback)));
891 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
892 }
893
894 void disableVsync(hwc2_display_t display)
895 {
896 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
897 }
898
899 void waitForVsync(hwc2_display_t* outDisplay = nullptr,
900 int64_t* outTimestamp = nullptr)
901 {
902 std::unique_lock<std::mutex> lock(mVsyncMutex);
903 ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
904 std::cv_status::no_timeout) << "timed out attempting to get"
905 " vsync callback";
906 if (outDisplay)
907 *outDisplay = mVsyncDisplay;
908 if (outTimestamp)
909 *outTimestamp = mVsyncTimestamp;
910 }
911
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800912 /* Calls a set property function from Hwc2Test to set a property value from
913 * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
914 using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
915 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800916 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800917
Marissa Wall273b1df2016-12-15 12:28:47 -0800918 /* Calls a set property function from Hwc2Test to set property values from
919 * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
920 using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
921 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800922 Hwc2TestLayers* testLayers);
Marissa Wall273b1df2016-12-15 12:28:47 -0800923
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800924 /* Calls a set property function from Hwc2Test to set a bad property value
925 * on hwc2_layer_t on hwc2_display_t */
926 using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
927 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800928 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800929
930 /* Calls a set property function from Hwc2Test to set a bad property value
931 * on hwc2_layer_t on hwc2_display_t */
932 using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
933 hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
934
Marissa Wall1cd789c2017-01-27 12:55:36 -0800935 /* Is called after a display is powered on and all layer properties have
936 * been set. It should be used to test functions such as validate, accepting
937 * changes, present, etc. */
938 using TestDisplayLayersFunction = void (*)(Hwc2Test* test,
Marissa Wall706178d2016-12-15 12:39:14 -0800939 hwc2_display_t display, const std::vector<hwc2_layer_t>& layers,
940 const Hwc2TestLayers& testLayers);
941
942 /* It is called on an non validated display */
943 using TestDisplayNonValidatedLayersFunction = void (*)(Hwc2Test* test,
944 hwc2_display_t display, std::vector<hwc2_layer_t>* layers);
Marissa Wall1cd789c2017-01-27 12:55:36 -0800945
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800946 /* Advances a property of Hwc2TestLayer */
947 using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
948
Marissa Wallf7618ed2016-12-15 12:34:39 -0800949 /* Advances properties of Hwc2TestLayers */
950 using AdvanceProperties = bool (*)(Hwc2TestLayers* testLayer);
951
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800952 /* For each active display it cycles through each display config and tests
953 * each property value. It creates a layer, sets the property and then
954 * destroys the layer */
955 void setLayerProperty(Hwc2TestCoverage coverage,
956 TestLayerPropertyFunction function, AdvanceProperty advance)
957 {
958 for (auto display : mDisplays) {
959 std::vector<hwc2_config_t> configs;
960
961 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
962
963 for (auto config : configs) {
964 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -0800965 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800966
967 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800968 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
969 &displayArea));
970 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800971
972 do {
973 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
974
975 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800976 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800977
978 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
979 } while (advance(&testLayer));
980 }
981 }
982 }
983
984 /* For each active display it cycles through each display config and tests
985 * each property value. It creates a layer, cycles through each property
986 * value and updates the layer property value and then destroys the layer */
987 void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
988 TestLayerPropertyFunction function, AdvanceProperty advance)
989 {
990 for (auto display : mDisplays) {
991 std::vector<hwc2_config_t> configs;
992
993 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
994
995 for (auto config : configs) {
996 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -0800997 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800998
999 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001000 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1001 &displayArea));
1002 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001003
1004 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1005
1006 do {
1007 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001008 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001009 } while (advance(&testLayer));
1010
1011 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1012 }
1013 }
1014 }
1015
Marissa Wall273b1df2016-12-15 12:28:47 -08001016 /* For each active display it cycles through each display config and tests
1017 * each property value. It creates multiple layers, calls the
1018 * TestLayerPropertiesFunction to set property values and then
1019 * destroys the layers */
1020 void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
Marissa Wallf7618ed2016-12-15 12:34:39 -08001021 TestLayerPropertiesFunction function, AdvanceProperties advance)
Marissa Wall273b1df2016-12-15 12:28:47 -08001022 {
1023 for (auto display : mDisplays) {
1024 std::vector<hwc2_config_t> configs;
1025
1026 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1027
1028 for (auto config : configs) {
1029 std::vector<hwc2_layer_t> layers;
Marissa Wall600a73b2016-12-15 12:30:39 -08001030 Area displayArea;
Marissa Wall273b1df2016-12-15 12:28:47 -08001031
1032 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001033 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1034 &displayArea));
Marissa Wall273b1df2016-12-15 12:28:47 -08001035
1036 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
Marissa Wall600a73b2016-12-15 12:30:39 -08001037 Hwc2TestLayers testLayers(layers, coverage, displayArea);
Marissa Wall273b1df2016-12-15 12:28:47 -08001038
Marissa Wallf7618ed2016-12-15 12:34:39 -08001039 do {
1040 for (auto layer : layers) {
1041 EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
1042 &testLayers));
1043 }
1044 } while (advance(&testLayers));
Marissa Wall273b1df2016-12-15 12:28:47 -08001045
1046 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1047 }
1048 }
1049 }
1050
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001051 /* For each active display it cycles through each display config.
1052 * 1) It attempts to set a valid property value to bad layer handle.
1053 * 2) It creates a layer x and attempts to set a valid property value to
1054 * layer x + 1
1055 * 3) It destroys the layer x and attempts to set a valid property value to
1056 * the destroyed layer x.
1057 */
1058 void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
1059 TestLayerPropertyBadLayerFunction function)
1060 {
1061 for (auto display : mDisplays) {
1062 std::vector<hwc2_config_t> configs;
1063
1064 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1065
1066 for (auto config : configs) {
1067 hwc2_layer_t layer = 0;
Marissa Wall600a73b2016-12-15 12:30:39 -08001068 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001069 hwc2_error_t err = HWC2_ERROR_NONE;
1070
1071 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001072 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1073 &displayArea));
1074 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001075
1076 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001077 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001078 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1079
1080 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1081
1082 ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001083 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001084 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1085
1086 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1087
1088 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001089 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001090 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1091 }
1092 }
1093 }
1094
1095 /* For each active display it cycles through each display config and tests
1096 * each property value. It creates a layer, sets a bad property value and
1097 * then destroys the layer */
1098 void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
1099 {
1100 for (auto display : mDisplays) {
1101 std::vector<hwc2_config_t> configs;
1102
1103 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1104
1105 for (auto config : configs) {
1106 hwc2_layer_t layer;
1107 hwc2_error_t err = HWC2_ERROR_NONE;
1108
1109 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1110
1111 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1112
1113 ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
1114 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
1115 " error code";
1116
1117 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1118 }
1119 }
1120 }
1121
Marissa Wall1cd789c2017-01-27 12:55:36 -08001122 /* For each active display it powers on the display, cycles through each
1123 * config and creates a set of layers with a certain amount of coverage.
1124 * For each active display, for each config and for each set of layers,
1125 * it calls the TestDisplayLayersFunction */
1126 void displayLayers(Hwc2TestCoverage coverage, size_t layerCnt,
1127 TestDisplayLayersFunction function)
1128 {
1129 for (auto display : mDisplays) {
1130 std::vector<hwc2_config_t> configs;
1131
1132 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1133
1134 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1135
1136 for (auto config : configs) {
1137 Area displayArea;
1138 std::vector<hwc2_layer_t> layers;
1139
1140 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1141 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
1142
1143 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1144 Hwc2TestLayers testLayers(layers, coverage, displayArea);
1145
1146 do {
1147 bool skip;
1148
1149 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
1150 &testLayers, &skip));
1151 if (!skip)
Marissa Wall706178d2016-12-15 12:39:14 -08001152 EXPECT_NO_FATAL_FAILURE(function(this, display, layers,
1153 testLayers));
Marissa Wall1cd789c2017-01-27 12:55:36 -08001154
1155 } while (testLayers.advance());
1156
1157 ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
1158 std::move(layers)));
1159 }
1160
1161 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1162 }
1163 }
1164
Marissa Wall706178d2016-12-15 12:39:14 -08001165 /* For each active display, it calls the
1166 * TestDisplayNonValidatedLayersFunction on a variety on non-validated
1167 * layer combinations */
1168 void displayNonValidatedLayers(size_t layerCnt,
1169 TestDisplayNonValidatedLayersFunction function)
1170 {
1171 for (auto display : mDisplays) {
1172 uint32_t numTypes, numRequests;
1173 std::vector<hwc2_layer_t> layers;
1174 bool hasChanges;
1175
1176 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1177
1178 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1179
1180 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1181
1182 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1183
1184 for (auto layer : layers) {
1185 ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1186 HWC2_COMPOSITION_CLIENT));
1187 }
1188
1189 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1190
1191 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1192 &numRequests, &hasChanges));
1193
1194 for (auto layer : layers) {
1195 ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1196 HWC2_COMPOSITION_DEVICE));
1197 }
1198
1199 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1200
1201 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1202
1203 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1204
1205 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1206 }
1207 }
1208
Marissa Wall600a73b2016-12-15 12:30:39 -08001209 void getActiveConfigAttribute(hwc2_display_t display,
1210 hwc2_attribute_t attribute, int32_t* outValue)
1211 {
1212 hwc2_config_t config;
1213 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
1214 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1215 attribute, outValue));
1216 ASSERT_GE(*outValue, 0) << "failed to get valid "
1217 << getAttributeName(attribute);
1218 }
1219
1220 void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
1221 {
1222 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1223 HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
1224 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1225 HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
1226 }
1227
Marissa Wall1cd789c2017-01-27 12:55:36 -08001228 void setLayerProperties(hwc2_display_t display, hwc2_layer_t layer,
1229 Hwc2TestLayers* testLayers, bool* outSkip)
1230 {
1231 hwc2_composition_t composition;
1232 buffer_handle_t handle = nullptr;
1233 int32_t acquireFence;
1234 hwc2_error_t err = HWC2_ERROR_NONE;
1235 *outSkip = true;
1236
1237 if (!testLayers->contains(layer))
1238 return;
1239
1240 composition = testLayers->getComposition(layer);
1241
1242 /* If the device cannot support a buffer format, then do not continue */
1243 if ((composition == HWC2_COMPOSITION_DEVICE
1244 || composition == HWC2_COMPOSITION_CURSOR)
1245 && testLayers->getBuffer(layer, &handle, &acquireFence) < 0)
1246 return;
1247
1248 EXPECT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1249 composition, &err));
1250 if (err == HWC2_ERROR_UNSUPPORTED)
1251 EXPECT_TRUE(composition != HWC2_COMPOSITION_CLIENT
1252 && composition != HWC2_COMPOSITION_DEVICE);
1253
1254 const hwc_rect_t cursor = testLayers->getCursorPosition(layer);
1255
1256 EXPECT_NO_FATAL_FAILURE(setLayerBuffer(display, layer, handle,
1257 acquireFence));
1258 EXPECT_NO_FATAL_FAILURE(setLayerBlendMode(display, layer,
1259 testLayers->getBlendMode(layer)));
1260 EXPECT_NO_FATAL_FAILURE(setLayerColor(display, layer,
1261 testLayers->getColor(layer)));
1262 EXPECT_NO_FATAL_FAILURE(setCursorPosition(display, layer, cursor.left,
1263 cursor.top));
1264 EXPECT_NO_FATAL_FAILURE(setLayerDataspace(display, layer,
1265 testLayers->getDataspace(layer)));
1266 EXPECT_NO_FATAL_FAILURE(setLayerDisplayFrame(display, layer,
1267 testLayers->getDisplayFrame(layer)));
1268 EXPECT_NO_FATAL_FAILURE(setLayerPlaneAlpha(display, layer,
1269 testLayers->getPlaneAlpha(layer)));
1270 EXPECT_NO_FATAL_FAILURE(setLayerSourceCrop(display, layer,
1271 testLayers->getSourceCrop(layer)));
1272 EXPECT_NO_FATAL_FAILURE(setLayerSurfaceDamage(display, layer,
1273 testLayers->getSurfaceDamage(layer)));
1274 EXPECT_NO_FATAL_FAILURE(setLayerTransform(display, layer,
1275 testLayers->getTransform(layer)));
1276 EXPECT_NO_FATAL_FAILURE(setLayerVisibleRegion(display, layer,
1277 testLayers->getVisibleRegion(layer)));
1278 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer,
1279 testLayers->getZOrder(layer)));
1280
1281 *outSkip = false;
1282 }
1283
1284 void setLayerProperties(hwc2_display_t display,
1285 const std::vector<hwc2_layer_t>& layers,
1286 Hwc2TestLayers* testLayers, bool* outSkip)
1287 {
1288 for (auto layer : layers) {
1289 EXPECT_NO_FATAL_FAILURE(setLayerProperties(display, layer,
1290 testLayers, outSkip));
1291 if (*outSkip)
1292 return;
1293 }
1294 }
1295
Marissa Wall4d600052016-12-15 12:16:01 -08001296 hwc2_device_t* mHwc2Device = nullptr;
Marissa Wallcfb9a072017-02-17 20:53:18 -08001297
1298 enum class Hwc2TestHotplugStatus {
1299 Init = 1,
1300 Receiving,
1301 Done,
1302 };
1303
1304 std::mutex mHotplugMutex;
1305 std::condition_variable mHotplugCv;
1306 Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
1307 std::unordered_set<hwc2_display_t> mDisplays;
Marissa Wall1db2e372016-12-15 12:19:39 -08001308
1309 /* Store all created layers that have not been destroyed. If an ASSERT_*
1310 * fails, then destroy the layers on exit */
1311 std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
Marissa Wall03c91732016-12-15 12:23:16 -08001312
1313 /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
1314 * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
1315 std::set<hwc2_display_t> mActiveDisplays;
Marissa Wall572a1ee2016-12-15 12:24:13 -08001316
1317 std::mutex mVsyncMutex;
1318 std::condition_variable mVsyncCv;
1319 hwc2_display_t mVsyncDisplay;
1320 int64_t mVsyncTimestamp = -1;
Marissa Wall4d600052016-12-15 12:16:01 -08001321};
1322
Marissa Wallcfb9a072017-02-17 20:53:18 -08001323void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
1324 hwc2_display_t display, int32_t connection)
1325{
1326 if (callbackData)
1327 static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
1328 connection);
1329}
1330
Marissa Wall572a1ee2016-12-15 12:24:13 -08001331void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
1332 hwc2_display_t display, int64_t timestamp)
1333{
1334 if (callbackData)
1335 static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
1336 timestamp);
1337}
1338
Marissa Wallffc67da2016-12-15 12:26:09 -08001339void setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001340 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallffc67da2016-12-15 12:26:09 -08001341{
1342 EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001343 testLayer->getBlendMode(), outErr));
1344}
1345
1346void setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1347 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1348{
1349 buffer_handle_t handle;
1350 android::base::unique_fd acquireFence;
1351 hwc2_composition_t composition = testLayer->getComposition();
1352
1353 if (composition == HWC2_COMPOSITION_CLIENT
1354 || composition == HWC2_COMPOSITION_SOLID_COLOR
1355 || composition == HWC2_COMPOSITION_SIDEBAND)
1356 return;
1357
1358 if (testLayer->getBuffer(&handle, &acquireFence) < 0)
1359 return;
1360
1361 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
1362 composition));
1363 EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
1364 handle, acquireFence, outErr));
Marissa Wallffc67da2016-12-15 12:26:09 -08001365}
1366
Marissa Wallee242782016-12-15 12:30:12 -08001367void setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001368 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallee242782016-12-15 12:30:12 -08001369{
1370 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1371 layer, HWC2_COMPOSITION_SOLID_COLOR));
1372 ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001373 layer, testLayer->getPlaneAlpha()));
Marissa Wallee242782016-12-15 12:30:12 -08001374 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001375 layer, testLayer->getBlendMode()));
Marissa Wallee242782016-12-15 12:30:12 -08001376 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001377 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08001378}
1379
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001380void setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001381 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001382{
Marissa Wall5a240aa2016-12-15 12:34:06 -08001383 hwc2_composition_t composition = testLayer->getComposition();
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001384 hwc2_error_t err = HWC2_ERROR_NONE;
1385
1386 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
1387 composition, &err));
1388 if (outErr) {
1389 *outErr = err;
1390 return;
1391 }
1392
1393 if (composition != HWC2_COMPOSITION_SIDEBAND) {
1394 EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
1395 } else {
1396 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
1397 << "returned wrong error code";
1398 }
1399}
1400
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001401void setCursorPosition(Hwc2Test* test, hwc2_display_t display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001402 hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001403{
1404 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1405 layer, HWC2_COMPOSITION_CURSOR));
1406
Marissa Wall5a240aa2016-12-15 12:34:06 -08001407 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001408 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
1409 cursorPosition.left, cursorPosition.top, outErr));
1410}
1411
Marissa Wallb72b5c92016-12-15 12:26:39 -08001412void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001413 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallb72b5c92016-12-15 12:26:39 -08001414{
1415 EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001416 testLayer->getDataspace(), outErr));
Marissa Wallb72b5c92016-12-15 12:26:39 -08001417}
1418
Marissa Wall600a73b2016-12-15 12:30:39 -08001419void setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001420 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall600a73b2016-12-15 12:30:39 -08001421{
1422 EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001423 testLayer->getDisplayFrame(), outErr));
Marissa Wall600a73b2016-12-15 12:30:39 -08001424}
1425
Marissa Wall2b1f5302016-12-15 12:27:20 -08001426void setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001427 Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
Marissa Wall2b1f5302016-12-15 12:27:20 -08001428{
1429 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001430 testLayer->getBlendMode()));
Marissa Wall2b1f5302016-12-15 12:27:20 -08001431 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001432 testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08001433}
1434
Marissa Wallc57468f2016-12-15 12:31:12 -08001435void setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001436 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallc57468f2016-12-15 12:31:12 -08001437{
1438 EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001439 testLayer->getSourceCrop(), outErr));
Marissa Wallc57468f2016-12-15 12:31:12 -08001440}
1441
Marissa Wallad761812016-12-15 12:32:24 -08001442void setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001443 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallad761812016-12-15 12:32:24 -08001444{
1445 EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001446 testLayer->getSurfaceDamage(), outErr));
Marissa Wallad761812016-12-15 12:32:24 -08001447}
1448
Marissa Wallac108192016-12-15 12:27:48 -08001449void setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001450 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallac108192016-12-15 12:27:48 -08001451{
1452 EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001453 testLayer->getTransform(), outErr));
Marissa Wallac108192016-12-15 12:27:48 -08001454}
1455
Marissa Wallf7618ed2016-12-15 12:34:39 -08001456void setVisibleRegion(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1457 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1458{
1459 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display, layer,
1460 testLayer->getVisibleRegion(), outErr));
1461}
1462
Marissa Wall273b1df2016-12-15 12:28:47 -08001463void setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001464 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall273b1df2016-12-15 12:28:47 -08001465{
1466 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001467 testLayer->getZOrder(), outErr));
Marissa Wall273b1df2016-12-15 12:28:47 -08001468}
1469
Marissa Wallffc67da2016-12-15 12:26:09 -08001470bool advanceBlendMode(Hwc2TestLayer* testLayer)
1471{
1472 return testLayer->advanceBlendMode();
1473}
1474
Marissa Wall5a240aa2016-12-15 12:34:06 -08001475bool advanceBuffer(Hwc2TestLayer* testLayer)
1476{
1477 if (testLayer->advanceComposition())
1478 return true;
1479 return testLayer->advanceBufferArea();
1480}
1481
Marissa Wallee242782016-12-15 12:30:12 -08001482bool advanceColor(Hwc2TestLayer* testLayer)
1483{
1484 /* Color depends on blend mode so advance blend mode last so color is not
1485 * force to update as often */
1486 if (testLayer->advancePlaneAlpha())
1487 return true;
1488 if (testLayer->advanceColor())
1489 return true;
1490 return testLayer->advanceBlendMode();
1491}
1492
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001493bool advanceComposition(Hwc2TestLayer* testLayer)
1494{
1495 return testLayer->advanceComposition();
1496}
1497
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001498bool advanceCursorPosition(Hwc2TestLayer* testLayer)
1499{
1500 return testLayer->advanceCursorPosition();
1501}
1502
Marissa Wallb72b5c92016-12-15 12:26:39 -08001503bool advanceDataspace(Hwc2TestLayer* testLayer)
1504{
1505 return testLayer->advanceDataspace();
1506}
1507
Marissa Wall600a73b2016-12-15 12:30:39 -08001508bool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1509{
1510 return testLayer->advanceDisplayFrame();
1511}
1512
Marissa Wall2b1f5302016-12-15 12:27:20 -08001513bool advancePlaneAlpha(Hwc2TestLayer* testLayer)
1514{
1515 return testLayer->advancePlaneAlpha();
1516}
1517
Marissa Wallc57468f2016-12-15 12:31:12 -08001518bool advanceSourceCrop(Hwc2TestLayer* testLayer)
1519{
1520 if (testLayer->advanceSourceCrop())
1521 return true;
1522 return testLayer->advanceBufferArea();
1523}
1524
Marissa Wallad761812016-12-15 12:32:24 -08001525bool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
1526{
1527 if (testLayer->advanceSurfaceDamage())
1528 return true;
1529 return testLayer->advanceBufferArea();
1530}
1531
Marissa Wallac108192016-12-15 12:27:48 -08001532bool advanceTransform(Hwc2TestLayer* testLayer)
1533{
1534 return testLayer->advanceTransform();
1535}
1536
Marissa Wallf7618ed2016-12-15 12:34:39 -08001537bool advanceVisibleRegions(Hwc2TestLayers* testLayers)
1538{
1539 return testLayers->advanceVisibleRegions();
1540}
1541
Marissa Wall4d600052016-12-15 12:16:01 -08001542
1543static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
1544 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
1545 HWC2_FUNCTION_CREATE_LAYER,
1546 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
1547 HWC2_FUNCTION_DESTROY_LAYER,
1548 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
1549 HWC2_FUNCTION_DUMP,
1550 HWC2_FUNCTION_GET_ACTIVE_CONFIG,
1551 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
1552 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
1553 HWC2_FUNCTION_GET_COLOR_MODES,
1554 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
1555 HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
1556 HWC2_FUNCTION_GET_DISPLAY_NAME,
1557 HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
1558 HWC2_FUNCTION_GET_DISPLAY_TYPE,
1559 HWC2_FUNCTION_GET_DOZE_SUPPORT,
1560 HWC2_FUNCTION_GET_HDR_CAPABILITIES,
1561 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
1562 HWC2_FUNCTION_GET_RELEASE_FENCES,
1563 HWC2_FUNCTION_PRESENT_DISPLAY,
1564 HWC2_FUNCTION_REGISTER_CALLBACK,
1565 HWC2_FUNCTION_SET_ACTIVE_CONFIG,
1566 HWC2_FUNCTION_SET_CLIENT_TARGET,
1567 HWC2_FUNCTION_SET_COLOR_MODE,
1568 HWC2_FUNCTION_SET_COLOR_TRANSFORM,
1569 HWC2_FUNCTION_SET_CURSOR_POSITION,
1570 HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
1571 HWC2_FUNCTION_SET_LAYER_BUFFER,
1572 HWC2_FUNCTION_SET_LAYER_COLOR,
1573 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
1574 HWC2_FUNCTION_SET_LAYER_DATASPACE,
1575 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
1576 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
1577 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
1578 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
1579 HWC2_FUNCTION_SET_LAYER_TRANSFORM,
1580 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
1581 HWC2_FUNCTION_SET_LAYER_Z_ORDER,
1582 HWC2_FUNCTION_SET_OUTPUT_BUFFER,
1583 HWC2_FUNCTION_SET_POWER_MODE,
1584 HWC2_FUNCTION_SET_VSYNC_ENABLED,
1585 HWC2_FUNCTION_VALIDATE_DISPLAY,
1586}};
1587
1588/* TESTCASE: Tests that the HWC2 supports all required functions. */
1589TEST_F(Hwc2Test, GET_FUNCTION)
1590{
1591 for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
1592 hwc2_function_pointer_t pfn = getFunction(descriptor);
1593 EXPECT_TRUE(pfn) << "failed to get function "
1594 << getFunctionDescriptorName(descriptor);
1595 }
1596}
1597
1598/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
1599TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
1600{
1601 hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
1602 EXPECT_FALSE(pfn) << "failed to get invalid function";
1603}
1604
1605/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
1606TEST_F(Hwc2Test, GET_CAPABILITIES)
1607{
1608 std::vector<hwc2_capability_t> capabilities;
1609
1610 getCapabilities(&capabilities);
1611
1612 EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
1613 HWC2_CAPABILITY_INVALID), 0);
1614}
Marissa Walla4b01482017-02-17 20:52:03 -08001615
1616static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1617 HWC2_CALLBACK_HOTPLUG,
1618 HWC2_CALLBACK_REFRESH,
1619 HWC2_CALLBACK_VSYNC,
1620}};
1621
1622/* TESTCASE: Tests that the HWC2 can successfully register all required
1623 * callback functions. */
1624TEST_F(Hwc2Test, REGISTER_CALLBACK)
1625{
1626 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1627 const_cast<char*>("data"));
1628
1629 for (auto descriptor : callbackDescriptors) {
1630 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1631 []() { return; }));
1632 }
1633}
1634
1635/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1636TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1637{
1638 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1639 const_cast<char*>("data"));
1640 hwc2_error_t err = HWC2_ERROR_NONE;
1641
1642 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1643 []() { return; }, &err));
1644 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1645}
1646
1647/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
1648TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
1649{
1650 hwc2_callback_data_t data = nullptr;
1651
1652 for (auto descriptor : callbackDescriptors) {
1653 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1654 []() { return; }));
1655 }
1656}
Marissa Wallcfb9a072017-02-17 20:53:18 -08001657
1658/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1659 * physical display. */
1660TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1661{
1662 for (auto display : mDisplays) {
1663 hwc2_display_type_t type;
1664
1665 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1666 EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1667 " correct display type";
1668 }
1669}
1670
1671/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1672 * display is requested. */
1673TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1674{
1675 hwc2_display_t display;
1676 hwc2_display_type_t type;
1677 hwc2_error_t err = HWC2_ERROR_NONE;
1678
1679 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1680
1681 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1682 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1683}
Marissa Wall1db2e372016-12-15 12:19:39 -08001684
1685/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
1686TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
1687{
1688 for (auto display : mDisplays) {
1689 hwc2_layer_t layer;
1690
1691 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1692
1693 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1694 }
1695}
1696
1697/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
1698TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
1699{
1700 hwc2_display_t display;
1701 hwc2_layer_t layer;
1702 hwc2_error_t err = HWC2_ERROR_NONE;
1703
1704 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1705
1706 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
1707 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1708}
1709
1710/* TESTCASE: Tests that the HWC2 will either support a large number of resources
1711 * or will return no resources. */
1712TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
1713{
1714 const size_t layerCnt = 1000;
1715
1716 for (auto display : mDisplays) {
1717 std::vector<hwc2_layer_t> layers;
1718
1719 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1720
1721 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1722 }
1723}
1724
1725/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
1726TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
1727{
1728 hwc2_display_t badDisplay;
1729
1730 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
1731
1732 for (auto display : mDisplays) {
1733 hwc2_layer_t layer = 0;
1734 hwc2_error_t err = HWC2_ERROR_NONE;
1735
1736 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1737 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1738
1739 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1740
1741 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1742 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1743
1744 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1745 }
1746}
1747
1748/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
1749TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
1750{
1751 for (auto display : mDisplays) {
1752 hwc2_layer_t layer;
1753 hwc2_error_t err = HWC2_ERROR_NONE;
1754
1755 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
1756 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1757
1758 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
1759 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1760
1761 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
1762 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1763
1764 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
1765 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1766
1767 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
1768 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1769
1770 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1771
1772 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
1773 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1774
1775 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1776
1777 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
1778 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1779 }
1780}
Marissa Wallcf935cb2016-12-15 12:20:47 -08001781
1782static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1783 HWC2_ATTRIBUTE_WIDTH,
1784 HWC2_ATTRIBUTE_HEIGHT,
1785}};
1786
1787static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1788 HWC2_ATTRIBUTE_VSYNC_PERIOD,
1789 HWC2_ATTRIBUTE_DPI_X,
1790 HWC2_ATTRIBUTE_DPI_Y,
1791}};
1792
1793/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1794 * config. */
1795TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1796{
1797 for (auto display : mDisplays) {
1798 std::vector<hwc2_config_t> configs;
1799
1800 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1801
1802 for (auto config : configs) {
1803 int32_t value;
1804
1805 for (auto attribute : requiredAttributes) {
1806 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1807 attribute, &value));
1808 EXPECT_GE(value, 0) << "missing required attribute "
1809 << getAttributeName(attribute) << " for config "
1810 << config;
1811 }
1812 for (auto attribute : optionalAttributes) {
1813 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1814 attribute, &value));
1815 }
1816 }
1817 }
1818}
1819
1820/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1821 * attribute */
1822TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1823{
1824 const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1825
1826 for (auto display : mDisplays) {
1827 std::vector<hwc2_config_t> configs;
1828
1829 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1830
1831 for (auto config : configs) {
1832 int32_t value;
1833 hwc2_error_t err = HWC2_ERROR_NONE;
1834
1835 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1836 attribute, &value, &err));
1837 EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1838 " attribute for config " << config;
1839 }
1840 }
1841}
1842
1843/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1844TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1845{
1846 hwc2_display_t display;
1847 const hwc2_config_t config = 0;
1848 int32_t value;
1849 hwc2_error_t err = HWC2_ERROR_NONE;
1850
1851 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1852
1853 for (auto attribute : requiredAttributes) {
1854 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1855 &value, &err));
1856 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1857 }
1858
1859 for (auto attribute : optionalAttributes) {
1860 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1861 &value, &err));
1862 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1863 }
1864}
1865
1866/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1867TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1868{
1869 for (auto display : mDisplays) {
1870 hwc2_config_t config;
1871 int32_t value;
1872 hwc2_error_t err = HWC2_ERROR_NONE;
1873
1874 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1875
1876 for (auto attribute : requiredAttributes) {
1877 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1878 attribute, &value, &err));
1879 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1880 }
1881
1882 for (auto attribute : optionalAttributes) {
1883 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1884 attribute, &value, &err));
1885 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1886 }
1887 }
1888}
1889
1890/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1891TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1892{
1893 for (auto display : mDisplays) {
1894 std::vector<hwc2_config_t> configs;
1895
1896 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1897 }
1898}
1899
1900/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1901TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1902{
1903 hwc2_display_t display;
1904 std::vector<hwc2_config_t> configs;
1905 hwc2_error_t err = HWC2_ERROR_NONE;
1906
1907 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1908
1909 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1910
1911 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1912 EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1913}
1914
1915/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1916 * times in a row. */
1917TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1918{
1919 for (auto display : mDisplays) {
1920 std::vector<hwc2_config_t> configs1, configs2;
1921
1922 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
1923 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
1924
1925 EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
1926 configs2.begin())) << "returned two different config sets";
1927 }
1928}
1929
1930/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
1931TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
1932{
1933 for (auto display : mDisplays) {
1934 std::vector<hwc2_config_t> configs;
1935
1936 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1937
1938 std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
1939 configs.end());
1940 EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
1941 " configs";
1942 }
1943}
Marissa Wall93dc04f2016-12-15 12:21:46 -08001944
1945/* TESTCASE: Tests that the HWC2 returns the active config for a display */
1946TEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
1947{
1948 for (auto display : mDisplays) {
1949 std::vector<hwc2_config_t> configs;
1950
1951 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1952
1953 for (auto config : configs) {
1954 hwc2_config_t activeConfig;
1955
1956 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1957 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
1958
1959 EXPECT_EQ(activeConfig, config) << "failed to get active config";
1960 }
1961 }
1962}
1963
1964/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
1965 * display. */
1966TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
1967{
1968 hwc2_display_t display;
1969 hwc2_config_t activeConfig;
1970 hwc2_error_t err = HWC2_ERROR_NONE;
1971
1972 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1973
1974 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1975
1976 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1977}
1978
1979/* TESTCASE: Tests that the HWC2 either begins with a valid active config
1980 * or returns an error when getActiveConfig is called. */
1981TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
1982{
1983 for (auto display : mDisplays) {
1984 std::vector<hwc2_config_t> configs;
1985 hwc2_config_t activeConfig;
1986 hwc2_error_t err = HWC2_ERROR_NONE;
1987
1988 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1989
1990 if (configs.empty())
1991 return;
1992
1993 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1994 if (err == HWC2_ERROR_NONE) {
1995 EXPECT_NE(std::count(configs.begin(), configs.end(),
1996 activeConfig), 0) << "active config is not found in "
1997 " configs for display";
1998 } else {
1999 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2000 }
2001 }
2002}
2003
2004/* TESTCASE: Tests that the HWC2 can set every display config as an active
2005 * config */
2006TEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
2007{
2008 for (auto display : mDisplays) {
2009 std::vector<hwc2_config_t> configs;
2010
2011 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2012
2013 for (auto config : configs) {
2014 EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2015 }
2016 }
2017}
2018
2019/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
2020TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
2021{
2022 hwc2_display_t display;
2023 const hwc2_config_t config = 0;
2024 hwc2_error_t err = HWC2_ERROR_NONE;
2025
2026 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2027
2028 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
2029 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2030}
2031
2032/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
2033TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
2034{
2035 for (auto display : mDisplays) {
2036 hwc2_config_t config;
2037 hwc2_error_t err = HWC2_ERROR_NONE;
2038
2039 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
2040
2041 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
2042 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2043 }
2044}
Marissa Wall03c91732016-12-15 12:23:16 -08002045
2046/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
2047TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
2048{
2049 for (auto display : mDisplays) {
2050 int32_t support = -1;
2051
2052 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2053
2054 EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
2055 }
2056}
2057
2058/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
2059TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
2060{
2061 hwc2_display_t display;
2062 int32_t support = -1;
2063 hwc2_error_t err = HWC2_ERROR_NONE;
2064
2065 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2066
2067 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2068
2069 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2070}
2071
2072/* TESTCASE: Tests that the HWC2 can set all supported power modes */
2073TEST_F(Hwc2Test, SET_POWER_MODE)
2074{
2075 for (auto display : mDisplays) {
2076 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2077 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2078
2079 int32_t support = -1;
2080 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2081 if (support != 1)
2082 return;
2083
2084 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2085 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2086 HWC2_POWER_MODE_DOZE_SUSPEND));
2087
2088 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2089 }
2090}
2091
2092/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
2093TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
2094{
2095 hwc2_display_t display;
2096 hwc2_error_t err = HWC2_ERROR_NONE;
2097
2098 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2099
2100 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
2101 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2102
2103 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
2104 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2105
2106 int32_t support = -1;
2107 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2108 if (support != 1)
2109 return;
2110
2111 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
2112 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2113
2114 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
2115 &err));
2116 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2117}
2118
2119/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
2120TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
2121{
2122 for (auto display : mDisplays) {
2123 hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
2124 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
2125 hwc2_error_t err = HWC2_ERROR_NONE;
2126
2127 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
2128 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
2129 << mode;
2130 }
2131}
2132
2133/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
2134 * an optional power mode. */
2135TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
2136{
2137 for (auto display : mDisplays) {
2138 int32_t support = -1;
2139 hwc2_error_t err = HWC2_ERROR_NONE;
2140
2141 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2142 if (support == 1)
2143 return;
2144
2145 ASSERT_EQ(support, 0) << "invalid doze support value";
2146
2147 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
2148 &err));
2149 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
2150
2151 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2152 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
2153 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
2154 }
2155}
2156
2157/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
2158TEST_F(Hwc2Test, SET_POWER_MODE_stress)
2159{
2160 for (auto display : mDisplays) {
2161 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2162 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2163
2164 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2165 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2166
2167 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2168 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2169
2170 int32_t support = -1;
2171 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2172 if (support != 1)
2173 return;
2174
2175 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2176 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2177
2178 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2179 HWC2_POWER_MODE_DOZE_SUSPEND));
2180 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2181 HWC2_POWER_MODE_DOZE_SUSPEND));
2182
2183 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2184 }
2185}
Marissa Wall572a1ee2016-12-15 12:24:13 -08002186
2187/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
2188 * displays */
2189TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
2190{
2191 for (auto display : mDisplays) {
2192 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2193 const_cast<char*>("data"));
2194
2195 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2196
2197 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2198 []() { return; }));
2199
2200 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2201
2202 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2203
2204 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2205 }
2206}
2207
2208/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
2209TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
2210{
2211 for (auto display : mDisplays) {
2212 hwc2_display_t receivedDisplay;
2213 int64_t receivedTimestamp;
2214
2215 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2216
2217 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
2218
2219 ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
2220 &receivedTimestamp));
2221
2222 EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
2223 EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
2224
2225 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
2226
2227 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2228 }
2229}
2230
2231/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
2232TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
2233{
2234 hwc2_display_t display;
2235 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2236 const_cast<char*>("data"));
2237 hwc2_error_t err = HWC2_ERROR_NONE;
2238
2239 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2240
2241 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2242 []() { return; }));
2243
2244 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
2245 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2246
2247 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
2248 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2249}
2250
2251/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
2252TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
2253{
2254 for (auto display : mDisplays) {
2255 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2256 const_cast<char*>("data"));
2257 hwc2_error_t err = HWC2_ERROR_NONE;
2258
2259 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2260
2261 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2262 []() { return; }));
2263
2264 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
2265 &err));
2266 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2267
2268 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2269 }
2270}
2271
2272/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
2273 * times. */
2274TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
2275{
2276 for (auto display : mDisplays) {
2277 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2278 const_cast<char*>("data"));
2279
2280 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2281
2282 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2283 []() { return; }));
2284
2285 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2286
2287 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2288 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2289
2290 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2291 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2292
2293 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2294 }
2295}
2296
2297/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
2298 * is off and no callback is registered. */
2299TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
2300{
2301 const uint secs = 1;
2302
2303 for (auto display : mDisplays) {
2304 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2305
2306 sleep(secs);
2307
2308 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2309 }
2310}
2311
2312/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
2313 * is registered. */
2314TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
2315{
2316 const uint secs = 1;
2317
2318 for (auto display : mDisplays) {
2319 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2320
2321 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2322
2323 sleep(secs);
2324
2325 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2326
2327 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2328 }
2329}
Marissa Walldd4087f2016-12-15 12:24:52 -08002330
2331/* TESTCASE: Tests that the HWC2 returns a display name for each display */
2332TEST_F(Hwc2Test, GET_DISPLAY_NAME)
2333{
2334 for (auto display : mDisplays) {
2335 std::string name;
2336
2337 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
2338 }
2339}
2340
2341/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
2342 * display */
2343TEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
2344{
2345 hwc2_display_t display;
2346 std::string name;
2347 hwc2_error_t err = HWC2_ERROR_NONE;
2348
2349 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2350
2351 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
2352 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2353}
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08002354
2355/* TESTCASE: Tests that the HWC2 can set basic composition types. */
2356TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
2357{
2358 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2359 setComposition, advanceComposition));
2360}
2361
2362/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
2363 * layer. */
2364TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
2365{
2366 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2367 setComposition, advanceComposition));
2368}
2369
2370/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
2371TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
2372{
2373 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2374 setComposition));
2375}
2376
2377/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
2378TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
2379{
2380 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2381 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2382 hwc2_error_t* outErr) {
2383
2384 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
2385 layer, HWC2_COMPOSITION_INVALID, outErr));
2386 }
2387 ));
2388}
Marissa Wallffc67da2016-12-15 12:26:09 -08002389
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002390/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
2391TEST_F(Hwc2Test, SET_CURSOR_POSITION)
2392{
2393 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2394 ::setCursorPosition, advanceCursorPosition));
2395}
2396
2397/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
2398TEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
2399{
2400 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2401 ::setCursorPosition, advanceCursorPosition));
2402}
2403
2404/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
2405 * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
2406TEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
2407{
2408 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2409 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002410 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002411
Marissa Wall5a240aa2016-12-15 12:34:06 -08002412 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002413 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
2414 cursorPosition.left, cursorPosition.top, outErr));
2415 },
2416
2417 advanceCursorPosition));
2418}
2419
2420/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
2421 * display. */
2422TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
2423{
2424 hwc2_display_t display;
2425 hwc2_layer_t layer = 0;
2426 int32_t x = 0, y = 0;
2427 hwc2_error_t err = HWC2_ERROR_NONE;
2428
2429 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2430
2431 ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
2432 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2433}
2434
2435/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
2436TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
2437{
2438 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2439 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002440 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002441
Marissa Wall5a240aa2016-12-15 12:34:06 -08002442 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002443 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
2444 badLayer, cursorPosition.left, cursorPosition.top,
2445 outErr));
2446 }
2447 ));
2448}
2449
Marissa Wallffc67da2016-12-15 12:26:09 -08002450/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
2451TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
2452{
2453 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2454 setBlendMode, advanceBlendMode));
2455}
2456
2457/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
2458TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
2459{
2460 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2461 setBlendMode, advanceBlendMode));
2462}
2463
2464/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
2465TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
2466{
2467 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2468 setBlendMode));
2469}
2470
2471/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
2472TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
2473{
2474 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2475 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2476 hwc2_error_t* outErr) {
2477
2478 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
2479 layer, HWC2_BLEND_MODE_INVALID, outErr));
2480 }
2481 ));
2482}
Marissa Wallb72b5c92016-12-15 12:26:39 -08002483
Marissa Wall5a240aa2016-12-15 12:34:06 -08002484/* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
2485TEST_F(Hwc2Test, SET_LAYER_BUFFER)
2486{
2487 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2488 setBuffer, advanceBuffer));
2489}
2490
2491/* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
2492TEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
2493{
2494 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2495 setBuffer, advanceBuffer));
2496}
2497
2498/* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
2499TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
2500{
2501 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2502 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
2503 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2504
2505 buffer_handle_t handle = nullptr;
2506 android::base::unique_fd acquireFence;
2507
2508 /* If there is not available buffer for the given buffer
2509 * properties, it should not fail this test case */
2510 if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
2511 *outErr = HWC2_ERROR_BAD_LAYER;
2512 return;
2513 }
2514
2515 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
2516 handle, acquireFence, outErr));
2517 }
2518 ));
2519}
2520
2521/* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
2522TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
2523{
2524 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2525 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2526 hwc2_error_t* outErr) {
2527
2528 buffer_handle_t handle = nullptr;
2529 int32_t acquireFence = -1;
2530
2531 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
2532 handle, acquireFence, outErr));
2533 }
2534 ));
2535}
2536
Marissa Wallee242782016-12-15 12:30:12 -08002537/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
2538TEST_F(Hwc2Test, SET_LAYER_COLOR)
2539{
2540 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2541 setColor, advanceColor));
2542}
2543
2544/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
2545TEST_F(Hwc2Test, SET_LAYER_COLOR_update)
2546{
2547 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2548 setColor, advanceColor));
2549}
2550
2551/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
2552 * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
2553TEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
2554{
2555 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
2556 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002557 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08002558
2559 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002560 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08002561 },
2562
2563 advanceColor));
2564}
2565
2566/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
2567TEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
2568{
2569 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2570 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002571 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08002572
2573 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002574 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08002575 }
2576 ));
2577}
2578
Marissa Wallb72b5c92016-12-15 12:26:39 -08002579/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
2580TEST_F(Hwc2Test, SET_LAYER_DATASPACE)
2581{
2582 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2583 setDataspace, advanceDataspace));
2584}
2585
2586/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
2587TEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
2588{
2589 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2590 setDataspace, advanceDataspace));
2591}
2592
2593/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
2594TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
2595{
2596 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2597 setDataspace));
2598}
Marissa Wall2b1f5302016-12-15 12:27:20 -08002599
Marissa Wall600a73b2016-12-15 12:30:39 -08002600/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
2601TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
2602{
2603 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2604 setDisplayFrame, advanceDisplayFrame));
2605}
2606
2607/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
2608TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
2609{
2610 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2611 setDisplayFrame, advanceDisplayFrame));
2612}
2613
2614/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
2615TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
2616{
2617 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2618 setDisplayFrame));
2619}
2620
Marissa Wall2b1f5302016-12-15 12:27:20 -08002621/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
2622TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
2623{
2624 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2625 setPlaneAlpha, advancePlaneAlpha));
2626}
2627
2628/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
2629TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
2630{
2631 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2632 setPlaneAlpha, advancePlaneAlpha));
2633}
2634
2635/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
2636TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
2637{
2638 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2639 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002640 Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
Marissa Wall2b1f5302016-12-15 12:27:20 -08002641
2642 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002643 badLayer, testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08002644 }
2645 ));
2646}
Marissa Wallac108192016-12-15 12:27:48 -08002647
Marissa Wallc57468f2016-12-15 12:31:12 -08002648/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
2649TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
2650{
2651 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2652 setSourceCrop, advanceSourceCrop));
2653}
2654
2655/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
2656TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
2657{
2658 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2659 setSourceCrop, advanceSourceCrop));
2660}
2661
2662/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
2663TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
2664{
2665 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2666 setSourceCrop));
2667}
2668
Marissa Wallad761812016-12-15 12:32:24 -08002669/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
2670TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
2671{
2672 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2673 setSurfaceDamage, advanceSurfaceDamage));
2674}
2675
2676/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
2677TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
2678{
2679 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2680 setSurfaceDamage, advanceSurfaceDamage));
2681}
2682
2683/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
2684TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
2685{
2686 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2687 setSurfaceDamage));
2688}
2689
Marissa Wallac108192016-12-15 12:27:48 -08002690/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
2691TEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
2692{
2693 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2694 setTransform, advanceTransform));
2695}
2696
2697/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
2698TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
2699{
2700 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2701 setTransform, advanceTransform));
2702}
2703
2704/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
2705TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
2706{
2707 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2708 setTransform));
2709}
Marissa Wall273b1df2016-12-15 12:28:47 -08002710
Marissa Wallf7618ed2016-12-15 12:34:39 -08002711/* TESTCASE: Tests that the HWC2 can set the visible region of a layer. */
2712TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION)
2713{
2714 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Basic, 5,
2715 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2716 Hwc2TestLayers* testLayers) {
2717
2718 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display,
2719 layer, testLayers->getVisibleRegion(layer)));
2720 },
2721
2722 advanceVisibleRegions));
2723}
2724
2725/* TESTCASE: Tests that the HWC2 cannot set the visible region of a bad layer. */
2726TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION_bad_layer)
2727{
2728 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2729 setVisibleRegion));
2730}
2731
Marissa Wall273b1df2016-12-15 12:28:47 -08002732/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
2733TEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
2734{
2735 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
2736 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002737 Hwc2TestLayers* testLayers) {
Marissa Wall273b1df2016-12-15 12:28:47 -08002738
2739 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002740 testLayers->getZOrder(layer)));
Marissa Wallf7618ed2016-12-15 12:34:39 -08002741 },
2742
2743 /* TestLayer z orders are set during the construction of TestLayers
2744 * and cannot be updated. There is no need (or ability) to cycle
2745 * through additional z order configurations. */
2746 [] (Hwc2TestLayers* /*testLayers*/) {
2747 return false;
Marissa Wall273b1df2016-12-15 12:28:47 -08002748 }
2749 ));
2750}
2751
2752/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
2753TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
2754{
2755 const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
2756 static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
2757 static_cast<uint32_t>(UINT32_MAX / 2),
2758 static_cast<uint32_t>(UINT32_MAX) };
2759
2760 for (auto display : mDisplays) {
2761 std::vector<hwc2_config_t> configs;
2762
2763 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2764
2765 for (auto config : configs) {
2766 hwc2_layer_t layer;
2767
2768 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2769
2770 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2771
2772 for (uint32_t zOrder : zOrders) {
2773 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
2774 }
2775
2776 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2777 }
2778 }
2779}
2780
2781/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
2782TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
2783{
2784 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2785 setZOrder));
2786}
Marissa Wall1cd789c2017-01-27 12:55:36 -08002787
2788/* TESTCASE: Tests that the HWC2 can display a layer with basic property
2789 * coverage */
2790TEST_F(Hwc2Test, VALIDATE_DISPLAY_basic)
2791{
2792 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
2793 [] (Hwc2Test* test, hwc2_display_t display,
Marissa Wall706178d2016-12-15 12:39:14 -08002794 const std::vector<hwc2_layer_t>& layers,
2795 const Hwc2TestLayers& /*testLayers*/) {
Marissa Wall1cd789c2017-01-27 12:55:36 -08002796
2797 uint32_t numTypes, numRequests;
2798 bool hasChanges = false;
2799
2800 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
2801 &numRequests, &hasChanges));
2802 if (hasChanges)
2803 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
2804 << "wrong number of requests";
2805 }
2806 ));
2807}
2808
2809/* TESTCASE: Tests that the HWC2 can display 5 layers with default coverage. */
2810TEST_F(Hwc2Test, VALIDATE_DISPLAY_default_5)
2811{
2812 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 5,
2813 [] (Hwc2Test* test, hwc2_display_t display,
Marissa Wall706178d2016-12-15 12:39:14 -08002814 const std::vector<hwc2_layer_t>& layers,
2815 const Hwc2TestLayers& /*testLayers*/) {
Marissa Wall1cd789c2017-01-27 12:55:36 -08002816
2817 uint32_t numTypes, numRequests;
2818 bool hasChanges = false;
2819
2820 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
2821 &numRequests, &hasChanges));
2822 if (hasChanges)
2823 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
2824 << "wrong number of requests";
2825 }
2826 ));
2827}
2828
2829/* TESTCASE: Tests that the HWC2 cannot validate a bad display */
2830TEST_F(Hwc2Test, VALIDATE_DISPLAY_bad_display)
2831{
2832 hwc2_display_t display;
2833 uint32_t numTypes, numRequests;
2834 hwc2_error_t err = HWC2_ERROR_NONE;
2835
2836 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2837
2838 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes, &numRequests,
2839 &err));
2840 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2841}
Marissa Wall706178d2016-12-15 12:39:14 -08002842
2843/* TESTCASE: Tests that the HWC2 can get display requests after validating a
2844 * basic layer. */
2845TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_basic)
2846{
2847 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
2848 [] (Hwc2Test* test, hwc2_display_t display,
2849 const std::vector<hwc2_layer_t>& layers,
2850 const Hwc2TestLayers& /*testLayers*/) {
2851
2852 uint32_t numTypes, numRequests;
2853 bool hasChanges = false;
2854
2855 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
2856 &numRequests, &hasChanges));
2857 if (hasChanges)
2858 EXPECT_LE(numTypes, layers.size())
2859 << "wrong number of requests";
2860
2861 EXPECT_NO_FATAL_FAILURE(test->handleRequests(display, layers,
2862 numRequests));
2863 }
2864 ));
2865}
2866
2867/* TESTCASE: Tests that the HWC2 cannot get display requests from a bad display */
2868TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_bad_display)
2869{
2870 hwc2_display_t display;
2871 hwc2_display_request_t displayRequests;
2872 std::vector<hwc2_layer_t> layers;
2873 std::vector<hwc2_layer_request_t> layerRequests;
2874 hwc2_error_t err = HWC2_ERROR_NONE;
2875
2876 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2877
2878 EXPECT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequests,
2879 &layers, &layerRequests, &err));
2880 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2881}
2882
2883/* TESTCASE: Tests that the HWC2 cannot get display requests from an non
2884 * validated display. */
2885TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_not_validated)
2886{
2887 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
2888 [] (Hwc2Test* test, hwc2_display_t display,
2889 std::vector<hwc2_layer_t>* layers) {
2890
2891 hwc2_display_request_t displayRequests;
2892 std::vector<hwc2_layer_request_t> layerRequests;
2893 hwc2_error_t err = HWC2_ERROR_NONE;
2894
2895 ASSERT_NO_FATAL_FAILURE(test->getDisplayRequests(display,
2896 &displayRequests, layers, &layerRequests, &err));
2897 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
2898 << "returned wrong error code";
2899 }
2900 ));
2901}
2902
2903/* TESTCASE: Tests that the HWC2 can get changed composition types after
2904 * validating a basic layer. */
2905TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_basic)
2906{
2907 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
2908 [] (Hwc2Test* test, hwc2_display_t display,
2909 const std::vector<hwc2_layer_t>& layers,
2910 const Hwc2TestLayers& testLayers) {
2911
2912 uint32_t numTypes, numRequests;
2913 bool hasChanges = false;
2914
2915 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
2916 &numRequests, &hasChanges));
2917 if (hasChanges)
2918 EXPECT_LE(numTypes, layers.size())
2919 << "wrong number of requests";
2920
2921 EXPECT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
2922 testLayers, layers, numTypes));
2923 }
2924 ));
2925}
2926
2927/* TESTCASE: Tests that the HWC2 cannot get changed composition types from a bad
2928 * display */
2929TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_bad_display)
2930{
2931 hwc2_display_t display;
2932 std::vector<hwc2_layer_t> layers;
2933 std::vector<hwc2_composition_t> types;
2934 hwc2_error_t err = HWC2_ERROR_NONE;
2935
2936 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2937
2938 EXPECT_NO_FATAL_FAILURE(getChangedCompositionTypes(display, &layers,
2939 &types, &err));
2940 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2941}
2942
2943/* TESTCASE: Tests that the HWC2 cannot get changed composition types from an non
2944 * validated display. */
2945TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_not_validated)
2946{
2947 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
2948 [] (Hwc2Test* test, hwc2_display_t display,
2949 std::vector<hwc2_layer_t>* layers) {
2950
2951 std::vector<hwc2_composition_t> types;
2952 hwc2_error_t err = HWC2_ERROR_NONE;
2953
2954 ASSERT_NO_FATAL_FAILURE(test->getChangedCompositionTypes(
2955 display, layers, &types, &err));
2956 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
2957 << "returned wrong error code";
2958 }
2959 ));
2960}
2961
2962/* TESTCASE: Tests that the HWC2 can accept display changes after validating a
2963 * basic layer. */
2964TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_basic)
2965{
2966 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
2967 [] (Hwc2Test* test, hwc2_display_t display,
2968 const std::vector<hwc2_layer_t>& layers,
2969 const Hwc2TestLayers& testLayers) {
2970
2971 uint32_t numTypes, numRequests;
2972 bool hasChanges = false;
2973
2974 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
2975 &numRequests, &hasChanges));
2976 if (hasChanges)
2977 EXPECT_LE(numTypes, layers.size())
2978 << "wrong number of requests";
2979
2980 ASSERT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
2981 testLayers, layers, numTypes));
2982
2983 EXPECT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display));
2984 }
2985 ));
2986}
2987
2988/* TESTCASE: Tests that the HWC2 cannot accept display changes from a bad
2989 * display */
2990TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_bad_display)
2991{
2992 hwc2_display_t display;
2993 hwc2_error_t err = HWC2_ERROR_NONE;
2994
2995 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2996
2997 EXPECT_NO_FATAL_FAILURE(acceptDisplayChanges(display, &err));
2998 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2999}
3000
3001/* TESTCASE: Tests that the HWC2 cannot accept display changes from an non
3002 * validated display. */
3003TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_not_validated)
3004{
3005 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3006 [] (Hwc2Test* test, hwc2_display_t display,
3007 std::vector<hwc2_layer_t>* /*layers*/) {
3008
3009 hwc2_error_t err = HWC2_ERROR_NONE;
3010
3011 ASSERT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display, &err));
3012 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3013 << "returned wrong error code";
3014 }
3015 ));
3016}