blob: 4055527b13a749ff49429ab06809796e0e2bbd1d [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
Marissa Wall4d600052016-12-15 12:16:01 -08001778 hwc2_device_t* mHwc2Device = nullptr;
Marissa Wallcfb9a072017-02-17 20:53:18 -08001779
1780 enum class Hwc2TestHotplugStatus {
1781 Init = 1,
1782 Receiving,
1783 Done,
1784 };
1785
1786 std::mutex mHotplugMutex;
1787 std::condition_variable mHotplugCv;
1788 Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
1789 std::unordered_set<hwc2_display_t> mDisplays;
Marissa Wall1db2e372016-12-15 12:19:39 -08001790
1791 /* Store all created layers that have not been destroyed. If an ASSERT_*
1792 * fails, then destroy the layers on exit */
1793 std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
Marissa Wall03c91732016-12-15 12:23:16 -08001794
1795 /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
1796 * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
1797 std::set<hwc2_display_t> mActiveDisplays;
Marissa Wall572a1ee2016-12-15 12:24:13 -08001798
Marissa Wallbad1bc72017-02-21 14:33:46 -08001799 /* Store all created virtual displays that have not been destroyed. If an
1800 * ASSERT_* fails, then destroy the virtual displays on exit */
1801 std::set<hwc2_display_t> mVirtualDisplays;
1802
Marissa Wall572a1ee2016-12-15 12:24:13 -08001803 std::mutex mVsyncMutex;
1804 std::condition_variable mVsyncCv;
1805 hwc2_display_t mVsyncDisplay;
1806 int64_t mVsyncTimestamp = -1;
Marissa Wall4d600052016-12-15 12:16:01 -08001807};
1808
Marissa Wallcfb9a072017-02-17 20:53:18 -08001809void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
1810 hwc2_display_t display, int32_t connection)
1811{
1812 if (callbackData)
1813 static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
1814 connection);
1815}
1816
Marissa Wall572a1ee2016-12-15 12:24:13 -08001817void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
1818 hwc2_display_t display, int64_t timestamp)
1819{
1820 if (callbackData)
1821 static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
1822 timestamp);
1823}
1824
Marissa Wallffc67da2016-12-15 12:26:09 -08001825void setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001826 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallffc67da2016-12-15 12:26:09 -08001827{
1828 EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001829 testLayer->getBlendMode(), outErr));
1830}
1831
1832void setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1833 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1834{
1835 buffer_handle_t handle;
1836 android::base::unique_fd acquireFence;
1837 hwc2_composition_t composition = testLayer->getComposition();
1838
1839 if (composition == HWC2_COMPOSITION_CLIENT
1840 || composition == HWC2_COMPOSITION_SOLID_COLOR
1841 || composition == HWC2_COMPOSITION_SIDEBAND)
1842 return;
1843
1844 if (testLayer->getBuffer(&handle, &acquireFence) < 0)
1845 return;
1846
1847 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
1848 composition));
1849 EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
1850 handle, acquireFence, outErr));
Marissa Wallffc67da2016-12-15 12:26:09 -08001851}
1852
Marissa Wallee242782016-12-15 12:30:12 -08001853void setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001854 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallee242782016-12-15 12:30:12 -08001855{
1856 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1857 layer, HWC2_COMPOSITION_SOLID_COLOR));
1858 ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001859 layer, testLayer->getPlaneAlpha()));
Marissa Wallee242782016-12-15 12:30:12 -08001860 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001861 layer, testLayer->getBlendMode()));
Marissa Wallee242782016-12-15 12:30:12 -08001862 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001863 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08001864}
1865
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001866void setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001867 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001868{
Marissa Wall5a240aa2016-12-15 12:34:06 -08001869 hwc2_composition_t composition = testLayer->getComposition();
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001870 hwc2_error_t err = HWC2_ERROR_NONE;
1871
1872 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
1873 composition, &err));
1874 if (outErr) {
1875 *outErr = err;
1876 return;
1877 }
1878
1879 if (composition != HWC2_COMPOSITION_SIDEBAND) {
1880 EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
1881 } else {
1882 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
1883 << "returned wrong error code";
1884 }
1885}
1886
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001887void setCursorPosition(Hwc2Test* test, hwc2_display_t display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001888 hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001889{
1890 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1891 layer, HWC2_COMPOSITION_CURSOR));
1892
Marissa Wall5a240aa2016-12-15 12:34:06 -08001893 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001894 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
1895 cursorPosition.left, cursorPosition.top, outErr));
1896}
1897
Marissa Wallb72b5c92016-12-15 12:26:39 -08001898void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001899 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallb72b5c92016-12-15 12:26:39 -08001900{
1901 EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001902 testLayer->getDataspace(), outErr));
Marissa Wallb72b5c92016-12-15 12:26:39 -08001903}
1904
Marissa Wall600a73b2016-12-15 12:30:39 -08001905void setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001906 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall600a73b2016-12-15 12:30:39 -08001907{
1908 EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001909 testLayer->getDisplayFrame(), outErr));
Marissa Wall600a73b2016-12-15 12:30:39 -08001910}
1911
Marissa Wall2b1f5302016-12-15 12:27:20 -08001912void setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001913 Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
Marissa Wall2b1f5302016-12-15 12:27:20 -08001914{
1915 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001916 testLayer->getBlendMode()));
Marissa Wall2b1f5302016-12-15 12:27:20 -08001917 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001918 testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08001919}
1920
Marissa Wallc57468f2016-12-15 12:31:12 -08001921void setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001922 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallc57468f2016-12-15 12:31:12 -08001923{
1924 EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001925 testLayer->getSourceCrop(), outErr));
Marissa Wallc57468f2016-12-15 12:31:12 -08001926}
1927
Marissa Wallad761812016-12-15 12:32:24 -08001928void setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001929 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallad761812016-12-15 12:32:24 -08001930{
1931 EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001932 testLayer->getSurfaceDamage(), outErr));
Marissa Wallad761812016-12-15 12:32:24 -08001933}
1934
Marissa Wallac108192016-12-15 12:27:48 -08001935void setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001936 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallac108192016-12-15 12:27:48 -08001937{
1938 EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001939 testLayer->getTransform(), outErr));
Marissa Wallac108192016-12-15 12:27:48 -08001940}
1941
Marissa Wallf7618ed2016-12-15 12:34:39 -08001942void setVisibleRegion(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1943 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1944{
1945 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display, layer,
1946 testLayer->getVisibleRegion(), outErr));
1947}
1948
Marissa Wall273b1df2016-12-15 12:28:47 -08001949void setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001950 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall273b1df2016-12-15 12:28:47 -08001951{
1952 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001953 testLayer->getZOrder(), outErr));
Marissa Wall273b1df2016-12-15 12:28:47 -08001954}
1955
Marissa Wallffc67da2016-12-15 12:26:09 -08001956bool advanceBlendMode(Hwc2TestLayer* testLayer)
1957{
1958 return testLayer->advanceBlendMode();
1959}
1960
Marissa Wall5a240aa2016-12-15 12:34:06 -08001961bool advanceBuffer(Hwc2TestLayer* testLayer)
1962{
1963 if (testLayer->advanceComposition())
1964 return true;
1965 return testLayer->advanceBufferArea();
1966}
1967
Marissa Wallee242782016-12-15 12:30:12 -08001968bool advanceColor(Hwc2TestLayer* testLayer)
1969{
1970 /* Color depends on blend mode so advance blend mode last so color is not
1971 * force to update as often */
1972 if (testLayer->advancePlaneAlpha())
1973 return true;
1974 if (testLayer->advanceColor())
1975 return true;
1976 return testLayer->advanceBlendMode();
1977}
1978
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001979bool advanceComposition(Hwc2TestLayer* testLayer)
1980{
1981 return testLayer->advanceComposition();
1982}
1983
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001984bool advanceCursorPosition(Hwc2TestLayer* testLayer)
1985{
1986 return testLayer->advanceCursorPosition();
1987}
1988
Marissa Wallb72b5c92016-12-15 12:26:39 -08001989bool advanceDataspace(Hwc2TestLayer* testLayer)
1990{
1991 return testLayer->advanceDataspace();
1992}
1993
Marissa Wall600a73b2016-12-15 12:30:39 -08001994bool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1995{
1996 return testLayer->advanceDisplayFrame();
1997}
1998
Marissa Wall2b1f5302016-12-15 12:27:20 -08001999bool advancePlaneAlpha(Hwc2TestLayer* testLayer)
2000{
2001 return testLayer->advancePlaneAlpha();
2002}
2003
Marissa Wallc57468f2016-12-15 12:31:12 -08002004bool advanceSourceCrop(Hwc2TestLayer* testLayer)
2005{
2006 if (testLayer->advanceSourceCrop())
2007 return true;
2008 return testLayer->advanceBufferArea();
2009}
2010
Marissa Wallad761812016-12-15 12:32:24 -08002011bool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
2012{
2013 if (testLayer->advanceSurfaceDamage())
2014 return true;
2015 return testLayer->advanceBufferArea();
2016}
2017
Marissa Wallac108192016-12-15 12:27:48 -08002018bool advanceTransform(Hwc2TestLayer* testLayer)
2019{
2020 return testLayer->advanceTransform();
2021}
2022
Marissa Wallf7618ed2016-12-15 12:34:39 -08002023bool advanceVisibleRegions(Hwc2TestLayers* testLayers)
2024{
2025 return testLayers->advanceVisibleRegions();
2026}
2027
Marissa Wallf18cfb02017-02-21 14:01:05 -08002028bool advanceClientTargetSupport(
2029 Hwc2TestClientTargetSupport* testClientTargetSupport)
2030{
2031 return testClientTargetSupport->advance();
2032}
Marissa Wall4d600052016-12-15 12:16:01 -08002033
2034static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
2035 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
2036 HWC2_FUNCTION_CREATE_LAYER,
2037 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
2038 HWC2_FUNCTION_DESTROY_LAYER,
2039 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
2040 HWC2_FUNCTION_DUMP,
2041 HWC2_FUNCTION_GET_ACTIVE_CONFIG,
2042 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
2043 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
2044 HWC2_FUNCTION_GET_COLOR_MODES,
2045 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
2046 HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
2047 HWC2_FUNCTION_GET_DISPLAY_NAME,
2048 HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
2049 HWC2_FUNCTION_GET_DISPLAY_TYPE,
2050 HWC2_FUNCTION_GET_DOZE_SUPPORT,
2051 HWC2_FUNCTION_GET_HDR_CAPABILITIES,
2052 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
2053 HWC2_FUNCTION_GET_RELEASE_FENCES,
2054 HWC2_FUNCTION_PRESENT_DISPLAY,
2055 HWC2_FUNCTION_REGISTER_CALLBACK,
2056 HWC2_FUNCTION_SET_ACTIVE_CONFIG,
2057 HWC2_FUNCTION_SET_CLIENT_TARGET,
2058 HWC2_FUNCTION_SET_COLOR_MODE,
2059 HWC2_FUNCTION_SET_COLOR_TRANSFORM,
2060 HWC2_FUNCTION_SET_CURSOR_POSITION,
2061 HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
2062 HWC2_FUNCTION_SET_LAYER_BUFFER,
2063 HWC2_FUNCTION_SET_LAYER_COLOR,
2064 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
2065 HWC2_FUNCTION_SET_LAYER_DATASPACE,
2066 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
2067 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
2068 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
2069 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
2070 HWC2_FUNCTION_SET_LAYER_TRANSFORM,
2071 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
2072 HWC2_FUNCTION_SET_LAYER_Z_ORDER,
2073 HWC2_FUNCTION_SET_OUTPUT_BUFFER,
2074 HWC2_FUNCTION_SET_POWER_MODE,
2075 HWC2_FUNCTION_SET_VSYNC_ENABLED,
2076 HWC2_FUNCTION_VALIDATE_DISPLAY,
2077}};
2078
2079/* TESTCASE: Tests that the HWC2 supports all required functions. */
2080TEST_F(Hwc2Test, GET_FUNCTION)
2081{
2082 for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
2083 hwc2_function_pointer_t pfn = getFunction(descriptor);
2084 EXPECT_TRUE(pfn) << "failed to get function "
2085 << getFunctionDescriptorName(descriptor);
2086 }
2087}
2088
2089/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
2090TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
2091{
2092 hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
2093 EXPECT_FALSE(pfn) << "failed to get invalid function";
2094}
2095
2096/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
2097TEST_F(Hwc2Test, GET_CAPABILITIES)
2098{
2099 std::vector<hwc2_capability_t> capabilities;
2100
2101 getCapabilities(&capabilities);
2102
2103 EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
2104 HWC2_CAPABILITY_INVALID), 0);
2105}
Marissa Walla4b01482017-02-17 20:52:03 -08002106
2107static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
2108 HWC2_CALLBACK_HOTPLUG,
2109 HWC2_CALLBACK_REFRESH,
2110 HWC2_CALLBACK_VSYNC,
2111}};
2112
2113/* TESTCASE: Tests that the HWC2 can successfully register all required
2114 * callback functions. */
2115TEST_F(Hwc2Test, REGISTER_CALLBACK)
2116{
2117 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2118 const_cast<char*>("data"));
2119
2120 for (auto descriptor : callbackDescriptors) {
2121 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
2122 []() { return; }));
2123 }
2124}
2125
2126/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
2127TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
2128{
2129 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2130 const_cast<char*>("data"));
2131 hwc2_error_t err = HWC2_ERROR_NONE;
2132
2133 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
2134 []() { return; }, &err));
2135 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2136}
2137
2138/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
2139TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
2140{
2141 hwc2_callback_data_t data = nullptr;
2142
2143 for (auto descriptor : callbackDescriptors) {
2144 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
2145 []() { return; }));
2146 }
2147}
Marissa Wallcfb9a072017-02-17 20:53:18 -08002148
2149/* TESTCASE: Tests that the HWC2 returns the correct display type for each
2150 * physical display. */
2151TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
2152{
2153 for (auto display : mDisplays) {
2154 hwc2_display_type_t type;
2155
2156 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
2157 EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
2158 " correct display type";
2159 }
2160}
2161
2162/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
2163 * display is requested. */
2164TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
2165{
2166 hwc2_display_t display;
2167 hwc2_display_type_t type;
2168 hwc2_error_t err = HWC2_ERROR_NONE;
2169
2170 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2171
2172 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
2173 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2174}
Marissa Wall1db2e372016-12-15 12:19:39 -08002175
2176/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
2177TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
2178{
2179 for (auto display : mDisplays) {
2180 hwc2_layer_t layer;
2181
2182 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2183
2184 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2185 }
2186}
2187
2188/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
2189TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
2190{
2191 hwc2_display_t display;
2192 hwc2_layer_t layer;
2193 hwc2_error_t err = HWC2_ERROR_NONE;
2194
2195 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2196
2197 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
2198 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2199}
2200
2201/* TESTCASE: Tests that the HWC2 will either support a large number of resources
2202 * or will return no resources. */
2203TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
2204{
2205 const size_t layerCnt = 1000;
2206
2207 for (auto display : mDisplays) {
2208 std::vector<hwc2_layer_t> layers;
2209
2210 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
2211
2212 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
2213 }
2214}
2215
2216/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
2217TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
2218{
2219 hwc2_display_t badDisplay;
2220
2221 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
2222
2223 for (auto display : mDisplays) {
2224 hwc2_layer_t layer = 0;
2225 hwc2_error_t err = HWC2_ERROR_NONE;
2226
2227 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
2228 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2229
2230 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2231
2232 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
2233 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2234
2235 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2236 }
2237}
2238
2239/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
2240TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
2241{
2242 for (auto display : mDisplays) {
2243 hwc2_layer_t layer;
2244 hwc2_error_t err = HWC2_ERROR_NONE;
2245
2246 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
2247 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2248
2249 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
2250 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2251
2252 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
2253 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2254
2255 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
2256 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2257
2258 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
2259 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2260
2261 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2262
2263 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
2264 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2265
2266 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2267
2268 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
2269 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2270 }
2271}
Marissa Wallcf935cb2016-12-15 12:20:47 -08002272
2273static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
2274 HWC2_ATTRIBUTE_WIDTH,
2275 HWC2_ATTRIBUTE_HEIGHT,
2276}};
2277
2278static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
2279 HWC2_ATTRIBUTE_VSYNC_PERIOD,
2280 HWC2_ATTRIBUTE_DPI_X,
2281 HWC2_ATTRIBUTE_DPI_Y,
2282}};
2283
2284/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
2285 * config. */
2286TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
2287{
2288 for (auto display : mDisplays) {
2289 std::vector<hwc2_config_t> configs;
2290
2291 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2292
2293 for (auto config : configs) {
2294 int32_t value;
2295
2296 for (auto attribute : requiredAttributes) {
2297 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2298 attribute, &value));
2299 EXPECT_GE(value, 0) << "missing required attribute "
2300 << getAttributeName(attribute) << " for config "
2301 << config;
2302 }
2303 for (auto attribute : optionalAttributes) {
2304 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2305 attribute, &value));
2306 }
2307 }
2308 }
2309}
2310
2311/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
2312 * attribute */
2313TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
2314{
2315 const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
2316
2317 for (auto display : mDisplays) {
2318 std::vector<hwc2_config_t> configs;
2319
2320 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2321
2322 for (auto config : configs) {
2323 int32_t value;
2324 hwc2_error_t err = HWC2_ERROR_NONE;
2325
2326 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2327 attribute, &value, &err));
2328 EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
2329 " attribute for config " << config;
2330 }
2331 }
2332}
2333
2334/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
2335TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
2336{
2337 hwc2_display_t display;
2338 const hwc2_config_t config = 0;
2339 int32_t value;
2340 hwc2_error_t err = HWC2_ERROR_NONE;
2341
2342 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2343
2344 for (auto attribute : requiredAttributes) {
2345 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
2346 &value, &err));
2347 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2348 }
2349
2350 for (auto attribute : optionalAttributes) {
2351 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
2352 &value, &err));
2353 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2354 }
2355}
2356
2357/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
2358TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
2359{
2360 for (auto display : mDisplays) {
2361 hwc2_config_t config;
2362 int32_t value;
2363 hwc2_error_t err = HWC2_ERROR_NONE;
2364
2365 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
2366
2367 for (auto attribute : requiredAttributes) {
2368 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2369 attribute, &value, &err));
2370 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2371 }
2372
2373 for (auto attribute : optionalAttributes) {
2374 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2375 attribute, &value, &err));
2376 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2377 }
2378 }
2379}
2380
2381/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
2382TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
2383{
2384 for (auto display : mDisplays) {
2385 std::vector<hwc2_config_t> configs;
2386
2387 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2388 }
2389}
2390
2391/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
2392TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
2393{
2394 hwc2_display_t display;
2395 std::vector<hwc2_config_t> configs;
2396 hwc2_error_t err = HWC2_ERROR_NONE;
2397
2398 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2399
2400 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
2401
2402 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2403 EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
2404}
2405
2406/* TESTCASE: Tests that the HWC2 will return the same config list multiple
2407 * times in a row. */
2408TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
2409{
2410 for (auto display : mDisplays) {
2411 std::vector<hwc2_config_t> configs1, configs2;
2412
2413 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
2414 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
2415
2416 EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
2417 configs2.begin())) << "returned two different config sets";
2418 }
2419}
2420
2421/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
2422TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
2423{
2424 for (auto display : mDisplays) {
2425 std::vector<hwc2_config_t> configs;
2426
2427 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2428
2429 std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
2430 configs.end());
2431 EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
2432 " configs";
2433 }
2434}
Marissa Wall93dc04f2016-12-15 12:21:46 -08002435
2436/* TESTCASE: Tests that the HWC2 returns the active config for a display */
2437TEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
2438{
2439 for (auto display : mDisplays) {
2440 std::vector<hwc2_config_t> configs;
2441
2442 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2443
2444 for (auto config : configs) {
2445 hwc2_config_t activeConfig;
2446
2447 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2448 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
2449
2450 EXPECT_EQ(activeConfig, config) << "failed to get active config";
2451 }
2452 }
2453}
2454
2455/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
2456 * display. */
2457TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
2458{
2459 hwc2_display_t display;
2460 hwc2_config_t activeConfig;
2461 hwc2_error_t err = HWC2_ERROR_NONE;
2462
2463 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2464
2465 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
2466
2467 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2468}
2469
2470/* TESTCASE: Tests that the HWC2 either begins with a valid active config
2471 * or returns an error when getActiveConfig is called. */
2472TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
2473{
2474 for (auto display : mDisplays) {
2475 std::vector<hwc2_config_t> configs;
2476 hwc2_config_t activeConfig;
2477 hwc2_error_t err = HWC2_ERROR_NONE;
2478
2479 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2480
2481 if (configs.empty())
2482 return;
2483
2484 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
2485 if (err == HWC2_ERROR_NONE) {
2486 EXPECT_NE(std::count(configs.begin(), configs.end(),
2487 activeConfig), 0) << "active config is not found in "
2488 " configs for display";
2489 } else {
2490 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2491 }
2492 }
2493}
2494
2495/* TESTCASE: Tests that the HWC2 can set every display config as an active
2496 * config */
2497TEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
2498{
2499 for (auto display : mDisplays) {
2500 std::vector<hwc2_config_t> configs;
2501
2502 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2503
2504 for (auto config : configs) {
2505 EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2506 }
2507 }
2508}
2509
2510/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
2511TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
2512{
2513 hwc2_display_t display;
2514 const hwc2_config_t config = 0;
2515 hwc2_error_t err = HWC2_ERROR_NONE;
2516
2517 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2518
2519 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
2520 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2521}
2522
2523/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
2524TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
2525{
2526 for (auto display : mDisplays) {
2527 hwc2_config_t config;
2528 hwc2_error_t err = HWC2_ERROR_NONE;
2529
2530 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
2531
2532 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
2533 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2534 }
2535}
Marissa Wall03c91732016-12-15 12:23:16 -08002536
2537/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
2538TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
2539{
2540 for (auto display : mDisplays) {
2541 int32_t support = -1;
2542
2543 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2544
2545 EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
2546 }
2547}
2548
2549/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
2550TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
2551{
2552 hwc2_display_t display;
2553 int32_t support = -1;
2554 hwc2_error_t err = HWC2_ERROR_NONE;
2555
2556 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2557
2558 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2559
2560 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2561}
2562
2563/* TESTCASE: Tests that the HWC2 can set all supported power modes */
2564TEST_F(Hwc2Test, SET_POWER_MODE)
2565{
2566 for (auto display : mDisplays) {
2567 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2568 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2569
2570 int32_t support = -1;
2571 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2572 if (support != 1)
2573 return;
2574
2575 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2576 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2577 HWC2_POWER_MODE_DOZE_SUSPEND));
2578
2579 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2580 }
2581}
2582
2583/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
2584TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
2585{
2586 hwc2_display_t display;
2587 hwc2_error_t err = HWC2_ERROR_NONE;
2588
2589 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2590
2591 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
2592 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2593
2594 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
2595 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2596
2597 int32_t support = -1;
2598 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2599 if (support != 1)
2600 return;
2601
2602 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
2603 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2604
2605 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
2606 &err));
2607 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2608}
2609
2610/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
2611TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
2612{
2613 for (auto display : mDisplays) {
2614 hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
2615 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
2616 hwc2_error_t err = HWC2_ERROR_NONE;
2617
2618 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
2619 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
2620 << mode;
2621 }
2622}
2623
2624/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
2625 * an optional power mode. */
2626TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
2627{
2628 for (auto display : mDisplays) {
2629 int32_t support = -1;
2630 hwc2_error_t err = HWC2_ERROR_NONE;
2631
2632 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2633 if (support == 1)
2634 return;
2635
2636 ASSERT_EQ(support, 0) << "invalid doze support value";
2637
2638 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
2639 &err));
2640 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
2641
2642 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2643 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
2644 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
2645 }
2646}
2647
2648/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
2649TEST_F(Hwc2Test, SET_POWER_MODE_stress)
2650{
2651 for (auto display : mDisplays) {
2652 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2653 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2654
2655 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2656 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2657
2658 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2659 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2660
2661 int32_t support = -1;
2662 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2663 if (support != 1)
2664 return;
2665
2666 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2667 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2668
2669 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2670 HWC2_POWER_MODE_DOZE_SUSPEND));
2671 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2672 HWC2_POWER_MODE_DOZE_SUSPEND));
2673
2674 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2675 }
2676}
Marissa Wall572a1ee2016-12-15 12:24:13 -08002677
2678/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
2679 * displays */
2680TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
2681{
2682 for (auto display : mDisplays) {
2683 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2684 const_cast<char*>("data"));
2685
2686 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2687
2688 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2689 []() { return; }));
2690
2691 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2692
2693 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2694
2695 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2696 }
2697}
2698
2699/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
2700TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
2701{
2702 for (auto display : mDisplays) {
2703 hwc2_display_t receivedDisplay;
2704 int64_t receivedTimestamp;
2705
2706 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2707
2708 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
2709
2710 ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
2711 &receivedTimestamp));
2712
2713 EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
2714 EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
2715
2716 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
2717
2718 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2719 }
2720}
2721
2722/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
2723TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
2724{
2725 hwc2_display_t display;
2726 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2727 const_cast<char*>("data"));
2728 hwc2_error_t err = HWC2_ERROR_NONE;
2729
2730 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2731
2732 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2733 []() { return; }));
2734
2735 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
2736 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2737
2738 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
2739 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2740}
2741
2742/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
2743TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
2744{
2745 for (auto display : mDisplays) {
2746 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2747 const_cast<char*>("data"));
2748 hwc2_error_t err = HWC2_ERROR_NONE;
2749
2750 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2751
2752 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2753 []() { return; }));
2754
2755 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
2756 &err));
2757 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2758
2759 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2760 }
2761}
2762
2763/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
2764 * times. */
2765TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
2766{
2767 for (auto display : mDisplays) {
2768 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2769 const_cast<char*>("data"));
2770
2771 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2772
2773 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2774 []() { return; }));
2775
2776 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2777
2778 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2779 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2780
2781 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2782 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2783
2784 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2785 }
2786}
2787
2788/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
2789 * is off and no callback is registered. */
2790TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
2791{
2792 const uint secs = 1;
2793
2794 for (auto display : mDisplays) {
2795 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2796
2797 sleep(secs);
2798
2799 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2800 }
2801}
2802
2803/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
2804 * is registered. */
2805TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
2806{
2807 const uint secs = 1;
2808
2809 for (auto display : mDisplays) {
2810 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2811
2812 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2813
2814 sleep(secs);
2815
2816 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2817
2818 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2819 }
2820}
Marissa Walldd4087f2016-12-15 12:24:52 -08002821
2822/* TESTCASE: Tests that the HWC2 returns a display name for each display */
2823TEST_F(Hwc2Test, GET_DISPLAY_NAME)
2824{
2825 for (auto display : mDisplays) {
2826 std::string name;
2827
2828 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
2829 }
2830}
2831
2832/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
2833 * display */
2834TEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
2835{
2836 hwc2_display_t display;
2837 std::string name;
2838 hwc2_error_t err = HWC2_ERROR_NONE;
2839
2840 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2841
2842 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
2843 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2844}
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08002845
2846/* TESTCASE: Tests that the HWC2 can set basic composition types. */
2847TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
2848{
2849 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2850 setComposition, advanceComposition));
2851}
2852
2853/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
2854 * layer. */
2855TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
2856{
2857 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2858 setComposition, advanceComposition));
2859}
2860
2861/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
2862TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
2863{
2864 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2865 setComposition));
2866}
2867
2868/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
2869TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
2870{
2871 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2872 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2873 hwc2_error_t* outErr) {
2874
2875 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
2876 layer, HWC2_COMPOSITION_INVALID, outErr));
2877 }
2878 ));
2879}
Marissa Wallffc67da2016-12-15 12:26:09 -08002880
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002881/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
2882TEST_F(Hwc2Test, SET_CURSOR_POSITION)
2883{
2884 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2885 ::setCursorPosition, advanceCursorPosition));
2886}
2887
2888/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
2889TEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
2890{
2891 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2892 ::setCursorPosition, advanceCursorPosition));
2893}
2894
2895/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
2896 * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
2897TEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
2898{
2899 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2900 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002901 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall5a240aa2016-12-15 12:34:06 -08002902 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002903 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
2904 cursorPosition.left, cursorPosition.top, outErr));
2905 },
2906
2907 advanceCursorPosition));
2908}
2909
2910/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
2911 * display. */
2912TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
2913{
2914 hwc2_display_t display;
2915 hwc2_layer_t layer = 0;
2916 int32_t x = 0, y = 0;
2917 hwc2_error_t err = HWC2_ERROR_NONE;
2918
2919 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2920
2921 ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
2922 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2923}
2924
2925/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
2926TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
2927{
2928 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2929 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002930 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002931
Marissa Wall5a240aa2016-12-15 12:34:06 -08002932 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002933 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
2934 badLayer, cursorPosition.left, cursorPosition.top,
2935 outErr));
2936 }
2937 ));
2938}
2939
Marissa Wallffc67da2016-12-15 12:26:09 -08002940/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
2941TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
2942{
2943 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2944 setBlendMode, advanceBlendMode));
2945}
2946
2947/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
2948TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
2949{
2950 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2951 setBlendMode, advanceBlendMode));
2952}
2953
2954/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
2955TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
2956{
2957 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2958 setBlendMode));
2959}
2960
2961/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
2962TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
2963{
2964 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2965 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2966 hwc2_error_t* outErr) {
2967
2968 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
2969 layer, HWC2_BLEND_MODE_INVALID, outErr));
2970 }
2971 ));
2972}
Marissa Wallb72b5c92016-12-15 12:26:39 -08002973
Marissa Wall5a240aa2016-12-15 12:34:06 -08002974/* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
2975TEST_F(Hwc2Test, SET_LAYER_BUFFER)
2976{
2977 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2978 setBuffer, advanceBuffer));
2979}
2980
2981/* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
2982TEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
2983{
2984 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2985 setBuffer, advanceBuffer));
2986}
2987
2988/* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
2989TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
2990{
2991 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2992 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
2993 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2994
2995 buffer_handle_t handle = nullptr;
2996 android::base::unique_fd acquireFence;
2997
2998 /* If there is not available buffer for the given buffer
2999 * properties, it should not fail this test case */
3000 if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
3001 *outErr = HWC2_ERROR_BAD_LAYER;
3002 return;
3003 }
3004
3005 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
3006 handle, acquireFence, outErr));
3007 }
3008 ));
3009}
3010
3011/* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
3012TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
3013{
3014 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
3015 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
3016 hwc2_error_t* outErr) {
3017
3018 buffer_handle_t handle = nullptr;
3019 int32_t acquireFence = -1;
3020
3021 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
3022 handle, acquireFence, outErr));
3023 }
3024 ));
3025}
3026
Marissa Wallee242782016-12-15 12:30:12 -08003027/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
3028TEST_F(Hwc2Test, SET_LAYER_COLOR)
3029{
3030 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3031 setColor, advanceColor));
3032}
3033
3034/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
3035TEST_F(Hwc2Test, SET_LAYER_COLOR_update)
3036{
3037 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3038 setColor, advanceColor));
3039}
3040
3041/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
3042 * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
3043TEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
3044{
3045 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
3046 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003047 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08003048
3049 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003050 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08003051 },
3052
3053 advanceColor));
3054}
3055
3056/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
3057TEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
3058{
3059 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3060 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003061 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08003062
3063 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003064 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08003065 }
3066 ));
3067}
3068
Marissa Wallb72b5c92016-12-15 12:26:39 -08003069/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
3070TEST_F(Hwc2Test, SET_LAYER_DATASPACE)
3071{
3072 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3073 setDataspace, advanceDataspace));
3074}
3075
3076/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
3077TEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
3078{
3079 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3080 setDataspace, advanceDataspace));
3081}
3082
3083/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
3084TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
3085{
3086 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3087 setDataspace));
3088}
Marissa Wall2b1f5302016-12-15 12:27:20 -08003089
Marissa Wall600a73b2016-12-15 12:30:39 -08003090/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
3091TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
3092{
3093 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3094 setDisplayFrame, advanceDisplayFrame));
3095}
3096
3097/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
3098TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
3099{
3100 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3101 setDisplayFrame, advanceDisplayFrame));
3102}
3103
3104/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
3105TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
3106{
3107 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3108 setDisplayFrame));
3109}
3110
Marissa Wall2b1f5302016-12-15 12:27:20 -08003111/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
3112TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
3113{
3114 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3115 setPlaneAlpha, advancePlaneAlpha));
3116}
3117
3118/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
3119TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
3120{
3121 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3122 setPlaneAlpha, advancePlaneAlpha));
3123}
3124
3125/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
3126TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
3127{
3128 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3129 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003130 Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
Marissa Wall2b1f5302016-12-15 12:27:20 -08003131
3132 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003133 badLayer, testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08003134 }
3135 ));
3136}
Marissa Wallac108192016-12-15 12:27:48 -08003137
Marissa Wallc57468f2016-12-15 12:31:12 -08003138/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
3139TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
3140{
3141 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3142 setSourceCrop, advanceSourceCrop));
3143}
3144
3145/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
3146TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
3147{
3148 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3149 setSourceCrop, advanceSourceCrop));
3150}
3151
3152/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
3153TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
3154{
3155 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3156 setSourceCrop));
3157}
3158
Marissa Wallad761812016-12-15 12:32:24 -08003159/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
3160TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
3161{
3162 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3163 setSurfaceDamage, advanceSurfaceDamage));
3164}
3165
3166/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
3167TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
3168{
3169 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3170 setSurfaceDamage, advanceSurfaceDamage));
3171}
3172
3173/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
3174TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
3175{
3176 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3177 setSurfaceDamage));
3178}
3179
Marissa Wallac108192016-12-15 12:27:48 -08003180/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
3181TEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
3182{
3183 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3184 setTransform, advanceTransform));
3185}
3186
3187/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
3188TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
3189{
3190 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3191 setTransform, advanceTransform));
3192}
3193
3194/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
3195TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
3196{
3197 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3198 setTransform));
3199}
Marissa Wall273b1df2016-12-15 12:28:47 -08003200
Marissa Wallf7618ed2016-12-15 12:34:39 -08003201/* TESTCASE: Tests that the HWC2 can set the visible region of a layer. */
3202TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION)
3203{
3204 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Basic, 5,
3205 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
3206 Hwc2TestLayers* testLayers) {
3207
3208 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display,
3209 layer, testLayers->getVisibleRegion(layer)));
3210 },
3211
3212 advanceVisibleRegions));
3213}
3214
3215/* TESTCASE: Tests that the HWC2 cannot set the visible region of a bad layer. */
3216TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION_bad_layer)
3217{
3218 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3219 setVisibleRegion));
3220}
3221
Marissa Wall273b1df2016-12-15 12:28:47 -08003222/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
3223TEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
3224{
3225 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
3226 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003227 Hwc2TestLayers* testLayers) {
Marissa Wall273b1df2016-12-15 12:28:47 -08003228
3229 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003230 testLayers->getZOrder(layer)));
Marissa Wallf7618ed2016-12-15 12:34:39 -08003231 },
3232
3233 /* TestLayer z orders are set during the construction of TestLayers
3234 * and cannot be updated. There is no need (or ability) to cycle
3235 * through additional z order configurations. */
3236 [] (Hwc2TestLayers* /*testLayers*/) {
3237 return false;
Marissa Wall273b1df2016-12-15 12:28:47 -08003238 }
3239 ));
3240}
3241
3242/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
3243TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
3244{
3245 const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
3246 static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
3247 static_cast<uint32_t>(UINT32_MAX / 2),
3248 static_cast<uint32_t>(UINT32_MAX) };
3249
3250 for (auto display : mDisplays) {
3251 std::vector<hwc2_config_t> configs;
3252
3253 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3254
3255 for (auto config : configs) {
3256 hwc2_layer_t layer;
3257
3258 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3259
3260 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
3261
3262 for (uint32_t zOrder : zOrders) {
3263 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
3264 }
3265
3266 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
3267 }
3268 }
3269}
3270
3271/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
3272TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
3273{
3274 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3275 setZOrder));
3276}
Marissa Wall1cd789c2017-01-27 12:55:36 -08003277
3278/* TESTCASE: Tests that the HWC2 can display a layer with basic property
3279 * coverage */
3280TEST_F(Hwc2Test, VALIDATE_DISPLAY_basic)
3281{
3282 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3283 [] (Hwc2Test* test, hwc2_display_t display,
Marissa Wall706178d2016-12-15 12:39:14 -08003284 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003285 Hwc2TestLayers* /*testLayers*/) {
Marissa Wall1cd789c2017-01-27 12:55:36 -08003286
3287 uint32_t numTypes, numRequests;
3288 bool hasChanges = false;
3289
3290 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3291 &numRequests, &hasChanges));
3292 if (hasChanges)
3293 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
3294 << "wrong number of requests";
3295 }
3296 ));
3297}
3298
3299/* TESTCASE: Tests that the HWC2 can display 5 layers with default coverage. */
3300TEST_F(Hwc2Test, VALIDATE_DISPLAY_default_5)
3301{
3302 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 5,
3303 [] (Hwc2Test* test, hwc2_display_t display,
Marissa Wall706178d2016-12-15 12:39:14 -08003304 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003305 Hwc2TestLayers* /*testLayers*/) {
Marissa Wall1cd789c2017-01-27 12:55:36 -08003306
3307 uint32_t numTypes, numRequests;
3308 bool hasChanges = false;
3309
3310 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3311 &numRequests, &hasChanges));
3312 if (hasChanges)
3313 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
3314 << "wrong number of requests";
3315 }
3316 ));
3317}
3318
3319/* TESTCASE: Tests that the HWC2 cannot validate a bad display */
3320TEST_F(Hwc2Test, VALIDATE_DISPLAY_bad_display)
3321{
3322 hwc2_display_t display;
3323 uint32_t numTypes, numRequests;
3324 hwc2_error_t err = HWC2_ERROR_NONE;
3325
3326 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3327
3328 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes, &numRequests,
3329 &err));
3330 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3331}
Marissa Wall706178d2016-12-15 12:39:14 -08003332
3333/* TESTCASE: Tests that the HWC2 can get display requests after validating a
3334 * basic layer. */
3335TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_basic)
3336{
3337 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3338 [] (Hwc2Test* test, hwc2_display_t display,
3339 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003340 Hwc2TestLayers* /*testLayers*/) {
Marissa Wall706178d2016-12-15 12:39:14 -08003341
3342 uint32_t numTypes, numRequests;
3343 bool hasChanges = false;
3344
3345 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3346 &numRequests, &hasChanges));
3347 if (hasChanges)
3348 EXPECT_LE(numTypes, layers.size())
3349 << "wrong number of requests";
3350
3351 EXPECT_NO_FATAL_FAILURE(test->handleRequests(display, layers,
3352 numRequests));
3353 }
3354 ));
3355}
3356
3357/* TESTCASE: Tests that the HWC2 cannot get display requests from a bad display */
3358TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_bad_display)
3359{
3360 hwc2_display_t display;
3361 hwc2_display_request_t displayRequests;
3362 std::vector<hwc2_layer_t> layers;
3363 std::vector<hwc2_layer_request_t> layerRequests;
3364 hwc2_error_t err = HWC2_ERROR_NONE;
3365
3366 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3367
3368 EXPECT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequests,
3369 &layers, &layerRequests, &err));
3370 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3371}
3372
3373/* TESTCASE: Tests that the HWC2 cannot get display requests from an non
3374 * validated display. */
3375TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_not_validated)
3376{
3377 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3378 [] (Hwc2Test* test, hwc2_display_t display,
3379 std::vector<hwc2_layer_t>* layers) {
3380
3381 hwc2_display_request_t displayRequests;
3382 std::vector<hwc2_layer_request_t> layerRequests;
3383 hwc2_error_t err = HWC2_ERROR_NONE;
3384
3385 ASSERT_NO_FATAL_FAILURE(test->getDisplayRequests(display,
3386 &displayRequests, layers, &layerRequests, &err));
3387 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3388 << "returned wrong error code";
3389 }
3390 ));
3391}
3392
3393/* TESTCASE: Tests that the HWC2 can get changed composition types after
3394 * validating a basic layer. */
3395TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_basic)
3396{
3397 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3398 [] (Hwc2Test* test, hwc2_display_t display,
3399 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003400 Hwc2TestLayers* testLayers) {
Marissa Wall706178d2016-12-15 12:39:14 -08003401
3402 uint32_t numTypes, numRequests;
3403 bool hasChanges = false;
3404
3405 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3406 &numRequests, &hasChanges));
3407 if (hasChanges)
3408 EXPECT_LE(numTypes, layers.size())
3409 << "wrong number of requests";
3410
3411 EXPECT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
Marissa Wall563030b2017-02-21 14:01:05 -08003412 *testLayers, layers, numTypes));
Marissa Wall706178d2016-12-15 12:39:14 -08003413 }
3414 ));
3415}
3416
3417/* TESTCASE: Tests that the HWC2 cannot get changed composition types from a bad
3418 * display */
3419TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_bad_display)
3420{
3421 hwc2_display_t display;
3422 std::vector<hwc2_layer_t> layers;
3423 std::vector<hwc2_composition_t> types;
3424 hwc2_error_t err = HWC2_ERROR_NONE;
3425
3426 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3427
3428 EXPECT_NO_FATAL_FAILURE(getChangedCompositionTypes(display, &layers,
3429 &types, &err));
3430 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3431}
3432
3433/* TESTCASE: Tests that the HWC2 cannot get changed composition types from an non
3434 * validated display. */
3435TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_not_validated)
3436{
3437 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3438 [] (Hwc2Test* test, hwc2_display_t display,
3439 std::vector<hwc2_layer_t>* layers) {
3440
3441 std::vector<hwc2_composition_t> types;
3442 hwc2_error_t err = HWC2_ERROR_NONE;
3443
3444 ASSERT_NO_FATAL_FAILURE(test->getChangedCompositionTypes(
3445 display, layers, &types, &err));
3446 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3447 << "returned wrong error code";
3448 }
3449 ));
3450}
3451
3452/* TESTCASE: Tests that the HWC2 can accept display changes after validating a
3453 * basic layer. */
3454TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_basic)
3455{
3456 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3457 [] (Hwc2Test* test, hwc2_display_t display,
3458 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003459 Hwc2TestLayers* testLayers) {
Marissa Wall706178d2016-12-15 12:39:14 -08003460
3461 uint32_t numTypes, numRequests;
3462 bool hasChanges = false;
3463
3464 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3465 &numRequests, &hasChanges));
3466 if (hasChanges)
3467 EXPECT_LE(numTypes, layers.size())
3468 << "wrong number of requests";
3469
3470 ASSERT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
Marissa Wall563030b2017-02-21 14:01:05 -08003471 *testLayers, layers, numTypes));
Marissa Wall706178d2016-12-15 12:39:14 -08003472
3473 EXPECT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display));
3474 }
3475 ));
3476}
3477
3478/* TESTCASE: Tests that the HWC2 cannot accept display changes from a bad
3479 * display */
3480TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_bad_display)
3481{
3482 hwc2_display_t display;
3483 hwc2_error_t err = HWC2_ERROR_NONE;
3484
3485 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3486
3487 EXPECT_NO_FATAL_FAILURE(acceptDisplayChanges(display, &err));
3488 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3489}
3490
3491/* TESTCASE: Tests that the HWC2 cannot accept display changes from an non
3492 * validated display. */
3493TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_not_validated)
3494{
3495 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3496 [] (Hwc2Test* test, hwc2_display_t display,
3497 std::vector<hwc2_layer_t>* /*layers*/) {
3498
3499 hwc2_error_t err = HWC2_ERROR_NONE;
3500
3501 ASSERT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display, &err));
3502 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3503 << "returned wrong error code";
3504 }
3505 ));
3506}
Marissa Wallf18cfb02017-02-21 14:01:05 -08003507
3508/* TESTCASE: Tests that the HWC2 supports client target with required values */
3509TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT)
3510{
3511 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3512 [] (Hwc2Test* test, hwc2_display_t display,
3513 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3514
3515 const Area bufferArea = testClientTargetSupport.getBufferArea();
3516 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3517
3518 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3519 bufferArea.width, bufferArea.height, format,
3520 testClientTargetSupport.getDataspace()));
3521 },
3522
3523 advanceClientTargetSupport));
3524}
3525
3526/* TESTCASE: Tests that the HWC2 cannot get client target support for a bad
3527 * display. */
3528TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_bad_display)
3529{
3530 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3531 [] (Hwc2Test* test, hwc2_display_t /*display*/,
3532 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3533
3534 const Area bufferArea = testClientTargetSupport.getBufferArea();
3535 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3536 hwc2_display_t badDisplay;
3537 hwc2_error_t err = HWC2_ERROR_NONE;
3538
3539 ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
3540
3541 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(badDisplay,
3542 bufferArea.width, bufferArea.height, format,
3543 testClientTargetSupport.getDataspace(), &err));
3544 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3545 },
3546
3547 advanceClientTargetSupport));
3548}
3549
3550/* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
3551 * for a variety of client target values. */
3552TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_unsupported)
3553{
3554 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Complete,
3555 [] (Hwc2Test* test, hwc2_display_t display,
3556 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3557
3558 const Area bufferArea = testClientTargetSupport.getBufferArea();
3559 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3560 hwc2_error_t err = HWC2_ERROR_NONE;
3561
3562 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3563 bufferArea.width, bufferArea.height, format,
3564 testClientTargetSupport.getDataspace(), &err));
3565 EXPECT_TRUE(err == HWC2_ERROR_NONE
3566 || err == HWC2_ERROR_UNSUPPORTED)
3567 << "returned wrong error code";
3568 },
3569
3570 advanceClientTargetSupport));
3571}
3572
3573/* TESTCASE: Tests that the HWC2 can set a client target buffer for a basic
3574 * layer. */
3575TEST_F(Hwc2Test, SET_CLIENT_TARGET_basic)
3576{
3577 const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3578 const hwc_region_t damage = { };
3579 const size_t layerCnt = 1;
3580
3581 for (auto display : mDisplays) {
3582 std::vector<hwc2_config_t> configs;
3583
3584 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
3585
3586 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3587
3588 for (auto config : configs) {
3589 Area displayArea;
3590 std::vector<hwc2_layer_t> layers;
3591
3592 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3593 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
3594
3595 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
3596 Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Basic,
3597 displayArea);
3598
3599 if (!testLayers.optimizeLayouts())
3600 continue;
3601
3602 Hwc2TestClientTarget testClientTarget;
3603
3604 do {
3605 std::set<hwc2_layer_t> clientLayers;
3606 std::set<hwc2_layer_t> clearLayers;
3607 uint32_t numTypes, numRequests;
3608 bool hasChanges, skip;
3609 bool flipClientTarget;
3610 buffer_handle_t handle;
3611 int32_t acquireFence;
3612
3613 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
3614 &testLayers, &skip));
3615 if (skip)
3616 continue;
3617
3618 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
3619 &numRequests, &hasChanges));
3620 if (hasChanges)
3621 EXPECT_LE(numTypes, layers.size())
3622 << "wrong number of requests";
3623
3624 ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
3625 testLayers, layers, numTypes, &clientLayers));
3626 ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
3627 numRequests, &clearLayers, &flipClientTarget));
3628 ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3629 clearLayers, flipClientTarget, displayArea, &handle,
3630 &acquireFence), 0);
3631 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle,
3632 acquireFence, dataspace, damage));
3633
3634 if (acquireFence >= 0)
3635 close(acquireFence);
3636
3637 } while (testLayers.advance());
3638
3639 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
3640 }
3641
3642 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
3643 }
3644}
3645
3646/* TESTCASE: Tests that the HWC2 cannot set a client target for a bad display. */
3647TEST_F(Hwc2Test, SET_CLIENT_TARGET_bad_display)
3648{
3649 hwc2_display_t display;
3650 std::vector<hwc2_layer_t> layers;
3651 const Area displayArea = {0, 0};
3652 Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Default, displayArea);
3653 std::set<hwc2_layer_t> clientLayers;
3654 std::set<hwc2_layer_t> flipClientTargetLayers;
3655 bool flipClientTarget = true;
3656 const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3657 const hwc_region_t damage = { };
3658 buffer_handle_t handle;
3659 int32_t acquireFence;
3660 hwc2_error_t err = HWC2_ERROR_NONE;
3661
3662 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3663
3664 Hwc2TestClientTarget testClientTarget;
3665
3666 ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3667 flipClientTargetLayers, flipClientTarget, displayArea, &handle,
3668 &acquireFence), 0);
3669
3670 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
3671 dataspace, damage, &err));
3672
3673 if (acquireFence >= 0)
3674 close(acquireFence);
3675
3676 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3677}
Marissa Wall563030b2017-02-21 14:01:05 -08003678
3679/* TESTCASE: Tests that the HWC2 can present 1 default layer. */
3680TEST_F(Hwc2Test, PRESENT_DISPLAY_default_1)
3681{
3682 const size_t layerCnt = 1;
3683 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3684 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3685 bool optimize = false;
3686
3687 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3688 optimize));
3689}
3690
3691/* TESTCASE: Tests that the HWC2 can present 2 default layers. */
3692TEST_F(Hwc2Test, PRESENT_DISPLAY_default_2)
3693{
3694 const size_t layerCnt = 2;
3695 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3696 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3697 bool optimize = false;
3698
3699 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3700 optimize));
3701}
3702
3703/* TESTCASE: Tests that the HWC2 can present 3 default layers. */
3704TEST_F(Hwc2Test, PRESENT_DISPLAY_default_3)
3705{
3706 const size_t layerCnt = 3;
3707 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3708 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3709 bool optimize = false;
3710
3711 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3712 optimize));
3713}
3714
3715/* TESTCASE: Tests that the HWC2 can present 4 default layers. */
3716TEST_F(Hwc2Test, PRESENT_DISPLAY_default_4)
3717{
3718 const size_t layerCnt = 4;
3719 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3720 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3721 bool optimize = false;
3722
3723 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3724 optimize));
3725}
3726
3727/* TESTCASE: Tests that the HWC2 can present 5 default layers. */
3728TEST_F(Hwc2Test, PRESENT_DISPLAY_default_5)
3729{
3730 const size_t layerCnt = 5;
3731 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3732 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3733 bool optimize = false;
3734
3735 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3736 optimize));
3737}
3738
3739/* TESTCASE: Tests that the HWC2 can present 6 default layers. */
3740TEST_F(Hwc2Test, PRESENT_DISPLAY_default_6)
3741{
3742 const size_t layerCnt = 6;
3743 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3744 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3745 bool optimize = false;
3746
3747 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3748 optimize));
3749}
3750
3751/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3752 * blend mode. */
3753TEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_1)
3754{
3755 const size_t layerCnt = 1;
3756 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3757 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3758 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
3759 {Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Basic},
3760 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
3761 bool optimize = false;
3762
3763 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3764 optimize));
3765}
3766
3767/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3768 * blend mode. */
3769TEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_2)
3770{
3771 const size_t layerCnt = 2;
3772 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3773 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3774 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
3775 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
3776 bool optimize = false;
3777
3778 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3779 optimize));
3780}
3781
3782/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3783 * buffer. */
3784TEST_F(Hwc2Test, PRESENT_DISPLAY_buffer_1)
3785{
3786 const size_t layerCnt = 1;
3787 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3788 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3789 {{Hwc2TestPropertyName::BufferArea, Hwc2TestCoverage::Complete}};
3790 bool optimize = true;
3791
3792 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3793 optimize));
3794}
3795
3796/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3797 * color. */
3798TEST_F(Hwc2Test, PRESENT_DISPLAY_color_1)
3799{
3800 const size_t layerCnt = 1;
3801 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3802 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3803 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3804 {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Complete}};
3805 bool optimize = true;
3806
3807 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3808 optimize));
3809}
3810
3811/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3812 * color. */
3813TEST_F(Hwc2Test, PRESENT_DISPLAY_color_2)
3814{
3815 const size_t layerCnt = 2;
3816 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3817 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3818 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3819 {Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3820 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic},
3821 {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Basic}};
3822 bool optimize = true;
3823
3824 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3825 optimize));
3826}
3827
3828/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3829 * composition. */
3830TEST_F(Hwc2Test, PRESENT_DISPLAY_composition_1)
3831{
3832 const size_t layerCnt = 1;
3833 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3834 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3835 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete}};
3836 bool optimize = true;
3837
3838 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3839 optimize));
3840}
3841
3842/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3843 * cursor. */
3844TEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_1)
3845{
3846 const size_t layerCnt = 1;
3847 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3848 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3849 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3850 {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete}};
3851 bool optimize = true;
3852
3853 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3854 optimize));
3855}
3856
3857/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3858 * cursor. */
3859TEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_2)
3860{
3861 const size_t layerCnt = 2;
3862 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3863 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3864 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3865 {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete},
3866 {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
3867 bool optimize = true;
3868
3869 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3870 optimize));
3871}
3872
3873/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3874 * dataspace. */
3875TEST_F(Hwc2Test, PRESENT_DISPLAY_dataspace_1)
3876{
3877 const size_t layerCnt = 1;
3878 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3879 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3880 {{Hwc2TestPropertyName::Dataspace, Hwc2TestCoverage::Complete}};
3881 bool optimize = true;
3882
3883 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3884 optimize));
3885}
3886
3887/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3888 * display frame. */
3889TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_1)
3890{
3891 const size_t layerCnt = 1;
3892 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3893 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3894 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3895 bool optimize = true;
3896
3897 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3898 optimize));
3899}
3900
3901/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3902 * display frame. */
3903TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_2)
3904{
3905 const size_t layerCnt = 2;
3906 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3907 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3908 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3909 bool optimize = true;
3910
3911 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3912 optimize));
3913}
3914
3915/* TESTCASE: Tests that the HWC2 can present 3 layers with complete coverage of
3916 * display frame. */
3917TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_3)
3918{
3919 const size_t layerCnt = 3;
3920 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3921 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3922 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3923 bool optimize = true;
3924
3925 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3926 optimize));
3927}
3928
3929/* TESTCASE: Tests that the HWC2 can present 4 layers with complete coverage of
3930 * display frame. */
3931TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_4)
3932{
3933 const size_t layerCnt = 4;
3934 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3935 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3936 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3937 bool optimize = true;
3938
3939 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3940 optimize));
3941}
3942
3943/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3944 * plane alpha. */
3945TEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_1)
3946{
3947 const size_t layerCnt = 1;
3948 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3949 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3950 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3951 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
3952 bool optimize = false;
3953
3954 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3955 optimize));
3956}
3957
3958/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3959 * plane alpha. */
3960TEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_2)
3961{
3962 const size_t layerCnt = 2;
3963 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3964 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3965 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3966 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
3967 bool optimize = false;
3968
3969 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3970 optimize));
3971}
3972
3973/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3974 * source crop. */
3975TEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_1)
3976{
3977 const size_t layerCnt = 1;
3978 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3979 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3980 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
3981 {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
3982 bool optimize = true;
3983
3984 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3985 optimize));
3986}
3987
3988/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3989 * source crop. */
3990TEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_2)
3991{
3992 const size_t layerCnt = 2;
3993 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3994 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3995 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
3996 {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
3997 bool optimize = true;
3998
3999 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4000 optimize));
4001}
4002
4003
4004/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4005 * surface damage. */
4006TEST_F(Hwc2Test, PRESENT_DISPLAY_surface_damage_1)
4007{
4008 const size_t layerCnt = 1;
4009 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4010 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4011 {{Hwc2TestPropertyName::SurfaceDamage, Hwc2TestCoverage::Complete}};
4012 bool optimize = true;
4013
4014 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4015 optimize));
4016}
4017
4018/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4019 * transform. */
4020TEST_F(Hwc2Test, PRESENT_DISPLAY_transform_1)
4021{
4022 const size_t layerCnt = 1;
4023 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4024 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4025 {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete}};
4026 bool optimize = true;
4027
4028 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4029 optimize));
4030}
4031
4032/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
4033 * transform. */
4034TEST_F(Hwc2Test, PRESENT_DISPLAY_transform_2)
4035{
4036 const size_t layerCnt = 2;
4037 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4038 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4039 {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete},
4040 {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
4041 bool optimize = true;
4042
4043 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4044 optimize));
4045}
4046
4047/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4048 * basic. */
4049TEST_F(Hwc2Test, PRESENT_DISPLAY_basic_1)
4050{
4051 const size_t layerCnt = 1;
4052 Hwc2TestCoverage coverage = Hwc2TestCoverage::Basic;
4053 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
4054 bool optimize = true;
4055
4056 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4057 optimize));
4058}
4059
4060/* TESTCASE: Tests that the HWC2 cannot present a bad display. */
4061TEST_F(Hwc2Test, PRESENT_DISPLAY_bad_display)
4062{
4063 hwc2_display_t display;
4064 int32_t presentFence;
4065 hwc2_error_t err = HWC2_ERROR_NONE;
4066
4067 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4068
4069 ASSERT_NO_FATAL_FAILURE(presentDisplay(display, &presentFence, &err));
4070 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4071}
4072
4073/* TESTCASE: Tests that the HWC2 cannot present an unvalidated display. */
4074TEST_F(Hwc2Test, PRESENT_DISPLAY_not_validated)
4075{
4076 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 1,
4077 [] (Hwc2Test* test, hwc2_display_t display,
4078 const std::vector<hwc2_layer_t>& /*layers*/,
4079 Hwc2TestLayers* /*testLayers*/) {
4080
4081 int32_t presentFence;
4082 hwc2_error_t err = HWC2_ERROR_NONE;
4083
4084 ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
4085 HWC2_POWER_MODE_ON));
4086 ASSERT_NO_FATAL_FAILURE(test->enableVsync(display));
4087
4088 ASSERT_NO_FATAL_FAILURE(test->waitForVsync());
4089
4090 ASSERT_NO_FATAL_FAILURE(test->presentDisplay(display,
4091 &presentFence, &err));
4092 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
4093 << "returned wrong error code";
4094
4095 ASSERT_NO_FATAL_FAILURE(test->disableVsync(display));
4096 ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
4097 HWC2_POWER_MODE_OFF));
4098 }
4099 ));
4100}
4101
4102/* TESTCASE: Tests that the HWC2 cannot get release fences from a bad display. */
4103TEST_F(Hwc2Test, GET_RELEASE_FENCES_bad_display)
4104{
4105 hwc2_display_t display;
4106 std::vector<hwc2_layer_t> layers;
4107 std::vector<int32_t> fences;
4108 hwc2_error_t err = HWC2_ERROR_NONE;
4109
4110 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4111
4112 ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences, &err));
4113 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4114}
Marissa Wall35040c52016-12-15 12:41:06 -08004115
4116static const std::array<android_color_mode, 9> androidColorModes = {{
4117 HAL_COLOR_MODE_NATIVE,
4118 HAL_COLOR_MODE_STANDARD_BT601_625,
4119 HAL_COLOR_MODE_STANDARD_BT601_625_UNADJUSTED,
4120 HAL_COLOR_MODE_STANDARD_BT601_525,
4121 HAL_COLOR_MODE_STANDARD_BT601_525_UNADJUSTED,
4122 HAL_COLOR_MODE_STANDARD_BT709,
4123 HAL_COLOR_MODE_DCI_P3,
4124 HAL_COLOR_MODE_SRGB,
4125 HAL_COLOR_MODE_ADOBE_RGB,
4126}};
4127
4128/* TESTCASE: Tests that the HWC2 can get the color modes for a display. The
4129 * display must support HAL_COLOR_MODE_NATIVE */
4130TEST_F(Hwc2Test, GET_COLOR_MODES)
4131{
4132 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4133 [] (Hwc2Test* test, hwc2_display_t display) {
4134
4135 std::vector<android_color_mode_t> colorModes;
4136
4137 ASSERT_NO_FATAL_FAILURE(test->getColorModes(display,
4138 &colorModes));
4139
4140 EXPECT_NE(std::count(colorModes.begin(), colorModes.end(),
4141 HAL_COLOR_MODE_NATIVE), 0) << "all displays"
4142 " must support HAL_COLOR_MODE_NATIVE";
4143 }
4144 ));
4145}
4146
4147/* TESTCASE: Tests that the HWC2 cannot get color modes from a bad display. */
4148TEST_F(Hwc2Test, GET_COLOR_MODES_bad_display)
4149{
4150 hwc2_display_t display;
4151 std::vector<android_color_mode_t> colorModes;
4152 hwc2_error_t err = HWC2_ERROR_NONE;
4153
4154 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4155
4156 ASSERT_NO_FATAL_FAILURE(getColorModes(display, &colorModes, &err));
4157 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4158}
4159
4160/* TESTCASE: Tests that the HWC2 can set the required color mode on a display. */
4161TEST_F(Hwc2Test, SET_COLOR_MODES)
4162{
4163 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4164 [] (Hwc2Test* test, hwc2_display_t display) {
4165
4166 const android_color_mode_t colorMode = HAL_COLOR_MODE_NATIVE;
4167
4168 EXPECT_NO_FATAL_FAILURE(test->setColorMode(display, colorMode));
4169 }
4170 ));
4171}
4172
4173/* TESTCASE: Tests that the HWC2 cannot set a color mode on a bad display. */
4174TEST_F(Hwc2Test, SET_COLOR_MODES_bad_display)
4175{
4176 hwc2_display_t display;
4177 const android_color_mode_t colorMode = HAL_COLOR_MODE_NATIVE;
4178 hwc2_error_t err = HWC2_ERROR_NONE;
4179
4180 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4181
4182 ASSERT_NO_FATAL_FAILURE(setColorMode(display, colorMode, &err));
4183 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4184}
4185
4186/* TESTCASE: Tests that the HWC2 cannot set an invalid color mode. */
4187TEST_F(Hwc2Test, SET_COLOR_MODES_bad_parameter)
4188{
4189 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4190 [] (Hwc2Test* test, hwc2_display_t display) {
4191
4192 const android_color_mode_t colorMode =
4193 static_cast<android_color_mode_t>(-1);
4194 hwc2_error_t err = HWC2_ERROR_NONE;
4195
4196 ASSERT_NO_FATAL_FAILURE(test->setColorMode(display, colorMode,
4197 &err));
4198 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
4199 << "returned wrong error code";
4200 }
4201 ));
4202}
4203
4204/* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
4205 * for all valid color modes. */
4206TEST_F(Hwc2Test, SET_COLOR_MODES_unsupported)
4207{
4208 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4209 [] (Hwc2Test* test, hwc2_display_t display) {
4210
4211 for (auto colorMode : androidColorModes) {
4212 hwc2_error_t err = HWC2_ERROR_NONE;
4213
4214 ASSERT_NO_FATAL_FAILURE(test->setColorMode(display,
4215 colorMode, &err));
4216
4217 EXPECT_TRUE(err == HWC2_ERROR_NONE
4218 || err == HWC2_ERROR_UNSUPPORTED)
4219 << "returned wrong error code";
4220 }
4221 }
4222 ));
4223}
4224
4225/* TESTCASE: Tests that the HWC2 gets the HDR capabilities for a display and
4226 * test if they are valid. */
4227TEST_F(Hwc2Test, GET_HDR_CAPABILITIES)
4228{
4229 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4230 [] (Hwc2Test* test, hwc2_display_t display) {
4231
4232 std::vector<android_hdr_t> hdrCapabilities;
4233 float maxLuminance, maxAverageLuminance, minLuminance;
4234
4235 EXPECT_NO_FATAL_FAILURE(test->getHdrCapabilities(display,
4236 &hdrCapabilities, &maxLuminance, &maxAverageLuminance,
4237 &minLuminance));
4238
4239 if (hdrCapabilities.empty())
4240 return;
4241
4242 EXPECT_GE(maxLuminance, maxAverageLuminance);
4243 EXPECT_GE(maxAverageLuminance, minLuminance);
4244 }
4245 ));
4246}
4247
4248/* TESTCASE: Tests that the HWC2 cannot get hdr capabilities from a bad display */
4249TEST_F(Hwc2Test, GET_HDR_CAPABILITIES_bad_display)
4250{
4251 hwc2_display_t display;
4252 std::vector<android_hdr_t> hdrCapabilities;
4253 float maxLuminance, maxAverageLuminance, minLuminance;
4254 hwc2_error_t err = HWC2_ERROR_NONE;
4255
4256 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4257
4258 ASSERT_NO_FATAL_FAILURE(getHdrCapabilities(display, &hdrCapabilities,
4259 &maxLuminance, &maxAverageLuminance, &minLuminance, &err));
4260 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4261}
4262
4263static const std::array<float, 16> identityMatrix = {{
4264 1.0, 0.0, 0.0, 0.0,
4265 0.0, 1.0, 0.0, 0.0,
4266 0.0, 0.0, 1.0, 0.0,
4267 0.0, 0.0, 0.0, 1.0,
4268}};
4269
4270/* Values for the color transform matrices were precomputed using the source code
4271 * in surfaceflinger/Effects/Daltonizer.cpp. */
4272
4273static const std::array<const std::array<float, 16>, 5> exampleMatrices = {{
4274 identityMatrix,
4275 /* Converts RGB color to the XYZ space */
4276 {{ 0.4124, 0.2126, 0.0193, 0,
4277 0.3576, 0.7152, 0.1192, 0,
4278 0.1805, 0.0722, 0.9505, 0,
4279 0 , 0 , 0 , 1 }},
4280 /* Protanomaly */
4281 {{ 0.068493, 0.931506, 0, 0,
4282 0.068493, 0.931507, 0, 0,
4283 0.013626, -0.013626, 1, 0,
4284 0, 0, 0, 1 }},
4285 /* Deuteranomaly */
4286 {{ 0.288299, 0.711701, 0, 0,
4287 0.052709, 0.947291, 0, 0,
4288 -0.257912, 0.257912, 1, 0,
4289 0, 0, 0, 1 }},
4290 /* Tritanomaly */
4291 {{ 1, -0.805712, 0.805712, 0,
4292 0, 0.378838, 0.621162, 0,
4293 0, 0.104823, 0.895177, 0,
4294 0, 0, 0, 1 }},
4295}};
4296
4297/* TESTCASE: Tests that the HWC2 can set the identity color transform */
4298TEST_F(Hwc2Test, SET_COLOR_TRANSFORM)
4299{
4300 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4301 [] (Hwc2Test* test, hwc2_display_t display) {
4302
4303 EXPECT_NO_FATAL_FAILURE(test->setColorTransform(display,
4304 identityMatrix, HAL_COLOR_TRANSFORM_IDENTITY));
4305 }
4306 ));
4307}
4308
4309/* TESTCASE: Tests that the HWC2 cannot set the color transform for a bad
4310 * display. */
4311TEST_F(Hwc2Test, SET_COLOR_TRANSFORM_bad_display)
4312{
4313 hwc2_display_t display;
4314 hwc2_error_t err = HWC2_ERROR_NONE;
4315
4316 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4317
4318 ASSERT_NO_FATAL_FAILURE(setColorTransform(display, identityMatrix,
4319 HAL_COLOR_TRANSFORM_IDENTITY, &err));
4320 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4321}
4322
4323/* TESTCASE: Tests that the HWC2 cannot set an invalid color transform. */
4324TEST_F(Hwc2Test, SET_COLOR_TRANSFORM_bad_parameter)
4325{
4326 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4327 [] (Hwc2Test* test, hwc2_display_t display) {
4328
4329 const android_color_transform_t hint =
4330 static_cast<android_color_transform_t>(-1);
4331 hwc2_error_t err = HWC2_ERROR_NONE;
4332
4333 ASSERT_NO_FATAL_FAILURE(test->setColorTransform(display,
4334 identityMatrix, hint, &err));
4335 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
4336 << "returned wrong error code";
4337 }
4338 ));
4339}
4340
4341/* TESTCASE: Tests that the HWC2 can set an arbitrary color matrix. */
4342TEST_F(Hwc2Test, SET_COLOR_TRANSFORM_arbitrary_matrix)
4343{
4344 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4345 [] (Hwc2Test* test, hwc2_display_t display) {
4346
4347 const android_color_transform_t hint =
4348 HAL_COLOR_TRANSFORM_ARBITRARY_MATRIX;
4349
4350 for (const std::array<float, 16>& matrix : exampleMatrices) {
4351 EXPECT_NO_FATAL_FAILURE(test->setColorTransform(display,
4352 matrix, hint));
4353 }
4354 }
4355 ));
4356}
Marissa Wallbad1bc72017-02-21 14:33:46 -08004357
4358/* TESTCASE: Tests that the HWC2 create an destory virtual displays. */
4359TEST_F(Hwc2Test, CREATE_DESTROY_VIRTUAL_DISPLAY)
4360{
4361 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Complete,
4362 [] (Hwc2Test* /*test*/, hwc2_display_t /*display*/,
4363 Hwc2TestVirtualDisplay* /*testVirtualDisplay*/) { }));
4364}
4365
4366/* TESTCASE: Tests that the HWC2 can create and destroy multiple virtual
4367 * displays. */
4368TEST_F(Hwc2Test, CREATE_DESTROY_VIRTUAL_DISPLAY_multiple)
4369{
4370 Hwc2TestVirtualDisplay testVirtualDisplay(Hwc2TestCoverage::Complete);
4371 std::vector<hwc2_display_t> displays;
4372
4373 do {
4374 const UnsignedArea& dimension =
4375 testVirtualDisplay.getDisplayDimension();
4376 android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
4377 hwc2_display_t display;
4378 hwc2_error_t err = HWC2_ERROR_NONE;
4379
4380 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(dimension.width,
4381 dimension.height, &desiredFormat, &display, &err));
4382
4383 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_NO_RESOURCES
4384 || err == HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
4385 EXPECT_GE(desiredFormat, 0) << "invalid format";
4386
4387 if (err == HWC2_ERROR_NONE)
4388 displays.push_back(display);
4389
4390 } while (testVirtualDisplay.advance());
4391
4392 for (hwc2_display_t display : displays) {
4393 EXPECT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
4394 }
4395}
4396
4397/* TESTCASE: Tests that the HWC2 cannot destroy a bad virtual displays. */
4398TEST_F(Hwc2Test, DESTROY_VIRTUAL_DISPLAY_bad_display)
4399{
4400 hwc2_display_t display;
4401 hwc2_error_t err = HWC2_ERROR_NONE;
4402
4403 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4404
4405 ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display, &err));
4406 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4407}
4408
4409/* TESTCASE: Tests that the HWC2 cannot destroy a physical display. */
4410TEST_F(Hwc2Test, DESTROY_VIRTUAL_DISPLAY_bad_parameter)
4411{
Marissa Wallbad1bc72017-02-21 14:33:46 -08004412 hwc2_error_t err = HWC2_ERROR_NONE;
Arun Kumar K.R0b8fd892017-06-16 15:20:01 +05304413 for (auto display : mDisplays) {
4414 ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display, &err));
4415 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
4416 }
Marissa Wallbad1bc72017-02-21 14:33:46 -08004417}
4418
4419/* TESTCASE: Tests that the HWC2 can get the max virtual display count. */
4420TEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT)
4421{
4422 uint32_t maxCnt;
4423
4424 ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt));
4425}
4426
4427/* TESTCASE: Tests that the HWC2 returns the same max virtual display count for
4428 * each call. */
4429TEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT_duplicate)
4430{
4431 uint32_t maxCnt1, maxCnt2;
4432
4433 ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt1));
4434 ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt2));
4435
4436 EXPECT_EQ(maxCnt1, maxCnt2) << "returned two different max virtual display"
4437 " counts";
4438}
4439
4440/* TESTCASE: Tests that the HWC2 can create the max number of virtual displays
4441 * that it reports. */
4442TEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT_create_max)
4443{
4444 std::vector<hwc2_display_t> displays;
4445 uint32_t maxCnt;
4446
4447 ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt));
4448
4449 while (displays.size() < maxCnt) {
4450 uint32_t width = 1920, height = 1080;
4451 android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
4452 hwc2_display_t display;
4453 hwc2_error_t err = HWC2_ERROR_NONE;
4454
4455 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(width, height,
4456 &desiredFormat, &display, &err));
4457
4458 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
4459 << "returned wrong error code";
4460 if (err != HWC2_ERROR_NONE)
4461 break;
4462
4463 displays.push_back(display);
4464 }
4465
4466 for (hwc2_display_t display : displays) {
4467 EXPECT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
4468 }
4469}
4470
4471/* TESTCASE: Tests that the HWC2 can set an output buffer for a virtual
4472 * display. */
4473TEST_F(Hwc2Test, SET_OUTPUT_BUFFER)
4474{
4475 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Complete,
4476 [] (Hwc2Test* test, hwc2_display_t display,
4477 Hwc2TestVirtualDisplay* testVirtualDisplay) {
4478
4479 buffer_handle_t handle;
4480 android::base::unique_fd acquireFence;
4481
4482 if (testVirtualDisplay->getBuffer(&handle, &acquireFence) >= 0)
4483 EXPECT_NO_FATAL_FAILURE(test->setOutputBuffer(display,
4484 handle, acquireFence));
4485 }));
4486}
4487
4488/* TESTCASE: Tests that the HWC2 cannot set an output buffer for a bad display */
4489TEST_F(Hwc2Test, SET_OUTPUT_BUFFER_bad_display)
4490{
4491 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Default,
4492 [] (Hwc2Test* test, hwc2_display_t /*display*/,
4493 Hwc2TestVirtualDisplay* testVirtualDisplay) {
4494
4495 hwc2_display_t badDisplay;
4496 buffer_handle_t handle;
4497 android::base::unique_fd acquireFence;
4498 hwc2_error_t err = HWC2_ERROR_NONE;
4499
4500 ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
4501
4502 if (testVirtualDisplay->getBuffer(&handle, &acquireFence) < 0)
4503 return;
4504
4505 ASSERT_NO_FATAL_FAILURE(test->setOutputBuffer(badDisplay,
4506 handle, acquireFence, &err));
4507 EXPECT_TRUE(err == HWC2_ERROR_BAD_DISPLAY)
4508 << "returned wrong error code";
4509 }));
4510}
4511
4512/* TESTCASE: Tests that the HWC2 cannot set an invalid output buffer. */
4513TEST_F(Hwc2Test, SET_OUTPUT_BUFFER_bad_parameter)
4514{
4515 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Default,
4516 [] (Hwc2Test* test, hwc2_display_t display,
4517 Hwc2TestVirtualDisplay* /*testVirtualDisplay*/) {
4518
4519 const buffer_handle_t handle = nullptr;
4520 uint32_t releaseFence = -1;
4521 hwc2_error_t err = HWC2_ERROR_NONE;
4522
4523 ASSERT_NO_FATAL_FAILURE(test->setOutputBuffer(display, handle,
4524 releaseFence, &err));
4525 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
4526 << "returned wrong error code";
4527 }));
4528}
4529
4530/* TESTCASE: Tests that the HWC2 cannot set an output buffer for non virtual
4531 * display */
4532TEST_F(Hwc2Test, SET_OUTPUT_BUFFER_unsupported)
4533{
4534 for (auto display : mDisplays) {
4535 Hwc2TestVirtualDisplay testVirtualDisplay(Hwc2TestCoverage::Complete);
4536
4537 do {
4538 buffer_handle_t handle;
4539 android::base::unique_fd acquireFence;
4540 hwc2_error_t err = HWC2_ERROR_NONE;
4541
4542 if (testVirtualDisplay.getBuffer(&handle, &acquireFence) < 0)
4543 continue;
4544
4545 ASSERT_NO_FATAL_FAILURE(setOutputBuffer(display, handle,
4546 acquireFence, &err));
4547 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
4548
4549 } while (testVirtualDisplay.advance());
4550 }
4551}
Marissa Wallae7d3242016-12-15 12:42:07 -08004552
4553/* TESTCASE: Tests that the HWC2 can dump debug information. */
4554TEST_F(Hwc2Test, DUMP)
4555{
4556 std::string buffer;
4557
4558 ASSERT_NO_FATAL_FAILURE(dump(&buffer));
4559}