blob: 4878c140edde4b1e3d1019e4c8e8005990e2daec [file] [log] [blame]
Marissa Wall4d600052016-12-15 12:16:01 -08001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <array>
Marissa Wallcfb9a072017-02-17 20:53:18 -080018#include <unordered_set>
Marissa Wall563030b2017-02-21 14:01:05 -080019#include <unordered_map>
Marissa Wall4d600052016-12-15 12:16:01 -080020#include <gtest/gtest.h>
21#include <dlfcn.h>
Marissa Wall5a240aa2016-12-15 12:34:06 -080022#include <android-base/unique_fd.h>
Marissa Wall4d600052016-12-15 12:16:01 -080023#include <hardware/hardware.h>
Marissa Wall563030b2017-02-21 14:01:05 -080024#include <sync/sync.h>
Marissa Wall4d600052016-12-15 12:16:01 -080025
26#define HWC2_INCLUDE_STRINGIFICATION
27#define HWC2_USE_CPP11
28#include <hardware/hwcomposer2.h>
29#undef HWC2_INCLUDE_STRINGIFICATION
30#undef HWC2_USE_CPP11
31
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080032#include "Hwc2TestLayer.h"
Marissa Wall273b1df2016-12-15 12:28:47 -080033#include "Hwc2TestLayers.h"
Marissa Wallf18cfb02017-02-21 14:01:05 -080034#include "Hwc2TestClientTarget.h"
Marissa Wallbad1bc72017-02-21 14:33:46 -080035#include "Hwc2TestVirtualDisplay.h"
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080036
Marissa Wallcfb9a072017-02-17 20:53:18 -080037void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
38 hwc2_display_t display, int32_t connected);
Marissa Wall572a1ee2016-12-15 12:24:13 -080039void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
40 hwc2_display_t display, int64_t timestamp);
Marissa Wallcfb9a072017-02-17 20:53:18 -080041
Marissa Wall4d600052016-12-15 12:16:01 -080042class Hwc2Test : public testing::Test {
43public:
44
45 virtual void SetUp()
46 {
47 hw_module_t const* hwc2Module;
48
49 int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
50 ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
51 << strerror(-err);
52
53 /* The following method will fail if you have not run
54 * "adb shell stop" */
55 err = hwc2_open(hwc2Module, &mHwc2Device);
56 ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
57 << strerror(-err);
Marissa Wallcfb9a072017-02-17 20:53:18 -080058
59 populateDisplays();
Marissa Wall4d600052016-12-15 12:16:01 -080060 }
61
62 virtual void TearDown()
63 {
Marissa Wall1db2e372016-12-15 12:19:39 -080064
65 for (auto itr = mLayers.begin(); itr != mLayers.end();) {
66 hwc2_display_t display = itr->first;
67 hwc2_layer_t layer = itr->second;
68 itr++;
69 /* Destroys and removes the layer from mLayers */
70 destroyLayer(display, layer);
71 }
72
Marissa Wall03c91732016-12-15 12:23:16 -080073 for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
74 hwc2_display_t display = *itr;
75 itr++;
76 /* Sets power mode to off and removes the display from
77 * mActiveDisplays */
78 setPowerMode(display, HWC2_POWER_MODE_OFF);
79 }
80
Marissa Wallbad1bc72017-02-21 14:33:46 -080081 for (auto itr = mVirtualDisplays.begin(); itr != mVirtualDisplays.end();) {
82 hwc2_display_t display = *itr;
83 itr++;
84 /* Destroys virtual displays */
85 destroyVirtualDisplay(display);
86 }
87
Marissa Wall4d600052016-12-15 12:16:01 -080088 if (mHwc2Device)
89 hwc2_close(mHwc2Device);
90 }
91
Marissa Walla4b01482017-02-17 20:52:03 -080092 void registerCallback(hwc2_callback_descriptor_t descriptor,
93 hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
94 hwc2_error_t* outErr = nullptr)
95 {
96 auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
97 getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
98 ASSERT_TRUE(pfn) << "failed to get function";
99
100 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
101 callbackData, pointer));
102 if (outErr) {
103 *outErr = err;
104 } else {
105 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
106 }
107 }
108
Marissa Wallcfb9a072017-02-17 20:53:18 -0800109 void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
110 hwc2_error_t* outErr = nullptr)
111 {
112 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
113 getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
114 ASSERT_TRUE(pfn) << "failed to get function";
115
116 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
117 reinterpret_cast<int32_t*>(outType)));
118 if (outErr) {
119 *outErr = err;
120 } else {
121 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
122 }
123 }
124
125 /* If the populateDisplays function is still receiving displays and the
126 * display is connected, the display handle is stored in mDisplays. */
127 void hotplugCallback(hwc2_display_t display, int32_t connected)
128 {
129 std::lock_guard<std::mutex> lock(mHotplugMutex);
130
131 if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
132 return;
133
134 if (connected == HWC2_CONNECTION_CONNECTED)
135 mDisplays.insert(display);
136
137 mHotplugCv.notify_all();
138 }
139
Marissa Wall1db2e372016-12-15 12:19:39 -0800140 void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
141 hwc2_error_t* outErr = nullptr)
142 {
143 auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
144 getFunction(HWC2_FUNCTION_CREATE_LAYER));
145 ASSERT_TRUE(pfn) << "failed to get function";
146
147 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
148 outLayer));
149
150 if (err == HWC2_ERROR_NONE)
151 mLayers.insert(std::make_pair(display, *outLayer));
152
153 if (outErr) {
154 *outErr = err;
155 } else {
156 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
157 }
158 }
159
160 void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
161 hwc2_error_t* outErr = nullptr)
162 {
163 auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
164 getFunction(HWC2_FUNCTION_DESTROY_LAYER));
165 ASSERT_TRUE(pfn) << "failed to get function";
166
167 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
168
169 if (err == HWC2_ERROR_NONE)
170 mLayers.erase(std::make_pair(display, layer));
171
172 if (outErr) {
173 *outErr = err;
174 } else {
175 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
176 << layer;
177 }
178 }
179
Marissa Wallcf935cb2016-12-15 12:20:47 -0800180 void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
181 hwc2_attribute_t attribute, int32_t* outValue,
182 hwc2_error_t* outErr = nullptr)
183 {
184 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
185 getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
186 ASSERT_TRUE(pfn) << "failed to get function";
187
188 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
189 attribute, outValue));
190
191 if (outErr) {
192 *outErr = err;
193 } else {
194 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
195 << getAttributeName(attribute) << " for config " << config;
196 }
197 }
198
199 void getDisplayConfigs(hwc2_display_t display,
200 std::vector<hwc2_config_t>* outConfigs,
201 hwc2_error_t* outErr = nullptr)
202 {
203 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
204 getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
205 ASSERT_TRUE(pfn) << "failed to get function";
206
207 uint32_t numConfigs = 0;
208
209 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
210 &numConfigs, nullptr));
211
212 if (err == HWC2_ERROR_NONE) {
213 outConfigs->resize(numConfigs);
214
215 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
216 &numConfigs, outConfigs->data()));
217 }
218
219 if (outErr) {
220 *outErr = err;
221 } else {
222 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
223 " display " << display;
224 }
225 }
226
Marissa Wall93dc04f2016-12-15 12:21:46 -0800227 void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
228 hwc2_error_t* outErr = nullptr)
229 {
230 auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
231 getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
232 ASSERT_TRUE(pfn) << "failed to get function";
233
234 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
235 outConfig));
236 if (outErr) {
237 *outErr = err;
238 } else {
239 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
240 " display " << display;
241 }
242 }
243
244 void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
245 hwc2_error_t* outErr = nullptr)
246 {
247 auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
248 getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
249 ASSERT_TRUE(pfn) << "failed to get function";
250
251 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
252 if (outErr) {
253 *outErr = err;
254 } else {
255 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
256 << config;
257 }
258 }
259
Marissa Wall03c91732016-12-15 12:23:16 -0800260 void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
261 hwc2_error_t* outErr = nullptr)
262 {
263 auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
264 getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
265 ASSERT_TRUE(pfn) << "failed to get function";
266
267 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
268 outSupport));
269 if (outErr) {
270 *outErr = err;
271 } else {
272 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
273 " display " << display;
274 }
275 }
276
277 void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
278 hwc2_error_t* outErr = nullptr)
279 {
280 auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
281 getFunction(HWC2_FUNCTION_SET_POWER_MODE));
282 ASSERT_TRUE(pfn) << "failed to get function";
283
284 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
285 mode));
286 if (outErr) {
287 *outErr = err;
288 if (err != HWC2_ERROR_NONE)
289 return;
290 } else {
291 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
292 << getPowerModeName(mode) << " on display " << display;
293 }
294
295 if (mode == HWC2_POWER_MODE_OFF) {
296 mActiveDisplays.erase(display);
297 } else {
298 mActiveDisplays.insert(display);
299 }
300 }
301
Marissa Wall572a1ee2016-12-15 12:24:13 -0800302 void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
303 hwc2_error_t* outErr = nullptr)
304 {
305 auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
306 getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
307 ASSERT_TRUE(pfn) << "failed to get function";
308
309 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
310 enabled));
311 if (outErr) {
312 *outErr = err;
313 } else {
314 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
315 << getVsyncName(enabled);
316 }
317 }
318
319 void vsyncCallback(hwc2_display_t display, int64_t timestamp)
320 {
321 std::lock_guard<std::mutex> lock(mVsyncMutex);
322 mVsyncDisplay = display;
323 mVsyncTimestamp = timestamp;
324 mVsyncCv.notify_all();
325 }
326
Marissa Walldd4087f2016-12-15 12:24:52 -0800327 void getDisplayName(hwc2_display_t display, std::string* outName,
328 hwc2_error_t* outErr = nullptr)
329 {
330 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
331 getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
332 ASSERT_TRUE(pfn) << "failed to get function";
333
334 uint32_t size = 0;
335
336 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
337 nullptr));
338
339 if (err == HWC2_ERROR_NONE) {
340 std::vector<char> name(size);
341
342 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
343 name.data()));
344
345 outName->assign(name.data());
346 }
347
348 if (outErr) {
349 *outErr = err;
350 } else {
351 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
352 << display;
353 }
354 }
355
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800356 void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
357 hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
358 {
359 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
360 getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
361 ASSERT_TRUE(pfn) << "failed to get function";
362
363 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
364 composition));
365 if (outErr) {
366 *outErr = err;
367 } else {
368 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
369 " type " << getCompositionName(composition);
370 }
371 }
372
Marissa Wall2a0aaf92016-12-15 12:31:37 -0800373 void setCursorPosition(hwc2_display_t display, hwc2_layer_t layer,
374 int32_t x, int32_t y, hwc2_error_t* outErr = nullptr)
375 {
376 auto pfn = reinterpret_cast<HWC2_PFN_SET_CURSOR_POSITION>(
377 getFunction(HWC2_FUNCTION_SET_CURSOR_POSITION));
378 ASSERT_TRUE(pfn) << "failed to get function";
379
380 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, x,
381 y));
382 if (outErr) {
383 *outErr = err;
384 } else {
Arun Kumar K.R0b8fd892017-06-16 15:20:01 +0530385 ASSERT_TRUE((err == HWC2_ERROR_NONE) ||
386 (err == HWC2_ERROR_BAD_LAYER)) <<
387 "failed to set cursor position";
Marissa Wall2a0aaf92016-12-15 12:31:37 -0800388 }
389 }
390
Marissa Wallffc67da2016-12-15 12:26:09 -0800391 void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
392 hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
393 {
394 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
395 getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
396 ASSERT_TRUE(pfn) << "failed to get function";
397
398 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
399 mode));
400 if (outErr) {
401 *outErr = err;
402 } else {
403 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
404 << getBlendModeName(mode);
405 }
406 }
407
Marissa Wall5a240aa2016-12-15 12:34:06 -0800408 void setLayerBuffer(hwc2_display_t display, hwc2_layer_t layer,
409 buffer_handle_t buffer, int32_t acquireFence,
410 hwc2_error_t* outErr = nullptr)
411 {
412 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BUFFER>(
413 getFunction(HWC2_FUNCTION_SET_LAYER_BUFFER));
414 ASSERT_TRUE(pfn) << "failed to get function";
415
416 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
417 buffer, acquireFence));
418 if (outErr) {
419 *outErr = err;
420 } else {
421 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer buffer";
422 }
423 }
424
Marissa Wallee242782016-12-15 12:30:12 -0800425 void setLayerColor(hwc2_display_t display, hwc2_layer_t layer,
426 hwc_color_t color, hwc2_error_t* outErr = nullptr)
427 {
428 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COLOR>(
429 getFunction(HWC2_FUNCTION_SET_LAYER_COLOR));
430 ASSERT_TRUE(pfn) << "failed to get function";
431
432 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
433 color));
434 if (outErr) {
435 *outErr = err;
436 } else {
437 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer color";
438 }
439 }
440
Marissa Wallb72b5c92016-12-15 12:26:39 -0800441 void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
442 android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
443 {
444 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
445 getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
446 ASSERT_TRUE(pfn) << "failed to get function";
447
448 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
449 layer, dataspace));
450 if (outErr) {
451 *outErr = err;
452 } else {
453 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
454 }
455 }
456
Marissa Wall600a73b2016-12-15 12:30:39 -0800457 void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
458 const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
459 {
460 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
461 getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
462 ASSERT_TRUE(pfn) << "failed to get function";
463
464 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
465 displayFrame));
466 if (outErr) {
467 *outErr = err;
468 } else {
469 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
470 " frame";
471 }
472 }
473
Marissa Wall2b1f5302016-12-15 12:27:20 -0800474 void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
475 float alpha, hwc2_error_t* outErr = nullptr)
476 {
477 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
478 getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
479 ASSERT_TRUE(pfn) << "failed to get function";
480
481 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
482 alpha));
483 if (outErr) {
484 *outErr = err;
485 } else {
486 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
487 << alpha;
488 }
489 }
490
Marissa Wallc57468f2016-12-15 12:31:12 -0800491 void setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer,
492 const hwc_frect_t& sourceCrop, hwc2_error_t* outErr = nullptr)
493 {
494 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
495 getFunction(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP));
496 ASSERT_TRUE(pfn) << "failed to get function";
497
498 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
499 sourceCrop));
500 if (outErr) {
501 *outErr = err;
502 } else {
503 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer source crop";
504 }
505 }
506
Marissa Wallad761812016-12-15 12:32:24 -0800507 void setLayerSurfaceDamage(hwc2_display_t display, hwc2_layer_t layer,
508 const hwc_region_t& surfaceDamage, hwc2_error_t* outErr = nullptr)
509 {
510 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
511 getFunction(HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE));
512 ASSERT_TRUE(pfn) << "failed to get function";
513
514 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
515 surfaceDamage));
516 if (outErr) {
517 *outErr = err;
518 } else {
519 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer surface"
520 " damage";
521 }
522 }
523
Marissa Wallac108192016-12-15 12:27:48 -0800524 void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
525 hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
526 {
527 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
528 getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
529 ASSERT_TRUE(pfn) << "failed to get function";
530
531 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
532 transform));
533 if (outErr) {
534 *outErr = err;
535 } else {
536 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
537 << getTransformName(transform);
538 }
539 }
540
Marissa Wallf7618ed2016-12-15 12:34:39 -0800541 void setLayerVisibleRegion(hwc2_display_t display, hwc2_layer_t layer,
542 const hwc_region_t& visibleRegion, hwc2_error_t* outErr = nullptr)
543 {
544 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_VISIBLE_REGION>(
545 getFunction(HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION));
546 ASSERT_TRUE(pfn) << "failed to get function";
547
548 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
549 visibleRegion));
550 if (outErr) {
551 *outErr = err;
552 } else {
553 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer visible"
554 " region";
555 }
556 }
557
Marissa Wall273b1df2016-12-15 12:28:47 -0800558 void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
559 uint32_t zOrder, hwc2_error_t* outErr = nullptr)
560 {
561 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
562 getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
563 ASSERT_TRUE(pfn) << "failed to get function";
564
565 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
566 zOrder));
567 if (outErr) {
568 *outErr = err;
569 } else {
570 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
571 << zOrder;
572 }
573 }
574
Marissa Wall1cd789c2017-01-27 12:55:36 -0800575 void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
576 uint32_t* outNumRequests, hwc2_error_t* outErr)
577 {
578 auto pfn = reinterpret_cast<HWC2_PFN_VALIDATE_DISPLAY>(
579 getFunction(HWC2_FUNCTION_VALIDATE_DISPLAY));
580 ASSERT_TRUE(pfn) << "failed to get function";
581
582 *outErr = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
583 outNumTypes, outNumRequests));
584 }
585
586 void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
587 uint32_t* outNumRequests, bool* outHasChanges)
588 {
589 hwc2_error_t err = HWC2_ERROR_NONE;
590
591 EXPECT_NO_FATAL_FAILURE(validateDisplay(display, outNumTypes,
592 outNumRequests, &err));
593
594 if (err != HWC2_ERROR_HAS_CHANGES) {
595 *outHasChanges = false;
596 EXPECT_EQ(err, HWC2_ERROR_NONE) << "failed to validate display";
597 } else {
598 *outHasChanges = true;
599 }
600 }
601
Marissa Wall706178d2016-12-15 12:39:14 -0800602 void getDisplayRequests(hwc2_display_t display,
603 hwc2_display_request_t* outDisplayRequests,
604 std::vector<hwc2_layer_t>* outLayers,
605 std::vector<hwc2_layer_request_t>* outLayerRequests,
606 hwc2_error_t* outErr = nullptr)
607 {
608 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_REQUESTS>(
609 getFunction(HWC2_FUNCTION_GET_DISPLAY_REQUESTS));
610 ASSERT_TRUE(pfn) << "failed to get function";
611
612 uint32_t numElements = 0;
613
614 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
615 reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
616 nullptr, nullptr));
617
618 if (err == HWC2_ERROR_NONE && numElements > 0) {
619 outLayers->resize(numElements);
620 outLayerRequests->resize(numElements);
621
622 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
623 reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
624 reinterpret_cast<uint64_t*>(outLayers->data()),
625 reinterpret_cast<int32_t*>(outLayerRequests->data())));
626 }
627
628 if (outErr) {
629 *outErr = err;
630 } else {
631 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display requests";
632 }
633 }
634
635 void handleRequests(hwc2_display_t display,
636 const std::vector<hwc2_layer_t>& layers, uint32_t numRequests,
637 std::set<hwc2_layer_t>* outClearLayers = nullptr,
638 bool* outFlipClientTarget = nullptr)
639 {
640 hwc2_display_request_t displayRequest =
641 static_cast<hwc2_display_request_t>(0);
642 std::vector<hwc2_layer_t> requestedLayers;
643 std::vector<hwc2_layer_request_t> requests;
644
645 ASSERT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequest,
646 &requestedLayers, &requests));
647
648 EXPECT_EQ(numRequests, requests.size()) << "validate returned "
649 << numRequests << " requests and get display requests returned "
650 << requests.size() << " requests";
651
652 for (size_t i = 0; i < requests.size(); i++) {
653 hwc2_layer_t requestedLayer = requestedLayers.at(i);
654 hwc2_layer_request_t request = requests.at(i);
655
656 EXPECT_EQ(std::count(layers.begin(), layers.end(), requestedLayer),
Arun Kumar K.R0b8fd892017-06-16 15:20:01 +0530657 1) << "get display requests returned an unknown layer";
Marissa Wall706178d2016-12-15 12:39:14 -0800658 EXPECT_NE(request, 0) << "returned empty request for layer "
659 << requestedLayer;
660
661 if (outClearLayers && request
662 == HWC2_LAYER_REQUEST_CLEAR_CLIENT_TARGET)
663 outClearLayers->insert(requestedLayer);
664 }
665
666 if (outFlipClientTarget)
667 *outFlipClientTarget = displayRequest
668 & HWC2_DISPLAY_REQUEST_FLIP_CLIENT_TARGET;
669 }
670
671 void getChangedCompositionTypes(hwc2_display_t display,
672 std::vector<hwc2_layer_t>* outLayers,
673 std::vector<hwc2_composition_t>* outTypes,
674 hwc2_error_t* outErr = nullptr)
675 {
676 auto pfn = reinterpret_cast<HWC2_PFN_GET_CHANGED_COMPOSITION_TYPES>(
677 getFunction(HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES));
678 ASSERT_TRUE(pfn) << "failed to get function";
679
680 uint32_t numElements = 0;
681
682 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
683 &numElements, nullptr, nullptr));
684
685 if (err == HWC2_ERROR_NONE && numElements > 0) {
686 outLayers->resize(numElements);
687 outTypes->resize(numElements);
688
689 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
690 &numElements, reinterpret_cast<uint64_t*>(outLayers->data()),
691 reinterpret_cast<int32_t*>(outTypes->data())));
692 }
693
694 if (outErr) {
695 *outErr = err;
696 } else {
697 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get changed"
698 " composition types";
699 }
700 }
701
702 void handleCompositionChanges(hwc2_display_t display,
703 const Hwc2TestLayers& testLayers,
704 const std::vector<hwc2_layer_t>& layers, uint32_t numTypes,
705 std::set<hwc2_layer_t>* outClientLayers = nullptr)
706 {
707 std::vector<hwc2_layer_t> changedLayers;
708 std::vector<hwc2_composition_t> types;
709
710 ASSERT_NO_FATAL_FAILURE(getChangedCompositionTypes(display,
711 &changedLayers, &types));
712
713 EXPECT_EQ(numTypes, types.size()) << "validate returned "
714 << numTypes << " types and get changed composition types"
715 " returned " << types.size() << " types";
716
717 for (size_t i = 0; i < types.size(); i++) {
718
719 auto layer = std::find(layers.begin(), layers.end(),
720 changedLayers.at(i));
721
722 EXPECT_TRUE(layer != layers.end() || !testLayers.contains(*layer))
723 << "get changed composition types returned an unknown layer";
724
725 hwc2_composition_t requestedType = testLayers.getComposition(*layer);
726 hwc2_composition_t returnedType = types.at(i);
727
728 EXPECT_NE(returnedType, HWC2_COMPOSITION_INVALID) << "get changed"
729 " composition types returned invalid composition";
730
731 switch (requestedType) {
732 case HWC2_COMPOSITION_CLIENT:
733 EXPECT_TRUE(false) << getCompositionName(returnedType)
734 << " cannot be changed";
735 break;
736 case HWC2_COMPOSITION_DEVICE:
737 case HWC2_COMPOSITION_SOLID_COLOR:
738 EXPECT_EQ(returnedType, HWC2_COMPOSITION_CLIENT)
739 << "composition of type "
740 << getCompositionName(requestedType)
741 << " can only be changed to "
742 << getCompositionName(HWC2_COMPOSITION_CLIENT);
743 break;
744 case HWC2_COMPOSITION_CURSOR:
745 case HWC2_COMPOSITION_SIDEBAND:
746 EXPECT_TRUE(returnedType == HWC2_COMPOSITION_CLIENT
747 || returnedType == HWC2_COMPOSITION_DEVICE)
748 << "composition of type "
749 << getCompositionName(requestedType)
750 << " can only be changed to "
751 << getCompositionName(HWC2_COMPOSITION_CLIENT) << " or "
752 << getCompositionName(HWC2_COMPOSITION_DEVICE);
753 break;
754 default:
755 EXPECT_TRUE(false) << "unknown type "
756 << getCompositionName(requestedType);
757 break;
758 }
759
760 if (outClientLayers)
761 if (returnedType == HWC2_COMPOSITION_CLIENT)
762 outClientLayers->insert(*layer);
763 }
764
765 if (outClientLayers) {
766 for (auto layer : layers) {
767 if (testLayers.getComposition(layer) == HWC2_COMPOSITION_CLIENT)
768 outClientLayers->insert(layer);
769 }
770 }
771 }
772
773 void acceptDisplayChanges(hwc2_display_t display,
774 hwc2_error_t* outErr = nullptr)
775 {
776 auto pfn = reinterpret_cast<HWC2_PFN_ACCEPT_DISPLAY_CHANGES>(
777 getFunction(HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES));
778 ASSERT_TRUE(pfn) << "failed to get function";
779
780 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display));
781 if (outErr) {
782 *outErr = err;
783 } else {
784 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to accept display changes";
785 }
786 }
787
Marissa Wallf18cfb02017-02-21 14:01:05 -0800788 void getClientTargetSupport(hwc2_display_t display, int32_t width,
789 int32_t height, android_pixel_format_t format,
790 android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
791 {
792 auto pfn = reinterpret_cast<HWC2_PFN_GET_CLIENT_TARGET_SUPPORT>(
793 getFunction(HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT));
794 ASSERT_TRUE(pfn) << "failed to get function";
795
796 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, width,
797 height, format, dataspace));
798 if (outErr) {
799 *outErr = err;
800 } else {
801 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get client target"
802 " support";
803 }
804 }
805
806 void setClientTarget(hwc2_display_t display, buffer_handle_t handle,
807 int32_t acquireFence, android_dataspace_t dataspace,
808 hwc_region_t damage, hwc2_error_t* outErr = nullptr)
809 {
810 auto pfn = reinterpret_cast<HWC2_PFN_SET_CLIENT_TARGET>(
811 getFunction(HWC2_FUNCTION_SET_CLIENT_TARGET));
812 ASSERT_TRUE(pfn) << "failed to get function";
813
814 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, handle,
815 acquireFence, dataspace, damage));
816 if (outErr) {
817 *outErr = err;
818 } else {
819 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set client target";
820 }
821 }
822
Marissa Wall563030b2017-02-21 14:01:05 -0800823 void presentDisplay(hwc2_display_t display, int32_t* outPresentFence,
824 hwc2_error_t* outErr = nullptr)
825 {
826 auto pfn = reinterpret_cast<HWC2_PFN_PRESENT_DISPLAY>(
827 getFunction(HWC2_FUNCTION_PRESENT_DISPLAY));
828 ASSERT_TRUE(pfn) << "failed to get function";
829
830 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
831 outPresentFence));
832 if (outErr) {
833 *outErr = err;
834 } else {
835 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to present display";
836 }
837 }
838
839 void getReleaseFences(hwc2_display_t display,
840 std::vector<hwc2_layer_t>* outLayers,
841 std::vector<int32_t>* outFences, hwc2_error_t* outErr = nullptr)
842 {
843 auto pfn = reinterpret_cast<HWC2_PFN_GET_RELEASE_FENCES>(
844 getFunction(HWC2_FUNCTION_GET_RELEASE_FENCES));
845 ASSERT_TRUE(pfn) << "failed to get function";
846
847 uint32_t numElements = 0;
848
849 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
850 &numElements, nullptr, nullptr));
851
852 if (err == HWC2_ERROR_NONE) {
853 outLayers->resize(numElements);
854 outFences->resize(numElements);
855
856 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
857 &numElements, outLayers->data(), outFences->data()));
858 }
859
860 if (outErr) {
861 *outErr = err;
862 } else {
863 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get release fences";
864 }
865 }
866
Marissa Wall35040c52016-12-15 12:41:06 -0800867 void getColorModes(hwc2_display_t display,
868 std::vector<android_color_mode_t>* outColorModes,
869 hwc2_error_t* outErr = nullptr)
870 {
871 auto pfn = reinterpret_cast<HWC2_PFN_GET_COLOR_MODES>(
872 getFunction(HWC2_FUNCTION_GET_COLOR_MODES));
873 ASSERT_TRUE(pfn) << "failed to get function";
874
875 uint32_t numColorModes = 0;
876
877 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
878 &numColorModes, nullptr));
879 if (err == HWC2_ERROR_NONE) {
880 outColorModes->resize(numColorModes);
881
882 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
883 &numColorModes,
884 reinterpret_cast<int32_t*>(outColorModes->data())));
885 }
886
887 if (outErr) {
888 *outErr = err;
889 } else {
890 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get color modes for"
891 " display " << display;
892 }
893 }
894
895 void setColorMode(hwc2_display_t display, android_color_mode_t colorMode,
896 hwc2_error_t* outErr = nullptr)
897 {
898 auto pfn = reinterpret_cast<HWC2_PFN_SET_COLOR_MODE>(
899 getFunction(HWC2_FUNCTION_SET_COLOR_MODE));
900 ASSERT_TRUE(pfn) << "failed to get function";
901
902 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
903 static_cast<int32_t>(colorMode)));
904 if (outErr) {
905 *outErr = err;
906 } else {
907 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set color mode "
908 << colorMode;
909 }
910 }
911
912 void getHdrCapabilities(hwc2_display_t display,
913 std::vector<android_hdr_t>* outTypes, float* outMaxLuminance,
914 float* outMaxAverageLuminance, float* outMinLuminance,
915 hwc2_error_t* outErr = nullptr)
916 {
917 auto pfn = reinterpret_cast<HWC2_PFN_GET_HDR_CAPABILITIES>(
918 getFunction(HWC2_FUNCTION_GET_HDR_CAPABILITIES));
919 ASSERT_TRUE(pfn) << "failed to get function";
920
921 uint32_t numTypes = 0;
922
923 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
924 &numTypes, nullptr, outMaxLuminance, outMaxAverageLuminance,
925 outMinLuminance));
926
927 if (err == HWC2_ERROR_NONE) {
928 outTypes->resize(numTypes);
929
930 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &numTypes,
931 reinterpret_cast<int32_t*>(outTypes->data()), outMaxLuminance,
932 outMaxAverageLuminance, outMinLuminance));
933 }
934
935 if (outErr) {
936 *outErr = err;
937 } else {
938 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get hdr capabilities"
939 " for display " << display;
940 }
941 }
942
943 void setColorTransform(hwc2_display_t display,
944 const std::array<float, 16>& matrix, android_color_transform_t hint,
945 hwc2_error_t* outErr = nullptr)
946 {
947 auto pfn = reinterpret_cast<HWC2_PFN_SET_COLOR_TRANSFORM>(
948 getFunction(HWC2_FUNCTION_SET_COLOR_TRANSFORM));
949 ASSERT_TRUE(pfn) << "failed to get function";
950
951 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
952 matrix.data(), hint));
953
954 if (outErr) {
955 *outErr = err;
956 } else {
957 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set color transform "
958 << hint;
959 }
960 }
961
Marissa Wallbad1bc72017-02-21 14:33:46 -0800962 void createVirtualDisplay(uint32_t width, uint32_t height,
963 android_pixel_format_t* outFormat, hwc2_display_t* outDisplay,
964 hwc2_error_t* outErr = nullptr)
965 {
966 auto pfn = reinterpret_cast<HWC2_PFN_CREATE_VIRTUAL_DISPLAY>(
967 getFunction(HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY));
968 ASSERT_TRUE(pfn) << "failed to get function";
969
970 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, width, height,
971 reinterpret_cast<int32_t*>(outFormat), outDisplay));
972
973 if (err == HWC2_ERROR_NONE)
974 mVirtualDisplays.insert(*outDisplay);
975
976 if (outErr) {
977 *outErr = err;
978 } else {
979 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create virtual display";
980 }
981 }
982
983 void destroyVirtualDisplay(hwc2_display_t display,
984 hwc2_error_t* outErr = nullptr)
985 {
986 auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_VIRTUAL_DISPLAY>(
987 getFunction(HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY));
988 ASSERT_TRUE(pfn) << "failed to get function";
989
990 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display));
991
992 if (err == HWC2_ERROR_NONE)
993 mVirtualDisplays.erase(display);
994
995 if (outErr) {
996 *outErr = err;
997 } else {
998 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy virtual display";
999 }
1000 }
1001
1002 void getMaxVirtualDisplayCount(uint32_t* outMaxCnt)
1003 {
1004 auto pfn = reinterpret_cast<HWC2_PFN_GET_MAX_VIRTUAL_DISPLAY_COUNT>(
1005 getFunction(HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT));
1006 ASSERT_TRUE(pfn) << "failed to get function";
1007
1008 *outMaxCnt = pfn(mHwc2Device);
1009 }
1010
1011 void setOutputBuffer(hwc2_display_t display, buffer_handle_t buffer,
1012 int32_t releaseFence, hwc2_error_t* outErr = nullptr)
1013 {
1014 auto pfn = reinterpret_cast<HWC2_PFN_SET_OUTPUT_BUFFER>(
1015 getFunction(HWC2_FUNCTION_SET_OUTPUT_BUFFER));
1016 ASSERT_TRUE(pfn) << "failed to get function";
1017
1018 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, buffer,
1019 releaseFence));
1020 if (outErr) {
1021 *outErr = err;
1022 } else {
1023 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set output buffer";
1024 }
1025 }
1026
Marissa Wallae7d3242016-12-15 12:42:07 -08001027 void dump(std::string* outBuffer)
1028 {
1029 auto pfn = reinterpret_cast<HWC2_PFN_DUMP>(
1030 getFunction(HWC2_FUNCTION_DUMP));
1031 ASSERT_TRUE(pfn) << "failed to get function";
1032
1033 uint32_t size = 0;
1034
1035 pfn(mHwc2Device, &size, nullptr);
1036
1037 std::vector<char> buffer(size);
1038
1039 pfn(mHwc2Device, &size, buffer.data());
1040
1041 outBuffer->assign(buffer.data());
1042 }
1043
Marissa Wallf18cfb02017-02-21 14:01:05 -08001044 void getBadDisplay(hwc2_display_t* outDisplay)
1045 {
1046 for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
1047 if (mDisplays.count(display) == 0) {
1048 *outDisplay = display;
1049 return;
1050 }
1051 }
1052 ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
1053 " are registered. This should never happen.";
1054 }
1055
Marissa Wall563030b2017-02-21 14:01:05 -08001056 void waitForVsync(hwc2_display_t* outDisplay = nullptr,
1057 int64_t* outTimestamp = nullptr)
1058 {
1059 std::unique_lock<std::mutex> lock(mVsyncMutex);
1060 ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
1061 std::cv_status::no_timeout) << "timed out attempting to get"
1062 " vsync callback";
1063 if (outDisplay)
1064 *outDisplay = mVsyncDisplay;
1065 if (outTimestamp)
1066 *outTimestamp = mVsyncTimestamp;
1067 }
1068
1069 void enableVsync(hwc2_display_t display)
1070 {
1071 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
1072 reinterpret_cast<hwc2_function_pointer_t>(
1073 hwc2TestVsyncCallback)));
1074 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1075 }
1076
1077 void disableVsync(hwc2_display_t display)
1078 {
1079 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1080 }
1081
Marissa Wall4d600052016-12-15 12:16:01 -08001082protected:
1083 hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
1084 {
1085 return mHwc2Device->getFunction(mHwc2Device, descriptor);
1086 }
1087
1088 void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
1089 {
1090 uint32_t num = 0;
1091
1092 mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
1093
1094 outCapabilities->resize(num);
1095
1096 mHwc2Device->getCapabilities(mHwc2Device, &num,
1097 reinterpret_cast<int32_t*>(outCapabilities->data()));
1098 }
1099
Marissa Wallcfb9a072017-02-17 20:53:18 -08001100 /* Registers a hotplug callback and waits for hotplug callbacks. This
1101 * function will have no effect if called more than once. */
1102 void populateDisplays()
1103 {
1104 /* Sets the hotplug status to receiving */
1105 {
1106 std::lock_guard<std::mutex> lock(mHotplugMutex);
1107
1108 if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
1109 return;
1110 mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
1111 }
1112
1113 /* Registers the callback. This function call cannot be locked because
1114 * a callback could happen on the same thread */
1115 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
1116 reinterpret_cast<hwc2_function_pointer_t>(
1117 hwc2TestHotplugCallback)));
1118
1119 /* Waits for hotplug events. If a hotplug event has not come within 1
1120 * second, stop waiting. */
1121 std::unique_lock<std::mutex> lock(mHotplugMutex);
1122
1123 while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
1124 std::cv_status::timeout) { }
1125
1126 /* Sets the hotplug status to done. Future calls will have no effect */
1127 mHotplugStatus = Hwc2TestHotplugStatus::Done;
1128 }
1129
Marissa Wall1db2e372016-12-15 12:19:39 -08001130 /* NOTE: will create min(newlayerCnt, max supported layers) layers */
1131 void createLayers(hwc2_display_t display,
1132 std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
1133 {
1134 std::vector<hwc2_layer_t> newLayers;
1135 hwc2_layer_t layer;
1136 hwc2_error_t err = HWC2_ERROR_NONE;
1137
1138 for (size_t i = 0; i < newLayerCnt; i++) {
1139
1140 EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
1141 if (err == HWC2_ERROR_NO_RESOURCES)
1142 break;
1143 if (err != HWC2_ERROR_NONE) {
1144 newLayers.clear();
1145 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
1146 }
1147 newLayers.push_back(layer);
1148 }
1149
1150 *outLayers = std::move(newLayers);
1151 }
1152
1153 void destroyLayers(hwc2_display_t display,
1154 std::vector<hwc2_layer_t>&& layers)
1155 {
1156 for (hwc2_layer_t layer : layers) {
1157 EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1158 }
1159 }
1160
Marissa Wallcf935cb2016-12-15 12:20:47 -08001161 void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
1162 {
1163 std::vector<hwc2_config_t> configs;
1164
1165 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1166
1167 hwc2_config_t CONFIG_MAX = UINT32_MAX;
1168
1169 ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
1170 " (2^32 values) has been taken which shouldn't happen";
1171
1172 hwc2_config_t config;
1173 for (config = 0; config < CONFIG_MAX; config++) {
1174 if (std::count(configs.begin(), configs.end(), config) == 0)
1175 break;
1176 }
1177
1178 *outConfig = config;
1179 }
1180
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001181 /* Calls a set property function from Hwc2Test to set a property value from
1182 * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
1183 using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
1184 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001185 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001186
Marissa Wall273b1df2016-12-15 12:28:47 -08001187 /* Calls a set property function from Hwc2Test to set property values from
1188 * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
1189 using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
1190 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001191 Hwc2TestLayers* testLayers);
Marissa Wall273b1df2016-12-15 12:28:47 -08001192
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001193 /* Calls a set property function from Hwc2Test to set a bad property value
1194 * on hwc2_layer_t on hwc2_display_t */
1195 using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
1196 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001197 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001198
1199 /* Calls a set property function from Hwc2Test to set a bad property value
1200 * on hwc2_layer_t on hwc2_display_t */
1201 using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
1202 hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
1203
Marissa Wall1cd789c2017-01-27 12:55:36 -08001204 /* Is called after a display is powered on and all layer properties have
1205 * been set. It should be used to test functions such as validate, accepting
1206 * changes, present, etc. */
1207 using TestDisplayLayersFunction = void (*)(Hwc2Test* test,
Marissa Wall706178d2016-12-15 12:39:14 -08001208 hwc2_display_t display, const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08001209 Hwc2TestLayers* testLayers);
Marissa Wall706178d2016-12-15 12:39:14 -08001210
1211 /* It is called on an non validated display */
1212 using TestDisplayNonValidatedLayersFunction = void (*)(Hwc2Test* test,
1213 hwc2_display_t display, std::vector<hwc2_layer_t>* layers);
Marissa Wall1cd789c2017-01-27 12:55:36 -08001214
Marissa Wallf18cfb02017-02-21 14:01:05 -08001215 /* Tests client target support on a particular display and config */
1216 using TestClientTargetSupportFunction = void (*)(Hwc2Test* test,
1217 hwc2_display_t display,
1218 const Hwc2TestClientTargetSupport& testClientTargetSupport);
1219
Marissa Wall35040c52016-12-15 12:41:06 -08001220 /* Tests a particular active display config */
1221 using TestActiveDisplayConfigFunction = void (*)(Hwc2Test* test,
1222 hwc2_display_t display);
1223
Marissa Wallbad1bc72017-02-21 14:33:46 -08001224 /* Tests a newly created virtual display */
1225 using TestCreateVirtualDisplayFunction = void (*)(Hwc2Test* test,
1226 hwc2_display_t display, Hwc2TestVirtualDisplay* testVirtualDisplay);
1227
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001228 /* Advances a property of Hwc2TestLayer */
1229 using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
1230
Marissa Wallf7618ed2016-12-15 12:34:39 -08001231 /* Advances properties of Hwc2TestLayers */
1232 using AdvanceProperties = bool (*)(Hwc2TestLayers* testLayer);
1233
Marissa Wallf18cfb02017-02-21 14:01:05 -08001234 /* Advances properties of Hwc2TestClientTargetSupport */
1235 using AdvanceClientTargetSupport = bool (*)(
1236 Hwc2TestClientTargetSupport* testClientTargetSupport);
1237
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001238 /* For each active display it cycles through each display config and tests
1239 * each property value. It creates a layer, sets the property and then
1240 * destroys the layer */
1241 void setLayerProperty(Hwc2TestCoverage coverage,
1242 TestLayerPropertyFunction function, AdvanceProperty advance)
1243 {
1244 for (auto display : mDisplays) {
1245 std::vector<hwc2_config_t> configs;
1246
1247 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1248
1249 for (auto config : configs) {
1250 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -08001251 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001252
1253 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001254 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1255 &displayArea));
1256 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001257
1258 do {
1259 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1260
1261 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001262 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001263
1264 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1265 } while (advance(&testLayer));
1266 }
1267 }
1268 }
1269
1270 /* For each active display it cycles through each display config and tests
1271 * each property value. It creates a layer, cycles through each property
1272 * value and updates the layer property value and then destroys the layer */
1273 void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
1274 TestLayerPropertyFunction function, AdvanceProperty advance)
1275 {
1276 for (auto display : mDisplays) {
1277 std::vector<hwc2_config_t> configs;
1278
1279 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1280
1281 for (auto config : configs) {
1282 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -08001283 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001284
1285 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001286 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1287 &displayArea));
1288 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001289
1290 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1291
1292 do {
1293 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001294 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001295 } while (advance(&testLayer));
1296
1297 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1298 }
1299 }
1300 }
1301
Marissa Wall273b1df2016-12-15 12:28:47 -08001302 /* For each active display it cycles through each display config and tests
1303 * each property value. It creates multiple layers, calls the
1304 * TestLayerPropertiesFunction to set property values and then
1305 * destroys the layers */
1306 void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
Marissa Wallf7618ed2016-12-15 12:34:39 -08001307 TestLayerPropertiesFunction function, AdvanceProperties advance)
Marissa Wall273b1df2016-12-15 12:28:47 -08001308 {
1309 for (auto display : mDisplays) {
1310 std::vector<hwc2_config_t> configs;
1311
1312 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1313
1314 for (auto config : configs) {
1315 std::vector<hwc2_layer_t> layers;
Marissa Wall600a73b2016-12-15 12:30:39 -08001316 Area displayArea;
Marissa Wall273b1df2016-12-15 12:28:47 -08001317
1318 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001319 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1320 &displayArea));
Marissa Wall273b1df2016-12-15 12:28:47 -08001321
1322 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
Marissa Wall600a73b2016-12-15 12:30:39 -08001323 Hwc2TestLayers testLayers(layers, coverage, displayArea);
Marissa Wall273b1df2016-12-15 12:28:47 -08001324
Marissa Wallf7618ed2016-12-15 12:34:39 -08001325 do {
1326 for (auto layer : layers) {
1327 EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
1328 &testLayers));
1329 }
1330 } while (advance(&testLayers));
Marissa Wall273b1df2016-12-15 12:28:47 -08001331
1332 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1333 }
1334 }
1335 }
1336
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001337 /* For each active display it cycles through each display config.
1338 * 1) It attempts to set a valid property value to bad layer handle.
1339 * 2) It creates a layer x and attempts to set a valid property value to
1340 * layer x + 1
1341 * 3) It destroys the layer x and attempts to set a valid property value to
1342 * the destroyed layer x.
1343 */
1344 void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
1345 TestLayerPropertyBadLayerFunction function)
1346 {
1347 for (auto display : mDisplays) {
1348 std::vector<hwc2_config_t> configs;
1349
1350 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1351
1352 for (auto config : configs) {
1353 hwc2_layer_t layer = 0;
Marissa Wall600a73b2016-12-15 12:30:39 -08001354 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001355 hwc2_error_t err = HWC2_ERROR_NONE;
1356
1357 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001358 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1359 &displayArea));
1360 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001361
1362 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001363 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001364 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1365
1366 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1367
1368 ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001369 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001370 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1371
1372 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1373
1374 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001375 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001376 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1377 }
1378 }
1379 }
1380
1381 /* For each active display it cycles through each display config and tests
1382 * each property value. It creates a layer, sets a bad property value and
1383 * then destroys the layer */
1384 void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
1385 {
1386 for (auto display : mDisplays) {
1387 std::vector<hwc2_config_t> configs;
1388
1389 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1390
1391 for (auto config : configs) {
1392 hwc2_layer_t layer;
1393 hwc2_error_t err = HWC2_ERROR_NONE;
1394
1395 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1396
1397 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1398
1399 ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
1400 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
1401 " error code";
1402
1403 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1404 }
1405 }
1406 }
1407
Marissa Wall1cd789c2017-01-27 12:55:36 -08001408 /* For each active display it powers on the display, cycles through each
1409 * config and creates a set of layers with a certain amount of coverage.
1410 * For each active display, for each config and for each set of layers,
1411 * it calls the TestDisplayLayersFunction */
1412 void displayLayers(Hwc2TestCoverage coverage, size_t layerCnt,
1413 TestDisplayLayersFunction function)
1414 {
1415 for (auto display : mDisplays) {
1416 std::vector<hwc2_config_t> configs;
1417
1418 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1419
1420 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1421
1422 for (auto config : configs) {
1423 Area displayArea;
1424 std::vector<hwc2_layer_t> layers;
1425
1426 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1427 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
1428
1429 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1430 Hwc2TestLayers testLayers(layers, coverage, displayArea);
1431
1432 do {
1433 bool skip;
1434
1435 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
1436 &testLayers, &skip));
1437 if (!skip)
Marissa Wall706178d2016-12-15 12:39:14 -08001438 EXPECT_NO_FATAL_FAILURE(function(this, display, layers,
Marissa Wall563030b2017-02-21 14:01:05 -08001439 &testLayers));
Marissa Wall1cd789c2017-01-27 12:55:36 -08001440
1441 } while (testLayers.advance());
1442
1443 ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
1444 std::move(layers)));
1445 }
1446
1447 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1448 }
1449 }
1450
Marissa Wall706178d2016-12-15 12:39:14 -08001451 /* For each active display, it calls the
1452 * TestDisplayNonValidatedLayersFunction on a variety on non-validated
1453 * layer combinations */
1454 void displayNonValidatedLayers(size_t layerCnt,
1455 TestDisplayNonValidatedLayersFunction function)
1456 {
1457 for (auto display : mDisplays) {
1458 uint32_t numTypes, numRequests;
1459 std::vector<hwc2_layer_t> layers;
1460 bool hasChanges;
1461
1462 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1463
1464 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1465
1466 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1467
1468 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1469
1470 for (auto layer : layers) {
1471 ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1472 HWC2_COMPOSITION_CLIENT));
1473 }
1474
1475 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1476
1477 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1478 &numRequests, &hasChanges));
1479
1480 for (auto layer : layers) {
1481 ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1482 HWC2_COMPOSITION_DEVICE));
1483 }
1484
1485 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1486
1487 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1488
1489 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1490
1491 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1492 }
1493 }
1494
Marissa Wallf18cfb02017-02-21 14:01:05 -08001495 /* Test client target support on each config on each active display */
1496 void setClientTargetSupport(Hwc2TestCoverage coverage,
1497 TestClientTargetSupportFunction function,
1498 AdvanceClientTargetSupport advance)
1499 {
1500 for (auto display : mDisplays) {
1501 std::vector<hwc2_config_t> configs;
1502
1503 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1504
1505 for (auto config : configs) {
1506 Area displayArea;
1507
1508 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1509 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1510 &displayArea));
1511 Hwc2TestClientTargetSupport testClientTargetSupport(coverage,
1512 displayArea);
1513
1514 do {
1515 EXPECT_NO_FATAL_FAILURE(function(this, display,
1516 testClientTargetSupport));
1517
1518 } while (advance(&testClientTargetSupport));
1519 }
1520 }
1521 }
1522
Marissa Wall35040c52016-12-15 12:41:06 -08001523 /* Cycles through each config on each active display and calls
1524 * a TestActiveDisplayConfigFunction */
1525 void setActiveDisplayConfig(TestActiveDisplayConfigFunction function)
1526 {
1527 for (auto display : mDisplays) {
1528 std::vector<hwc2_config_t> configs;
1529
1530 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1531
1532 for (auto config : configs) {
1533 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1534
1535 EXPECT_NO_FATAL_FAILURE(function(this, display));
1536 }
1537 }
1538 }
1539
Marissa Wallbad1bc72017-02-21 14:33:46 -08001540 /* Creates a virtual display for testing */
1541 void createVirtualDisplay(Hwc2TestCoverage coverage,
1542 TestCreateVirtualDisplayFunction function)
1543 {
1544 Hwc2TestVirtualDisplay testVirtualDisplay(coverage);
1545
1546 do {
1547 hwc2_display_t display;
1548 hwc2_error_t err = HWC2_ERROR_NONE;
1549
1550 const UnsignedArea& dimension =
1551 testVirtualDisplay.getDisplayDimension();
1552 android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
1553
1554 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(dimension.width,
1555 dimension.height, &desiredFormat, &display, &err));
1556
1557 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_NO_RESOURCES
1558 || err == HWC2_ERROR_UNSUPPORTED)
1559 << "returned wrong error code";
1560 EXPECT_GE(desiredFormat, 0) << "invalid format";
1561
1562 if (err != HWC2_ERROR_NONE)
1563 continue;
1564
1565 EXPECT_NO_FATAL_FAILURE(function(this, display,
1566 &testVirtualDisplay));
1567
1568 ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
1569
1570 } while (testVirtualDisplay.advance());
1571 }
1572
1573
Marissa Wall600a73b2016-12-15 12:30:39 -08001574 void getActiveConfigAttribute(hwc2_display_t display,
1575 hwc2_attribute_t attribute, int32_t* outValue)
1576 {
1577 hwc2_config_t config;
1578 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
1579 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1580 attribute, outValue));
1581 ASSERT_GE(*outValue, 0) << "failed to get valid "
1582 << getAttributeName(attribute);
1583 }
1584
1585 void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
1586 {
1587 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1588 HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
1589 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1590 HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
1591 }
1592
Marissa Wall563030b2017-02-21 14:01:05 -08001593 void closeFences(hwc2_display_t display, int32_t presentFence)
1594 {
1595 std::vector<hwc2_layer_t> layers;
1596 std::vector<int32_t> fences;
1597 const int msWait = 3000;
1598
1599 if (presentFence >= 0) {
1600 ASSERT_GE(sync_wait(presentFence, msWait), 0);
1601 close(presentFence);
1602 }
1603
1604 ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences));
1605 EXPECT_EQ(layers.size(), fences.size());
1606
1607 for (int32_t fence : fences) {
Arun Kumar K.R0b8fd892017-06-16 15:20:01 +05301608 if (fence >= 0) {
1609 EXPECT_GE(sync_wait(fence, msWait), 0);
Marissa Wall563030b2017-02-21 14:01:05 -08001610 close(fence);
Arun Kumar K.R0b8fd892017-06-16 15:20:01 +05301611 }
Marissa Wall563030b2017-02-21 14:01:05 -08001612 }
1613 }
1614
Marissa Wall1cd789c2017-01-27 12:55:36 -08001615 void setLayerProperties(hwc2_display_t display, hwc2_layer_t layer,
1616 Hwc2TestLayers* testLayers, bool* outSkip)
1617 {
1618 hwc2_composition_t composition;
1619 buffer_handle_t handle = nullptr;
1620 int32_t acquireFence;
1621 hwc2_error_t err = HWC2_ERROR_NONE;
1622 *outSkip = true;
1623
1624 if (!testLayers->contains(layer))
1625 return;
1626
1627 composition = testLayers->getComposition(layer);
1628
1629 /* If the device cannot support a buffer format, then do not continue */
1630 if ((composition == HWC2_COMPOSITION_DEVICE
1631 || composition == HWC2_COMPOSITION_CURSOR)
1632 && testLayers->getBuffer(layer, &handle, &acquireFence) < 0)
1633 return;
1634
1635 EXPECT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1636 composition, &err));
1637 if (err == HWC2_ERROR_UNSUPPORTED)
1638 EXPECT_TRUE(composition != HWC2_COMPOSITION_CLIENT
1639 && composition != HWC2_COMPOSITION_DEVICE);
1640
1641 const hwc_rect_t cursor = testLayers->getCursorPosition(layer);
1642
1643 EXPECT_NO_FATAL_FAILURE(setLayerBuffer(display, layer, handle,
1644 acquireFence));
1645 EXPECT_NO_FATAL_FAILURE(setLayerBlendMode(display, layer,
1646 testLayers->getBlendMode(layer)));
1647 EXPECT_NO_FATAL_FAILURE(setLayerColor(display, layer,
1648 testLayers->getColor(layer)));
Arun Kumar K.R0b8fd892017-06-16 15:20:01 +05301649 if (composition == HWC2_COMPOSITION_CURSOR)
1650 EXPECT_NO_FATAL_FAILURE(setCursorPosition(display, layer,
1651 cursor.left, cursor.top));
Marissa Wall1cd789c2017-01-27 12:55:36 -08001652 EXPECT_NO_FATAL_FAILURE(setLayerDataspace(display, layer,
1653 testLayers->getDataspace(layer)));
1654 EXPECT_NO_FATAL_FAILURE(setLayerDisplayFrame(display, layer,
1655 testLayers->getDisplayFrame(layer)));
1656 EXPECT_NO_FATAL_FAILURE(setLayerPlaneAlpha(display, layer,
1657 testLayers->getPlaneAlpha(layer)));
1658 EXPECT_NO_FATAL_FAILURE(setLayerSourceCrop(display, layer,
1659 testLayers->getSourceCrop(layer)));
1660 EXPECT_NO_FATAL_FAILURE(setLayerSurfaceDamage(display, layer,
1661 testLayers->getSurfaceDamage(layer)));
1662 EXPECT_NO_FATAL_FAILURE(setLayerTransform(display, layer,
1663 testLayers->getTransform(layer)));
1664 EXPECT_NO_FATAL_FAILURE(setLayerVisibleRegion(display, layer,
1665 testLayers->getVisibleRegion(layer)));
1666 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer,
1667 testLayers->getZOrder(layer)));
1668
1669 *outSkip = false;
1670 }
1671
1672 void setLayerProperties(hwc2_display_t display,
1673 const std::vector<hwc2_layer_t>& layers,
1674 Hwc2TestLayers* testLayers, bool* outSkip)
1675 {
1676 for (auto layer : layers) {
1677 EXPECT_NO_FATAL_FAILURE(setLayerProperties(display, layer,
1678 testLayers, outSkip));
1679 if (*outSkip)
1680 return;
1681 }
1682 }
1683
Marissa Wall563030b2017-02-21 14:01:05 -08001684 void setClientTarget(hwc2_display_t display,
1685 Hwc2TestClientTarget* testClientTarget,
1686 const Hwc2TestLayers& testLayers,
1687 const std::set<hwc2_layer_t>& clientLayers,
1688 const std::set<hwc2_layer_t>& clearLayers, bool flipClientTarget,
1689 const Area& displayArea)
1690 {
1691 android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
1692 hwc_region_t damage = { };
1693 buffer_handle_t handle;
1694 int32_t acquireFence;
1695
1696 ASSERT_EQ(testClientTarget->getBuffer(testLayers, clientLayers,
1697 clearLayers, flipClientTarget, displayArea, &handle,
1698 &acquireFence), 0);
1699 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
1700 dataspace, damage));
1701 }
1702
1703 void presentDisplays(size_t layerCnt, Hwc2TestCoverage coverage,
1704 const std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>&
1705 coverageExceptions, bool optimize)
1706 {
1707 for (auto display : mDisplays) {
1708 std::vector<hwc2_config_t> configs;
1709
1710 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1711 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1712
1713 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1714
1715 for (auto config : configs) {
1716 Area displayArea;
1717 std::vector<hwc2_layer_t> layers;
1718
1719 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1720 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1721 &displayArea));
1722
1723 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1724 Hwc2TestLayers testLayers(layers, coverage, displayArea,
1725 coverageExceptions);
1726
1727 if (optimize && !testLayers.optimizeLayouts())
1728 continue;
1729
1730 std::set<hwc2_layer_t> clientLayers;
1731 std::set<hwc2_layer_t> clearLayers;
1732 Hwc2TestClientTarget testClientTarget;
1733
1734 do {
1735 uint32_t numTypes, numRequests;
1736 bool hasChanges, skip;
1737 bool flipClientTarget;
1738 int32_t presentFence;
1739
1740 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
1741 &testLayers, &skip));
1742 if (skip)
1743 continue;
1744
1745 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1746 &numRequests, &hasChanges));
1747 if (hasChanges)
1748 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
1749 << "wrong number of requests";
1750
1751 ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
1752 testLayers, layers, numTypes, &clientLayers));
1753 ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
1754 numRequests, &clearLayers, &flipClientTarget));
1755 ASSERT_NO_FATAL_FAILURE(setClientTarget(display,
1756 &testClientTarget, testLayers, clientLayers,
1757 clearLayers, flipClientTarget, displayArea));
1758 ASSERT_NO_FATAL_FAILURE(acceptDisplayChanges(display));
1759
1760 ASSERT_NO_FATAL_FAILURE(waitForVsync());
1761
1762 EXPECT_NO_FATAL_FAILURE(presentDisplay(display,
1763 &presentFence));
1764
1765 ASSERT_NO_FATAL_FAILURE(closeFences(display, presentFence));
1766
1767 } while (testLayers.advance());
1768
1769 ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
1770 std::move(layers)));
1771 }
1772
1773 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1774 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1775 }
1776 }
1777
David Hanna Jr3f056022017-07-27 19:19:15 -07001778 void createAndPresentVirtualDisplay(size_t layerCnt,
1779 Hwc2TestCoverage coverage,
1780 const std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>&
1781 coverageExceptions)
1782 {
1783 Hwc2TestVirtualDisplay testVirtualDisplay(coverage);
1784 hwc2_display_t display;
1785 android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
1786
1787 do {
1788 // Items dependent on the display dimensions
1789 hwc2_error_t err = HWC2_ERROR_NONE;
1790 const UnsignedArea& dimension =
1791 testVirtualDisplay.getDisplayDimension();
1792 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(dimension.width,
1793 dimension.height, &desiredFormat, &display, &err));
1794 ASSERT_TRUE(err == HWC2_ERROR_NONE)
1795 << "Cannot allocate virtual display";
1796
1797 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1798 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1799
1800 std::vector<hwc2_config_t> configs;
1801 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1802
1803 for (auto config : configs) {
1804 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1805
1806 Area displayArea;
1807 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1808 &displayArea));
1809
1810 std::vector<hwc2_layer_t> layers;
1811 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers,
1812 layerCnt));
1813 Hwc2TestLayers testLayers(layers, coverage, displayArea,
1814 coverageExceptions);
1815
1816 /*
1817 * Layouts that do not cover an entire virtual display will
1818 * cause undefined behavior.
1819 * Enable optimizeLayouts to avoid this.
1820 */
1821 testLayers.optimizeLayouts();
1822 do {
1823 // Items dependent on the testLayers properties
1824 std::set<hwc2_layer_t> clientLayers;
1825 std::set<hwc2_layer_t> clearLayers;
1826 uint32_t numTypes, numRequests;
1827 bool hasChanges, skip;
1828 bool flipClientTarget;
1829 int32_t presentFence;
1830 Hwc2TestClientTarget testClientTarget;
1831 buffer_handle_t outputBufferHandle;
1832 android::base::unique_fd outputBufferReleaseFence;
1833
1834 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
1835 &testLayers, &skip));
1836
1837 if (skip)
1838 continue;
1839
1840 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1841 &numRequests, &hasChanges));
1842
1843 if (hasChanges)
1844 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
1845 << "wrong number of requests";
1846
1847 ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
1848 testLayers, layers, numTypes, &clientLayers));
1849
1850 ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
1851 numRequests, &clearLayers, &flipClientTarget));
1852 ASSERT_NO_FATAL_FAILURE(setClientTarget(display,
1853 &testClientTarget, testLayers, clientLayers,
1854 clearLayers, flipClientTarget, displayArea));
1855 ASSERT_NO_FATAL_FAILURE(acceptDisplayChanges(display));
1856
1857 ASSERT_EQ(testVirtualDisplay.getOutputBuffer(
1858 &outputBufferHandle, &outputBufferReleaseFence), 0);
1859 ASSERT_NO_FATAL_FAILURE(setOutputBuffer(display,
1860 outputBufferHandle, outputBufferReleaseFence));
1861
1862 EXPECT_NO_FATAL_FAILURE(presentDisplay(display,
1863 &presentFence));
1864 ASSERT_NO_FATAL_FAILURE(closeFences(display, presentFence));
1865
1866 ASSERT_EQ(testVirtualDisplay.verifyOutputBuffer(&testLayers,
1867 &layers, &clearLayers), 0);
1868
1869 /*
1870 * Upscaling the image causes minor pixel differences.
1871 * Work around this by using some threshold.
1872 *
1873 * Fail test if we are off by more than 1% of our
1874 * pixels.
1875 */
1876 ComparatorResult& comparatorResult = ComparatorResult::get();
1877 int threshold = (dimension.width * dimension.height) / 100;
1878 double diffPercent = (comparatorResult.getDifferentPixelCount() * 100.0) /
1879 (dimension.width * dimension.height);
1880
1881 if (comparatorResult.getDifferentPixelCount() != 0)
1882 EXPECT_TRUE(false)
1883 << comparatorResult.getDifferentPixelCount() << " pixels ("
1884 << diffPercent << "%) are different.";
1885
1886 if (comparatorResult.getDifferentPixelCount() > threshold) {
1887 EXPECT_TRUE(false)
1888 << "Mismatched pixel count exceeds threshold. "
1889 << "Writing buffers to file.";
1890
1891 const ::testing::TestInfo* const test_info =
1892 ::testing::UnitTest::GetInstance()
1893 ->current_test_info();
1894
1895 EXPECT_EQ(testVirtualDisplay.writeBuffersToFile(
1896 test_info->name()), 0)
1897 << "Failed to write buffers.";
1898 }
1899
1900 ASSERT_LE(comparatorResult.getDifferentPixelCount(), threshold)
1901 << comparatorResult.getDifferentPixelCount() << " pixels ("
1902 << diffPercent << "%) are different. "
1903 << "Exceeds 1% threshold, terminating test. "
1904 << "Test case: " << testLayers.dump();
1905
1906 } while (testLayers.advance());
1907
1908 ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
1909 std::move(layers)));
1910 }
1911 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1912 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1913 ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
1914 } while (testVirtualDisplay.advance());
1915 }
1916
Marissa Wall4d600052016-12-15 12:16:01 -08001917 hwc2_device_t* mHwc2Device = nullptr;
Marissa Wallcfb9a072017-02-17 20:53:18 -08001918
1919 enum class Hwc2TestHotplugStatus {
1920 Init = 1,
1921 Receiving,
1922 Done,
1923 };
1924
1925 std::mutex mHotplugMutex;
1926 std::condition_variable mHotplugCv;
1927 Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
1928 std::unordered_set<hwc2_display_t> mDisplays;
Marissa Wall1db2e372016-12-15 12:19:39 -08001929
1930 /* Store all created layers that have not been destroyed. If an ASSERT_*
1931 * fails, then destroy the layers on exit */
1932 std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
Marissa Wall03c91732016-12-15 12:23:16 -08001933
1934 /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
1935 * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
1936 std::set<hwc2_display_t> mActiveDisplays;
Marissa Wall572a1ee2016-12-15 12:24:13 -08001937
Marissa Wallbad1bc72017-02-21 14:33:46 -08001938 /* Store all created virtual displays that have not been destroyed. If an
1939 * ASSERT_* fails, then destroy the virtual displays on exit */
1940 std::set<hwc2_display_t> mVirtualDisplays;
1941
Marissa Wall572a1ee2016-12-15 12:24:13 -08001942 std::mutex mVsyncMutex;
1943 std::condition_variable mVsyncCv;
1944 hwc2_display_t mVsyncDisplay;
1945 int64_t mVsyncTimestamp = -1;
Marissa Wall4d600052016-12-15 12:16:01 -08001946};
1947
Marissa Wallcfb9a072017-02-17 20:53:18 -08001948void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
1949 hwc2_display_t display, int32_t connection)
1950{
1951 if (callbackData)
1952 static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
1953 connection);
1954}
1955
Marissa Wall572a1ee2016-12-15 12:24:13 -08001956void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
1957 hwc2_display_t display, int64_t timestamp)
1958{
1959 if (callbackData)
1960 static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
1961 timestamp);
1962}
1963
Marissa Wallffc67da2016-12-15 12:26:09 -08001964void setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001965 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallffc67da2016-12-15 12:26:09 -08001966{
1967 EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001968 testLayer->getBlendMode(), outErr));
1969}
1970
1971void setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1972 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1973{
1974 buffer_handle_t handle;
1975 android::base::unique_fd acquireFence;
1976 hwc2_composition_t composition = testLayer->getComposition();
1977
1978 if (composition == HWC2_COMPOSITION_CLIENT
1979 || composition == HWC2_COMPOSITION_SOLID_COLOR
1980 || composition == HWC2_COMPOSITION_SIDEBAND)
1981 return;
1982
1983 if (testLayer->getBuffer(&handle, &acquireFence) < 0)
1984 return;
1985
1986 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
1987 composition));
1988 EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
1989 handle, acquireFence, outErr));
Marissa Wallffc67da2016-12-15 12:26:09 -08001990}
1991
Marissa Wallee242782016-12-15 12:30:12 -08001992void setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001993 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallee242782016-12-15 12:30:12 -08001994{
1995 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1996 layer, HWC2_COMPOSITION_SOLID_COLOR));
1997 ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001998 layer, testLayer->getPlaneAlpha()));
Marissa Wallee242782016-12-15 12:30:12 -08001999 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002000 layer, testLayer->getBlendMode()));
Marissa Wallee242782016-12-15 12:30:12 -08002001 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002002 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08002003}
2004
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08002005void setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002006 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08002007{
Marissa Wall5a240aa2016-12-15 12:34:06 -08002008 hwc2_composition_t composition = testLayer->getComposition();
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08002009 hwc2_error_t err = HWC2_ERROR_NONE;
2010
2011 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
2012 composition, &err));
2013 if (outErr) {
2014 *outErr = err;
2015 return;
2016 }
2017
2018 if (composition != HWC2_COMPOSITION_SIDEBAND) {
2019 EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
2020 } else {
2021 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
2022 << "returned wrong error code";
2023 }
2024}
2025
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002026void setCursorPosition(Hwc2Test* test, hwc2_display_t display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002027 hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002028{
2029 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
2030 layer, HWC2_COMPOSITION_CURSOR));
2031
Marissa Wall5a240aa2016-12-15 12:34:06 -08002032 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002033 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
2034 cursorPosition.left, cursorPosition.top, outErr));
2035}
2036
Marissa Wallb72b5c92016-12-15 12:26:39 -08002037void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002038 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallb72b5c92016-12-15 12:26:39 -08002039{
2040 EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002041 testLayer->getDataspace(), outErr));
Marissa Wallb72b5c92016-12-15 12:26:39 -08002042}
2043
Marissa Wall600a73b2016-12-15 12:30:39 -08002044void setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002045 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall600a73b2016-12-15 12:30:39 -08002046{
2047 EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002048 testLayer->getDisplayFrame(), outErr));
Marissa Wall600a73b2016-12-15 12:30:39 -08002049}
2050
Marissa Wall2b1f5302016-12-15 12:27:20 -08002051void setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002052 Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
Marissa Wall2b1f5302016-12-15 12:27:20 -08002053{
2054 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002055 testLayer->getBlendMode()));
Marissa Wall2b1f5302016-12-15 12:27:20 -08002056 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002057 testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08002058}
2059
Marissa Wallc57468f2016-12-15 12:31:12 -08002060void setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002061 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallc57468f2016-12-15 12:31:12 -08002062{
2063 EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002064 testLayer->getSourceCrop(), outErr));
Marissa Wallc57468f2016-12-15 12:31:12 -08002065}
2066
Marissa Wallad761812016-12-15 12:32:24 -08002067void setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002068 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallad761812016-12-15 12:32:24 -08002069{
2070 EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002071 testLayer->getSurfaceDamage(), outErr));
Marissa Wallad761812016-12-15 12:32:24 -08002072}
2073
Marissa Wallac108192016-12-15 12:27:48 -08002074void setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002075 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallac108192016-12-15 12:27:48 -08002076{
2077 EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002078 testLayer->getTransform(), outErr));
Marissa Wallac108192016-12-15 12:27:48 -08002079}
2080
Marissa Wallf7618ed2016-12-15 12:34:39 -08002081void setVisibleRegion(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2082 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
2083{
2084 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display, layer,
2085 testLayer->getVisibleRegion(), outErr));
2086}
2087
Marissa Wall273b1df2016-12-15 12:28:47 -08002088void setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002089 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall273b1df2016-12-15 12:28:47 -08002090{
2091 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002092 testLayer->getZOrder(), outErr));
Marissa Wall273b1df2016-12-15 12:28:47 -08002093}
2094
Marissa Wallffc67da2016-12-15 12:26:09 -08002095bool advanceBlendMode(Hwc2TestLayer* testLayer)
2096{
2097 return testLayer->advanceBlendMode();
2098}
2099
Marissa Wall5a240aa2016-12-15 12:34:06 -08002100bool advanceBuffer(Hwc2TestLayer* testLayer)
2101{
2102 if (testLayer->advanceComposition())
2103 return true;
2104 return testLayer->advanceBufferArea();
2105}
2106
Marissa Wallee242782016-12-15 12:30:12 -08002107bool advanceColor(Hwc2TestLayer* testLayer)
2108{
2109 /* Color depends on blend mode so advance blend mode last so color is not
2110 * force to update as often */
2111 if (testLayer->advancePlaneAlpha())
2112 return true;
2113 if (testLayer->advanceColor())
2114 return true;
2115 return testLayer->advanceBlendMode();
2116}
2117
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08002118bool advanceComposition(Hwc2TestLayer* testLayer)
2119{
2120 return testLayer->advanceComposition();
2121}
2122
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002123bool advanceCursorPosition(Hwc2TestLayer* testLayer)
2124{
2125 return testLayer->advanceCursorPosition();
2126}
2127
Marissa Wallb72b5c92016-12-15 12:26:39 -08002128bool advanceDataspace(Hwc2TestLayer* testLayer)
2129{
2130 return testLayer->advanceDataspace();
2131}
2132
Marissa Wall600a73b2016-12-15 12:30:39 -08002133bool advanceDisplayFrame(Hwc2TestLayer* testLayer)
2134{
2135 return testLayer->advanceDisplayFrame();
2136}
2137
Marissa Wall2b1f5302016-12-15 12:27:20 -08002138bool advancePlaneAlpha(Hwc2TestLayer* testLayer)
2139{
2140 return testLayer->advancePlaneAlpha();
2141}
2142
Marissa Wallc57468f2016-12-15 12:31:12 -08002143bool advanceSourceCrop(Hwc2TestLayer* testLayer)
2144{
2145 if (testLayer->advanceSourceCrop())
2146 return true;
2147 return testLayer->advanceBufferArea();
2148}
2149
Marissa Wallad761812016-12-15 12:32:24 -08002150bool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
2151{
2152 if (testLayer->advanceSurfaceDamage())
2153 return true;
2154 return testLayer->advanceBufferArea();
2155}
2156
Marissa Wallac108192016-12-15 12:27:48 -08002157bool advanceTransform(Hwc2TestLayer* testLayer)
2158{
2159 return testLayer->advanceTransform();
2160}
2161
Marissa Wallf7618ed2016-12-15 12:34:39 -08002162bool advanceVisibleRegions(Hwc2TestLayers* testLayers)
2163{
2164 return testLayers->advanceVisibleRegions();
2165}
2166
Marissa Wallf18cfb02017-02-21 14:01:05 -08002167bool advanceClientTargetSupport(
2168 Hwc2TestClientTargetSupport* testClientTargetSupport)
2169{
2170 return testClientTargetSupport->advance();
2171}
Marissa Wall4d600052016-12-15 12:16:01 -08002172
2173static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
2174 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
2175 HWC2_FUNCTION_CREATE_LAYER,
2176 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
2177 HWC2_FUNCTION_DESTROY_LAYER,
2178 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
2179 HWC2_FUNCTION_DUMP,
2180 HWC2_FUNCTION_GET_ACTIVE_CONFIG,
2181 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
2182 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
2183 HWC2_FUNCTION_GET_COLOR_MODES,
2184 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
2185 HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
2186 HWC2_FUNCTION_GET_DISPLAY_NAME,
2187 HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
2188 HWC2_FUNCTION_GET_DISPLAY_TYPE,
2189 HWC2_FUNCTION_GET_DOZE_SUPPORT,
2190 HWC2_FUNCTION_GET_HDR_CAPABILITIES,
2191 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
2192 HWC2_FUNCTION_GET_RELEASE_FENCES,
2193 HWC2_FUNCTION_PRESENT_DISPLAY,
2194 HWC2_FUNCTION_REGISTER_CALLBACK,
2195 HWC2_FUNCTION_SET_ACTIVE_CONFIG,
2196 HWC2_FUNCTION_SET_CLIENT_TARGET,
2197 HWC2_FUNCTION_SET_COLOR_MODE,
2198 HWC2_FUNCTION_SET_COLOR_TRANSFORM,
2199 HWC2_FUNCTION_SET_CURSOR_POSITION,
2200 HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
2201 HWC2_FUNCTION_SET_LAYER_BUFFER,
2202 HWC2_FUNCTION_SET_LAYER_COLOR,
2203 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
2204 HWC2_FUNCTION_SET_LAYER_DATASPACE,
2205 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
2206 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
2207 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
2208 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
2209 HWC2_FUNCTION_SET_LAYER_TRANSFORM,
2210 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
2211 HWC2_FUNCTION_SET_LAYER_Z_ORDER,
2212 HWC2_FUNCTION_SET_OUTPUT_BUFFER,
2213 HWC2_FUNCTION_SET_POWER_MODE,
2214 HWC2_FUNCTION_SET_VSYNC_ENABLED,
2215 HWC2_FUNCTION_VALIDATE_DISPLAY,
2216}};
2217
2218/* TESTCASE: Tests that the HWC2 supports all required functions. */
2219TEST_F(Hwc2Test, GET_FUNCTION)
2220{
2221 for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
2222 hwc2_function_pointer_t pfn = getFunction(descriptor);
2223 EXPECT_TRUE(pfn) << "failed to get function "
2224 << getFunctionDescriptorName(descriptor);
2225 }
2226}
2227
2228/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
2229TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
2230{
2231 hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
2232 EXPECT_FALSE(pfn) << "failed to get invalid function";
2233}
2234
2235/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
2236TEST_F(Hwc2Test, GET_CAPABILITIES)
2237{
2238 std::vector<hwc2_capability_t> capabilities;
2239
2240 getCapabilities(&capabilities);
2241
2242 EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
2243 HWC2_CAPABILITY_INVALID), 0);
2244}
Marissa Walla4b01482017-02-17 20:52:03 -08002245
2246static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
2247 HWC2_CALLBACK_HOTPLUG,
2248 HWC2_CALLBACK_REFRESH,
2249 HWC2_CALLBACK_VSYNC,
2250}};
2251
2252/* TESTCASE: Tests that the HWC2 can successfully register all required
2253 * callback functions. */
2254TEST_F(Hwc2Test, REGISTER_CALLBACK)
2255{
2256 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2257 const_cast<char*>("data"));
2258
2259 for (auto descriptor : callbackDescriptors) {
2260 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
2261 []() { return; }));
2262 }
2263}
2264
2265/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
2266TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
2267{
2268 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2269 const_cast<char*>("data"));
2270 hwc2_error_t err = HWC2_ERROR_NONE;
2271
2272 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
2273 []() { return; }, &err));
2274 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2275}
2276
2277/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
2278TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
2279{
2280 hwc2_callback_data_t data = nullptr;
2281
2282 for (auto descriptor : callbackDescriptors) {
2283 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
2284 []() { return; }));
2285 }
2286}
Marissa Wallcfb9a072017-02-17 20:53:18 -08002287
2288/* TESTCASE: Tests that the HWC2 returns the correct display type for each
2289 * physical display. */
2290TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
2291{
2292 for (auto display : mDisplays) {
2293 hwc2_display_type_t type;
2294
2295 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
2296 EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
2297 " correct display type";
2298 }
2299}
2300
2301/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
2302 * display is requested. */
2303TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
2304{
2305 hwc2_display_t display;
2306 hwc2_display_type_t type;
2307 hwc2_error_t err = HWC2_ERROR_NONE;
2308
2309 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2310
2311 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
2312 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2313}
Marissa Wall1db2e372016-12-15 12:19:39 -08002314
2315/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
2316TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
2317{
2318 for (auto display : mDisplays) {
2319 hwc2_layer_t layer;
2320
2321 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2322
2323 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2324 }
2325}
2326
2327/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
2328TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
2329{
2330 hwc2_display_t display;
2331 hwc2_layer_t layer;
2332 hwc2_error_t err = HWC2_ERROR_NONE;
2333
2334 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2335
2336 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
2337 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2338}
2339
2340/* TESTCASE: Tests that the HWC2 will either support a large number of resources
2341 * or will return no resources. */
2342TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
2343{
2344 const size_t layerCnt = 1000;
2345
2346 for (auto display : mDisplays) {
2347 std::vector<hwc2_layer_t> layers;
2348
2349 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
2350
2351 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
2352 }
2353}
2354
2355/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
2356TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
2357{
2358 hwc2_display_t badDisplay;
2359
2360 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
2361
2362 for (auto display : mDisplays) {
2363 hwc2_layer_t layer = 0;
2364 hwc2_error_t err = HWC2_ERROR_NONE;
2365
2366 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
2367 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2368
2369 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2370
2371 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
2372 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2373
2374 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2375 }
2376}
2377
2378/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
2379TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
2380{
2381 for (auto display : mDisplays) {
2382 hwc2_layer_t layer;
2383 hwc2_error_t err = HWC2_ERROR_NONE;
2384
2385 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
2386 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2387
2388 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
2389 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2390
2391 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
2392 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2393
2394 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
2395 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2396
2397 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
2398 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2399
2400 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2401
2402 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
2403 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2404
2405 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2406
2407 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
2408 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2409 }
2410}
Marissa Wallcf935cb2016-12-15 12:20:47 -08002411
2412static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
2413 HWC2_ATTRIBUTE_WIDTH,
2414 HWC2_ATTRIBUTE_HEIGHT,
2415}};
2416
2417static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
2418 HWC2_ATTRIBUTE_VSYNC_PERIOD,
2419 HWC2_ATTRIBUTE_DPI_X,
2420 HWC2_ATTRIBUTE_DPI_Y,
2421}};
2422
2423/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
2424 * config. */
2425TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
2426{
2427 for (auto display : mDisplays) {
2428 std::vector<hwc2_config_t> configs;
2429
2430 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2431
2432 for (auto config : configs) {
2433 int32_t value;
2434
2435 for (auto attribute : requiredAttributes) {
2436 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2437 attribute, &value));
2438 EXPECT_GE(value, 0) << "missing required attribute "
2439 << getAttributeName(attribute) << " for config "
2440 << config;
2441 }
2442 for (auto attribute : optionalAttributes) {
2443 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2444 attribute, &value));
2445 }
2446 }
2447 }
2448}
2449
2450/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
2451 * attribute */
2452TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
2453{
2454 const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
2455
2456 for (auto display : mDisplays) {
2457 std::vector<hwc2_config_t> configs;
2458
2459 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2460
2461 for (auto config : configs) {
2462 int32_t value;
2463 hwc2_error_t err = HWC2_ERROR_NONE;
2464
2465 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2466 attribute, &value, &err));
2467 EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
2468 " attribute for config " << config;
2469 }
2470 }
2471}
2472
2473/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
2474TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
2475{
2476 hwc2_display_t display;
2477 const hwc2_config_t config = 0;
2478 int32_t value;
2479 hwc2_error_t err = HWC2_ERROR_NONE;
2480
2481 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2482
2483 for (auto attribute : requiredAttributes) {
2484 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
2485 &value, &err));
2486 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2487 }
2488
2489 for (auto attribute : optionalAttributes) {
2490 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
2491 &value, &err));
2492 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2493 }
2494}
2495
2496/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
2497TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
2498{
2499 for (auto display : mDisplays) {
2500 hwc2_config_t config;
2501 int32_t value;
2502 hwc2_error_t err = HWC2_ERROR_NONE;
2503
2504 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
2505
2506 for (auto attribute : requiredAttributes) {
2507 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2508 attribute, &value, &err));
2509 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2510 }
2511
2512 for (auto attribute : optionalAttributes) {
2513 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2514 attribute, &value, &err));
2515 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2516 }
2517 }
2518}
2519
2520/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
2521TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
2522{
2523 for (auto display : mDisplays) {
2524 std::vector<hwc2_config_t> configs;
2525
2526 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2527 }
2528}
2529
2530/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
2531TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
2532{
2533 hwc2_display_t display;
2534 std::vector<hwc2_config_t> configs;
2535 hwc2_error_t err = HWC2_ERROR_NONE;
2536
2537 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2538
2539 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
2540
2541 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2542 EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
2543}
2544
2545/* TESTCASE: Tests that the HWC2 will return the same config list multiple
2546 * times in a row. */
2547TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
2548{
2549 for (auto display : mDisplays) {
2550 std::vector<hwc2_config_t> configs1, configs2;
2551
2552 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
2553 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
2554
2555 EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
2556 configs2.begin())) << "returned two different config sets";
2557 }
2558}
2559
2560/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
2561TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
2562{
2563 for (auto display : mDisplays) {
2564 std::vector<hwc2_config_t> configs;
2565
2566 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2567
2568 std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
2569 configs.end());
2570 EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
2571 " configs";
2572 }
2573}
Marissa Wall93dc04f2016-12-15 12:21:46 -08002574
2575/* TESTCASE: Tests that the HWC2 returns the active config for a display */
2576TEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
2577{
2578 for (auto display : mDisplays) {
2579 std::vector<hwc2_config_t> configs;
2580
2581 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2582
2583 for (auto config : configs) {
2584 hwc2_config_t activeConfig;
2585
2586 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2587 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
2588
2589 EXPECT_EQ(activeConfig, config) << "failed to get active config";
2590 }
2591 }
2592}
2593
2594/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
2595 * display. */
2596TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
2597{
2598 hwc2_display_t display;
2599 hwc2_config_t activeConfig;
2600 hwc2_error_t err = HWC2_ERROR_NONE;
2601
2602 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2603
2604 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
2605
2606 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2607}
2608
2609/* TESTCASE: Tests that the HWC2 either begins with a valid active config
2610 * or returns an error when getActiveConfig is called. */
2611TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
2612{
2613 for (auto display : mDisplays) {
2614 std::vector<hwc2_config_t> configs;
2615 hwc2_config_t activeConfig;
2616 hwc2_error_t err = HWC2_ERROR_NONE;
2617
2618 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2619
2620 if (configs.empty())
2621 return;
2622
2623 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
2624 if (err == HWC2_ERROR_NONE) {
2625 EXPECT_NE(std::count(configs.begin(), configs.end(),
2626 activeConfig), 0) << "active config is not found in "
2627 " configs for display";
2628 } else {
2629 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2630 }
2631 }
2632}
2633
2634/* TESTCASE: Tests that the HWC2 can set every display config as an active
2635 * config */
2636TEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
2637{
2638 for (auto display : mDisplays) {
2639 std::vector<hwc2_config_t> configs;
2640
2641 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2642
2643 for (auto config : configs) {
2644 EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2645 }
2646 }
2647}
2648
2649/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
2650TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
2651{
2652 hwc2_display_t display;
2653 const hwc2_config_t config = 0;
2654 hwc2_error_t err = HWC2_ERROR_NONE;
2655
2656 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2657
2658 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
2659 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2660}
2661
2662/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
2663TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
2664{
2665 for (auto display : mDisplays) {
2666 hwc2_config_t config;
2667 hwc2_error_t err = HWC2_ERROR_NONE;
2668
2669 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
2670
2671 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
2672 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2673 }
2674}
Marissa Wall03c91732016-12-15 12:23:16 -08002675
2676/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
2677TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
2678{
2679 for (auto display : mDisplays) {
2680 int32_t support = -1;
2681
2682 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2683
2684 EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
2685 }
2686}
2687
2688/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
2689TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
2690{
2691 hwc2_display_t display;
2692 int32_t support = -1;
2693 hwc2_error_t err = HWC2_ERROR_NONE;
2694
2695 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2696
2697 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2698
2699 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2700}
2701
2702/* TESTCASE: Tests that the HWC2 can set all supported power modes */
2703TEST_F(Hwc2Test, SET_POWER_MODE)
2704{
2705 for (auto display : mDisplays) {
2706 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2707 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2708
2709 int32_t support = -1;
2710 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2711 if (support != 1)
2712 return;
2713
2714 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2715 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2716 HWC2_POWER_MODE_DOZE_SUSPEND));
2717
2718 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2719 }
2720}
2721
2722/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
2723TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
2724{
2725 hwc2_display_t display;
2726 hwc2_error_t err = HWC2_ERROR_NONE;
2727
2728 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2729
2730 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
2731 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2732
2733 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
2734 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2735
2736 int32_t support = -1;
2737 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2738 if (support != 1)
2739 return;
2740
2741 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
2742 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2743
2744 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
2745 &err));
2746 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2747}
2748
2749/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
2750TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
2751{
2752 for (auto display : mDisplays) {
2753 hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
2754 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
2755 hwc2_error_t err = HWC2_ERROR_NONE;
2756
2757 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
2758 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
2759 << mode;
2760 }
2761}
2762
2763/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
2764 * an optional power mode. */
2765TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
2766{
2767 for (auto display : mDisplays) {
2768 int32_t support = -1;
2769 hwc2_error_t err = HWC2_ERROR_NONE;
2770
2771 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2772 if (support == 1)
2773 return;
2774
2775 ASSERT_EQ(support, 0) << "invalid doze support value";
2776
2777 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
2778 &err));
2779 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
2780
2781 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2782 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
2783 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
2784 }
2785}
2786
2787/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
2788TEST_F(Hwc2Test, SET_POWER_MODE_stress)
2789{
2790 for (auto display : mDisplays) {
2791 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2792 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2793
2794 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2795 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2796
2797 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2798 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2799
2800 int32_t support = -1;
2801 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2802 if (support != 1)
2803 return;
2804
2805 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2806 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2807
2808 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2809 HWC2_POWER_MODE_DOZE_SUSPEND));
2810 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2811 HWC2_POWER_MODE_DOZE_SUSPEND));
2812
2813 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2814 }
2815}
Marissa Wall572a1ee2016-12-15 12:24:13 -08002816
2817/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
2818 * displays */
2819TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
2820{
2821 for (auto display : mDisplays) {
2822 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2823 const_cast<char*>("data"));
2824
2825 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2826
2827 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2828 []() { return; }));
2829
2830 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2831
2832 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2833
2834 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2835 }
2836}
2837
2838/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
2839TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
2840{
2841 for (auto display : mDisplays) {
2842 hwc2_display_t receivedDisplay;
2843 int64_t receivedTimestamp;
2844
2845 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2846
2847 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
2848
2849 ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
2850 &receivedTimestamp));
2851
2852 EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
2853 EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
2854
2855 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
2856
2857 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2858 }
2859}
2860
2861/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
2862TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
2863{
2864 hwc2_display_t display;
2865 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2866 const_cast<char*>("data"));
2867 hwc2_error_t err = HWC2_ERROR_NONE;
2868
2869 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2870
2871 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2872 []() { return; }));
2873
2874 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
2875 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2876
2877 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
2878 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2879}
2880
2881/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
2882TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
2883{
2884 for (auto display : mDisplays) {
2885 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2886 const_cast<char*>("data"));
2887 hwc2_error_t err = HWC2_ERROR_NONE;
2888
2889 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2890
2891 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2892 []() { return; }));
2893
2894 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
2895 &err));
2896 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2897
2898 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2899 }
2900}
2901
2902/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
2903 * times. */
2904TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
2905{
2906 for (auto display : mDisplays) {
2907 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2908 const_cast<char*>("data"));
2909
2910 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2911
2912 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2913 []() { return; }));
2914
2915 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2916
2917 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2918 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2919
2920 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2921 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2922
2923 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2924 }
2925}
2926
2927/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
2928 * is off and no callback is registered. */
2929TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
2930{
2931 const uint secs = 1;
2932
2933 for (auto display : mDisplays) {
2934 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2935
2936 sleep(secs);
2937
2938 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2939 }
2940}
2941
2942/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
2943 * is registered. */
2944TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
2945{
2946 const uint secs = 1;
2947
2948 for (auto display : mDisplays) {
2949 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2950
2951 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2952
2953 sleep(secs);
2954
2955 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2956
2957 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2958 }
2959}
Marissa Walldd4087f2016-12-15 12:24:52 -08002960
2961/* TESTCASE: Tests that the HWC2 returns a display name for each display */
2962TEST_F(Hwc2Test, GET_DISPLAY_NAME)
2963{
2964 for (auto display : mDisplays) {
2965 std::string name;
2966
2967 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
2968 }
2969}
2970
2971/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
2972 * display */
2973TEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
2974{
2975 hwc2_display_t display;
2976 std::string name;
2977 hwc2_error_t err = HWC2_ERROR_NONE;
2978
2979 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2980
2981 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
2982 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2983}
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08002984
2985/* TESTCASE: Tests that the HWC2 can set basic composition types. */
2986TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
2987{
2988 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2989 setComposition, advanceComposition));
2990}
2991
2992/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
2993 * layer. */
2994TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
2995{
2996 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2997 setComposition, advanceComposition));
2998}
2999
3000/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
3001TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
3002{
3003 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3004 setComposition));
3005}
3006
3007/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
3008TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
3009{
3010 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
3011 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
3012 hwc2_error_t* outErr) {
3013
3014 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
3015 layer, HWC2_COMPOSITION_INVALID, outErr));
3016 }
3017 ));
3018}
Marissa Wallffc67da2016-12-15 12:26:09 -08003019
Marissa Wall2a0aaf92016-12-15 12:31:37 -08003020/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
3021TEST_F(Hwc2Test, SET_CURSOR_POSITION)
3022{
3023 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3024 ::setCursorPosition, advanceCursorPosition));
3025}
3026
3027/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
3028TEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
3029{
3030 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3031 ::setCursorPosition, advanceCursorPosition));
3032}
3033
3034/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
3035 * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
3036TEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
3037{
3038 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3039 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003040 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall5a240aa2016-12-15 12:34:06 -08003041 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08003042 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
3043 cursorPosition.left, cursorPosition.top, outErr));
3044 },
3045
3046 advanceCursorPosition));
3047}
3048
3049/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
3050 * display. */
3051TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
3052{
3053 hwc2_display_t display;
3054 hwc2_layer_t layer = 0;
3055 int32_t x = 0, y = 0;
3056 hwc2_error_t err = HWC2_ERROR_NONE;
3057
3058 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3059
3060 ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
3061 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3062}
3063
3064/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
3065TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
3066{
3067 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3068 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003069 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08003070
Marissa Wall5a240aa2016-12-15 12:34:06 -08003071 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08003072 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
3073 badLayer, cursorPosition.left, cursorPosition.top,
3074 outErr));
3075 }
3076 ));
3077}
3078
Marissa Wallffc67da2016-12-15 12:26:09 -08003079/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
3080TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
3081{
3082 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3083 setBlendMode, advanceBlendMode));
3084}
3085
3086/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
3087TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
3088{
3089 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3090 setBlendMode, advanceBlendMode));
3091}
3092
3093/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
3094TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
3095{
3096 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3097 setBlendMode));
3098}
3099
3100/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
3101TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
3102{
3103 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
3104 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
3105 hwc2_error_t* outErr) {
3106
3107 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
3108 layer, HWC2_BLEND_MODE_INVALID, outErr));
3109 }
3110 ));
3111}
Marissa Wallb72b5c92016-12-15 12:26:39 -08003112
Marissa Wall5a240aa2016-12-15 12:34:06 -08003113/* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
3114TEST_F(Hwc2Test, SET_LAYER_BUFFER)
3115{
3116 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3117 setBuffer, advanceBuffer));
3118}
3119
3120/* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
3121TEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
3122{
3123 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3124 setBuffer, advanceBuffer));
3125}
3126
3127/* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
3128TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
3129{
3130 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3131 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
3132 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
3133
3134 buffer_handle_t handle = nullptr;
3135 android::base::unique_fd acquireFence;
3136
3137 /* If there is not available buffer for the given buffer
3138 * properties, it should not fail this test case */
3139 if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
3140 *outErr = HWC2_ERROR_BAD_LAYER;
3141 return;
3142 }
3143
3144 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
3145 handle, acquireFence, outErr));
3146 }
3147 ));
3148}
3149
3150/* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
3151TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
3152{
3153 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
3154 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
3155 hwc2_error_t* outErr) {
3156
3157 buffer_handle_t handle = nullptr;
3158 int32_t acquireFence = -1;
3159
3160 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
3161 handle, acquireFence, outErr));
3162 }
3163 ));
3164}
3165
Marissa Wallee242782016-12-15 12:30:12 -08003166/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
3167TEST_F(Hwc2Test, SET_LAYER_COLOR)
3168{
3169 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3170 setColor, advanceColor));
3171}
3172
3173/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
3174TEST_F(Hwc2Test, SET_LAYER_COLOR_update)
3175{
3176 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3177 setColor, advanceColor));
3178}
3179
3180/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
3181 * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
3182TEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
3183{
3184 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
3185 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003186 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08003187
3188 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003189 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08003190 },
3191
3192 advanceColor));
3193}
3194
3195/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
3196TEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
3197{
3198 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3199 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003200 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08003201
3202 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003203 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08003204 }
3205 ));
3206}
3207
Marissa Wallb72b5c92016-12-15 12:26:39 -08003208/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
3209TEST_F(Hwc2Test, SET_LAYER_DATASPACE)
3210{
3211 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3212 setDataspace, advanceDataspace));
3213}
3214
3215/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
3216TEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
3217{
3218 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3219 setDataspace, advanceDataspace));
3220}
3221
3222/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
3223TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
3224{
3225 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3226 setDataspace));
3227}
Marissa Wall2b1f5302016-12-15 12:27:20 -08003228
Marissa Wall600a73b2016-12-15 12:30:39 -08003229/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
3230TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
3231{
3232 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3233 setDisplayFrame, advanceDisplayFrame));
3234}
3235
3236/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
3237TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
3238{
3239 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3240 setDisplayFrame, advanceDisplayFrame));
3241}
3242
3243/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
3244TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
3245{
3246 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3247 setDisplayFrame));
3248}
3249
Marissa Wall2b1f5302016-12-15 12:27:20 -08003250/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
3251TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
3252{
3253 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3254 setPlaneAlpha, advancePlaneAlpha));
3255}
3256
3257/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
3258TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
3259{
3260 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3261 setPlaneAlpha, advancePlaneAlpha));
3262}
3263
3264/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
3265TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
3266{
3267 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3268 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003269 Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
Marissa Wall2b1f5302016-12-15 12:27:20 -08003270
3271 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003272 badLayer, testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08003273 }
3274 ));
3275}
Marissa Wallac108192016-12-15 12:27:48 -08003276
Marissa Wallc57468f2016-12-15 12:31:12 -08003277/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
3278TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
3279{
3280 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3281 setSourceCrop, advanceSourceCrop));
3282}
3283
3284/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
3285TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
3286{
3287 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3288 setSourceCrop, advanceSourceCrop));
3289}
3290
3291/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
3292TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
3293{
3294 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3295 setSourceCrop));
3296}
3297
Marissa Wallad761812016-12-15 12:32:24 -08003298/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
3299TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
3300{
3301 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3302 setSurfaceDamage, advanceSurfaceDamage));
3303}
3304
3305/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
3306TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
3307{
3308 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3309 setSurfaceDamage, advanceSurfaceDamage));
3310}
3311
3312/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
3313TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
3314{
3315 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3316 setSurfaceDamage));
3317}
3318
Marissa Wallac108192016-12-15 12:27:48 -08003319/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
3320TEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
3321{
3322 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3323 setTransform, advanceTransform));
3324}
3325
3326/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
3327TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
3328{
3329 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3330 setTransform, advanceTransform));
3331}
3332
3333/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
3334TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
3335{
3336 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3337 setTransform));
3338}
Marissa Wall273b1df2016-12-15 12:28:47 -08003339
Marissa Wallf7618ed2016-12-15 12:34:39 -08003340/* TESTCASE: Tests that the HWC2 can set the visible region of a layer. */
3341TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION)
3342{
3343 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Basic, 5,
3344 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
3345 Hwc2TestLayers* testLayers) {
3346
3347 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display,
3348 layer, testLayers->getVisibleRegion(layer)));
3349 },
3350
3351 advanceVisibleRegions));
3352}
3353
3354/* TESTCASE: Tests that the HWC2 cannot set the visible region of a bad layer. */
3355TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION_bad_layer)
3356{
3357 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3358 setVisibleRegion));
3359}
3360
Marissa Wall273b1df2016-12-15 12:28:47 -08003361/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
3362TEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
3363{
3364 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
3365 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003366 Hwc2TestLayers* testLayers) {
Marissa Wall273b1df2016-12-15 12:28:47 -08003367
3368 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003369 testLayers->getZOrder(layer)));
Marissa Wallf7618ed2016-12-15 12:34:39 -08003370 },
3371
3372 /* TestLayer z orders are set during the construction of TestLayers
3373 * and cannot be updated. There is no need (or ability) to cycle
3374 * through additional z order configurations. */
3375 [] (Hwc2TestLayers* /*testLayers*/) {
3376 return false;
Marissa Wall273b1df2016-12-15 12:28:47 -08003377 }
3378 ));
3379}
3380
3381/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
3382TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
3383{
3384 const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
3385 static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
3386 static_cast<uint32_t>(UINT32_MAX / 2),
3387 static_cast<uint32_t>(UINT32_MAX) };
3388
3389 for (auto display : mDisplays) {
3390 std::vector<hwc2_config_t> configs;
3391
3392 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3393
3394 for (auto config : configs) {
3395 hwc2_layer_t layer;
3396
3397 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3398
3399 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
3400
3401 for (uint32_t zOrder : zOrders) {
3402 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
3403 }
3404
3405 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
3406 }
3407 }
3408}
3409
3410/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
3411TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
3412{
3413 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3414 setZOrder));
3415}
Marissa Wall1cd789c2017-01-27 12:55:36 -08003416
3417/* TESTCASE: Tests that the HWC2 can display a layer with basic property
3418 * coverage */
3419TEST_F(Hwc2Test, VALIDATE_DISPLAY_basic)
3420{
3421 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3422 [] (Hwc2Test* test, hwc2_display_t display,
Marissa Wall706178d2016-12-15 12:39:14 -08003423 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003424 Hwc2TestLayers* /*testLayers*/) {
Marissa Wall1cd789c2017-01-27 12:55:36 -08003425
3426 uint32_t numTypes, numRequests;
3427 bool hasChanges = false;
3428
3429 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3430 &numRequests, &hasChanges));
3431 if (hasChanges)
3432 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
3433 << "wrong number of requests";
3434 }
3435 ));
3436}
3437
3438/* TESTCASE: Tests that the HWC2 can display 5 layers with default coverage. */
3439TEST_F(Hwc2Test, VALIDATE_DISPLAY_default_5)
3440{
3441 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 5,
3442 [] (Hwc2Test* test, hwc2_display_t display,
Marissa Wall706178d2016-12-15 12:39:14 -08003443 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003444 Hwc2TestLayers* /*testLayers*/) {
Marissa Wall1cd789c2017-01-27 12:55:36 -08003445
3446 uint32_t numTypes, numRequests;
3447 bool hasChanges = false;
3448
3449 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3450 &numRequests, &hasChanges));
3451 if (hasChanges)
3452 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
3453 << "wrong number of requests";
3454 }
3455 ));
3456}
3457
3458/* TESTCASE: Tests that the HWC2 cannot validate a bad display */
3459TEST_F(Hwc2Test, VALIDATE_DISPLAY_bad_display)
3460{
3461 hwc2_display_t display;
3462 uint32_t numTypes, numRequests;
3463 hwc2_error_t err = HWC2_ERROR_NONE;
3464
3465 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3466
3467 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes, &numRequests,
3468 &err));
3469 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3470}
Marissa Wall706178d2016-12-15 12:39:14 -08003471
3472/* TESTCASE: Tests that the HWC2 can get display requests after validating a
3473 * basic layer. */
3474TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_basic)
3475{
3476 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3477 [] (Hwc2Test* test, hwc2_display_t display,
3478 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003479 Hwc2TestLayers* /*testLayers*/) {
Marissa Wall706178d2016-12-15 12:39:14 -08003480
3481 uint32_t numTypes, numRequests;
3482 bool hasChanges = false;
3483
3484 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3485 &numRequests, &hasChanges));
3486 if (hasChanges)
3487 EXPECT_LE(numTypes, layers.size())
3488 << "wrong number of requests";
3489
3490 EXPECT_NO_FATAL_FAILURE(test->handleRequests(display, layers,
3491 numRequests));
3492 }
3493 ));
3494}
3495
3496/* TESTCASE: Tests that the HWC2 cannot get display requests from a bad display */
3497TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_bad_display)
3498{
3499 hwc2_display_t display;
3500 hwc2_display_request_t displayRequests;
3501 std::vector<hwc2_layer_t> layers;
3502 std::vector<hwc2_layer_request_t> layerRequests;
3503 hwc2_error_t err = HWC2_ERROR_NONE;
3504
3505 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3506
3507 EXPECT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequests,
3508 &layers, &layerRequests, &err));
3509 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3510}
3511
3512/* TESTCASE: Tests that the HWC2 cannot get display requests from an non
3513 * validated display. */
3514TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_not_validated)
3515{
3516 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3517 [] (Hwc2Test* test, hwc2_display_t display,
3518 std::vector<hwc2_layer_t>* layers) {
3519
3520 hwc2_display_request_t displayRequests;
3521 std::vector<hwc2_layer_request_t> layerRequests;
3522 hwc2_error_t err = HWC2_ERROR_NONE;
3523
3524 ASSERT_NO_FATAL_FAILURE(test->getDisplayRequests(display,
3525 &displayRequests, layers, &layerRequests, &err));
3526 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3527 << "returned wrong error code";
3528 }
3529 ));
3530}
3531
3532/* TESTCASE: Tests that the HWC2 can get changed composition types after
3533 * validating a basic layer. */
3534TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_basic)
3535{
3536 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3537 [] (Hwc2Test* test, hwc2_display_t display,
3538 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003539 Hwc2TestLayers* testLayers) {
Marissa Wall706178d2016-12-15 12:39:14 -08003540
3541 uint32_t numTypes, numRequests;
3542 bool hasChanges = false;
3543
3544 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3545 &numRequests, &hasChanges));
3546 if (hasChanges)
3547 EXPECT_LE(numTypes, layers.size())
3548 << "wrong number of requests";
3549
3550 EXPECT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
Marissa Wall563030b2017-02-21 14:01:05 -08003551 *testLayers, layers, numTypes));
Marissa Wall706178d2016-12-15 12:39:14 -08003552 }
3553 ));
3554}
3555
3556/* TESTCASE: Tests that the HWC2 cannot get changed composition types from a bad
3557 * display */
3558TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_bad_display)
3559{
3560 hwc2_display_t display;
3561 std::vector<hwc2_layer_t> layers;
3562 std::vector<hwc2_composition_t> types;
3563 hwc2_error_t err = HWC2_ERROR_NONE;
3564
3565 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3566
3567 EXPECT_NO_FATAL_FAILURE(getChangedCompositionTypes(display, &layers,
3568 &types, &err));
3569 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3570}
3571
3572/* TESTCASE: Tests that the HWC2 cannot get changed composition types from an non
3573 * validated display. */
3574TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_not_validated)
3575{
3576 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3577 [] (Hwc2Test* test, hwc2_display_t display,
3578 std::vector<hwc2_layer_t>* layers) {
3579
3580 std::vector<hwc2_composition_t> types;
3581 hwc2_error_t err = HWC2_ERROR_NONE;
3582
3583 ASSERT_NO_FATAL_FAILURE(test->getChangedCompositionTypes(
3584 display, layers, &types, &err));
3585 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3586 << "returned wrong error code";
3587 }
3588 ));
3589}
3590
3591/* TESTCASE: Tests that the HWC2 can accept display changes after validating a
3592 * basic layer. */
3593TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_basic)
3594{
3595 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3596 [] (Hwc2Test* test, hwc2_display_t display,
3597 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003598 Hwc2TestLayers* testLayers) {
Marissa Wall706178d2016-12-15 12:39:14 -08003599
3600 uint32_t numTypes, numRequests;
3601 bool hasChanges = false;
3602
3603 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3604 &numRequests, &hasChanges));
3605 if (hasChanges)
3606 EXPECT_LE(numTypes, layers.size())
3607 << "wrong number of requests";
3608
3609 ASSERT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
Marissa Wall563030b2017-02-21 14:01:05 -08003610 *testLayers, layers, numTypes));
Marissa Wall706178d2016-12-15 12:39:14 -08003611
3612 EXPECT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display));
3613 }
3614 ));
3615}
3616
3617/* TESTCASE: Tests that the HWC2 cannot accept display changes from a bad
3618 * display */
3619TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_bad_display)
3620{
3621 hwc2_display_t display;
3622 hwc2_error_t err = HWC2_ERROR_NONE;
3623
3624 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3625
3626 EXPECT_NO_FATAL_FAILURE(acceptDisplayChanges(display, &err));
3627 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3628}
3629
3630/* TESTCASE: Tests that the HWC2 cannot accept display changes from an non
3631 * validated display. */
3632TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_not_validated)
3633{
3634 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3635 [] (Hwc2Test* test, hwc2_display_t display,
3636 std::vector<hwc2_layer_t>* /*layers*/) {
3637
3638 hwc2_error_t err = HWC2_ERROR_NONE;
3639
3640 ASSERT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display, &err));
3641 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3642 << "returned wrong error code";
3643 }
3644 ));
3645}
Marissa Wallf18cfb02017-02-21 14:01:05 -08003646
3647/* TESTCASE: Tests that the HWC2 supports client target with required values */
3648TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT)
3649{
3650 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3651 [] (Hwc2Test* test, hwc2_display_t display,
3652 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3653
3654 const Area bufferArea = testClientTargetSupport.getBufferArea();
3655 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3656
3657 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3658 bufferArea.width, bufferArea.height, format,
3659 testClientTargetSupport.getDataspace()));
3660 },
3661
3662 advanceClientTargetSupport));
3663}
3664
3665/* TESTCASE: Tests that the HWC2 cannot get client target support for a bad
3666 * display. */
3667TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_bad_display)
3668{
3669 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3670 [] (Hwc2Test* test, hwc2_display_t /*display*/,
3671 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3672
3673 const Area bufferArea = testClientTargetSupport.getBufferArea();
3674 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3675 hwc2_display_t badDisplay;
3676 hwc2_error_t err = HWC2_ERROR_NONE;
3677
3678 ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
3679
3680 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(badDisplay,
3681 bufferArea.width, bufferArea.height, format,
3682 testClientTargetSupport.getDataspace(), &err));
3683 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3684 },
3685
3686 advanceClientTargetSupport));
3687}
3688
3689/* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
3690 * for a variety of client target values. */
3691TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_unsupported)
3692{
3693 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Complete,
3694 [] (Hwc2Test* test, hwc2_display_t display,
3695 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3696
3697 const Area bufferArea = testClientTargetSupport.getBufferArea();
3698 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3699 hwc2_error_t err = HWC2_ERROR_NONE;
3700
3701 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3702 bufferArea.width, bufferArea.height, format,
3703 testClientTargetSupport.getDataspace(), &err));
3704 EXPECT_TRUE(err == HWC2_ERROR_NONE
3705 || err == HWC2_ERROR_UNSUPPORTED)
3706 << "returned wrong error code";
3707 },
3708
3709 advanceClientTargetSupport));
3710}
3711
3712/* TESTCASE: Tests that the HWC2 can set a client target buffer for a basic
3713 * layer. */
3714TEST_F(Hwc2Test, SET_CLIENT_TARGET_basic)
3715{
3716 const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3717 const hwc_region_t damage = { };
3718 const size_t layerCnt = 1;
3719
3720 for (auto display : mDisplays) {
3721 std::vector<hwc2_config_t> configs;
3722
3723 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
3724
3725 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3726
3727 for (auto config : configs) {
3728 Area displayArea;
3729 std::vector<hwc2_layer_t> layers;
3730
3731 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3732 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
3733
3734 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
3735 Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Basic,
3736 displayArea);
3737
3738 if (!testLayers.optimizeLayouts())
3739 continue;
3740
3741 Hwc2TestClientTarget testClientTarget;
3742
3743 do {
3744 std::set<hwc2_layer_t> clientLayers;
3745 std::set<hwc2_layer_t> clearLayers;
3746 uint32_t numTypes, numRequests;
3747 bool hasChanges, skip;
3748 bool flipClientTarget;
3749 buffer_handle_t handle;
3750 int32_t acquireFence;
3751
3752 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
3753 &testLayers, &skip));
3754 if (skip)
3755 continue;
3756
3757 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
3758 &numRequests, &hasChanges));
3759 if (hasChanges)
3760 EXPECT_LE(numTypes, layers.size())
3761 << "wrong number of requests";
3762
3763 ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
3764 testLayers, layers, numTypes, &clientLayers));
3765 ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
3766 numRequests, &clearLayers, &flipClientTarget));
3767 ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3768 clearLayers, flipClientTarget, displayArea, &handle,
3769 &acquireFence), 0);
3770 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle,
3771 acquireFence, dataspace, damage));
3772
3773 if (acquireFence >= 0)
3774 close(acquireFence);
3775
3776 } while (testLayers.advance());
3777
3778 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
3779 }
3780
3781 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
3782 }
3783}
3784
3785/* TESTCASE: Tests that the HWC2 cannot set a client target for a bad display. */
3786TEST_F(Hwc2Test, SET_CLIENT_TARGET_bad_display)
3787{
3788 hwc2_display_t display;
3789 std::vector<hwc2_layer_t> layers;
3790 const Area displayArea = {0, 0};
3791 Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Default, displayArea);
3792 std::set<hwc2_layer_t> clientLayers;
3793 std::set<hwc2_layer_t> flipClientTargetLayers;
3794 bool flipClientTarget = true;
3795 const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3796 const hwc_region_t damage = { };
3797 buffer_handle_t handle;
3798 int32_t acquireFence;
3799 hwc2_error_t err = HWC2_ERROR_NONE;
3800
3801 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3802
3803 Hwc2TestClientTarget testClientTarget;
3804
3805 ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3806 flipClientTargetLayers, flipClientTarget, displayArea, &handle,
3807 &acquireFence), 0);
3808
3809 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
3810 dataspace, damage, &err));
3811
3812 if (acquireFence >= 0)
3813 close(acquireFence);
3814
3815 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3816}
Marissa Wall563030b2017-02-21 14:01:05 -08003817
3818/* TESTCASE: Tests that the HWC2 can present 1 default layer. */
3819TEST_F(Hwc2Test, PRESENT_DISPLAY_default_1)
3820{
3821 const size_t layerCnt = 1;
3822 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3823 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3824 bool optimize = false;
3825
3826 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3827 optimize));
3828}
3829
3830/* TESTCASE: Tests that the HWC2 can present 2 default layers. */
3831TEST_F(Hwc2Test, PRESENT_DISPLAY_default_2)
3832{
3833 const size_t layerCnt = 2;
3834 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3835 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3836 bool optimize = false;
3837
3838 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3839 optimize));
3840}
3841
3842/* TESTCASE: Tests that the HWC2 can present 3 default layers. */
3843TEST_F(Hwc2Test, PRESENT_DISPLAY_default_3)
3844{
3845 const size_t layerCnt = 3;
3846 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3847 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3848 bool optimize = false;
3849
3850 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3851 optimize));
3852}
3853
3854/* TESTCASE: Tests that the HWC2 can present 4 default layers. */
3855TEST_F(Hwc2Test, PRESENT_DISPLAY_default_4)
3856{
3857 const size_t layerCnt = 4;
3858 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3859 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3860 bool optimize = false;
3861
3862 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3863 optimize));
3864}
3865
3866/* TESTCASE: Tests that the HWC2 can present 5 default layers. */
3867TEST_F(Hwc2Test, PRESENT_DISPLAY_default_5)
3868{
3869 const size_t layerCnt = 5;
3870 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3871 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3872 bool optimize = false;
3873
3874 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3875 optimize));
3876}
3877
3878/* TESTCASE: Tests that the HWC2 can present 6 default layers. */
3879TEST_F(Hwc2Test, PRESENT_DISPLAY_default_6)
3880{
3881 const size_t layerCnt = 6;
3882 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3883 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3884 bool optimize = false;
3885
3886 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3887 optimize));
3888}
3889
3890/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3891 * blend mode. */
3892TEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_1)
3893{
3894 const size_t layerCnt = 1;
3895 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3896 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3897 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
3898 {Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Basic},
3899 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
3900 bool optimize = false;
3901
3902 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3903 optimize));
3904}
3905
3906/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3907 * blend mode. */
3908TEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_2)
3909{
3910 const size_t layerCnt = 2;
3911 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3912 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3913 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
3914 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
3915 bool optimize = false;
3916
3917 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3918 optimize));
3919}
3920
3921/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3922 * buffer. */
3923TEST_F(Hwc2Test, PRESENT_DISPLAY_buffer_1)
3924{
3925 const size_t layerCnt = 1;
3926 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3927 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3928 {{Hwc2TestPropertyName::BufferArea, Hwc2TestCoverage::Complete}};
3929 bool optimize = true;
3930
3931 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3932 optimize));
3933}
3934
3935/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3936 * color. */
3937TEST_F(Hwc2Test, PRESENT_DISPLAY_color_1)
3938{
3939 const size_t layerCnt = 1;
3940 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3941 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3942 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3943 {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Complete}};
3944 bool optimize = true;
3945
3946 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3947 optimize));
3948}
3949
3950/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3951 * color. */
3952TEST_F(Hwc2Test, PRESENT_DISPLAY_color_2)
3953{
3954 const size_t layerCnt = 2;
3955 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3956 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3957 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3958 {Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3959 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic},
3960 {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Basic}};
3961 bool optimize = true;
3962
3963 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3964 optimize));
3965}
3966
3967/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3968 * composition. */
3969TEST_F(Hwc2Test, PRESENT_DISPLAY_composition_1)
3970{
3971 const size_t layerCnt = 1;
3972 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3973 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3974 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete}};
3975 bool optimize = true;
3976
3977 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3978 optimize));
3979}
3980
3981/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3982 * cursor. */
3983TEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_1)
3984{
3985 const size_t layerCnt = 1;
3986 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3987 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3988 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3989 {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete}};
3990 bool optimize = true;
3991
3992 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3993 optimize));
3994}
3995
3996/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3997 * cursor. */
3998TEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_2)
3999{
4000 const size_t layerCnt = 2;
4001 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4002 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4003 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
4004 {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete},
4005 {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
4006 bool optimize = true;
4007
4008 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4009 optimize));
4010}
4011
4012/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4013 * dataspace. */
4014TEST_F(Hwc2Test, PRESENT_DISPLAY_dataspace_1)
4015{
4016 const size_t layerCnt = 1;
4017 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4018 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4019 {{Hwc2TestPropertyName::Dataspace, Hwc2TestCoverage::Complete}};
4020 bool optimize = true;
4021
4022 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4023 optimize));
4024}
4025
4026/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4027 * display frame. */
4028TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_1)
4029{
4030 const size_t layerCnt = 1;
4031 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4032 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4033 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
4034 bool optimize = true;
4035
4036 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4037 optimize));
4038}
4039
4040/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
4041 * display frame. */
4042TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_2)
4043{
4044 const size_t layerCnt = 2;
4045 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4046 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4047 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
4048 bool optimize = true;
4049
4050 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4051 optimize));
4052}
4053
4054/* TESTCASE: Tests that the HWC2 can present 3 layers with complete coverage of
4055 * display frame. */
4056TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_3)
4057{
4058 const size_t layerCnt = 3;
4059 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4060 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4061 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
4062 bool optimize = true;
4063
4064 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4065 optimize));
4066}
4067
4068/* TESTCASE: Tests that the HWC2 can present 4 layers with complete coverage of
4069 * display frame. */
4070TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_4)
4071{
4072 const size_t layerCnt = 4;
4073 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4074 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4075 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
4076 bool optimize = true;
4077
4078 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4079 optimize));
4080}
4081
4082/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4083 * plane alpha. */
4084TEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_1)
4085{
4086 const size_t layerCnt = 1;
4087 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4088 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4089 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
4090 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
4091 bool optimize = false;
4092
4093 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4094 optimize));
4095}
4096
4097/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
4098 * plane alpha. */
4099TEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_2)
4100{
4101 const size_t layerCnt = 2;
4102 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4103 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4104 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
4105 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
4106 bool optimize = false;
4107
4108 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4109 optimize));
4110}
4111
4112/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4113 * source crop. */
4114TEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_1)
4115{
4116 const size_t layerCnt = 1;
4117 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4118 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4119 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
4120 {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
4121 bool optimize = true;
4122
4123 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4124 optimize));
4125}
4126
4127/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
4128 * source crop. */
4129TEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_2)
4130{
4131 const size_t layerCnt = 2;
4132 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4133 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4134 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
4135 {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
4136 bool optimize = true;
4137
4138 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4139 optimize));
4140}
4141
4142
4143/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4144 * surface damage. */
4145TEST_F(Hwc2Test, PRESENT_DISPLAY_surface_damage_1)
4146{
4147 const size_t layerCnt = 1;
4148 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4149 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4150 {{Hwc2TestPropertyName::SurfaceDamage, Hwc2TestCoverage::Complete}};
4151 bool optimize = true;
4152
4153 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4154 optimize));
4155}
4156
4157/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4158 * transform. */
4159TEST_F(Hwc2Test, PRESENT_DISPLAY_transform_1)
4160{
4161 const size_t layerCnt = 1;
4162 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4163 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4164 {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete}};
4165 bool optimize = true;
4166
4167 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4168 optimize));
4169}
4170
4171/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
4172 * transform. */
4173TEST_F(Hwc2Test, PRESENT_DISPLAY_transform_2)
4174{
4175 const size_t layerCnt = 2;
4176 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4177 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4178 {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete},
4179 {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
4180 bool optimize = true;
4181
4182 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4183 optimize));
4184}
4185
4186/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4187 * basic. */
4188TEST_F(Hwc2Test, PRESENT_DISPLAY_basic_1)
4189{
4190 const size_t layerCnt = 1;
4191 Hwc2TestCoverage coverage = Hwc2TestCoverage::Basic;
4192 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
4193 bool optimize = true;
4194
4195 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4196 optimize));
4197}
4198
4199/* TESTCASE: Tests that the HWC2 cannot present a bad display. */
4200TEST_F(Hwc2Test, PRESENT_DISPLAY_bad_display)
4201{
4202 hwc2_display_t display;
4203 int32_t presentFence;
4204 hwc2_error_t err = HWC2_ERROR_NONE;
4205
4206 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4207
4208 ASSERT_NO_FATAL_FAILURE(presentDisplay(display, &presentFence, &err));
4209 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4210}
4211
4212/* TESTCASE: Tests that the HWC2 cannot present an unvalidated display. */
4213TEST_F(Hwc2Test, PRESENT_DISPLAY_not_validated)
4214{
4215 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 1,
4216 [] (Hwc2Test* test, hwc2_display_t display,
4217 const std::vector<hwc2_layer_t>& /*layers*/,
4218 Hwc2TestLayers* /*testLayers*/) {
4219
4220 int32_t presentFence;
4221 hwc2_error_t err = HWC2_ERROR_NONE;
4222
4223 ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
4224 HWC2_POWER_MODE_ON));
4225 ASSERT_NO_FATAL_FAILURE(test->enableVsync(display));
4226
4227 ASSERT_NO_FATAL_FAILURE(test->waitForVsync());
4228
4229 ASSERT_NO_FATAL_FAILURE(test->presentDisplay(display,
4230 &presentFence, &err));
4231 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
4232 << "returned wrong error code";
4233
4234 ASSERT_NO_FATAL_FAILURE(test->disableVsync(display));
4235 ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
4236 HWC2_POWER_MODE_OFF));
4237 }
4238 ));
4239}
4240
4241/* TESTCASE: Tests that the HWC2 cannot get release fences from a bad display. */
4242TEST_F(Hwc2Test, GET_RELEASE_FENCES_bad_display)
4243{
4244 hwc2_display_t display;
4245 std::vector<hwc2_layer_t> layers;
4246 std::vector<int32_t> fences;
4247 hwc2_error_t err = HWC2_ERROR_NONE;
4248
4249 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4250
4251 ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences, &err));
4252 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4253}
Marissa Wall35040c52016-12-15 12:41:06 -08004254
4255static const std::array<android_color_mode, 9> androidColorModes = {{
4256 HAL_COLOR_MODE_NATIVE,
4257 HAL_COLOR_MODE_STANDARD_BT601_625,
4258 HAL_COLOR_MODE_STANDARD_BT601_625_UNADJUSTED,
4259 HAL_COLOR_MODE_STANDARD_BT601_525,
4260 HAL_COLOR_MODE_STANDARD_BT601_525_UNADJUSTED,
4261 HAL_COLOR_MODE_STANDARD_BT709,
4262 HAL_COLOR_MODE_DCI_P3,
4263 HAL_COLOR_MODE_SRGB,
4264 HAL_COLOR_MODE_ADOBE_RGB,
4265}};
4266
4267/* TESTCASE: Tests that the HWC2 can get the color modes for a display. The
4268 * display must support HAL_COLOR_MODE_NATIVE */
4269TEST_F(Hwc2Test, GET_COLOR_MODES)
4270{
4271 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4272 [] (Hwc2Test* test, hwc2_display_t display) {
4273
4274 std::vector<android_color_mode_t> colorModes;
4275
4276 ASSERT_NO_FATAL_FAILURE(test->getColorModes(display,
4277 &colorModes));
4278
4279 EXPECT_NE(std::count(colorModes.begin(), colorModes.end(),
4280 HAL_COLOR_MODE_NATIVE), 0) << "all displays"
4281 " must support HAL_COLOR_MODE_NATIVE";
4282 }
4283 ));
4284}
4285
4286/* TESTCASE: Tests that the HWC2 cannot get color modes from a bad display. */
4287TEST_F(Hwc2Test, GET_COLOR_MODES_bad_display)
4288{
4289 hwc2_display_t display;
4290 std::vector<android_color_mode_t> colorModes;
4291 hwc2_error_t err = HWC2_ERROR_NONE;
4292
4293 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4294
4295 ASSERT_NO_FATAL_FAILURE(getColorModes(display, &colorModes, &err));
4296 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4297}
4298
4299/* TESTCASE: Tests that the HWC2 can set the required color mode on a display. */
4300TEST_F(Hwc2Test, SET_COLOR_MODES)
4301{
4302 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4303 [] (Hwc2Test* test, hwc2_display_t display) {
4304
4305 const android_color_mode_t colorMode = HAL_COLOR_MODE_NATIVE;
4306
4307 EXPECT_NO_FATAL_FAILURE(test->setColorMode(display, colorMode));
4308 }
4309 ));
4310}
4311
4312/* TESTCASE: Tests that the HWC2 cannot set a color mode on a bad display. */
4313TEST_F(Hwc2Test, SET_COLOR_MODES_bad_display)
4314{
4315 hwc2_display_t display;
4316 const android_color_mode_t colorMode = HAL_COLOR_MODE_NATIVE;
4317 hwc2_error_t err = HWC2_ERROR_NONE;
4318
4319 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4320
4321 ASSERT_NO_FATAL_FAILURE(setColorMode(display, colorMode, &err));
4322 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4323}
4324
4325/* TESTCASE: Tests that the HWC2 cannot set an invalid color mode. */
4326TEST_F(Hwc2Test, SET_COLOR_MODES_bad_parameter)
4327{
4328 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4329 [] (Hwc2Test* test, hwc2_display_t display) {
4330
4331 const android_color_mode_t colorMode =
4332 static_cast<android_color_mode_t>(-1);
4333 hwc2_error_t err = HWC2_ERROR_NONE;
4334
4335 ASSERT_NO_FATAL_FAILURE(test->setColorMode(display, colorMode,
4336 &err));
4337 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
4338 << "returned wrong error code";
4339 }
4340 ));
4341}
4342
4343/* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
4344 * for all valid color modes. */
4345TEST_F(Hwc2Test, SET_COLOR_MODES_unsupported)
4346{
4347 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4348 [] (Hwc2Test* test, hwc2_display_t display) {
4349
4350 for (auto colorMode : androidColorModes) {
4351 hwc2_error_t err = HWC2_ERROR_NONE;
4352
4353 ASSERT_NO_FATAL_FAILURE(test->setColorMode(display,
4354 colorMode, &err));
4355
4356 EXPECT_TRUE(err == HWC2_ERROR_NONE
4357 || err == HWC2_ERROR_UNSUPPORTED)
4358 << "returned wrong error code";
4359 }
4360 }
4361 ));
4362}
4363
4364/* TESTCASE: Tests that the HWC2 gets the HDR capabilities for a display and
4365 * test if they are valid. */
4366TEST_F(Hwc2Test, GET_HDR_CAPABILITIES)
4367{
4368 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4369 [] (Hwc2Test* test, hwc2_display_t display) {
4370
4371 std::vector<android_hdr_t> hdrCapabilities;
4372 float maxLuminance, maxAverageLuminance, minLuminance;
4373
4374 EXPECT_NO_FATAL_FAILURE(test->getHdrCapabilities(display,
4375 &hdrCapabilities, &maxLuminance, &maxAverageLuminance,
4376 &minLuminance));
4377
4378 if (hdrCapabilities.empty())
4379 return;
4380
4381 EXPECT_GE(maxLuminance, maxAverageLuminance);
4382 EXPECT_GE(maxAverageLuminance, minLuminance);
4383 }
4384 ));
4385}
4386
4387/* TESTCASE: Tests that the HWC2 cannot get hdr capabilities from a bad display */
4388TEST_F(Hwc2Test, GET_HDR_CAPABILITIES_bad_display)
4389{
4390 hwc2_display_t display;
4391 std::vector<android_hdr_t> hdrCapabilities;
4392 float maxLuminance, maxAverageLuminance, minLuminance;
4393 hwc2_error_t err = HWC2_ERROR_NONE;
4394
4395 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4396
4397 ASSERT_NO_FATAL_FAILURE(getHdrCapabilities(display, &hdrCapabilities,
4398 &maxLuminance, &maxAverageLuminance, &minLuminance, &err));
4399 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4400}
4401
4402static const std::array<float, 16> identityMatrix = {{
4403 1.0, 0.0, 0.0, 0.0,
4404 0.0, 1.0, 0.0, 0.0,
4405 0.0, 0.0, 1.0, 0.0,
4406 0.0, 0.0, 0.0, 1.0,
4407}};
4408
4409/* Values for the color transform matrices were precomputed using the source code
4410 * in surfaceflinger/Effects/Daltonizer.cpp. */
4411
4412static const std::array<const std::array<float, 16>, 5> exampleMatrices = {{
4413 identityMatrix,
4414 /* Converts RGB color to the XYZ space */
4415 {{ 0.4124, 0.2126, 0.0193, 0,
4416 0.3576, 0.7152, 0.1192, 0,
4417 0.1805, 0.0722, 0.9505, 0,
4418 0 , 0 , 0 , 1 }},
4419 /* Protanomaly */
4420 {{ 0.068493, 0.931506, 0, 0,
4421 0.068493, 0.931507, 0, 0,
4422 0.013626, -0.013626, 1, 0,
4423 0, 0, 0, 1 }},
4424 /* Deuteranomaly */
4425 {{ 0.288299, 0.711701, 0, 0,
4426 0.052709, 0.947291, 0, 0,
4427 -0.257912, 0.257912, 1, 0,
4428 0, 0, 0, 1 }},
4429 /* Tritanomaly */
4430 {{ 1, -0.805712, 0.805712, 0,
4431 0, 0.378838, 0.621162, 0,
4432 0, 0.104823, 0.895177, 0,
4433 0, 0, 0, 1 }},
4434}};
4435
4436/* TESTCASE: Tests that the HWC2 can set the identity color transform */
4437TEST_F(Hwc2Test, SET_COLOR_TRANSFORM)
4438{
4439 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4440 [] (Hwc2Test* test, hwc2_display_t display) {
4441
4442 EXPECT_NO_FATAL_FAILURE(test->setColorTransform(display,
4443 identityMatrix, HAL_COLOR_TRANSFORM_IDENTITY));
4444 }
4445 ));
4446}
4447
4448/* TESTCASE: Tests that the HWC2 cannot set the color transform for a bad
4449 * display. */
4450TEST_F(Hwc2Test, SET_COLOR_TRANSFORM_bad_display)
4451{
4452 hwc2_display_t display;
4453 hwc2_error_t err = HWC2_ERROR_NONE;
4454
4455 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4456
4457 ASSERT_NO_FATAL_FAILURE(setColorTransform(display, identityMatrix,
4458 HAL_COLOR_TRANSFORM_IDENTITY, &err));
4459 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4460}
4461
4462/* TESTCASE: Tests that the HWC2 cannot set an invalid color transform. */
4463TEST_F(Hwc2Test, SET_COLOR_TRANSFORM_bad_parameter)
4464{
4465 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4466 [] (Hwc2Test* test, hwc2_display_t display) {
4467
4468 const android_color_transform_t hint =
4469 static_cast<android_color_transform_t>(-1);
4470 hwc2_error_t err = HWC2_ERROR_NONE;
4471
4472 ASSERT_NO_FATAL_FAILURE(test->setColorTransform(display,
4473 identityMatrix, hint, &err));
4474 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
4475 << "returned wrong error code";
4476 }
4477 ));
4478}
4479
4480/* TESTCASE: Tests that the HWC2 can set an arbitrary color matrix. */
4481TEST_F(Hwc2Test, SET_COLOR_TRANSFORM_arbitrary_matrix)
4482{
4483 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4484 [] (Hwc2Test* test, hwc2_display_t display) {
4485
4486 const android_color_transform_t hint =
4487 HAL_COLOR_TRANSFORM_ARBITRARY_MATRIX;
4488
4489 for (const std::array<float, 16>& matrix : exampleMatrices) {
4490 EXPECT_NO_FATAL_FAILURE(test->setColorTransform(display,
4491 matrix, hint));
4492 }
4493 }
4494 ));
4495}
Marissa Wallbad1bc72017-02-21 14:33:46 -08004496
4497/* TESTCASE: Tests that the HWC2 create an destory virtual displays. */
4498TEST_F(Hwc2Test, CREATE_DESTROY_VIRTUAL_DISPLAY)
4499{
4500 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Complete,
4501 [] (Hwc2Test* /*test*/, hwc2_display_t /*display*/,
4502 Hwc2TestVirtualDisplay* /*testVirtualDisplay*/) { }));
4503}
4504
4505/* TESTCASE: Tests that the HWC2 can create and destroy multiple virtual
4506 * displays. */
4507TEST_F(Hwc2Test, CREATE_DESTROY_VIRTUAL_DISPLAY_multiple)
4508{
4509 Hwc2TestVirtualDisplay testVirtualDisplay(Hwc2TestCoverage::Complete);
4510 std::vector<hwc2_display_t> displays;
4511
4512 do {
4513 const UnsignedArea& dimension =
4514 testVirtualDisplay.getDisplayDimension();
4515 android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
4516 hwc2_display_t display;
4517 hwc2_error_t err = HWC2_ERROR_NONE;
4518
4519 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(dimension.width,
4520 dimension.height, &desiredFormat, &display, &err));
4521
4522 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_NO_RESOURCES
4523 || err == HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
4524 EXPECT_GE(desiredFormat, 0) << "invalid format";
4525
4526 if (err == HWC2_ERROR_NONE)
4527 displays.push_back(display);
4528
4529 } while (testVirtualDisplay.advance());
4530
4531 for (hwc2_display_t display : displays) {
4532 EXPECT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
4533 }
4534}
4535
4536/* TESTCASE: Tests that the HWC2 cannot destroy a bad virtual displays. */
4537TEST_F(Hwc2Test, DESTROY_VIRTUAL_DISPLAY_bad_display)
4538{
4539 hwc2_display_t display;
4540 hwc2_error_t err = HWC2_ERROR_NONE;
4541
4542 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4543
4544 ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display, &err));
4545 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4546}
4547
4548/* TESTCASE: Tests that the HWC2 cannot destroy a physical display. */
4549TEST_F(Hwc2Test, DESTROY_VIRTUAL_DISPLAY_bad_parameter)
4550{
Marissa Wallbad1bc72017-02-21 14:33:46 -08004551 hwc2_error_t err = HWC2_ERROR_NONE;
Arun Kumar K.R0b8fd892017-06-16 15:20:01 +05304552 for (auto display : mDisplays) {
4553 ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display, &err));
4554 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
4555 }
Marissa Wallbad1bc72017-02-21 14:33:46 -08004556}
4557
4558/* TESTCASE: Tests that the HWC2 can get the max virtual display count. */
4559TEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT)
4560{
4561 uint32_t maxCnt;
4562
4563 ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt));
4564}
4565
4566/* TESTCASE: Tests that the HWC2 returns the same max virtual display count for
4567 * each call. */
4568TEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT_duplicate)
4569{
4570 uint32_t maxCnt1, maxCnt2;
4571
4572 ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt1));
4573 ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt2));
4574
4575 EXPECT_EQ(maxCnt1, maxCnt2) << "returned two different max virtual display"
4576 " counts";
4577}
4578
4579/* TESTCASE: Tests that the HWC2 can create the max number of virtual displays
4580 * that it reports. */
4581TEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT_create_max)
4582{
4583 std::vector<hwc2_display_t> displays;
4584 uint32_t maxCnt;
4585
4586 ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt));
4587
4588 while (displays.size() < maxCnt) {
4589 uint32_t width = 1920, height = 1080;
4590 android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
4591 hwc2_display_t display;
4592 hwc2_error_t err = HWC2_ERROR_NONE;
4593
4594 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(width, height,
4595 &desiredFormat, &display, &err));
4596
4597 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
4598 << "returned wrong error code";
4599 if (err != HWC2_ERROR_NONE)
4600 break;
4601
4602 displays.push_back(display);
4603 }
4604
4605 for (hwc2_display_t display : displays) {
4606 EXPECT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
4607 }
4608}
4609
4610/* TESTCASE: Tests that the HWC2 can set an output buffer for a virtual
4611 * display. */
4612TEST_F(Hwc2Test, SET_OUTPUT_BUFFER)
4613{
4614 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Complete,
4615 [] (Hwc2Test* test, hwc2_display_t display,
4616 Hwc2TestVirtualDisplay* testVirtualDisplay) {
4617
4618 buffer_handle_t handle;
4619 android::base::unique_fd acquireFence;
4620
David Hanna Jr3f056022017-07-27 19:19:15 -07004621 if (testVirtualDisplay->getOutputBuffer(&handle, &acquireFence) >= 0)
Marissa Wallbad1bc72017-02-21 14:33:46 -08004622 EXPECT_NO_FATAL_FAILURE(test->setOutputBuffer(display,
4623 handle, acquireFence));
4624 }));
4625}
4626
4627/* TESTCASE: Tests that the HWC2 cannot set an output buffer for a bad display */
4628TEST_F(Hwc2Test, SET_OUTPUT_BUFFER_bad_display)
4629{
4630 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Default,
4631 [] (Hwc2Test* test, hwc2_display_t /*display*/,
4632 Hwc2TestVirtualDisplay* testVirtualDisplay) {
4633
4634 hwc2_display_t badDisplay;
4635 buffer_handle_t handle;
4636 android::base::unique_fd acquireFence;
4637 hwc2_error_t err = HWC2_ERROR_NONE;
4638
4639 ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
4640
David Hanna Jr3f056022017-07-27 19:19:15 -07004641 if (testVirtualDisplay->getOutputBuffer(&handle, &acquireFence) < 0)
Marissa Wallbad1bc72017-02-21 14:33:46 -08004642 return;
4643
4644 ASSERT_NO_FATAL_FAILURE(test->setOutputBuffer(badDisplay,
4645 handle, acquireFence, &err));
4646 EXPECT_TRUE(err == HWC2_ERROR_BAD_DISPLAY)
4647 << "returned wrong error code";
4648 }));
4649}
4650
4651/* TESTCASE: Tests that the HWC2 cannot set an invalid output buffer. */
4652TEST_F(Hwc2Test, SET_OUTPUT_BUFFER_bad_parameter)
4653{
4654 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Default,
4655 [] (Hwc2Test* test, hwc2_display_t display,
4656 Hwc2TestVirtualDisplay* /*testVirtualDisplay*/) {
4657
4658 const buffer_handle_t handle = nullptr;
4659 uint32_t releaseFence = -1;
4660 hwc2_error_t err = HWC2_ERROR_NONE;
4661
4662 ASSERT_NO_FATAL_FAILURE(test->setOutputBuffer(display, handle,
4663 releaseFence, &err));
4664 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
4665 << "returned wrong error code";
4666 }));
4667}
4668
4669/* TESTCASE: Tests that the HWC2 cannot set an output buffer for non virtual
4670 * display */
4671TEST_F(Hwc2Test, SET_OUTPUT_BUFFER_unsupported)
4672{
4673 for (auto display : mDisplays) {
4674 Hwc2TestVirtualDisplay testVirtualDisplay(Hwc2TestCoverage::Complete);
4675
4676 do {
4677 buffer_handle_t handle;
4678 android::base::unique_fd acquireFence;
4679 hwc2_error_t err = HWC2_ERROR_NONE;
4680
David Hanna Jr3f056022017-07-27 19:19:15 -07004681 if (testVirtualDisplay.getOutputBuffer(&handle, &acquireFence) < 0)
Marissa Wallbad1bc72017-02-21 14:33:46 -08004682 continue;
4683
4684 ASSERT_NO_FATAL_FAILURE(setOutputBuffer(display, handle,
4685 acquireFence, &err));
4686 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
4687
4688 } while (testVirtualDisplay.advance());
4689 }
4690}
Marissa Wallae7d3242016-12-15 12:42:07 -08004691
4692/* TESTCASE: Tests that the HWC2 can dump debug information. */
4693TEST_F(Hwc2Test, DUMP)
4694{
4695 std::string buffer;
4696
4697 ASSERT_NO_FATAL_FAILURE(dump(&buffer));
4698}
David Hanna Jr3f056022017-07-27 19:19:15 -07004699
4700/*
4701 * TODO(b/64724708): Hwc2TestPropertyName::BufferArea MUST be default for all
4702 * virtual display tests as we don't handle this case correctly.
4703 *
4704 * Only default dataspace is supported in our drawing code.
4705 */
4706const std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>
4707 virtualDisplayExceptions =
4708 {{Hwc2TestPropertyName::BufferArea, Hwc2TestCoverage::Default},
4709 {Hwc2TestPropertyName::Dataspace, Hwc2TestCoverage::Default}};
4710
4711/* TESTCASE: Tests that the HWC2 can present 1 layer with default coverage on a
4712 * virtual display. */
4713TEST_F(Hwc2Test, PRESENT_VIRTUAL_DISPLAY_default_1)
4714{
4715 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4716 const size_t layerCnt = 1;
4717 ASSERT_NO_FATAL_FAILURE(createAndPresentVirtualDisplay(layerCnt, coverage,
4718 virtualDisplayExceptions));
4719}
4720
4721/* TESTCASE: Tests that the HWC2 can present 1 layer with basic coverage on a
4722 * virtual display. */
4723TEST_F(Hwc2Test, PRESENT_VIRTUAL_DISPLAY_basic_1)
4724{
4725 Hwc2TestCoverage coverage = Hwc2TestCoverage::Basic;
4726 const size_t layerCnt = 1;
4727 ASSERT_NO_FATAL_FAILURE(createAndPresentVirtualDisplay(layerCnt, coverage,
4728 virtualDisplayExceptions));
4729}
4730
4731/* TESTCASE: Tests that the HWC2 can present 2 layers with default coverage on a
4732 * virtual display. */
4733TEST_F(Hwc2Test, PRESENT_VIRTUAL_DISPLAY_default_2)
4734{
4735 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4736 const size_t layerCnt = 2;
4737 ASSERT_NO_FATAL_FAILURE(createAndPresentVirtualDisplay(layerCnt, coverage,
4738 virtualDisplayExceptions));
4739}
4740
4741/* TESTCASE: Tests that the HWC2 can present 3 layers with default coverage on a
4742 * virtual display. */
4743TEST_F(Hwc2Test, PRESENT_VIRTUAL_DISPLAY_default_3)
4744{
4745 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4746 const size_t layerCnt = 3;
4747 ASSERT_NO_FATAL_FAILURE(createAndPresentVirtualDisplay(layerCnt, coverage,
4748 virtualDisplayExceptions));
4749}
4750
4751/* TESTCASE: Tests that the HWC2 can present 4 layers with default coverage on a
4752 * virtual display. */
4753TEST_F(Hwc2Test, PRESENT_VIRTUAL_DISPLAY_default_4)
4754{
4755 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4756 const size_t layerCnt = 4;
4757 ASSERT_NO_FATAL_FAILURE(createAndPresentVirtualDisplay(layerCnt, coverage,
4758 virtualDisplayExceptions));
4759}
4760
4761/* TESTCASE: Tests that the HWC2 can present 5 layers with default coverage on a
4762 * virtual display. */
4763TEST_F(Hwc2Test, PRESENT_VIRTUAL_DISPLAY_default_5)
4764{
4765 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4766 const size_t layerCnt = 5;
4767 ASSERT_NO_FATAL_FAILURE(createAndPresentVirtualDisplay(layerCnt, coverage,
4768 virtualDisplayExceptions));
4769}