blob: 840f67d11259a5845693bab3659e1f2144415210 [file] [log] [blame]
Marissa Wall4d600052016-12-15 12:16:01 -08001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <array>
Marissa Wallcfb9a072017-02-17 20:53:18 -080018#include <unordered_set>
Marissa Wall563030b2017-02-21 14:01:05 -080019#include <unordered_map>
Marissa Wall4d600052016-12-15 12:16:01 -080020#include <gtest/gtest.h>
21#include <dlfcn.h>
Marissa Wall5a240aa2016-12-15 12:34:06 -080022#include <android-base/unique_fd.h>
Marissa Wall4d600052016-12-15 12:16:01 -080023#include <hardware/hardware.h>
Marissa Wall563030b2017-02-21 14:01:05 -080024#include <sync/sync.h>
Marissa Wall4d600052016-12-15 12:16:01 -080025
26#define HWC2_INCLUDE_STRINGIFICATION
27#define HWC2_USE_CPP11
28#include <hardware/hwcomposer2.h>
29#undef HWC2_INCLUDE_STRINGIFICATION
30#undef HWC2_USE_CPP11
31
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080032#include "Hwc2TestLayer.h"
Marissa Wall273b1df2016-12-15 12:28:47 -080033#include "Hwc2TestLayers.h"
Marissa Wallf18cfb02017-02-21 14:01:05 -080034#include "Hwc2TestClientTarget.h"
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080035
Marissa Wallcfb9a072017-02-17 20:53:18 -080036void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
37 hwc2_display_t display, int32_t connected);
Marissa Wall572a1ee2016-12-15 12:24:13 -080038void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
39 hwc2_display_t display, int64_t timestamp);
Marissa Wallcfb9a072017-02-17 20:53:18 -080040
Marissa Wall4d600052016-12-15 12:16:01 -080041class Hwc2Test : public testing::Test {
42public:
43
44 virtual void SetUp()
45 {
46 hw_module_t const* hwc2Module;
47
48 int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
49 ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
50 << strerror(-err);
51
52 /* The following method will fail if you have not run
53 * "adb shell stop" */
54 err = hwc2_open(hwc2Module, &mHwc2Device);
55 ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
56 << strerror(-err);
Marissa Wallcfb9a072017-02-17 20:53:18 -080057
58 populateDisplays();
Marissa Wall4d600052016-12-15 12:16:01 -080059 }
60
61 virtual void TearDown()
62 {
Marissa Wall1db2e372016-12-15 12:19:39 -080063
64 for (auto itr = mLayers.begin(); itr != mLayers.end();) {
65 hwc2_display_t display = itr->first;
66 hwc2_layer_t layer = itr->second;
67 itr++;
68 /* Destroys and removes the layer from mLayers */
69 destroyLayer(display, layer);
70 }
71
Marissa Wall03c91732016-12-15 12:23:16 -080072 for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
73 hwc2_display_t display = *itr;
74 itr++;
75 /* Sets power mode to off and removes the display from
76 * mActiveDisplays */
77 setPowerMode(display, HWC2_POWER_MODE_OFF);
78 }
79
Marissa Wall4d600052016-12-15 12:16:01 -080080 if (mHwc2Device)
81 hwc2_close(mHwc2Device);
82 }
83
Marissa Walla4b01482017-02-17 20:52:03 -080084 void registerCallback(hwc2_callback_descriptor_t descriptor,
85 hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
86 hwc2_error_t* outErr = nullptr)
87 {
88 auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
89 getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
90 ASSERT_TRUE(pfn) << "failed to get function";
91
92 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
93 callbackData, pointer));
94 if (outErr) {
95 *outErr = err;
96 } else {
97 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
98 }
99 }
100
Marissa Wallcfb9a072017-02-17 20:53:18 -0800101 void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
102 hwc2_error_t* outErr = nullptr)
103 {
104 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
105 getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
106 ASSERT_TRUE(pfn) << "failed to get function";
107
108 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
109 reinterpret_cast<int32_t*>(outType)));
110 if (outErr) {
111 *outErr = err;
112 } else {
113 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
114 }
115 }
116
117 /* If the populateDisplays function is still receiving displays and the
118 * display is connected, the display handle is stored in mDisplays. */
119 void hotplugCallback(hwc2_display_t display, int32_t connected)
120 {
121 std::lock_guard<std::mutex> lock(mHotplugMutex);
122
123 if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
124 return;
125
126 if (connected == HWC2_CONNECTION_CONNECTED)
127 mDisplays.insert(display);
128
129 mHotplugCv.notify_all();
130 }
131
Marissa Wall1db2e372016-12-15 12:19:39 -0800132 void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
133 hwc2_error_t* outErr = nullptr)
134 {
135 auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
136 getFunction(HWC2_FUNCTION_CREATE_LAYER));
137 ASSERT_TRUE(pfn) << "failed to get function";
138
139 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
140 outLayer));
141
142 if (err == HWC2_ERROR_NONE)
143 mLayers.insert(std::make_pair(display, *outLayer));
144
145 if (outErr) {
146 *outErr = err;
147 } else {
148 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
149 }
150 }
151
152 void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
153 hwc2_error_t* outErr = nullptr)
154 {
155 auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
156 getFunction(HWC2_FUNCTION_DESTROY_LAYER));
157 ASSERT_TRUE(pfn) << "failed to get function";
158
159 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
160
161 if (err == HWC2_ERROR_NONE)
162 mLayers.erase(std::make_pair(display, layer));
163
164 if (outErr) {
165 *outErr = err;
166 } else {
167 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
168 << layer;
169 }
170 }
171
Marissa Wallcf935cb2016-12-15 12:20:47 -0800172 void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
173 hwc2_attribute_t attribute, int32_t* outValue,
174 hwc2_error_t* outErr = nullptr)
175 {
176 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
177 getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
178 ASSERT_TRUE(pfn) << "failed to get function";
179
180 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
181 attribute, outValue));
182
183 if (outErr) {
184 *outErr = err;
185 } else {
186 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
187 << getAttributeName(attribute) << " for config " << config;
188 }
189 }
190
191 void getDisplayConfigs(hwc2_display_t display,
192 std::vector<hwc2_config_t>* outConfigs,
193 hwc2_error_t* outErr = nullptr)
194 {
195 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
196 getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
197 ASSERT_TRUE(pfn) << "failed to get function";
198
199 uint32_t numConfigs = 0;
200
201 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
202 &numConfigs, nullptr));
203
204 if (err == HWC2_ERROR_NONE) {
205 outConfigs->resize(numConfigs);
206
207 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
208 &numConfigs, outConfigs->data()));
209 }
210
211 if (outErr) {
212 *outErr = err;
213 } else {
214 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
215 " display " << display;
216 }
217 }
218
Marissa Wall93dc04f2016-12-15 12:21:46 -0800219 void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
220 hwc2_error_t* outErr = nullptr)
221 {
222 auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
223 getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
224 ASSERT_TRUE(pfn) << "failed to get function";
225
226 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
227 outConfig));
228 if (outErr) {
229 *outErr = err;
230 } else {
231 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
232 " display " << display;
233 }
234 }
235
236 void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
237 hwc2_error_t* outErr = nullptr)
238 {
239 auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
240 getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
241 ASSERT_TRUE(pfn) << "failed to get function";
242
243 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
244 if (outErr) {
245 *outErr = err;
246 } else {
247 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
248 << config;
249 }
250 }
251
Marissa Wall03c91732016-12-15 12:23:16 -0800252 void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
253 hwc2_error_t* outErr = nullptr)
254 {
255 auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
256 getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
257 ASSERT_TRUE(pfn) << "failed to get function";
258
259 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
260 outSupport));
261 if (outErr) {
262 *outErr = err;
263 } else {
264 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
265 " display " << display;
266 }
267 }
268
269 void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
270 hwc2_error_t* outErr = nullptr)
271 {
272 auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
273 getFunction(HWC2_FUNCTION_SET_POWER_MODE));
274 ASSERT_TRUE(pfn) << "failed to get function";
275
276 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
277 mode));
278 if (outErr) {
279 *outErr = err;
280 if (err != HWC2_ERROR_NONE)
281 return;
282 } else {
283 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
284 << getPowerModeName(mode) << " on display " << display;
285 }
286
287 if (mode == HWC2_POWER_MODE_OFF) {
288 mActiveDisplays.erase(display);
289 } else {
290 mActiveDisplays.insert(display);
291 }
292 }
293
Marissa Wall572a1ee2016-12-15 12:24:13 -0800294 void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
295 hwc2_error_t* outErr = nullptr)
296 {
297 auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
298 getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
299 ASSERT_TRUE(pfn) << "failed to get function";
300
301 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
302 enabled));
303 if (outErr) {
304 *outErr = err;
305 } else {
306 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
307 << getVsyncName(enabled);
308 }
309 }
310
311 void vsyncCallback(hwc2_display_t display, int64_t timestamp)
312 {
313 std::lock_guard<std::mutex> lock(mVsyncMutex);
314 mVsyncDisplay = display;
315 mVsyncTimestamp = timestamp;
316 mVsyncCv.notify_all();
317 }
318
Marissa Walldd4087f2016-12-15 12:24:52 -0800319 void getDisplayName(hwc2_display_t display, std::string* outName,
320 hwc2_error_t* outErr = nullptr)
321 {
322 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
323 getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
324 ASSERT_TRUE(pfn) << "failed to get function";
325
326 uint32_t size = 0;
327
328 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
329 nullptr));
330
331 if (err == HWC2_ERROR_NONE) {
332 std::vector<char> name(size);
333
334 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
335 name.data()));
336
337 outName->assign(name.data());
338 }
339
340 if (outErr) {
341 *outErr = err;
342 } else {
343 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
344 << display;
345 }
346 }
347
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800348 void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
349 hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
350 {
351 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
352 getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
353 ASSERT_TRUE(pfn) << "failed to get function";
354
355 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
356 composition));
357 if (outErr) {
358 *outErr = err;
359 } else {
360 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
361 " type " << getCompositionName(composition);
362 }
363 }
364
Marissa Wall2a0aaf92016-12-15 12:31:37 -0800365 void setCursorPosition(hwc2_display_t display, hwc2_layer_t layer,
366 int32_t x, int32_t y, hwc2_error_t* outErr = nullptr)
367 {
368 auto pfn = reinterpret_cast<HWC2_PFN_SET_CURSOR_POSITION>(
369 getFunction(HWC2_FUNCTION_SET_CURSOR_POSITION));
370 ASSERT_TRUE(pfn) << "failed to get function";
371
372 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, x,
373 y));
374 if (outErr) {
375 *outErr = err;
376 } else {
377 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set cursor position";
378 }
379 }
380
Marissa Wallffc67da2016-12-15 12:26:09 -0800381 void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
382 hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
383 {
384 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
385 getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
386 ASSERT_TRUE(pfn) << "failed to get function";
387
388 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
389 mode));
390 if (outErr) {
391 *outErr = err;
392 } else {
393 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
394 << getBlendModeName(mode);
395 }
396 }
397
Marissa Wall5a240aa2016-12-15 12:34:06 -0800398 void setLayerBuffer(hwc2_display_t display, hwc2_layer_t layer,
399 buffer_handle_t buffer, int32_t acquireFence,
400 hwc2_error_t* outErr = nullptr)
401 {
402 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BUFFER>(
403 getFunction(HWC2_FUNCTION_SET_LAYER_BUFFER));
404 ASSERT_TRUE(pfn) << "failed to get function";
405
406 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
407 buffer, acquireFence));
408 if (outErr) {
409 *outErr = err;
410 } else {
411 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer buffer";
412 }
413 }
414
Marissa Wallee242782016-12-15 12:30:12 -0800415 void setLayerColor(hwc2_display_t display, hwc2_layer_t layer,
416 hwc_color_t color, hwc2_error_t* outErr = nullptr)
417 {
418 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COLOR>(
419 getFunction(HWC2_FUNCTION_SET_LAYER_COLOR));
420 ASSERT_TRUE(pfn) << "failed to get function";
421
422 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
423 color));
424 if (outErr) {
425 *outErr = err;
426 } else {
427 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer color";
428 }
429 }
430
Marissa Wallb72b5c92016-12-15 12:26:39 -0800431 void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
432 android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
433 {
434 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
435 getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
436 ASSERT_TRUE(pfn) << "failed to get function";
437
438 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
439 layer, dataspace));
440 if (outErr) {
441 *outErr = err;
442 } else {
443 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
444 }
445 }
446
Marissa Wall600a73b2016-12-15 12:30:39 -0800447 void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
448 const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
449 {
450 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
451 getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
452 ASSERT_TRUE(pfn) << "failed to get function";
453
454 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
455 displayFrame));
456 if (outErr) {
457 *outErr = err;
458 } else {
459 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
460 " frame";
461 }
462 }
463
Marissa Wall2b1f5302016-12-15 12:27:20 -0800464 void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
465 float alpha, hwc2_error_t* outErr = nullptr)
466 {
467 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
468 getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
469 ASSERT_TRUE(pfn) << "failed to get function";
470
471 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
472 alpha));
473 if (outErr) {
474 *outErr = err;
475 } else {
476 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
477 << alpha;
478 }
479 }
480
Marissa Wallc57468f2016-12-15 12:31:12 -0800481 void setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer,
482 const hwc_frect_t& sourceCrop, hwc2_error_t* outErr = nullptr)
483 {
484 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
485 getFunction(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP));
486 ASSERT_TRUE(pfn) << "failed to get function";
487
488 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
489 sourceCrop));
490 if (outErr) {
491 *outErr = err;
492 } else {
493 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer source crop";
494 }
495 }
496
Marissa Wallad761812016-12-15 12:32:24 -0800497 void setLayerSurfaceDamage(hwc2_display_t display, hwc2_layer_t layer,
498 const hwc_region_t& surfaceDamage, hwc2_error_t* outErr = nullptr)
499 {
500 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
501 getFunction(HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE));
502 ASSERT_TRUE(pfn) << "failed to get function";
503
504 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
505 surfaceDamage));
506 if (outErr) {
507 *outErr = err;
508 } else {
509 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer surface"
510 " damage";
511 }
512 }
513
Marissa Wallac108192016-12-15 12:27:48 -0800514 void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
515 hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
516 {
517 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
518 getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
519 ASSERT_TRUE(pfn) << "failed to get function";
520
521 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
522 transform));
523 if (outErr) {
524 *outErr = err;
525 } else {
526 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
527 << getTransformName(transform);
528 }
529 }
530
Marissa Wallf7618ed2016-12-15 12:34:39 -0800531 void setLayerVisibleRegion(hwc2_display_t display, hwc2_layer_t layer,
532 const hwc_region_t& visibleRegion, hwc2_error_t* outErr = nullptr)
533 {
534 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_VISIBLE_REGION>(
535 getFunction(HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION));
536 ASSERT_TRUE(pfn) << "failed to get function";
537
538 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
539 visibleRegion));
540 if (outErr) {
541 *outErr = err;
542 } else {
543 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer visible"
544 " region";
545 }
546 }
547
Marissa Wall273b1df2016-12-15 12:28:47 -0800548 void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
549 uint32_t zOrder, hwc2_error_t* outErr = nullptr)
550 {
551 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
552 getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
553 ASSERT_TRUE(pfn) << "failed to get function";
554
555 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
556 zOrder));
557 if (outErr) {
558 *outErr = err;
559 } else {
560 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
561 << zOrder;
562 }
563 }
564
Marissa Wall1cd789c2017-01-27 12:55:36 -0800565 void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
566 uint32_t* outNumRequests, hwc2_error_t* outErr)
567 {
568 auto pfn = reinterpret_cast<HWC2_PFN_VALIDATE_DISPLAY>(
569 getFunction(HWC2_FUNCTION_VALIDATE_DISPLAY));
570 ASSERT_TRUE(pfn) << "failed to get function";
571
572 *outErr = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
573 outNumTypes, outNumRequests));
574 }
575
576 void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
577 uint32_t* outNumRequests, bool* outHasChanges)
578 {
579 hwc2_error_t err = HWC2_ERROR_NONE;
580
581 EXPECT_NO_FATAL_FAILURE(validateDisplay(display, outNumTypes,
582 outNumRequests, &err));
583
584 if (err != HWC2_ERROR_HAS_CHANGES) {
585 *outHasChanges = false;
586 EXPECT_EQ(err, HWC2_ERROR_NONE) << "failed to validate display";
587 } else {
588 *outHasChanges = true;
589 }
590 }
591
Marissa Wall706178d2016-12-15 12:39:14 -0800592 void getDisplayRequests(hwc2_display_t display,
593 hwc2_display_request_t* outDisplayRequests,
594 std::vector<hwc2_layer_t>* outLayers,
595 std::vector<hwc2_layer_request_t>* outLayerRequests,
596 hwc2_error_t* outErr = nullptr)
597 {
598 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_REQUESTS>(
599 getFunction(HWC2_FUNCTION_GET_DISPLAY_REQUESTS));
600 ASSERT_TRUE(pfn) << "failed to get function";
601
602 uint32_t numElements = 0;
603
604 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
605 reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
606 nullptr, nullptr));
607
608 if (err == HWC2_ERROR_NONE && numElements > 0) {
609 outLayers->resize(numElements);
610 outLayerRequests->resize(numElements);
611
612 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
613 reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
614 reinterpret_cast<uint64_t*>(outLayers->data()),
615 reinterpret_cast<int32_t*>(outLayerRequests->data())));
616 }
617
618 if (outErr) {
619 *outErr = err;
620 } else {
621 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display requests";
622 }
623 }
624
625 void handleRequests(hwc2_display_t display,
626 const std::vector<hwc2_layer_t>& layers, uint32_t numRequests,
627 std::set<hwc2_layer_t>* outClearLayers = nullptr,
628 bool* outFlipClientTarget = nullptr)
629 {
630 hwc2_display_request_t displayRequest =
631 static_cast<hwc2_display_request_t>(0);
632 std::vector<hwc2_layer_t> requestedLayers;
633 std::vector<hwc2_layer_request_t> requests;
634
635 ASSERT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequest,
636 &requestedLayers, &requests));
637
638 EXPECT_EQ(numRequests, requests.size()) << "validate returned "
639 << numRequests << " requests and get display requests returned "
640 << requests.size() << " requests";
641
642 for (size_t i = 0; i < requests.size(); i++) {
643 hwc2_layer_t requestedLayer = requestedLayers.at(i);
644 hwc2_layer_request_t request = requests.at(i);
645
646 EXPECT_EQ(std::count(layers.begin(), layers.end(), requestedLayer),
647 0) << "get display requests returned an unknown layer";
648 EXPECT_NE(request, 0) << "returned empty request for layer "
649 << requestedLayer;
650
651 if (outClearLayers && request
652 == HWC2_LAYER_REQUEST_CLEAR_CLIENT_TARGET)
653 outClearLayers->insert(requestedLayer);
654 }
655
656 if (outFlipClientTarget)
657 *outFlipClientTarget = displayRequest
658 & HWC2_DISPLAY_REQUEST_FLIP_CLIENT_TARGET;
659 }
660
661 void getChangedCompositionTypes(hwc2_display_t display,
662 std::vector<hwc2_layer_t>* outLayers,
663 std::vector<hwc2_composition_t>* outTypes,
664 hwc2_error_t* outErr = nullptr)
665 {
666 auto pfn = reinterpret_cast<HWC2_PFN_GET_CHANGED_COMPOSITION_TYPES>(
667 getFunction(HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES));
668 ASSERT_TRUE(pfn) << "failed to get function";
669
670 uint32_t numElements = 0;
671
672 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
673 &numElements, nullptr, nullptr));
674
675 if (err == HWC2_ERROR_NONE && numElements > 0) {
676 outLayers->resize(numElements);
677 outTypes->resize(numElements);
678
679 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
680 &numElements, reinterpret_cast<uint64_t*>(outLayers->data()),
681 reinterpret_cast<int32_t*>(outTypes->data())));
682 }
683
684 if (outErr) {
685 *outErr = err;
686 } else {
687 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get changed"
688 " composition types";
689 }
690 }
691
692 void handleCompositionChanges(hwc2_display_t display,
693 const Hwc2TestLayers& testLayers,
694 const std::vector<hwc2_layer_t>& layers, uint32_t numTypes,
695 std::set<hwc2_layer_t>* outClientLayers = nullptr)
696 {
697 std::vector<hwc2_layer_t> changedLayers;
698 std::vector<hwc2_composition_t> types;
699
700 ASSERT_NO_FATAL_FAILURE(getChangedCompositionTypes(display,
701 &changedLayers, &types));
702
703 EXPECT_EQ(numTypes, types.size()) << "validate returned "
704 << numTypes << " types and get changed composition types"
705 " returned " << types.size() << " types";
706
707 for (size_t i = 0; i < types.size(); i++) {
708
709 auto layer = std::find(layers.begin(), layers.end(),
710 changedLayers.at(i));
711
712 EXPECT_TRUE(layer != layers.end() || !testLayers.contains(*layer))
713 << "get changed composition types returned an unknown layer";
714
715 hwc2_composition_t requestedType = testLayers.getComposition(*layer);
716 hwc2_composition_t returnedType = types.at(i);
717
718 EXPECT_NE(returnedType, HWC2_COMPOSITION_INVALID) << "get changed"
719 " composition types returned invalid composition";
720
721 switch (requestedType) {
722 case HWC2_COMPOSITION_CLIENT:
723 EXPECT_TRUE(false) << getCompositionName(returnedType)
724 << " cannot be changed";
725 break;
726 case HWC2_COMPOSITION_DEVICE:
727 case HWC2_COMPOSITION_SOLID_COLOR:
728 EXPECT_EQ(returnedType, HWC2_COMPOSITION_CLIENT)
729 << "composition of type "
730 << getCompositionName(requestedType)
731 << " can only be changed to "
732 << getCompositionName(HWC2_COMPOSITION_CLIENT);
733 break;
734 case HWC2_COMPOSITION_CURSOR:
735 case HWC2_COMPOSITION_SIDEBAND:
736 EXPECT_TRUE(returnedType == HWC2_COMPOSITION_CLIENT
737 || returnedType == HWC2_COMPOSITION_DEVICE)
738 << "composition of type "
739 << getCompositionName(requestedType)
740 << " can only be changed to "
741 << getCompositionName(HWC2_COMPOSITION_CLIENT) << " or "
742 << getCompositionName(HWC2_COMPOSITION_DEVICE);
743 break;
744 default:
745 EXPECT_TRUE(false) << "unknown type "
746 << getCompositionName(requestedType);
747 break;
748 }
749
750 if (outClientLayers)
751 if (returnedType == HWC2_COMPOSITION_CLIENT)
752 outClientLayers->insert(*layer);
753 }
754
755 if (outClientLayers) {
756 for (auto layer : layers) {
757 if (testLayers.getComposition(layer) == HWC2_COMPOSITION_CLIENT)
758 outClientLayers->insert(layer);
759 }
760 }
761 }
762
763 void acceptDisplayChanges(hwc2_display_t display,
764 hwc2_error_t* outErr = nullptr)
765 {
766 auto pfn = reinterpret_cast<HWC2_PFN_ACCEPT_DISPLAY_CHANGES>(
767 getFunction(HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES));
768 ASSERT_TRUE(pfn) << "failed to get function";
769
770 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display));
771 if (outErr) {
772 *outErr = err;
773 } else {
774 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to accept display changes";
775 }
776 }
777
Marissa Wallf18cfb02017-02-21 14:01:05 -0800778 void getClientTargetSupport(hwc2_display_t display, int32_t width,
779 int32_t height, android_pixel_format_t format,
780 android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
781 {
782 auto pfn = reinterpret_cast<HWC2_PFN_GET_CLIENT_TARGET_SUPPORT>(
783 getFunction(HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT));
784 ASSERT_TRUE(pfn) << "failed to get function";
785
786 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, width,
787 height, format, dataspace));
788 if (outErr) {
789 *outErr = err;
790 } else {
791 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get client target"
792 " support";
793 }
794 }
795
796 void setClientTarget(hwc2_display_t display, buffer_handle_t handle,
797 int32_t acquireFence, android_dataspace_t dataspace,
798 hwc_region_t damage, hwc2_error_t* outErr = nullptr)
799 {
800 auto pfn = reinterpret_cast<HWC2_PFN_SET_CLIENT_TARGET>(
801 getFunction(HWC2_FUNCTION_SET_CLIENT_TARGET));
802 ASSERT_TRUE(pfn) << "failed to get function";
803
804 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, handle,
805 acquireFence, dataspace, damage));
806 if (outErr) {
807 *outErr = err;
808 } else {
809 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set client target";
810 }
811 }
812
Marissa Wall563030b2017-02-21 14:01:05 -0800813 void presentDisplay(hwc2_display_t display, int32_t* outPresentFence,
814 hwc2_error_t* outErr = nullptr)
815 {
816 auto pfn = reinterpret_cast<HWC2_PFN_PRESENT_DISPLAY>(
817 getFunction(HWC2_FUNCTION_PRESENT_DISPLAY));
818 ASSERT_TRUE(pfn) << "failed to get function";
819
820 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
821 outPresentFence));
822 if (outErr) {
823 *outErr = err;
824 } else {
825 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to present display";
826 }
827 }
828
829 void getReleaseFences(hwc2_display_t display,
830 std::vector<hwc2_layer_t>* outLayers,
831 std::vector<int32_t>* outFences, hwc2_error_t* outErr = nullptr)
832 {
833 auto pfn = reinterpret_cast<HWC2_PFN_GET_RELEASE_FENCES>(
834 getFunction(HWC2_FUNCTION_GET_RELEASE_FENCES));
835 ASSERT_TRUE(pfn) << "failed to get function";
836
837 uint32_t numElements = 0;
838
839 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
840 &numElements, nullptr, nullptr));
841
842 if (err == HWC2_ERROR_NONE) {
843 outLayers->resize(numElements);
844 outFences->resize(numElements);
845
846 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
847 &numElements, outLayers->data(), outFences->data()));
848 }
849
850 if (outErr) {
851 *outErr = err;
852 } else {
853 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get release fences";
854 }
855 }
856
Marissa Wall35040c52016-12-15 12:41:06 -0800857 void getColorModes(hwc2_display_t display,
858 std::vector<android_color_mode_t>* outColorModes,
859 hwc2_error_t* outErr = nullptr)
860 {
861 auto pfn = reinterpret_cast<HWC2_PFN_GET_COLOR_MODES>(
862 getFunction(HWC2_FUNCTION_GET_COLOR_MODES));
863 ASSERT_TRUE(pfn) << "failed to get function";
864
865 uint32_t numColorModes = 0;
866
867 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
868 &numColorModes, nullptr));
869 if (err == HWC2_ERROR_NONE) {
870 outColorModes->resize(numColorModes);
871
872 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
873 &numColorModes,
874 reinterpret_cast<int32_t*>(outColorModes->data())));
875 }
876
877 if (outErr) {
878 *outErr = err;
879 } else {
880 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get color modes for"
881 " display " << display;
882 }
883 }
884
885 void setColorMode(hwc2_display_t display, android_color_mode_t colorMode,
886 hwc2_error_t* outErr = nullptr)
887 {
888 auto pfn = reinterpret_cast<HWC2_PFN_SET_COLOR_MODE>(
889 getFunction(HWC2_FUNCTION_SET_COLOR_MODE));
890 ASSERT_TRUE(pfn) << "failed to get function";
891
892 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
893 static_cast<int32_t>(colorMode)));
894 if (outErr) {
895 *outErr = err;
896 } else {
897 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set color mode "
898 << colorMode;
899 }
900 }
901
902 void getHdrCapabilities(hwc2_display_t display,
903 std::vector<android_hdr_t>* outTypes, float* outMaxLuminance,
904 float* outMaxAverageLuminance, float* outMinLuminance,
905 hwc2_error_t* outErr = nullptr)
906 {
907 auto pfn = reinterpret_cast<HWC2_PFN_GET_HDR_CAPABILITIES>(
908 getFunction(HWC2_FUNCTION_GET_HDR_CAPABILITIES));
909 ASSERT_TRUE(pfn) << "failed to get function";
910
911 uint32_t numTypes = 0;
912
913 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
914 &numTypes, nullptr, outMaxLuminance, outMaxAverageLuminance,
915 outMinLuminance));
916
917 if (err == HWC2_ERROR_NONE) {
918 outTypes->resize(numTypes);
919
920 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &numTypes,
921 reinterpret_cast<int32_t*>(outTypes->data()), outMaxLuminance,
922 outMaxAverageLuminance, outMinLuminance));
923 }
924
925 if (outErr) {
926 *outErr = err;
927 } else {
928 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get hdr capabilities"
929 " for display " << display;
930 }
931 }
932
933 void setColorTransform(hwc2_display_t display,
934 const std::array<float, 16>& matrix, android_color_transform_t hint,
935 hwc2_error_t* outErr = nullptr)
936 {
937 auto pfn = reinterpret_cast<HWC2_PFN_SET_COLOR_TRANSFORM>(
938 getFunction(HWC2_FUNCTION_SET_COLOR_TRANSFORM));
939 ASSERT_TRUE(pfn) << "failed to get function";
940
941 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
942 matrix.data(), hint));
943
944 if (outErr) {
945 *outErr = err;
946 } else {
947 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set color transform "
948 << hint;
949 }
950 }
951
Marissa Wallf18cfb02017-02-21 14:01:05 -0800952 void getBadDisplay(hwc2_display_t* outDisplay)
953 {
954 for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
955 if (mDisplays.count(display) == 0) {
956 *outDisplay = display;
957 return;
958 }
959 }
960 ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
961 " are registered. This should never happen.";
962 }
963
Marissa Wall563030b2017-02-21 14:01:05 -0800964 void waitForVsync(hwc2_display_t* outDisplay = nullptr,
965 int64_t* outTimestamp = nullptr)
966 {
967 std::unique_lock<std::mutex> lock(mVsyncMutex);
968 ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
969 std::cv_status::no_timeout) << "timed out attempting to get"
970 " vsync callback";
971 if (outDisplay)
972 *outDisplay = mVsyncDisplay;
973 if (outTimestamp)
974 *outTimestamp = mVsyncTimestamp;
975 }
976
977 void enableVsync(hwc2_display_t display)
978 {
979 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
980 reinterpret_cast<hwc2_function_pointer_t>(
981 hwc2TestVsyncCallback)));
982 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
983 }
984
985 void disableVsync(hwc2_display_t display)
986 {
987 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
988 }
989
Marissa Wall4d600052016-12-15 12:16:01 -0800990protected:
991 hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
992 {
993 return mHwc2Device->getFunction(mHwc2Device, descriptor);
994 }
995
996 void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
997 {
998 uint32_t num = 0;
999
1000 mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
1001
1002 outCapabilities->resize(num);
1003
1004 mHwc2Device->getCapabilities(mHwc2Device, &num,
1005 reinterpret_cast<int32_t*>(outCapabilities->data()));
1006 }
1007
Marissa Wallcfb9a072017-02-17 20:53:18 -08001008 /* Registers a hotplug callback and waits for hotplug callbacks. This
1009 * function will have no effect if called more than once. */
1010 void populateDisplays()
1011 {
1012 /* Sets the hotplug status to receiving */
1013 {
1014 std::lock_guard<std::mutex> lock(mHotplugMutex);
1015
1016 if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
1017 return;
1018 mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
1019 }
1020
1021 /* Registers the callback. This function call cannot be locked because
1022 * a callback could happen on the same thread */
1023 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
1024 reinterpret_cast<hwc2_function_pointer_t>(
1025 hwc2TestHotplugCallback)));
1026
1027 /* Waits for hotplug events. If a hotplug event has not come within 1
1028 * second, stop waiting. */
1029 std::unique_lock<std::mutex> lock(mHotplugMutex);
1030
1031 while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
1032 std::cv_status::timeout) { }
1033
1034 /* Sets the hotplug status to done. Future calls will have no effect */
1035 mHotplugStatus = Hwc2TestHotplugStatus::Done;
1036 }
1037
Marissa Wall1db2e372016-12-15 12:19:39 -08001038 /* NOTE: will create min(newlayerCnt, max supported layers) layers */
1039 void createLayers(hwc2_display_t display,
1040 std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
1041 {
1042 std::vector<hwc2_layer_t> newLayers;
1043 hwc2_layer_t layer;
1044 hwc2_error_t err = HWC2_ERROR_NONE;
1045
1046 for (size_t i = 0; i < newLayerCnt; i++) {
1047
1048 EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
1049 if (err == HWC2_ERROR_NO_RESOURCES)
1050 break;
1051 if (err != HWC2_ERROR_NONE) {
1052 newLayers.clear();
1053 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
1054 }
1055 newLayers.push_back(layer);
1056 }
1057
1058 *outLayers = std::move(newLayers);
1059 }
1060
1061 void destroyLayers(hwc2_display_t display,
1062 std::vector<hwc2_layer_t>&& layers)
1063 {
1064 for (hwc2_layer_t layer : layers) {
1065 EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1066 }
1067 }
1068
Marissa Wallcf935cb2016-12-15 12:20:47 -08001069 void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
1070 {
1071 std::vector<hwc2_config_t> configs;
1072
1073 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1074
1075 hwc2_config_t CONFIG_MAX = UINT32_MAX;
1076
1077 ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
1078 " (2^32 values) has been taken which shouldn't happen";
1079
1080 hwc2_config_t config;
1081 for (config = 0; config < CONFIG_MAX; config++) {
1082 if (std::count(configs.begin(), configs.end(), config) == 0)
1083 break;
1084 }
1085
1086 *outConfig = config;
1087 }
1088
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001089 /* Calls a set property function from Hwc2Test to set a property value from
1090 * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
1091 using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
1092 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001093 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001094
Marissa Wall273b1df2016-12-15 12:28:47 -08001095 /* Calls a set property function from Hwc2Test to set property values from
1096 * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
1097 using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
1098 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001099 Hwc2TestLayers* testLayers);
Marissa Wall273b1df2016-12-15 12:28:47 -08001100
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001101 /* Calls a set property function from Hwc2Test to set a bad property value
1102 * on hwc2_layer_t on hwc2_display_t */
1103 using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
1104 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001105 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001106
1107 /* Calls a set property function from Hwc2Test to set a bad property value
1108 * on hwc2_layer_t on hwc2_display_t */
1109 using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
1110 hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
1111
Marissa Wall1cd789c2017-01-27 12:55:36 -08001112 /* Is called after a display is powered on and all layer properties have
1113 * been set. It should be used to test functions such as validate, accepting
1114 * changes, present, etc. */
1115 using TestDisplayLayersFunction = void (*)(Hwc2Test* test,
Marissa Wall706178d2016-12-15 12:39:14 -08001116 hwc2_display_t display, const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08001117 Hwc2TestLayers* testLayers);
Marissa Wall706178d2016-12-15 12:39:14 -08001118
1119 /* It is called on an non validated display */
1120 using TestDisplayNonValidatedLayersFunction = void (*)(Hwc2Test* test,
1121 hwc2_display_t display, std::vector<hwc2_layer_t>* layers);
Marissa Wall1cd789c2017-01-27 12:55:36 -08001122
Marissa Wallf18cfb02017-02-21 14:01:05 -08001123 /* Tests client target support on a particular display and config */
1124 using TestClientTargetSupportFunction = void (*)(Hwc2Test* test,
1125 hwc2_display_t display,
1126 const Hwc2TestClientTargetSupport& testClientTargetSupport);
1127
Marissa Wall35040c52016-12-15 12:41:06 -08001128 /* Tests a particular active display config */
1129 using TestActiveDisplayConfigFunction = void (*)(Hwc2Test* test,
1130 hwc2_display_t display);
1131
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001132 /* Advances a property of Hwc2TestLayer */
1133 using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
1134
Marissa Wallf7618ed2016-12-15 12:34:39 -08001135 /* Advances properties of Hwc2TestLayers */
1136 using AdvanceProperties = bool (*)(Hwc2TestLayers* testLayer);
1137
Marissa Wallf18cfb02017-02-21 14:01:05 -08001138 /* Advances properties of Hwc2TestClientTargetSupport */
1139 using AdvanceClientTargetSupport = bool (*)(
1140 Hwc2TestClientTargetSupport* testClientTargetSupport);
1141
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001142 /* For each active display it cycles through each display config and tests
1143 * each property value. It creates a layer, sets the property and then
1144 * destroys the layer */
1145 void setLayerProperty(Hwc2TestCoverage coverage,
1146 TestLayerPropertyFunction function, AdvanceProperty advance)
1147 {
1148 for (auto display : mDisplays) {
1149 std::vector<hwc2_config_t> configs;
1150
1151 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1152
1153 for (auto config : configs) {
1154 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -08001155 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001156
1157 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001158 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1159 &displayArea));
1160 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001161
1162 do {
1163 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1164
1165 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001166 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001167
1168 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1169 } while (advance(&testLayer));
1170 }
1171 }
1172 }
1173
1174 /* For each active display it cycles through each display config and tests
1175 * each property value. It creates a layer, cycles through each property
1176 * value and updates the layer property value and then destroys the layer */
1177 void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
1178 TestLayerPropertyFunction function, AdvanceProperty advance)
1179 {
1180 for (auto display : mDisplays) {
1181 std::vector<hwc2_config_t> configs;
1182
1183 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1184
1185 for (auto config : configs) {
1186 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -08001187 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001188
1189 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001190 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1191 &displayArea));
1192 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001193
1194 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1195
1196 do {
1197 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001198 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001199 } while (advance(&testLayer));
1200
1201 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1202 }
1203 }
1204 }
1205
Marissa Wall273b1df2016-12-15 12:28:47 -08001206 /* For each active display it cycles through each display config and tests
1207 * each property value. It creates multiple layers, calls the
1208 * TestLayerPropertiesFunction to set property values and then
1209 * destroys the layers */
1210 void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
Marissa Wallf7618ed2016-12-15 12:34:39 -08001211 TestLayerPropertiesFunction function, AdvanceProperties advance)
Marissa Wall273b1df2016-12-15 12:28:47 -08001212 {
1213 for (auto display : mDisplays) {
1214 std::vector<hwc2_config_t> configs;
1215
1216 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1217
1218 for (auto config : configs) {
1219 std::vector<hwc2_layer_t> layers;
Marissa Wall600a73b2016-12-15 12:30:39 -08001220 Area displayArea;
Marissa Wall273b1df2016-12-15 12:28:47 -08001221
1222 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001223 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1224 &displayArea));
Marissa Wall273b1df2016-12-15 12:28:47 -08001225
1226 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
Marissa Wall600a73b2016-12-15 12:30:39 -08001227 Hwc2TestLayers testLayers(layers, coverage, displayArea);
Marissa Wall273b1df2016-12-15 12:28:47 -08001228
Marissa Wallf7618ed2016-12-15 12:34:39 -08001229 do {
1230 for (auto layer : layers) {
1231 EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
1232 &testLayers));
1233 }
1234 } while (advance(&testLayers));
Marissa Wall273b1df2016-12-15 12:28:47 -08001235
1236 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1237 }
1238 }
1239 }
1240
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001241 /* For each active display it cycles through each display config.
1242 * 1) It attempts to set a valid property value to bad layer handle.
1243 * 2) It creates a layer x and attempts to set a valid property value to
1244 * layer x + 1
1245 * 3) It destroys the layer x and attempts to set a valid property value to
1246 * the destroyed layer x.
1247 */
1248 void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
1249 TestLayerPropertyBadLayerFunction function)
1250 {
1251 for (auto display : mDisplays) {
1252 std::vector<hwc2_config_t> configs;
1253
1254 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1255
1256 for (auto config : configs) {
1257 hwc2_layer_t layer = 0;
Marissa Wall600a73b2016-12-15 12:30:39 -08001258 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001259 hwc2_error_t err = HWC2_ERROR_NONE;
1260
1261 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001262 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1263 &displayArea));
1264 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001265
1266 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001267 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001268 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1269
1270 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1271
1272 ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001273 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001274 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1275
1276 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1277
1278 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001279 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001280 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1281 }
1282 }
1283 }
1284
1285 /* For each active display it cycles through each display config and tests
1286 * each property value. It creates a layer, sets a bad property value and
1287 * then destroys the layer */
1288 void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
1289 {
1290 for (auto display : mDisplays) {
1291 std::vector<hwc2_config_t> configs;
1292
1293 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1294
1295 for (auto config : configs) {
1296 hwc2_layer_t layer;
1297 hwc2_error_t err = HWC2_ERROR_NONE;
1298
1299 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1300
1301 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1302
1303 ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
1304 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
1305 " error code";
1306
1307 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1308 }
1309 }
1310 }
1311
Marissa Wall1cd789c2017-01-27 12:55:36 -08001312 /* For each active display it powers on the display, cycles through each
1313 * config and creates a set of layers with a certain amount of coverage.
1314 * For each active display, for each config and for each set of layers,
1315 * it calls the TestDisplayLayersFunction */
1316 void displayLayers(Hwc2TestCoverage coverage, size_t layerCnt,
1317 TestDisplayLayersFunction function)
1318 {
1319 for (auto display : mDisplays) {
1320 std::vector<hwc2_config_t> configs;
1321
1322 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1323
1324 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1325
1326 for (auto config : configs) {
1327 Area displayArea;
1328 std::vector<hwc2_layer_t> layers;
1329
1330 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1331 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
1332
1333 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1334 Hwc2TestLayers testLayers(layers, coverage, displayArea);
1335
1336 do {
1337 bool skip;
1338
1339 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
1340 &testLayers, &skip));
1341 if (!skip)
Marissa Wall706178d2016-12-15 12:39:14 -08001342 EXPECT_NO_FATAL_FAILURE(function(this, display, layers,
Marissa Wall563030b2017-02-21 14:01:05 -08001343 &testLayers));
Marissa Wall1cd789c2017-01-27 12:55:36 -08001344
1345 } while (testLayers.advance());
1346
1347 ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
1348 std::move(layers)));
1349 }
1350
1351 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1352 }
1353 }
1354
Marissa Wall706178d2016-12-15 12:39:14 -08001355 /* For each active display, it calls the
1356 * TestDisplayNonValidatedLayersFunction on a variety on non-validated
1357 * layer combinations */
1358 void displayNonValidatedLayers(size_t layerCnt,
1359 TestDisplayNonValidatedLayersFunction function)
1360 {
1361 for (auto display : mDisplays) {
1362 uint32_t numTypes, numRequests;
1363 std::vector<hwc2_layer_t> layers;
1364 bool hasChanges;
1365
1366 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1367
1368 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1369
1370 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1371
1372 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1373
1374 for (auto layer : layers) {
1375 ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1376 HWC2_COMPOSITION_CLIENT));
1377 }
1378
1379 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1380
1381 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1382 &numRequests, &hasChanges));
1383
1384 for (auto layer : layers) {
1385 ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1386 HWC2_COMPOSITION_DEVICE));
1387 }
1388
1389 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1390
1391 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1392
1393 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1394
1395 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1396 }
1397 }
1398
Marissa Wallf18cfb02017-02-21 14:01:05 -08001399 /* Test client target support on each config on each active display */
1400 void setClientTargetSupport(Hwc2TestCoverage coverage,
1401 TestClientTargetSupportFunction function,
1402 AdvanceClientTargetSupport advance)
1403 {
1404 for (auto display : mDisplays) {
1405 std::vector<hwc2_config_t> configs;
1406
1407 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1408
1409 for (auto config : configs) {
1410 Area displayArea;
1411
1412 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1413 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1414 &displayArea));
1415 Hwc2TestClientTargetSupport testClientTargetSupport(coverage,
1416 displayArea);
1417
1418 do {
1419 EXPECT_NO_FATAL_FAILURE(function(this, display,
1420 testClientTargetSupport));
1421
1422 } while (advance(&testClientTargetSupport));
1423 }
1424 }
1425 }
1426
Marissa Wall35040c52016-12-15 12:41:06 -08001427 /* Cycles through each config on each active display and calls
1428 * a TestActiveDisplayConfigFunction */
1429 void setActiveDisplayConfig(TestActiveDisplayConfigFunction function)
1430 {
1431 for (auto display : mDisplays) {
1432 std::vector<hwc2_config_t> configs;
1433
1434 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1435
1436 for (auto config : configs) {
1437 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1438
1439 EXPECT_NO_FATAL_FAILURE(function(this, display));
1440 }
1441 }
1442 }
1443
Marissa Wall600a73b2016-12-15 12:30:39 -08001444 void getActiveConfigAttribute(hwc2_display_t display,
1445 hwc2_attribute_t attribute, int32_t* outValue)
1446 {
1447 hwc2_config_t config;
1448 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
1449 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1450 attribute, outValue));
1451 ASSERT_GE(*outValue, 0) << "failed to get valid "
1452 << getAttributeName(attribute);
1453 }
1454
1455 void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
1456 {
1457 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1458 HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
1459 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1460 HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
1461 }
1462
Marissa Wall563030b2017-02-21 14:01:05 -08001463 void closeFences(hwc2_display_t display, int32_t presentFence)
1464 {
1465 std::vector<hwc2_layer_t> layers;
1466 std::vector<int32_t> fences;
1467 const int msWait = 3000;
1468
1469 if (presentFence >= 0) {
1470 ASSERT_GE(sync_wait(presentFence, msWait), 0);
1471 close(presentFence);
1472 }
1473
1474 ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences));
1475 EXPECT_EQ(layers.size(), fences.size());
1476
1477 for (int32_t fence : fences) {
1478 EXPECT_GE(sync_wait(fence, msWait), 0);
1479 if (fence >= 0)
1480 close(fence);
1481 }
1482 }
1483
Marissa Wall1cd789c2017-01-27 12:55:36 -08001484 void setLayerProperties(hwc2_display_t display, hwc2_layer_t layer,
1485 Hwc2TestLayers* testLayers, bool* outSkip)
1486 {
1487 hwc2_composition_t composition;
1488 buffer_handle_t handle = nullptr;
1489 int32_t acquireFence;
1490 hwc2_error_t err = HWC2_ERROR_NONE;
1491 *outSkip = true;
1492
1493 if (!testLayers->contains(layer))
1494 return;
1495
1496 composition = testLayers->getComposition(layer);
1497
1498 /* If the device cannot support a buffer format, then do not continue */
1499 if ((composition == HWC2_COMPOSITION_DEVICE
1500 || composition == HWC2_COMPOSITION_CURSOR)
1501 && testLayers->getBuffer(layer, &handle, &acquireFence) < 0)
1502 return;
1503
1504 EXPECT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1505 composition, &err));
1506 if (err == HWC2_ERROR_UNSUPPORTED)
1507 EXPECT_TRUE(composition != HWC2_COMPOSITION_CLIENT
1508 && composition != HWC2_COMPOSITION_DEVICE);
1509
1510 const hwc_rect_t cursor = testLayers->getCursorPosition(layer);
1511
1512 EXPECT_NO_FATAL_FAILURE(setLayerBuffer(display, layer, handle,
1513 acquireFence));
1514 EXPECT_NO_FATAL_FAILURE(setLayerBlendMode(display, layer,
1515 testLayers->getBlendMode(layer)));
1516 EXPECT_NO_FATAL_FAILURE(setLayerColor(display, layer,
1517 testLayers->getColor(layer)));
1518 EXPECT_NO_FATAL_FAILURE(setCursorPosition(display, layer, cursor.left,
1519 cursor.top));
1520 EXPECT_NO_FATAL_FAILURE(setLayerDataspace(display, layer,
1521 testLayers->getDataspace(layer)));
1522 EXPECT_NO_FATAL_FAILURE(setLayerDisplayFrame(display, layer,
1523 testLayers->getDisplayFrame(layer)));
1524 EXPECT_NO_FATAL_FAILURE(setLayerPlaneAlpha(display, layer,
1525 testLayers->getPlaneAlpha(layer)));
1526 EXPECT_NO_FATAL_FAILURE(setLayerSourceCrop(display, layer,
1527 testLayers->getSourceCrop(layer)));
1528 EXPECT_NO_FATAL_FAILURE(setLayerSurfaceDamage(display, layer,
1529 testLayers->getSurfaceDamage(layer)));
1530 EXPECT_NO_FATAL_FAILURE(setLayerTransform(display, layer,
1531 testLayers->getTransform(layer)));
1532 EXPECT_NO_FATAL_FAILURE(setLayerVisibleRegion(display, layer,
1533 testLayers->getVisibleRegion(layer)));
1534 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer,
1535 testLayers->getZOrder(layer)));
1536
1537 *outSkip = false;
1538 }
1539
1540 void setLayerProperties(hwc2_display_t display,
1541 const std::vector<hwc2_layer_t>& layers,
1542 Hwc2TestLayers* testLayers, bool* outSkip)
1543 {
1544 for (auto layer : layers) {
1545 EXPECT_NO_FATAL_FAILURE(setLayerProperties(display, layer,
1546 testLayers, outSkip));
1547 if (*outSkip)
1548 return;
1549 }
1550 }
1551
Marissa Wall563030b2017-02-21 14:01:05 -08001552 void setClientTarget(hwc2_display_t display,
1553 Hwc2TestClientTarget* testClientTarget,
1554 const Hwc2TestLayers& testLayers,
1555 const std::set<hwc2_layer_t>& clientLayers,
1556 const std::set<hwc2_layer_t>& clearLayers, bool flipClientTarget,
1557 const Area& displayArea)
1558 {
1559 android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
1560 hwc_region_t damage = { };
1561 buffer_handle_t handle;
1562 int32_t acquireFence;
1563
1564 ASSERT_EQ(testClientTarget->getBuffer(testLayers, clientLayers,
1565 clearLayers, flipClientTarget, displayArea, &handle,
1566 &acquireFence), 0);
1567 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
1568 dataspace, damage));
1569 }
1570
1571 void presentDisplays(size_t layerCnt, Hwc2TestCoverage coverage,
1572 const std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>&
1573 coverageExceptions, bool optimize)
1574 {
1575 for (auto display : mDisplays) {
1576 std::vector<hwc2_config_t> configs;
1577
1578 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1579 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1580
1581 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1582
1583 for (auto config : configs) {
1584 Area displayArea;
1585 std::vector<hwc2_layer_t> layers;
1586
1587 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1588 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1589 &displayArea));
1590
1591 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1592 Hwc2TestLayers testLayers(layers, coverage, displayArea,
1593 coverageExceptions);
1594
1595 if (optimize && !testLayers.optimizeLayouts())
1596 continue;
1597
1598 std::set<hwc2_layer_t> clientLayers;
1599 std::set<hwc2_layer_t> clearLayers;
1600 Hwc2TestClientTarget testClientTarget;
1601
1602 do {
1603 uint32_t numTypes, numRequests;
1604 bool hasChanges, skip;
1605 bool flipClientTarget;
1606 int32_t presentFence;
1607
1608 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
1609 &testLayers, &skip));
1610 if (skip)
1611 continue;
1612
1613 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1614 &numRequests, &hasChanges));
1615 if (hasChanges)
1616 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
1617 << "wrong number of requests";
1618
1619 ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
1620 testLayers, layers, numTypes, &clientLayers));
1621 ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
1622 numRequests, &clearLayers, &flipClientTarget));
1623 ASSERT_NO_FATAL_FAILURE(setClientTarget(display,
1624 &testClientTarget, testLayers, clientLayers,
1625 clearLayers, flipClientTarget, displayArea));
1626 ASSERT_NO_FATAL_FAILURE(acceptDisplayChanges(display));
1627
1628 ASSERT_NO_FATAL_FAILURE(waitForVsync());
1629
1630 EXPECT_NO_FATAL_FAILURE(presentDisplay(display,
1631 &presentFence));
1632
1633 ASSERT_NO_FATAL_FAILURE(closeFences(display, presentFence));
1634
1635 } while (testLayers.advance());
1636
1637 ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
1638 std::move(layers)));
1639 }
1640
1641 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1642 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1643 }
1644 }
1645
Marissa Wall4d600052016-12-15 12:16:01 -08001646 hwc2_device_t* mHwc2Device = nullptr;
Marissa Wallcfb9a072017-02-17 20:53:18 -08001647
1648 enum class Hwc2TestHotplugStatus {
1649 Init = 1,
1650 Receiving,
1651 Done,
1652 };
1653
1654 std::mutex mHotplugMutex;
1655 std::condition_variable mHotplugCv;
1656 Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
1657 std::unordered_set<hwc2_display_t> mDisplays;
Marissa Wall1db2e372016-12-15 12:19:39 -08001658
1659 /* Store all created layers that have not been destroyed. If an ASSERT_*
1660 * fails, then destroy the layers on exit */
1661 std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
Marissa Wall03c91732016-12-15 12:23:16 -08001662
1663 /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
1664 * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
1665 std::set<hwc2_display_t> mActiveDisplays;
Marissa Wall572a1ee2016-12-15 12:24:13 -08001666
1667 std::mutex mVsyncMutex;
1668 std::condition_variable mVsyncCv;
1669 hwc2_display_t mVsyncDisplay;
1670 int64_t mVsyncTimestamp = -1;
Marissa Wall4d600052016-12-15 12:16:01 -08001671};
1672
Marissa Wallcfb9a072017-02-17 20:53:18 -08001673void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
1674 hwc2_display_t display, int32_t connection)
1675{
1676 if (callbackData)
1677 static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
1678 connection);
1679}
1680
Marissa Wall572a1ee2016-12-15 12:24:13 -08001681void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
1682 hwc2_display_t display, int64_t timestamp)
1683{
1684 if (callbackData)
1685 static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
1686 timestamp);
1687}
1688
Marissa Wallffc67da2016-12-15 12:26:09 -08001689void setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001690 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallffc67da2016-12-15 12:26:09 -08001691{
1692 EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001693 testLayer->getBlendMode(), outErr));
1694}
1695
1696void setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1697 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1698{
1699 buffer_handle_t handle;
1700 android::base::unique_fd acquireFence;
1701 hwc2_composition_t composition = testLayer->getComposition();
1702
1703 if (composition == HWC2_COMPOSITION_CLIENT
1704 || composition == HWC2_COMPOSITION_SOLID_COLOR
1705 || composition == HWC2_COMPOSITION_SIDEBAND)
1706 return;
1707
1708 if (testLayer->getBuffer(&handle, &acquireFence) < 0)
1709 return;
1710
1711 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
1712 composition));
1713 EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
1714 handle, acquireFence, outErr));
Marissa Wallffc67da2016-12-15 12:26:09 -08001715}
1716
Marissa Wallee242782016-12-15 12:30:12 -08001717void setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001718 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallee242782016-12-15 12:30:12 -08001719{
1720 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1721 layer, HWC2_COMPOSITION_SOLID_COLOR));
1722 ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001723 layer, testLayer->getPlaneAlpha()));
Marissa Wallee242782016-12-15 12:30:12 -08001724 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001725 layer, testLayer->getBlendMode()));
Marissa Wallee242782016-12-15 12:30:12 -08001726 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001727 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08001728}
1729
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001730void setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001731 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001732{
Marissa Wall5a240aa2016-12-15 12:34:06 -08001733 hwc2_composition_t composition = testLayer->getComposition();
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001734 hwc2_error_t err = HWC2_ERROR_NONE;
1735
1736 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
1737 composition, &err));
1738 if (outErr) {
1739 *outErr = err;
1740 return;
1741 }
1742
1743 if (composition != HWC2_COMPOSITION_SIDEBAND) {
1744 EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
1745 } else {
1746 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
1747 << "returned wrong error code";
1748 }
1749}
1750
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001751void setCursorPosition(Hwc2Test* test, hwc2_display_t display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001752 hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001753{
1754 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1755 layer, HWC2_COMPOSITION_CURSOR));
1756
Marissa Wall5a240aa2016-12-15 12:34:06 -08001757 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001758 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
1759 cursorPosition.left, cursorPosition.top, outErr));
1760}
1761
Marissa Wallb72b5c92016-12-15 12:26:39 -08001762void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001763 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallb72b5c92016-12-15 12:26:39 -08001764{
1765 EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001766 testLayer->getDataspace(), outErr));
Marissa Wallb72b5c92016-12-15 12:26:39 -08001767}
1768
Marissa Wall600a73b2016-12-15 12:30:39 -08001769void setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001770 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall600a73b2016-12-15 12:30:39 -08001771{
1772 EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001773 testLayer->getDisplayFrame(), outErr));
Marissa Wall600a73b2016-12-15 12:30:39 -08001774}
1775
Marissa Wall2b1f5302016-12-15 12:27:20 -08001776void setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001777 Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
Marissa Wall2b1f5302016-12-15 12:27:20 -08001778{
1779 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001780 testLayer->getBlendMode()));
Marissa Wall2b1f5302016-12-15 12:27:20 -08001781 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001782 testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08001783}
1784
Marissa Wallc57468f2016-12-15 12:31:12 -08001785void setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001786 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallc57468f2016-12-15 12:31:12 -08001787{
1788 EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001789 testLayer->getSourceCrop(), outErr));
Marissa Wallc57468f2016-12-15 12:31:12 -08001790}
1791
Marissa Wallad761812016-12-15 12:32:24 -08001792void setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001793 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallad761812016-12-15 12:32:24 -08001794{
1795 EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001796 testLayer->getSurfaceDamage(), outErr));
Marissa Wallad761812016-12-15 12:32:24 -08001797}
1798
Marissa Wallac108192016-12-15 12:27:48 -08001799void setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001800 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallac108192016-12-15 12:27:48 -08001801{
1802 EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001803 testLayer->getTransform(), outErr));
Marissa Wallac108192016-12-15 12:27:48 -08001804}
1805
Marissa Wallf7618ed2016-12-15 12:34:39 -08001806void setVisibleRegion(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1807 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1808{
1809 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display, layer,
1810 testLayer->getVisibleRegion(), outErr));
1811}
1812
Marissa Wall273b1df2016-12-15 12:28:47 -08001813void setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001814 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall273b1df2016-12-15 12:28:47 -08001815{
1816 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001817 testLayer->getZOrder(), outErr));
Marissa Wall273b1df2016-12-15 12:28:47 -08001818}
1819
Marissa Wallffc67da2016-12-15 12:26:09 -08001820bool advanceBlendMode(Hwc2TestLayer* testLayer)
1821{
1822 return testLayer->advanceBlendMode();
1823}
1824
Marissa Wall5a240aa2016-12-15 12:34:06 -08001825bool advanceBuffer(Hwc2TestLayer* testLayer)
1826{
1827 if (testLayer->advanceComposition())
1828 return true;
1829 return testLayer->advanceBufferArea();
1830}
1831
Marissa Wallee242782016-12-15 12:30:12 -08001832bool advanceColor(Hwc2TestLayer* testLayer)
1833{
1834 /* Color depends on blend mode so advance blend mode last so color is not
1835 * force to update as often */
1836 if (testLayer->advancePlaneAlpha())
1837 return true;
1838 if (testLayer->advanceColor())
1839 return true;
1840 return testLayer->advanceBlendMode();
1841}
1842
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001843bool advanceComposition(Hwc2TestLayer* testLayer)
1844{
1845 return testLayer->advanceComposition();
1846}
1847
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001848bool advanceCursorPosition(Hwc2TestLayer* testLayer)
1849{
1850 return testLayer->advanceCursorPosition();
1851}
1852
Marissa Wallb72b5c92016-12-15 12:26:39 -08001853bool advanceDataspace(Hwc2TestLayer* testLayer)
1854{
1855 return testLayer->advanceDataspace();
1856}
1857
Marissa Wall600a73b2016-12-15 12:30:39 -08001858bool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1859{
1860 return testLayer->advanceDisplayFrame();
1861}
1862
Marissa Wall2b1f5302016-12-15 12:27:20 -08001863bool advancePlaneAlpha(Hwc2TestLayer* testLayer)
1864{
1865 return testLayer->advancePlaneAlpha();
1866}
1867
Marissa Wallc57468f2016-12-15 12:31:12 -08001868bool advanceSourceCrop(Hwc2TestLayer* testLayer)
1869{
1870 if (testLayer->advanceSourceCrop())
1871 return true;
1872 return testLayer->advanceBufferArea();
1873}
1874
Marissa Wallad761812016-12-15 12:32:24 -08001875bool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
1876{
1877 if (testLayer->advanceSurfaceDamage())
1878 return true;
1879 return testLayer->advanceBufferArea();
1880}
1881
Marissa Wallac108192016-12-15 12:27:48 -08001882bool advanceTransform(Hwc2TestLayer* testLayer)
1883{
1884 return testLayer->advanceTransform();
1885}
1886
Marissa Wallf7618ed2016-12-15 12:34:39 -08001887bool advanceVisibleRegions(Hwc2TestLayers* testLayers)
1888{
1889 return testLayers->advanceVisibleRegions();
1890}
1891
Marissa Wallf18cfb02017-02-21 14:01:05 -08001892bool advanceClientTargetSupport(
1893 Hwc2TestClientTargetSupport* testClientTargetSupport)
1894{
1895 return testClientTargetSupport->advance();
1896}
Marissa Wall4d600052016-12-15 12:16:01 -08001897
1898static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
1899 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
1900 HWC2_FUNCTION_CREATE_LAYER,
1901 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
1902 HWC2_FUNCTION_DESTROY_LAYER,
1903 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
1904 HWC2_FUNCTION_DUMP,
1905 HWC2_FUNCTION_GET_ACTIVE_CONFIG,
1906 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
1907 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
1908 HWC2_FUNCTION_GET_COLOR_MODES,
1909 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
1910 HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
1911 HWC2_FUNCTION_GET_DISPLAY_NAME,
1912 HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
1913 HWC2_FUNCTION_GET_DISPLAY_TYPE,
1914 HWC2_FUNCTION_GET_DOZE_SUPPORT,
1915 HWC2_FUNCTION_GET_HDR_CAPABILITIES,
1916 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
1917 HWC2_FUNCTION_GET_RELEASE_FENCES,
1918 HWC2_FUNCTION_PRESENT_DISPLAY,
1919 HWC2_FUNCTION_REGISTER_CALLBACK,
1920 HWC2_FUNCTION_SET_ACTIVE_CONFIG,
1921 HWC2_FUNCTION_SET_CLIENT_TARGET,
1922 HWC2_FUNCTION_SET_COLOR_MODE,
1923 HWC2_FUNCTION_SET_COLOR_TRANSFORM,
1924 HWC2_FUNCTION_SET_CURSOR_POSITION,
1925 HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
1926 HWC2_FUNCTION_SET_LAYER_BUFFER,
1927 HWC2_FUNCTION_SET_LAYER_COLOR,
1928 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
1929 HWC2_FUNCTION_SET_LAYER_DATASPACE,
1930 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
1931 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
1932 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
1933 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
1934 HWC2_FUNCTION_SET_LAYER_TRANSFORM,
1935 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
1936 HWC2_FUNCTION_SET_LAYER_Z_ORDER,
1937 HWC2_FUNCTION_SET_OUTPUT_BUFFER,
1938 HWC2_FUNCTION_SET_POWER_MODE,
1939 HWC2_FUNCTION_SET_VSYNC_ENABLED,
1940 HWC2_FUNCTION_VALIDATE_DISPLAY,
1941}};
1942
1943/* TESTCASE: Tests that the HWC2 supports all required functions. */
1944TEST_F(Hwc2Test, GET_FUNCTION)
1945{
1946 for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
1947 hwc2_function_pointer_t pfn = getFunction(descriptor);
1948 EXPECT_TRUE(pfn) << "failed to get function "
1949 << getFunctionDescriptorName(descriptor);
1950 }
1951}
1952
1953/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
1954TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
1955{
1956 hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
1957 EXPECT_FALSE(pfn) << "failed to get invalid function";
1958}
1959
1960/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
1961TEST_F(Hwc2Test, GET_CAPABILITIES)
1962{
1963 std::vector<hwc2_capability_t> capabilities;
1964
1965 getCapabilities(&capabilities);
1966
1967 EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
1968 HWC2_CAPABILITY_INVALID), 0);
1969}
Marissa Walla4b01482017-02-17 20:52:03 -08001970
1971static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1972 HWC2_CALLBACK_HOTPLUG,
1973 HWC2_CALLBACK_REFRESH,
1974 HWC2_CALLBACK_VSYNC,
1975}};
1976
1977/* TESTCASE: Tests that the HWC2 can successfully register all required
1978 * callback functions. */
1979TEST_F(Hwc2Test, REGISTER_CALLBACK)
1980{
1981 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1982 const_cast<char*>("data"));
1983
1984 for (auto descriptor : callbackDescriptors) {
1985 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1986 []() { return; }));
1987 }
1988}
1989
1990/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1991TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1992{
1993 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1994 const_cast<char*>("data"));
1995 hwc2_error_t err = HWC2_ERROR_NONE;
1996
1997 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1998 []() { return; }, &err));
1999 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2000}
2001
2002/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
2003TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
2004{
2005 hwc2_callback_data_t data = nullptr;
2006
2007 for (auto descriptor : callbackDescriptors) {
2008 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
2009 []() { return; }));
2010 }
2011}
Marissa Wallcfb9a072017-02-17 20:53:18 -08002012
2013/* TESTCASE: Tests that the HWC2 returns the correct display type for each
2014 * physical display. */
2015TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
2016{
2017 for (auto display : mDisplays) {
2018 hwc2_display_type_t type;
2019
2020 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
2021 EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
2022 " correct display type";
2023 }
2024}
2025
2026/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
2027 * display is requested. */
2028TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
2029{
2030 hwc2_display_t display;
2031 hwc2_display_type_t type;
2032 hwc2_error_t err = HWC2_ERROR_NONE;
2033
2034 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2035
2036 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
2037 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2038}
Marissa Wall1db2e372016-12-15 12:19:39 -08002039
2040/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
2041TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
2042{
2043 for (auto display : mDisplays) {
2044 hwc2_layer_t layer;
2045
2046 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2047
2048 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2049 }
2050}
2051
2052/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
2053TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
2054{
2055 hwc2_display_t display;
2056 hwc2_layer_t layer;
2057 hwc2_error_t err = HWC2_ERROR_NONE;
2058
2059 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2060
2061 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
2062 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2063}
2064
2065/* TESTCASE: Tests that the HWC2 will either support a large number of resources
2066 * or will return no resources. */
2067TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
2068{
2069 const size_t layerCnt = 1000;
2070
2071 for (auto display : mDisplays) {
2072 std::vector<hwc2_layer_t> layers;
2073
2074 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
2075
2076 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
2077 }
2078}
2079
2080/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
2081TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
2082{
2083 hwc2_display_t badDisplay;
2084
2085 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
2086
2087 for (auto display : mDisplays) {
2088 hwc2_layer_t layer = 0;
2089 hwc2_error_t err = HWC2_ERROR_NONE;
2090
2091 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
2092 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2093
2094 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2095
2096 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
2097 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2098
2099 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2100 }
2101}
2102
2103/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
2104TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
2105{
2106 for (auto display : mDisplays) {
2107 hwc2_layer_t layer;
2108 hwc2_error_t err = HWC2_ERROR_NONE;
2109
2110 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
2111 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2112
2113 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
2114 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2115
2116 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
2117 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2118
2119 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
2120 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2121
2122 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
2123 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2124
2125 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2126
2127 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
2128 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2129
2130 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2131
2132 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
2133 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2134 }
2135}
Marissa Wallcf935cb2016-12-15 12:20:47 -08002136
2137static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
2138 HWC2_ATTRIBUTE_WIDTH,
2139 HWC2_ATTRIBUTE_HEIGHT,
2140}};
2141
2142static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
2143 HWC2_ATTRIBUTE_VSYNC_PERIOD,
2144 HWC2_ATTRIBUTE_DPI_X,
2145 HWC2_ATTRIBUTE_DPI_Y,
2146}};
2147
2148/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
2149 * config. */
2150TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
2151{
2152 for (auto display : mDisplays) {
2153 std::vector<hwc2_config_t> configs;
2154
2155 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2156
2157 for (auto config : configs) {
2158 int32_t value;
2159
2160 for (auto attribute : requiredAttributes) {
2161 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2162 attribute, &value));
2163 EXPECT_GE(value, 0) << "missing required attribute "
2164 << getAttributeName(attribute) << " for config "
2165 << config;
2166 }
2167 for (auto attribute : optionalAttributes) {
2168 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2169 attribute, &value));
2170 }
2171 }
2172 }
2173}
2174
2175/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
2176 * attribute */
2177TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
2178{
2179 const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
2180
2181 for (auto display : mDisplays) {
2182 std::vector<hwc2_config_t> configs;
2183
2184 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2185
2186 for (auto config : configs) {
2187 int32_t value;
2188 hwc2_error_t err = HWC2_ERROR_NONE;
2189
2190 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2191 attribute, &value, &err));
2192 EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
2193 " attribute for config " << config;
2194 }
2195 }
2196}
2197
2198/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
2199TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
2200{
2201 hwc2_display_t display;
2202 const hwc2_config_t config = 0;
2203 int32_t value;
2204 hwc2_error_t err = HWC2_ERROR_NONE;
2205
2206 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2207
2208 for (auto attribute : requiredAttributes) {
2209 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
2210 &value, &err));
2211 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2212 }
2213
2214 for (auto attribute : optionalAttributes) {
2215 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
2216 &value, &err));
2217 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2218 }
2219}
2220
2221/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
2222TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
2223{
2224 for (auto display : mDisplays) {
2225 hwc2_config_t config;
2226 int32_t value;
2227 hwc2_error_t err = HWC2_ERROR_NONE;
2228
2229 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
2230
2231 for (auto attribute : requiredAttributes) {
2232 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2233 attribute, &value, &err));
2234 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2235 }
2236
2237 for (auto attribute : optionalAttributes) {
2238 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2239 attribute, &value, &err));
2240 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2241 }
2242 }
2243}
2244
2245/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
2246TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
2247{
2248 for (auto display : mDisplays) {
2249 std::vector<hwc2_config_t> configs;
2250
2251 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2252 }
2253}
2254
2255/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
2256TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
2257{
2258 hwc2_display_t display;
2259 std::vector<hwc2_config_t> configs;
2260 hwc2_error_t err = HWC2_ERROR_NONE;
2261
2262 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2263
2264 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
2265
2266 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2267 EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
2268}
2269
2270/* TESTCASE: Tests that the HWC2 will return the same config list multiple
2271 * times in a row. */
2272TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
2273{
2274 for (auto display : mDisplays) {
2275 std::vector<hwc2_config_t> configs1, configs2;
2276
2277 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
2278 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
2279
2280 EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
2281 configs2.begin())) << "returned two different config sets";
2282 }
2283}
2284
2285/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
2286TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
2287{
2288 for (auto display : mDisplays) {
2289 std::vector<hwc2_config_t> configs;
2290
2291 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2292
2293 std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
2294 configs.end());
2295 EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
2296 " configs";
2297 }
2298}
Marissa Wall93dc04f2016-12-15 12:21:46 -08002299
2300/* TESTCASE: Tests that the HWC2 returns the active config for a display */
2301TEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
2302{
2303 for (auto display : mDisplays) {
2304 std::vector<hwc2_config_t> configs;
2305
2306 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2307
2308 for (auto config : configs) {
2309 hwc2_config_t activeConfig;
2310
2311 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2312 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
2313
2314 EXPECT_EQ(activeConfig, config) << "failed to get active config";
2315 }
2316 }
2317}
2318
2319/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
2320 * display. */
2321TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
2322{
2323 hwc2_display_t display;
2324 hwc2_config_t activeConfig;
2325 hwc2_error_t err = HWC2_ERROR_NONE;
2326
2327 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2328
2329 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
2330
2331 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2332}
2333
2334/* TESTCASE: Tests that the HWC2 either begins with a valid active config
2335 * or returns an error when getActiveConfig is called. */
2336TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
2337{
2338 for (auto display : mDisplays) {
2339 std::vector<hwc2_config_t> configs;
2340 hwc2_config_t activeConfig;
2341 hwc2_error_t err = HWC2_ERROR_NONE;
2342
2343 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2344
2345 if (configs.empty())
2346 return;
2347
2348 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
2349 if (err == HWC2_ERROR_NONE) {
2350 EXPECT_NE(std::count(configs.begin(), configs.end(),
2351 activeConfig), 0) << "active config is not found in "
2352 " configs for display";
2353 } else {
2354 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2355 }
2356 }
2357}
2358
2359/* TESTCASE: Tests that the HWC2 can set every display config as an active
2360 * config */
2361TEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
2362{
2363 for (auto display : mDisplays) {
2364 std::vector<hwc2_config_t> configs;
2365
2366 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2367
2368 for (auto config : configs) {
2369 EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2370 }
2371 }
2372}
2373
2374/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
2375TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
2376{
2377 hwc2_display_t display;
2378 const hwc2_config_t config = 0;
2379 hwc2_error_t err = HWC2_ERROR_NONE;
2380
2381 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2382
2383 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
2384 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2385}
2386
2387/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
2388TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
2389{
2390 for (auto display : mDisplays) {
2391 hwc2_config_t config;
2392 hwc2_error_t err = HWC2_ERROR_NONE;
2393
2394 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
2395
2396 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
2397 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2398 }
2399}
Marissa Wall03c91732016-12-15 12:23:16 -08002400
2401/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
2402TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
2403{
2404 for (auto display : mDisplays) {
2405 int32_t support = -1;
2406
2407 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2408
2409 EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
2410 }
2411}
2412
2413/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
2414TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
2415{
2416 hwc2_display_t display;
2417 int32_t support = -1;
2418 hwc2_error_t err = HWC2_ERROR_NONE;
2419
2420 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2421
2422 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2423
2424 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2425}
2426
2427/* TESTCASE: Tests that the HWC2 can set all supported power modes */
2428TEST_F(Hwc2Test, SET_POWER_MODE)
2429{
2430 for (auto display : mDisplays) {
2431 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2432 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2433
2434 int32_t support = -1;
2435 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2436 if (support != 1)
2437 return;
2438
2439 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2440 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2441 HWC2_POWER_MODE_DOZE_SUSPEND));
2442
2443 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2444 }
2445}
2446
2447/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
2448TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
2449{
2450 hwc2_display_t display;
2451 hwc2_error_t err = HWC2_ERROR_NONE;
2452
2453 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2454
2455 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
2456 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2457
2458 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
2459 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2460
2461 int32_t support = -1;
2462 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2463 if (support != 1)
2464 return;
2465
2466 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
2467 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2468
2469 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
2470 &err));
2471 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2472}
2473
2474/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
2475TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
2476{
2477 for (auto display : mDisplays) {
2478 hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
2479 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
2480 hwc2_error_t err = HWC2_ERROR_NONE;
2481
2482 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
2483 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
2484 << mode;
2485 }
2486}
2487
2488/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
2489 * an optional power mode. */
2490TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
2491{
2492 for (auto display : mDisplays) {
2493 int32_t support = -1;
2494 hwc2_error_t err = HWC2_ERROR_NONE;
2495
2496 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2497 if (support == 1)
2498 return;
2499
2500 ASSERT_EQ(support, 0) << "invalid doze support value";
2501
2502 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
2503 &err));
2504 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
2505
2506 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2507 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
2508 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
2509 }
2510}
2511
2512/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
2513TEST_F(Hwc2Test, SET_POWER_MODE_stress)
2514{
2515 for (auto display : mDisplays) {
2516 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2517 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2518
2519 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2520 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2521
2522 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2523 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2524
2525 int32_t support = -1;
2526 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2527 if (support != 1)
2528 return;
2529
2530 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2531 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2532
2533 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2534 HWC2_POWER_MODE_DOZE_SUSPEND));
2535 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2536 HWC2_POWER_MODE_DOZE_SUSPEND));
2537
2538 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2539 }
2540}
Marissa Wall572a1ee2016-12-15 12:24:13 -08002541
2542/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
2543 * displays */
2544TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
2545{
2546 for (auto display : mDisplays) {
2547 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2548 const_cast<char*>("data"));
2549
2550 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2551
2552 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2553 []() { return; }));
2554
2555 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2556
2557 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2558
2559 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2560 }
2561}
2562
2563/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
2564TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
2565{
2566 for (auto display : mDisplays) {
2567 hwc2_display_t receivedDisplay;
2568 int64_t receivedTimestamp;
2569
2570 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2571
2572 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
2573
2574 ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
2575 &receivedTimestamp));
2576
2577 EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
2578 EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
2579
2580 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
2581
2582 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2583 }
2584}
2585
2586/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
2587TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
2588{
2589 hwc2_display_t display;
2590 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2591 const_cast<char*>("data"));
2592 hwc2_error_t err = HWC2_ERROR_NONE;
2593
2594 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2595
2596 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2597 []() { return; }));
2598
2599 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
2600 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2601
2602 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
2603 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2604}
2605
2606/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
2607TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
2608{
2609 for (auto display : mDisplays) {
2610 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2611 const_cast<char*>("data"));
2612 hwc2_error_t err = HWC2_ERROR_NONE;
2613
2614 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2615
2616 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2617 []() { return; }));
2618
2619 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
2620 &err));
2621 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2622
2623 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2624 }
2625}
2626
2627/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
2628 * times. */
2629TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
2630{
2631 for (auto display : mDisplays) {
2632 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2633 const_cast<char*>("data"));
2634
2635 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2636
2637 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2638 []() { return; }));
2639
2640 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2641
2642 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2643 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2644
2645 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2646 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2647
2648 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2649 }
2650}
2651
2652/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
2653 * is off and no callback is registered. */
2654TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
2655{
2656 const uint secs = 1;
2657
2658 for (auto display : mDisplays) {
2659 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2660
2661 sleep(secs);
2662
2663 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2664 }
2665}
2666
2667/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
2668 * is registered. */
2669TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
2670{
2671 const uint secs = 1;
2672
2673 for (auto display : mDisplays) {
2674 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2675
2676 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2677
2678 sleep(secs);
2679
2680 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2681
2682 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2683 }
2684}
Marissa Walldd4087f2016-12-15 12:24:52 -08002685
2686/* TESTCASE: Tests that the HWC2 returns a display name for each display */
2687TEST_F(Hwc2Test, GET_DISPLAY_NAME)
2688{
2689 for (auto display : mDisplays) {
2690 std::string name;
2691
2692 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
2693 }
2694}
2695
2696/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
2697 * display */
2698TEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
2699{
2700 hwc2_display_t display;
2701 std::string name;
2702 hwc2_error_t err = HWC2_ERROR_NONE;
2703
2704 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2705
2706 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
2707 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2708}
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08002709
2710/* TESTCASE: Tests that the HWC2 can set basic composition types. */
2711TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
2712{
2713 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2714 setComposition, advanceComposition));
2715}
2716
2717/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
2718 * layer. */
2719TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
2720{
2721 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2722 setComposition, advanceComposition));
2723}
2724
2725/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
2726TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
2727{
2728 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2729 setComposition));
2730}
2731
2732/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
2733TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
2734{
2735 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2736 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2737 hwc2_error_t* outErr) {
2738
2739 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
2740 layer, HWC2_COMPOSITION_INVALID, outErr));
2741 }
2742 ));
2743}
Marissa Wallffc67da2016-12-15 12:26:09 -08002744
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002745/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
2746TEST_F(Hwc2Test, SET_CURSOR_POSITION)
2747{
2748 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2749 ::setCursorPosition, advanceCursorPosition));
2750}
2751
2752/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
2753TEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
2754{
2755 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2756 ::setCursorPosition, advanceCursorPosition));
2757}
2758
2759/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
2760 * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
2761TEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
2762{
2763 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2764 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002765 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002766
Marissa Wall5a240aa2016-12-15 12:34:06 -08002767 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002768 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
2769 cursorPosition.left, cursorPosition.top, outErr));
2770 },
2771
2772 advanceCursorPosition));
2773}
2774
2775/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
2776 * display. */
2777TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
2778{
2779 hwc2_display_t display;
2780 hwc2_layer_t layer = 0;
2781 int32_t x = 0, y = 0;
2782 hwc2_error_t err = HWC2_ERROR_NONE;
2783
2784 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2785
2786 ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
2787 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2788}
2789
2790/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
2791TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
2792{
2793 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2794 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002795 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002796
Marissa Wall5a240aa2016-12-15 12:34:06 -08002797 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002798 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
2799 badLayer, cursorPosition.left, cursorPosition.top,
2800 outErr));
2801 }
2802 ));
2803}
2804
Marissa Wallffc67da2016-12-15 12:26:09 -08002805/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
2806TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
2807{
2808 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2809 setBlendMode, advanceBlendMode));
2810}
2811
2812/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
2813TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
2814{
2815 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2816 setBlendMode, advanceBlendMode));
2817}
2818
2819/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
2820TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
2821{
2822 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2823 setBlendMode));
2824}
2825
2826/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
2827TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
2828{
2829 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2830 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2831 hwc2_error_t* outErr) {
2832
2833 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
2834 layer, HWC2_BLEND_MODE_INVALID, outErr));
2835 }
2836 ));
2837}
Marissa Wallb72b5c92016-12-15 12:26:39 -08002838
Marissa Wall5a240aa2016-12-15 12:34:06 -08002839/* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
2840TEST_F(Hwc2Test, SET_LAYER_BUFFER)
2841{
2842 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2843 setBuffer, advanceBuffer));
2844}
2845
2846/* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
2847TEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
2848{
2849 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2850 setBuffer, advanceBuffer));
2851}
2852
2853/* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
2854TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
2855{
2856 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2857 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
2858 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2859
2860 buffer_handle_t handle = nullptr;
2861 android::base::unique_fd acquireFence;
2862
2863 /* If there is not available buffer for the given buffer
2864 * properties, it should not fail this test case */
2865 if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
2866 *outErr = HWC2_ERROR_BAD_LAYER;
2867 return;
2868 }
2869
2870 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
2871 handle, acquireFence, outErr));
2872 }
2873 ));
2874}
2875
2876/* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
2877TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
2878{
2879 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2880 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2881 hwc2_error_t* outErr) {
2882
2883 buffer_handle_t handle = nullptr;
2884 int32_t acquireFence = -1;
2885
2886 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
2887 handle, acquireFence, outErr));
2888 }
2889 ));
2890}
2891
Marissa Wallee242782016-12-15 12:30:12 -08002892/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
2893TEST_F(Hwc2Test, SET_LAYER_COLOR)
2894{
2895 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2896 setColor, advanceColor));
2897}
2898
2899/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
2900TEST_F(Hwc2Test, SET_LAYER_COLOR_update)
2901{
2902 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2903 setColor, advanceColor));
2904}
2905
2906/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
2907 * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
2908TEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
2909{
2910 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
2911 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002912 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08002913
2914 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002915 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08002916 },
2917
2918 advanceColor));
2919}
2920
2921/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
2922TEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
2923{
2924 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2925 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002926 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08002927
2928 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002929 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08002930 }
2931 ));
2932}
2933
Marissa Wallb72b5c92016-12-15 12:26:39 -08002934/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
2935TEST_F(Hwc2Test, SET_LAYER_DATASPACE)
2936{
2937 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2938 setDataspace, advanceDataspace));
2939}
2940
2941/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
2942TEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
2943{
2944 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2945 setDataspace, advanceDataspace));
2946}
2947
2948/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
2949TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
2950{
2951 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2952 setDataspace));
2953}
Marissa Wall2b1f5302016-12-15 12:27:20 -08002954
Marissa Wall600a73b2016-12-15 12:30:39 -08002955/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
2956TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
2957{
2958 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2959 setDisplayFrame, advanceDisplayFrame));
2960}
2961
2962/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
2963TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
2964{
2965 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2966 setDisplayFrame, advanceDisplayFrame));
2967}
2968
2969/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
2970TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
2971{
2972 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2973 setDisplayFrame));
2974}
2975
Marissa Wall2b1f5302016-12-15 12:27:20 -08002976/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
2977TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
2978{
2979 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2980 setPlaneAlpha, advancePlaneAlpha));
2981}
2982
2983/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
2984TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
2985{
2986 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2987 setPlaneAlpha, advancePlaneAlpha));
2988}
2989
2990/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
2991TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
2992{
2993 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2994 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002995 Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
Marissa Wall2b1f5302016-12-15 12:27:20 -08002996
2997 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002998 badLayer, testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08002999 }
3000 ));
3001}
Marissa Wallac108192016-12-15 12:27:48 -08003002
Marissa Wallc57468f2016-12-15 12:31:12 -08003003/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
3004TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
3005{
3006 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3007 setSourceCrop, advanceSourceCrop));
3008}
3009
3010/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
3011TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
3012{
3013 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3014 setSourceCrop, advanceSourceCrop));
3015}
3016
3017/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
3018TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
3019{
3020 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3021 setSourceCrop));
3022}
3023
Marissa Wallad761812016-12-15 12:32:24 -08003024/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
3025TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
3026{
3027 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3028 setSurfaceDamage, advanceSurfaceDamage));
3029}
3030
3031/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
3032TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
3033{
3034 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3035 setSurfaceDamage, advanceSurfaceDamage));
3036}
3037
3038/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
3039TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
3040{
3041 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3042 setSurfaceDamage));
3043}
3044
Marissa Wallac108192016-12-15 12:27:48 -08003045/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
3046TEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
3047{
3048 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3049 setTransform, advanceTransform));
3050}
3051
3052/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
3053TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
3054{
3055 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3056 setTransform, advanceTransform));
3057}
3058
3059/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
3060TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
3061{
3062 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3063 setTransform));
3064}
Marissa Wall273b1df2016-12-15 12:28:47 -08003065
Marissa Wallf7618ed2016-12-15 12:34:39 -08003066/* TESTCASE: Tests that the HWC2 can set the visible region of a layer. */
3067TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION)
3068{
3069 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Basic, 5,
3070 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
3071 Hwc2TestLayers* testLayers) {
3072
3073 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display,
3074 layer, testLayers->getVisibleRegion(layer)));
3075 },
3076
3077 advanceVisibleRegions));
3078}
3079
3080/* TESTCASE: Tests that the HWC2 cannot set the visible region of a bad layer. */
3081TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION_bad_layer)
3082{
3083 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3084 setVisibleRegion));
3085}
3086
Marissa Wall273b1df2016-12-15 12:28:47 -08003087/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
3088TEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
3089{
3090 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
3091 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003092 Hwc2TestLayers* testLayers) {
Marissa Wall273b1df2016-12-15 12:28:47 -08003093
3094 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003095 testLayers->getZOrder(layer)));
Marissa Wallf7618ed2016-12-15 12:34:39 -08003096 },
3097
3098 /* TestLayer z orders are set during the construction of TestLayers
3099 * and cannot be updated. There is no need (or ability) to cycle
3100 * through additional z order configurations. */
3101 [] (Hwc2TestLayers* /*testLayers*/) {
3102 return false;
Marissa Wall273b1df2016-12-15 12:28:47 -08003103 }
3104 ));
3105}
3106
3107/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
3108TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
3109{
3110 const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
3111 static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
3112 static_cast<uint32_t>(UINT32_MAX / 2),
3113 static_cast<uint32_t>(UINT32_MAX) };
3114
3115 for (auto display : mDisplays) {
3116 std::vector<hwc2_config_t> configs;
3117
3118 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3119
3120 for (auto config : configs) {
3121 hwc2_layer_t layer;
3122
3123 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3124
3125 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
3126
3127 for (uint32_t zOrder : zOrders) {
3128 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
3129 }
3130
3131 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
3132 }
3133 }
3134}
3135
3136/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
3137TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
3138{
3139 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3140 setZOrder));
3141}
Marissa Wall1cd789c2017-01-27 12:55:36 -08003142
3143/* TESTCASE: Tests that the HWC2 can display a layer with basic property
3144 * coverage */
3145TEST_F(Hwc2Test, VALIDATE_DISPLAY_basic)
3146{
3147 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3148 [] (Hwc2Test* test, hwc2_display_t display,
Marissa Wall706178d2016-12-15 12:39:14 -08003149 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003150 Hwc2TestLayers* /*testLayers*/) {
Marissa Wall1cd789c2017-01-27 12:55:36 -08003151
3152 uint32_t numTypes, numRequests;
3153 bool hasChanges = false;
3154
3155 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3156 &numRequests, &hasChanges));
3157 if (hasChanges)
3158 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
3159 << "wrong number of requests";
3160 }
3161 ));
3162}
3163
3164/* TESTCASE: Tests that the HWC2 can display 5 layers with default coverage. */
3165TEST_F(Hwc2Test, VALIDATE_DISPLAY_default_5)
3166{
3167 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 5,
3168 [] (Hwc2Test* test, hwc2_display_t display,
Marissa Wall706178d2016-12-15 12:39:14 -08003169 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003170 Hwc2TestLayers* /*testLayers*/) {
Marissa Wall1cd789c2017-01-27 12:55:36 -08003171
3172 uint32_t numTypes, numRequests;
3173 bool hasChanges = false;
3174
3175 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3176 &numRequests, &hasChanges));
3177 if (hasChanges)
3178 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
3179 << "wrong number of requests";
3180 }
3181 ));
3182}
3183
3184/* TESTCASE: Tests that the HWC2 cannot validate a bad display */
3185TEST_F(Hwc2Test, VALIDATE_DISPLAY_bad_display)
3186{
3187 hwc2_display_t display;
3188 uint32_t numTypes, numRequests;
3189 hwc2_error_t err = HWC2_ERROR_NONE;
3190
3191 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3192
3193 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes, &numRequests,
3194 &err));
3195 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3196}
Marissa Wall706178d2016-12-15 12:39:14 -08003197
3198/* TESTCASE: Tests that the HWC2 can get display requests after validating a
3199 * basic layer. */
3200TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_basic)
3201{
3202 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3203 [] (Hwc2Test* test, hwc2_display_t display,
3204 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003205 Hwc2TestLayers* /*testLayers*/) {
Marissa Wall706178d2016-12-15 12:39:14 -08003206
3207 uint32_t numTypes, numRequests;
3208 bool hasChanges = false;
3209
3210 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3211 &numRequests, &hasChanges));
3212 if (hasChanges)
3213 EXPECT_LE(numTypes, layers.size())
3214 << "wrong number of requests";
3215
3216 EXPECT_NO_FATAL_FAILURE(test->handleRequests(display, layers,
3217 numRequests));
3218 }
3219 ));
3220}
3221
3222/* TESTCASE: Tests that the HWC2 cannot get display requests from a bad display */
3223TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_bad_display)
3224{
3225 hwc2_display_t display;
3226 hwc2_display_request_t displayRequests;
3227 std::vector<hwc2_layer_t> layers;
3228 std::vector<hwc2_layer_request_t> layerRequests;
3229 hwc2_error_t err = HWC2_ERROR_NONE;
3230
3231 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3232
3233 EXPECT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequests,
3234 &layers, &layerRequests, &err));
3235 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3236}
3237
3238/* TESTCASE: Tests that the HWC2 cannot get display requests from an non
3239 * validated display. */
3240TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_not_validated)
3241{
3242 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3243 [] (Hwc2Test* test, hwc2_display_t display,
3244 std::vector<hwc2_layer_t>* layers) {
3245
3246 hwc2_display_request_t displayRequests;
3247 std::vector<hwc2_layer_request_t> layerRequests;
3248 hwc2_error_t err = HWC2_ERROR_NONE;
3249
3250 ASSERT_NO_FATAL_FAILURE(test->getDisplayRequests(display,
3251 &displayRequests, layers, &layerRequests, &err));
3252 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3253 << "returned wrong error code";
3254 }
3255 ));
3256}
3257
3258/* TESTCASE: Tests that the HWC2 can get changed composition types after
3259 * validating a basic layer. */
3260TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_basic)
3261{
3262 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3263 [] (Hwc2Test* test, hwc2_display_t display,
3264 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003265 Hwc2TestLayers* testLayers) {
Marissa Wall706178d2016-12-15 12:39:14 -08003266
3267 uint32_t numTypes, numRequests;
3268 bool hasChanges = false;
3269
3270 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3271 &numRequests, &hasChanges));
3272 if (hasChanges)
3273 EXPECT_LE(numTypes, layers.size())
3274 << "wrong number of requests";
3275
3276 EXPECT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
Marissa Wall563030b2017-02-21 14:01:05 -08003277 *testLayers, layers, numTypes));
Marissa Wall706178d2016-12-15 12:39:14 -08003278 }
3279 ));
3280}
3281
3282/* TESTCASE: Tests that the HWC2 cannot get changed composition types from a bad
3283 * display */
3284TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_bad_display)
3285{
3286 hwc2_display_t display;
3287 std::vector<hwc2_layer_t> layers;
3288 std::vector<hwc2_composition_t> types;
3289 hwc2_error_t err = HWC2_ERROR_NONE;
3290
3291 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3292
3293 EXPECT_NO_FATAL_FAILURE(getChangedCompositionTypes(display, &layers,
3294 &types, &err));
3295 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3296}
3297
3298/* TESTCASE: Tests that the HWC2 cannot get changed composition types from an non
3299 * validated display. */
3300TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_not_validated)
3301{
3302 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3303 [] (Hwc2Test* test, hwc2_display_t display,
3304 std::vector<hwc2_layer_t>* layers) {
3305
3306 std::vector<hwc2_composition_t> types;
3307 hwc2_error_t err = HWC2_ERROR_NONE;
3308
3309 ASSERT_NO_FATAL_FAILURE(test->getChangedCompositionTypes(
3310 display, layers, &types, &err));
3311 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3312 << "returned wrong error code";
3313 }
3314 ));
3315}
3316
3317/* TESTCASE: Tests that the HWC2 can accept display changes after validating a
3318 * basic layer. */
3319TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_basic)
3320{
3321 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3322 [] (Hwc2Test* test, hwc2_display_t display,
3323 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003324 Hwc2TestLayers* testLayers) {
Marissa Wall706178d2016-12-15 12:39:14 -08003325
3326 uint32_t numTypes, numRequests;
3327 bool hasChanges = false;
3328
3329 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3330 &numRequests, &hasChanges));
3331 if (hasChanges)
3332 EXPECT_LE(numTypes, layers.size())
3333 << "wrong number of requests";
3334
3335 ASSERT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
Marissa Wall563030b2017-02-21 14:01:05 -08003336 *testLayers, layers, numTypes));
Marissa Wall706178d2016-12-15 12:39:14 -08003337
3338 EXPECT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display));
3339 }
3340 ));
3341}
3342
3343/* TESTCASE: Tests that the HWC2 cannot accept display changes from a bad
3344 * display */
3345TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_bad_display)
3346{
3347 hwc2_display_t display;
3348 hwc2_error_t err = HWC2_ERROR_NONE;
3349
3350 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3351
3352 EXPECT_NO_FATAL_FAILURE(acceptDisplayChanges(display, &err));
3353 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3354}
3355
3356/* TESTCASE: Tests that the HWC2 cannot accept display changes from an non
3357 * validated display. */
3358TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_not_validated)
3359{
3360 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3361 [] (Hwc2Test* test, hwc2_display_t display,
3362 std::vector<hwc2_layer_t>* /*layers*/) {
3363
3364 hwc2_error_t err = HWC2_ERROR_NONE;
3365
3366 ASSERT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display, &err));
3367 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3368 << "returned wrong error code";
3369 }
3370 ));
3371}
Marissa Wallf18cfb02017-02-21 14:01:05 -08003372
3373/* TESTCASE: Tests that the HWC2 supports client target with required values */
3374TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT)
3375{
3376 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3377 [] (Hwc2Test* test, hwc2_display_t display,
3378 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3379
3380 const Area bufferArea = testClientTargetSupport.getBufferArea();
3381 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3382
3383 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3384 bufferArea.width, bufferArea.height, format,
3385 testClientTargetSupport.getDataspace()));
3386 },
3387
3388 advanceClientTargetSupport));
3389}
3390
3391/* TESTCASE: Tests that the HWC2 cannot get client target support for a bad
3392 * display. */
3393TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_bad_display)
3394{
3395 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3396 [] (Hwc2Test* test, hwc2_display_t /*display*/,
3397 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3398
3399 const Area bufferArea = testClientTargetSupport.getBufferArea();
3400 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3401 hwc2_display_t badDisplay;
3402 hwc2_error_t err = HWC2_ERROR_NONE;
3403
3404 ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
3405
3406 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(badDisplay,
3407 bufferArea.width, bufferArea.height, format,
3408 testClientTargetSupport.getDataspace(), &err));
3409 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3410 },
3411
3412 advanceClientTargetSupport));
3413}
3414
3415/* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
3416 * for a variety of client target values. */
3417TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_unsupported)
3418{
3419 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Complete,
3420 [] (Hwc2Test* test, hwc2_display_t display,
3421 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3422
3423 const Area bufferArea = testClientTargetSupport.getBufferArea();
3424 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3425 hwc2_error_t err = HWC2_ERROR_NONE;
3426
3427 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3428 bufferArea.width, bufferArea.height, format,
3429 testClientTargetSupport.getDataspace(), &err));
3430 EXPECT_TRUE(err == HWC2_ERROR_NONE
3431 || err == HWC2_ERROR_UNSUPPORTED)
3432 << "returned wrong error code";
3433 },
3434
3435 advanceClientTargetSupport));
3436}
3437
3438/* TESTCASE: Tests that the HWC2 can set a client target buffer for a basic
3439 * layer. */
3440TEST_F(Hwc2Test, SET_CLIENT_TARGET_basic)
3441{
3442 const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3443 const hwc_region_t damage = { };
3444 const size_t layerCnt = 1;
3445
3446 for (auto display : mDisplays) {
3447 std::vector<hwc2_config_t> configs;
3448
3449 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
3450
3451 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3452
3453 for (auto config : configs) {
3454 Area displayArea;
3455 std::vector<hwc2_layer_t> layers;
3456
3457 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3458 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
3459
3460 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
3461 Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Basic,
3462 displayArea);
3463
3464 if (!testLayers.optimizeLayouts())
3465 continue;
3466
3467 Hwc2TestClientTarget testClientTarget;
3468
3469 do {
3470 std::set<hwc2_layer_t> clientLayers;
3471 std::set<hwc2_layer_t> clearLayers;
3472 uint32_t numTypes, numRequests;
3473 bool hasChanges, skip;
3474 bool flipClientTarget;
3475 buffer_handle_t handle;
3476 int32_t acquireFence;
3477
3478 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
3479 &testLayers, &skip));
3480 if (skip)
3481 continue;
3482
3483 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
3484 &numRequests, &hasChanges));
3485 if (hasChanges)
3486 EXPECT_LE(numTypes, layers.size())
3487 << "wrong number of requests";
3488
3489 ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
3490 testLayers, layers, numTypes, &clientLayers));
3491 ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
3492 numRequests, &clearLayers, &flipClientTarget));
3493 ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3494 clearLayers, flipClientTarget, displayArea, &handle,
3495 &acquireFence), 0);
3496 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle,
3497 acquireFence, dataspace, damage));
3498
3499 if (acquireFence >= 0)
3500 close(acquireFence);
3501
3502 } while (testLayers.advance());
3503
3504 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
3505 }
3506
3507 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
3508 }
3509}
3510
3511/* TESTCASE: Tests that the HWC2 cannot set a client target for a bad display. */
3512TEST_F(Hwc2Test, SET_CLIENT_TARGET_bad_display)
3513{
3514 hwc2_display_t display;
3515 std::vector<hwc2_layer_t> layers;
3516 const Area displayArea = {0, 0};
3517 Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Default, displayArea);
3518 std::set<hwc2_layer_t> clientLayers;
3519 std::set<hwc2_layer_t> flipClientTargetLayers;
3520 bool flipClientTarget = true;
3521 const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3522 const hwc_region_t damage = { };
3523 buffer_handle_t handle;
3524 int32_t acquireFence;
3525 hwc2_error_t err = HWC2_ERROR_NONE;
3526
3527 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3528
3529 Hwc2TestClientTarget testClientTarget;
3530
3531 ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3532 flipClientTargetLayers, flipClientTarget, displayArea, &handle,
3533 &acquireFence), 0);
3534
3535 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
3536 dataspace, damage, &err));
3537
3538 if (acquireFence >= 0)
3539 close(acquireFence);
3540
3541 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3542}
Marissa Wall563030b2017-02-21 14:01:05 -08003543
3544/* TESTCASE: Tests that the HWC2 can present 1 default layer. */
3545TEST_F(Hwc2Test, PRESENT_DISPLAY_default_1)
3546{
3547 const size_t layerCnt = 1;
3548 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3549 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3550 bool optimize = false;
3551
3552 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3553 optimize));
3554}
3555
3556/* TESTCASE: Tests that the HWC2 can present 2 default layers. */
3557TEST_F(Hwc2Test, PRESENT_DISPLAY_default_2)
3558{
3559 const size_t layerCnt = 2;
3560 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3561 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3562 bool optimize = false;
3563
3564 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3565 optimize));
3566}
3567
3568/* TESTCASE: Tests that the HWC2 can present 3 default layers. */
3569TEST_F(Hwc2Test, PRESENT_DISPLAY_default_3)
3570{
3571 const size_t layerCnt = 3;
3572 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3573 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3574 bool optimize = false;
3575
3576 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3577 optimize));
3578}
3579
3580/* TESTCASE: Tests that the HWC2 can present 4 default layers. */
3581TEST_F(Hwc2Test, PRESENT_DISPLAY_default_4)
3582{
3583 const size_t layerCnt = 4;
3584 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3585 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3586 bool optimize = false;
3587
3588 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3589 optimize));
3590}
3591
3592/* TESTCASE: Tests that the HWC2 can present 5 default layers. */
3593TEST_F(Hwc2Test, PRESENT_DISPLAY_default_5)
3594{
3595 const size_t layerCnt = 5;
3596 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3597 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3598 bool optimize = false;
3599
3600 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3601 optimize));
3602}
3603
3604/* TESTCASE: Tests that the HWC2 can present 6 default layers. */
3605TEST_F(Hwc2Test, PRESENT_DISPLAY_default_6)
3606{
3607 const size_t layerCnt = 6;
3608 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3609 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3610 bool optimize = false;
3611
3612 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3613 optimize));
3614}
3615
3616/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3617 * blend mode. */
3618TEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_1)
3619{
3620 const size_t layerCnt = 1;
3621 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3622 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3623 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
3624 {Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Basic},
3625 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
3626 bool optimize = false;
3627
3628 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3629 optimize));
3630}
3631
3632/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3633 * blend mode. */
3634TEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_2)
3635{
3636 const size_t layerCnt = 2;
3637 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3638 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3639 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
3640 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
3641 bool optimize = false;
3642
3643 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3644 optimize));
3645}
3646
3647/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3648 * buffer. */
3649TEST_F(Hwc2Test, PRESENT_DISPLAY_buffer_1)
3650{
3651 const size_t layerCnt = 1;
3652 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3653 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3654 {{Hwc2TestPropertyName::BufferArea, Hwc2TestCoverage::Complete}};
3655 bool optimize = true;
3656
3657 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3658 optimize));
3659}
3660
3661/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3662 * color. */
3663TEST_F(Hwc2Test, PRESENT_DISPLAY_color_1)
3664{
3665 const size_t layerCnt = 1;
3666 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3667 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3668 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3669 {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Complete}};
3670 bool optimize = true;
3671
3672 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3673 optimize));
3674}
3675
3676/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3677 * color. */
3678TEST_F(Hwc2Test, PRESENT_DISPLAY_color_2)
3679{
3680 const size_t layerCnt = 2;
3681 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3682 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3683 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3684 {Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3685 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic},
3686 {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Basic}};
3687 bool optimize = true;
3688
3689 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3690 optimize));
3691}
3692
3693/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3694 * composition. */
3695TEST_F(Hwc2Test, PRESENT_DISPLAY_composition_1)
3696{
3697 const size_t layerCnt = 1;
3698 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3699 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3700 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete}};
3701 bool optimize = true;
3702
3703 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3704 optimize));
3705}
3706
3707/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3708 * cursor. */
3709TEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_1)
3710{
3711 const size_t layerCnt = 1;
3712 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3713 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3714 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3715 {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete}};
3716 bool optimize = true;
3717
3718 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3719 optimize));
3720}
3721
3722/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3723 * cursor. */
3724TEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_2)
3725{
3726 const size_t layerCnt = 2;
3727 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3728 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3729 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3730 {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete},
3731 {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
3732 bool optimize = true;
3733
3734 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3735 optimize));
3736}
3737
3738/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3739 * dataspace. */
3740TEST_F(Hwc2Test, PRESENT_DISPLAY_dataspace_1)
3741{
3742 const size_t layerCnt = 1;
3743 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3744 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3745 {{Hwc2TestPropertyName::Dataspace, Hwc2TestCoverage::Complete}};
3746 bool optimize = true;
3747
3748 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3749 optimize));
3750}
3751
3752/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3753 * display frame. */
3754TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_1)
3755{
3756 const size_t layerCnt = 1;
3757 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3758 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3759 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3760 bool optimize = true;
3761
3762 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3763 optimize));
3764}
3765
3766/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3767 * display frame. */
3768TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_2)
3769{
3770 const size_t layerCnt = 2;
3771 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3772 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3773 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3774 bool optimize = true;
3775
3776 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3777 optimize));
3778}
3779
3780/* TESTCASE: Tests that the HWC2 can present 3 layers with complete coverage of
3781 * display frame. */
3782TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_3)
3783{
3784 const size_t layerCnt = 3;
3785 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3786 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3787 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3788 bool optimize = true;
3789
3790 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3791 optimize));
3792}
3793
3794/* TESTCASE: Tests that the HWC2 can present 4 layers with complete coverage of
3795 * display frame. */
3796TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_4)
3797{
3798 const size_t layerCnt = 4;
3799 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3800 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3801 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3802 bool optimize = true;
3803
3804 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3805 optimize));
3806}
3807
3808/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3809 * plane alpha. */
3810TEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_1)
3811{
3812 const size_t layerCnt = 1;
3813 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3814 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3815 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3816 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
3817 bool optimize = false;
3818
3819 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3820 optimize));
3821}
3822
3823/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3824 * plane alpha. */
3825TEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_2)
3826{
3827 const size_t layerCnt = 2;
3828 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3829 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3830 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3831 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
3832 bool optimize = false;
3833
3834 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3835 optimize));
3836}
3837
3838/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3839 * source crop. */
3840TEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_1)
3841{
3842 const size_t layerCnt = 1;
3843 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3844 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3845 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
3846 {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
3847 bool optimize = true;
3848
3849 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3850 optimize));
3851}
3852
3853/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3854 * source crop. */
3855TEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_2)
3856{
3857 const size_t layerCnt = 2;
3858 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3859 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3860 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
3861 {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
3862 bool optimize = true;
3863
3864 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3865 optimize));
3866}
3867
3868
3869/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3870 * surface damage. */
3871TEST_F(Hwc2Test, PRESENT_DISPLAY_surface_damage_1)
3872{
3873 const size_t layerCnt = 1;
3874 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3875 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3876 {{Hwc2TestPropertyName::SurfaceDamage, Hwc2TestCoverage::Complete}};
3877 bool optimize = true;
3878
3879 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3880 optimize));
3881}
3882
3883/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3884 * transform. */
3885TEST_F(Hwc2Test, PRESENT_DISPLAY_transform_1)
3886{
3887 const size_t layerCnt = 1;
3888 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3889 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3890 {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete}};
3891 bool optimize = true;
3892
3893 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3894 optimize));
3895}
3896
3897/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3898 * transform. */
3899TEST_F(Hwc2Test, PRESENT_DISPLAY_transform_2)
3900{
3901 const size_t layerCnt = 2;
3902 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3903 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3904 {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete},
3905 {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
3906 bool optimize = true;
3907
3908 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3909 optimize));
3910}
3911
3912/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3913 * basic. */
3914TEST_F(Hwc2Test, PRESENT_DISPLAY_basic_1)
3915{
3916 const size_t layerCnt = 1;
3917 Hwc2TestCoverage coverage = Hwc2TestCoverage::Basic;
3918 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3919 bool optimize = true;
3920
3921 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3922 optimize));
3923}
3924
3925/* TESTCASE: Tests that the HWC2 cannot present a bad display. */
3926TEST_F(Hwc2Test, PRESENT_DISPLAY_bad_display)
3927{
3928 hwc2_display_t display;
3929 int32_t presentFence;
3930 hwc2_error_t err = HWC2_ERROR_NONE;
3931
3932 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3933
3934 ASSERT_NO_FATAL_FAILURE(presentDisplay(display, &presentFence, &err));
3935 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3936}
3937
3938/* TESTCASE: Tests that the HWC2 cannot present an unvalidated display. */
3939TEST_F(Hwc2Test, PRESENT_DISPLAY_not_validated)
3940{
3941 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 1,
3942 [] (Hwc2Test* test, hwc2_display_t display,
3943 const std::vector<hwc2_layer_t>& /*layers*/,
3944 Hwc2TestLayers* /*testLayers*/) {
3945
3946 int32_t presentFence;
3947 hwc2_error_t err = HWC2_ERROR_NONE;
3948
3949 ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
3950 HWC2_POWER_MODE_ON));
3951 ASSERT_NO_FATAL_FAILURE(test->enableVsync(display));
3952
3953 ASSERT_NO_FATAL_FAILURE(test->waitForVsync());
3954
3955 ASSERT_NO_FATAL_FAILURE(test->presentDisplay(display,
3956 &presentFence, &err));
3957 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3958 << "returned wrong error code";
3959
3960 ASSERT_NO_FATAL_FAILURE(test->disableVsync(display));
3961 ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
3962 HWC2_POWER_MODE_OFF));
3963 }
3964 ));
3965}
3966
3967/* TESTCASE: Tests that the HWC2 cannot get release fences from a bad display. */
3968TEST_F(Hwc2Test, GET_RELEASE_FENCES_bad_display)
3969{
3970 hwc2_display_t display;
3971 std::vector<hwc2_layer_t> layers;
3972 std::vector<int32_t> fences;
3973 hwc2_error_t err = HWC2_ERROR_NONE;
3974
3975 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3976
3977 ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences, &err));
3978 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3979}
Marissa Wall35040c52016-12-15 12:41:06 -08003980
3981static const std::array<android_color_mode, 9> androidColorModes = {{
3982 HAL_COLOR_MODE_NATIVE,
3983 HAL_COLOR_MODE_STANDARD_BT601_625,
3984 HAL_COLOR_MODE_STANDARD_BT601_625_UNADJUSTED,
3985 HAL_COLOR_MODE_STANDARD_BT601_525,
3986 HAL_COLOR_MODE_STANDARD_BT601_525_UNADJUSTED,
3987 HAL_COLOR_MODE_STANDARD_BT709,
3988 HAL_COLOR_MODE_DCI_P3,
3989 HAL_COLOR_MODE_SRGB,
3990 HAL_COLOR_MODE_ADOBE_RGB,
3991}};
3992
3993/* TESTCASE: Tests that the HWC2 can get the color modes for a display. The
3994 * display must support HAL_COLOR_MODE_NATIVE */
3995TEST_F(Hwc2Test, GET_COLOR_MODES)
3996{
3997 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
3998 [] (Hwc2Test* test, hwc2_display_t display) {
3999
4000 std::vector<android_color_mode_t> colorModes;
4001
4002 ASSERT_NO_FATAL_FAILURE(test->getColorModes(display,
4003 &colorModes));
4004
4005 EXPECT_NE(std::count(colorModes.begin(), colorModes.end(),
4006 HAL_COLOR_MODE_NATIVE), 0) << "all displays"
4007 " must support HAL_COLOR_MODE_NATIVE";
4008 }
4009 ));
4010}
4011
4012/* TESTCASE: Tests that the HWC2 cannot get color modes from a bad display. */
4013TEST_F(Hwc2Test, GET_COLOR_MODES_bad_display)
4014{
4015 hwc2_display_t display;
4016 std::vector<android_color_mode_t> colorModes;
4017 hwc2_error_t err = HWC2_ERROR_NONE;
4018
4019 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4020
4021 ASSERT_NO_FATAL_FAILURE(getColorModes(display, &colorModes, &err));
4022 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4023}
4024
4025/* TESTCASE: Tests that the HWC2 can set the required color mode on a display. */
4026TEST_F(Hwc2Test, SET_COLOR_MODES)
4027{
4028 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4029 [] (Hwc2Test* test, hwc2_display_t display) {
4030
4031 const android_color_mode_t colorMode = HAL_COLOR_MODE_NATIVE;
4032
4033 EXPECT_NO_FATAL_FAILURE(test->setColorMode(display, colorMode));
4034 }
4035 ));
4036}
4037
4038/* TESTCASE: Tests that the HWC2 cannot set a color mode on a bad display. */
4039TEST_F(Hwc2Test, SET_COLOR_MODES_bad_display)
4040{
4041 hwc2_display_t display;
4042 const android_color_mode_t colorMode = HAL_COLOR_MODE_NATIVE;
4043 hwc2_error_t err = HWC2_ERROR_NONE;
4044
4045 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4046
4047 ASSERT_NO_FATAL_FAILURE(setColorMode(display, colorMode, &err));
4048 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4049}
4050
4051/* TESTCASE: Tests that the HWC2 cannot set an invalid color mode. */
4052TEST_F(Hwc2Test, SET_COLOR_MODES_bad_parameter)
4053{
4054 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4055 [] (Hwc2Test* test, hwc2_display_t display) {
4056
4057 const android_color_mode_t colorMode =
4058 static_cast<android_color_mode_t>(-1);
4059 hwc2_error_t err = HWC2_ERROR_NONE;
4060
4061 ASSERT_NO_FATAL_FAILURE(test->setColorMode(display, colorMode,
4062 &err));
4063 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
4064 << "returned wrong error code";
4065 }
4066 ));
4067}
4068
4069/* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
4070 * for all valid color modes. */
4071TEST_F(Hwc2Test, SET_COLOR_MODES_unsupported)
4072{
4073 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4074 [] (Hwc2Test* test, hwc2_display_t display) {
4075
4076 for (auto colorMode : androidColorModes) {
4077 hwc2_error_t err = HWC2_ERROR_NONE;
4078
4079 ASSERT_NO_FATAL_FAILURE(test->setColorMode(display,
4080 colorMode, &err));
4081
4082 EXPECT_TRUE(err == HWC2_ERROR_NONE
4083 || err == HWC2_ERROR_UNSUPPORTED)
4084 << "returned wrong error code";
4085 }
4086 }
4087 ));
4088}
4089
4090/* TESTCASE: Tests that the HWC2 gets the HDR capabilities for a display and
4091 * test if they are valid. */
4092TEST_F(Hwc2Test, GET_HDR_CAPABILITIES)
4093{
4094 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4095 [] (Hwc2Test* test, hwc2_display_t display) {
4096
4097 std::vector<android_hdr_t> hdrCapabilities;
4098 float maxLuminance, maxAverageLuminance, minLuminance;
4099
4100 EXPECT_NO_FATAL_FAILURE(test->getHdrCapabilities(display,
4101 &hdrCapabilities, &maxLuminance, &maxAverageLuminance,
4102 &minLuminance));
4103
4104 if (hdrCapabilities.empty())
4105 return;
4106
4107 EXPECT_GE(maxLuminance, maxAverageLuminance);
4108 EXPECT_GE(maxAverageLuminance, minLuminance);
4109 }
4110 ));
4111}
4112
4113/* TESTCASE: Tests that the HWC2 cannot get hdr capabilities from a bad display */
4114TEST_F(Hwc2Test, GET_HDR_CAPABILITIES_bad_display)
4115{
4116 hwc2_display_t display;
4117 std::vector<android_hdr_t> hdrCapabilities;
4118 float maxLuminance, maxAverageLuminance, minLuminance;
4119 hwc2_error_t err = HWC2_ERROR_NONE;
4120
4121 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4122
4123 ASSERT_NO_FATAL_FAILURE(getHdrCapabilities(display, &hdrCapabilities,
4124 &maxLuminance, &maxAverageLuminance, &minLuminance, &err));
4125 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4126}
4127
4128static const std::array<float, 16> identityMatrix = {{
4129 1.0, 0.0, 0.0, 0.0,
4130 0.0, 1.0, 0.0, 0.0,
4131 0.0, 0.0, 1.0, 0.0,
4132 0.0, 0.0, 0.0, 1.0,
4133}};
4134
4135/* Values for the color transform matrices were precomputed using the source code
4136 * in surfaceflinger/Effects/Daltonizer.cpp. */
4137
4138static const std::array<const std::array<float, 16>, 5> exampleMatrices = {{
4139 identityMatrix,
4140 /* Converts RGB color to the XYZ space */
4141 {{ 0.4124, 0.2126, 0.0193, 0,
4142 0.3576, 0.7152, 0.1192, 0,
4143 0.1805, 0.0722, 0.9505, 0,
4144 0 , 0 , 0 , 1 }},
4145 /* Protanomaly */
4146 {{ 0.068493, 0.931506, 0, 0,
4147 0.068493, 0.931507, 0, 0,
4148 0.013626, -0.013626, 1, 0,
4149 0, 0, 0, 1 }},
4150 /* Deuteranomaly */
4151 {{ 0.288299, 0.711701, 0, 0,
4152 0.052709, 0.947291, 0, 0,
4153 -0.257912, 0.257912, 1, 0,
4154 0, 0, 0, 1 }},
4155 /* Tritanomaly */
4156 {{ 1, -0.805712, 0.805712, 0,
4157 0, 0.378838, 0.621162, 0,
4158 0, 0.104823, 0.895177, 0,
4159 0, 0, 0, 1 }},
4160}};
4161
4162/* TESTCASE: Tests that the HWC2 can set the identity color transform */
4163TEST_F(Hwc2Test, SET_COLOR_TRANSFORM)
4164{
4165 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4166 [] (Hwc2Test* test, hwc2_display_t display) {
4167
4168 EXPECT_NO_FATAL_FAILURE(test->setColorTransform(display,
4169 identityMatrix, HAL_COLOR_TRANSFORM_IDENTITY));
4170 }
4171 ));
4172}
4173
4174/* TESTCASE: Tests that the HWC2 cannot set the color transform for a bad
4175 * display. */
4176TEST_F(Hwc2Test, SET_COLOR_TRANSFORM_bad_display)
4177{
4178 hwc2_display_t display;
4179 hwc2_error_t err = HWC2_ERROR_NONE;
4180
4181 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4182
4183 ASSERT_NO_FATAL_FAILURE(setColorTransform(display, identityMatrix,
4184 HAL_COLOR_TRANSFORM_IDENTITY, &err));
4185 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4186}
4187
4188/* TESTCASE: Tests that the HWC2 cannot set an invalid color transform. */
4189TEST_F(Hwc2Test, SET_COLOR_TRANSFORM_bad_parameter)
4190{
4191 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4192 [] (Hwc2Test* test, hwc2_display_t display) {
4193
4194 const android_color_transform_t hint =
4195 static_cast<android_color_transform_t>(-1);
4196 hwc2_error_t err = HWC2_ERROR_NONE;
4197
4198 ASSERT_NO_FATAL_FAILURE(test->setColorTransform(display,
4199 identityMatrix, hint, &err));
4200 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
4201 << "returned wrong error code";
4202 }
4203 ));
4204}
4205
4206/* TESTCASE: Tests that the HWC2 can set an arbitrary color matrix. */
4207TEST_F(Hwc2Test, SET_COLOR_TRANSFORM_arbitrary_matrix)
4208{
4209 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4210 [] (Hwc2Test* test, hwc2_display_t display) {
4211
4212 const android_color_transform_t hint =
4213 HAL_COLOR_TRANSFORM_ARBITRARY_MATRIX;
4214
4215 for (const std::array<float, 16>& matrix : exampleMatrices) {
4216 EXPECT_NO_FATAL_FAILURE(test->setColorTransform(display,
4217 matrix, hint));
4218 }
4219 }
4220 ));
4221}