blob: 9171de2b5d3bbfe6ff42b146f0054b8158e986a9 [file] [log] [blame]
Marissa Wall4d600052016-12-15 12:16:01 -08001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <array>
Marissa Wallcfb9a072017-02-17 20:53:18 -080018#include <unordered_set>
Marissa Wall4d600052016-12-15 12:16:01 -080019#include <gtest/gtest.h>
20#include <dlfcn.h>
Marissa Wall5a240aa2016-12-15 12:34:06 -080021#include <android-base/unique_fd.h>
Marissa Wall4d600052016-12-15 12:16:01 -080022#include <hardware/hardware.h>
23
24#define HWC2_INCLUDE_STRINGIFICATION
25#define HWC2_USE_CPP11
26#include <hardware/hwcomposer2.h>
27#undef HWC2_INCLUDE_STRINGIFICATION
28#undef HWC2_USE_CPP11
29
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080030#include "Hwc2TestLayer.h"
Marissa Wall273b1df2016-12-15 12:28:47 -080031#include "Hwc2TestLayers.h"
Marissa Wallf18cfb02017-02-21 14:01:05 -080032#include "Hwc2TestClientTarget.h"
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080033
Marissa Wallcfb9a072017-02-17 20:53:18 -080034void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
35 hwc2_display_t display, int32_t connected);
Marissa Wall572a1ee2016-12-15 12:24:13 -080036void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
37 hwc2_display_t display, int64_t timestamp);
Marissa Wallcfb9a072017-02-17 20:53:18 -080038
Marissa Wall4d600052016-12-15 12:16:01 -080039class Hwc2Test : public testing::Test {
40public:
41
42 virtual void SetUp()
43 {
44 hw_module_t const* hwc2Module;
45
46 int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
47 ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
48 << strerror(-err);
49
50 /* The following method will fail if you have not run
51 * "adb shell stop" */
52 err = hwc2_open(hwc2Module, &mHwc2Device);
53 ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
54 << strerror(-err);
Marissa Wallcfb9a072017-02-17 20:53:18 -080055
56 populateDisplays();
Marissa Wall4d600052016-12-15 12:16:01 -080057 }
58
59 virtual void TearDown()
60 {
Marissa Wall1db2e372016-12-15 12:19:39 -080061
62 for (auto itr = mLayers.begin(); itr != mLayers.end();) {
63 hwc2_display_t display = itr->first;
64 hwc2_layer_t layer = itr->second;
65 itr++;
66 /* Destroys and removes the layer from mLayers */
67 destroyLayer(display, layer);
68 }
69
Marissa Wall03c91732016-12-15 12:23:16 -080070 for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
71 hwc2_display_t display = *itr;
72 itr++;
73 /* Sets power mode to off and removes the display from
74 * mActiveDisplays */
75 setPowerMode(display, HWC2_POWER_MODE_OFF);
76 }
77
Marissa Wall4d600052016-12-15 12:16:01 -080078 if (mHwc2Device)
79 hwc2_close(mHwc2Device);
80 }
81
Marissa Walla4b01482017-02-17 20:52:03 -080082 void registerCallback(hwc2_callback_descriptor_t descriptor,
83 hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
84 hwc2_error_t* outErr = nullptr)
85 {
86 auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
87 getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
88 ASSERT_TRUE(pfn) << "failed to get function";
89
90 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
91 callbackData, pointer));
92 if (outErr) {
93 *outErr = err;
94 } else {
95 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
96 }
97 }
98
Marissa Wallcfb9a072017-02-17 20:53:18 -080099 void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
100 hwc2_error_t* outErr = nullptr)
101 {
102 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
103 getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
104 ASSERT_TRUE(pfn) << "failed to get function";
105
106 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
107 reinterpret_cast<int32_t*>(outType)));
108 if (outErr) {
109 *outErr = err;
110 } else {
111 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
112 }
113 }
114
115 /* If the populateDisplays function is still receiving displays and the
116 * display is connected, the display handle is stored in mDisplays. */
117 void hotplugCallback(hwc2_display_t display, int32_t connected)
118 {
119 std::lock_guard<std::mutex> lock(mHotplugMutex);
120
121 if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
122 return;
123
124 if (connected == HWC2_CONNECTION_CONNECTED)
125 mDisplays.insert(display);
126
127 mHotplugCv.notify_all();
128 }
129
Marissa Wall1db2e372016-12-15 12:19:39 -0800130 void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
131 hwc2_error_t* outErr = nullptr)
132 {
133 auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
134 getFunction(HWC2_FUNCTION_CREATE_LAYER));
135 ASSERT_TRUE(pfn) << "failed to get function";
136
137 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
138 outLayer));
139
140 if (err == HWC2_ERROR_NONE)
141 mLayers.insert(std::make_pair(display, *outLayer));
142
143 if (outErr) {
144 *outErr = err;
145 } else {
146 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
147 }
148 }
149
150 void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
151 hwc2_error_t* outErr = nullptr)
152 {
153 auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
154 getFunction(HWC2_FUNCTION_DESTROY_LAYER));
155 ASSERT_TRUE(pfn) << "failed to get function";
156
157 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
158
159 if (err == HWC2_ERROR_NONE)
160 mLayers.erase(std::make_pair(display, layer));
161
162 if (outErr) {
163 *outErr = err;
164 } else {
165 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
166 << layer;
167 }
168 }
169
Marissa Wallcf935cb2016-12-15 12:20:47 -0800170 void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
171 hwc2_attribute_t attribute, int32_t* outValue,
172 hwc2_error_t* outErr = nullptr)
173 {
174 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
175 getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
176 ASSERT_TRUE(pfn) << "failed to get function";
177
178 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
179 attribute, outValue));
180
181 if (outErr) {
182 *outErr = err;
183 } else {
184 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
185 << getAttributeName(attribute) << " for config " << config;
186 }
187 }
188
189 void getDisplayConfigs(hwc2_display_t display,
190 std::vector<hwc2_config_t>* outConfigs,
191 hwc2_error_t* outErr = nullptr)
192 {
193 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
194 getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
195 ASSERT_TRUE(pfn) << "failed to get function";
196
197 uint32_t numConfigs = 0;
198
199 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
200 &numConfigs, nullptr));
201
202 if (err == HWC2_ERROR_NONE) {
203 outConfigs->resize(numConfigs);
204
205 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
206 &numConfigs, outConfigs->data()));
207 }
208
209 if (outErr) {
210 *outErr = err;
211 } else {
212 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
213 " display " << display;
214 }
215 }
216
Marissa Wall93dc04f2016-12-15 12:21:46 -0800217 void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
218 hwc2_error_t* outErr = nullptr)
219 {
220 auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
221 getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
222 ASSERT_TRUE(pfn) << "failed to get function";
223
224 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
225 outConfig));
226 if (outErr) {
227 *outErr = err;
228 } else {
229 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
230 " display " << display;
231 }
232 }
233
234 void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
235 hwc2_error_t* outErr = nullptr)
236 {
237 auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
238 getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
239 ASSERT_TRUE(pfn) << "failed to get function";
240
241 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
242 if (outErr) {
243 *outErr = err;
244 } else {
245 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
246 << config;
247 }
248 }
249
Marissa Wall03c91732016-12-15 12:23:16 -0800250 void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
251 hwc2_error_t* outErr = nullptr)
252 {
253 auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
254 getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
255 ASSERT_TRUE(pfn) << "failed to get function";
256
257 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
258 outSupport));
259 if (outErr) {
260 *outErr = err;
261 } else {
262 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
263 " display " << display;
264 }
265 }
266
267 void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
268 hwc2_error_t* outErr = nullptr)
269 {
270 auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
271 getFunction(HWC2_FUNCTION_SET_POWER_MODE));
272 ASSERT_TRUE(pfn) << "failed to get function";
273
274 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
275 mode));
276 if (outErr) {
277 *outErr = err;
278 if (err != HWC2_ERROR_NONE)
279 return;
280 } else {
281 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
282 << getPowerModeName(mode) << " on display " << display;
283 }
284
285 if (mode == HWC2_POWER_MODE_OFF) {
286 mActiveDisplays.erase(display);
287 } else {
288 mActiveDisplays.insert(display);
289 }
290 }
291
Marissa Wall572a1ee2016-12-15 12:24:13 -0800292 void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
293 hwc2_error_t* outErr = nullptr)
294 {
295 auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
296 getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
297 ASSERT_TRUE(pfn) << "failed to get function";
298
299 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
300 enabled));
301 if (outErr) {
302 *outErr = err;
303 } else {
304 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
305 << getVsyncName(enabled);
306 }
307 }
308
309 void vsyncCallback(hwc2_display_t display, int64_t timestamp)
310 {
311 std::lock_guard<std::mutex> lock(mVsyncMutex);
312 mVsyncDisplay = display;
313 mVsyncTimestamp = timestamp;
314 mVsyncCv.notify_all();
315 }
316
Marissa Walldd4087f2016-12-15 12:24:52 -0800317 void getDisplayName(hwc2_display_t display, std::string* outName,
318 hwc2_error_t* outErr = nullptr)
319 {
320 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
321 getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
322 ASSERT_TRUE(pfn) << "failed to get function";
323
324 uint32_t size = 0;
325
326 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
327 nullptr));
328
329 if (err == HWC2_ERROR_NONE) {
330 std::vector<char> name(size);
331
332 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
333 name.data()));
334
335 outName->assign(name.data());
336 }
337
338 if (outErr) {
339 *outErr = err;
340 } else {
341 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
342 << display;
343 }
344 }
345
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800346 void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
347 hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
348 {
349 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
350 getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
351 ASSERT_TRUE(pfn) << "failed to get function";
352
353 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
354 composition));
355 if (outErr) {
356 *outErr = err;
357 } else {
358 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
359 " type " << getCompositionName(composition);
360 }
361 }
362
Marissa Wall2a0aaf92016-12-15 12:31:37 -0800363 void setCursorPosition(hwc2_display_t display, hwc2_layer_t layer,
364 int32_t x, int32_t y, hwc2_error_t* outErr = nullptr)
365 {
366 auto pfn = reinterpret_cast<HWC2_PFN_SET_CURSOR_POSITION>(
367 getFunction(HWC2_FUNCTION_SET_CURSOR_POSITION));
368 ASSERT_TRUE(pfn) << "failed to get function";
369
370 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, x,
371 y));
372 if (outErr) {
373 *outErr = err;
374 } else {
375 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set cursor position";
376 }
377 }
378
Marissa Wallffc67da2016-12-15 12:26:09 -0800379 void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
380 hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
381 {
382 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
383 getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
384 ASSERT_TRUE(pfn) << "failed to get function";
385
386 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
387 mode));
388 if (outErr) {
389 *outErr = err;
390 } else {
391 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
392 << getBlendModeName(mode);
393 }
394 }
395
Marissa Wall5a240aa2016-12-15 12:34:06 -0800396 void setLayerBuffer(hwc2_display_t display, hwc2_layer_t layer,
397 buffer_handle_t buffer, int32_t acquireFence,
398 hwc2_error_t* outErr = nullptr)
399 {
400 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BUFFER>(
401 getFunction(HWC2_FUNCTION_SET_LAYER_BUFFER));
402 ASSERT_TRUE(pfn) << "failed to get function";
403
404 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
405 buffer, acquireFence));
406 if (outErr) {
407 *outErr = err;
408 } else {
409 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer buffer";
410 }
411 }
412
Marissa Wallee242782016-12-15 12:30:12 -0800413 void setLayerColor(hwc2_display_t display, hwc2_layer_t layer,
414 hwc_color_t color, hwc2_error_t* outErr = nullptr)
415 {
416 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COLOR>(
417 getFunction(HWC2_FUNCTION_SET_LAYER_COLOR));
418 ASSERT_TRUE(pfn) << "failed to get function";
419
420 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
421 color));
422 if (outErr) {
423 *outErr = err;
424 } else {
425 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer color";
426 }
427 }
428
Marissa Wallb72b5c92016-12-15 12:26:39 -0800429 void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
430 android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
431 {
432 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
433 getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
434 ASSERT_TRUE(pfn) << "failed to get function";
435
436 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
437 layer, dataspace));
438 if (outErr) {
439 *outErr = err;
440 } else {
441 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
442 }
443 }
444
Marissa Wall600a73b2016-12-15 12:30:39 -0800445 void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
446 const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
447 {
448 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
449 getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
450 ASSERT_TRUE(pfn) << "failed to get function";
451
452 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
453 displayFrame));
454 if (outErr) {
455 *outErr = err;
456 } else {
457 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
458 " frame";
459 }
460 }
461
Marissa Wall2b1f5302016-12-15 12:27:20 -0800462 void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
463 float alpha, hwc2_error_t* outErr = nullptr)
464 {
465 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
466 getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
467 ASSERT_TRUE(pfn) << "failed to get function";
468
469 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
470 alpha));
471 if (outErr) {
472 *outErr = err;
473 } else {
474 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
475 << alpha;
476 }
477 }
478
Marissa Wallc57468f2016-12-15 12:31:12 -0800479 void setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer,
480 const hwc_frect_t& sourceCrop, hwc2_error_t* outErr = nullptr)
481 {
482 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
483 getFunction(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP));
484 ASSERT_TRUE(pfn) << "failed to get function";
485
486 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
487 sourceCrop));
488 if (outErr) {
489 *outErr = err;
490 } else {
491 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer source crop";
492 }
493 }
494
Marissa Wallad761812016-12-15 12:32:24 -0800495 void setLayerSurfaceDamage(hwc2_display_t display, hwc2_layer_t layer,
496 const hwc_region_t& surfaceDamage, hwc2_error_t* outErr = nullptr)
497 {
498 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
499 getFunction(HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE));
500 ASSERT_TRUE(pfn) << "failed to get function";
501
502 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
503 surfaceDamage));
504 if (outErr) {
505 *outErr = err;
506 } else {
507 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer surface"
508 " damage";
509 }
510 }
511
Marissa Wallac108192016-12-15 12:27:48 -0800512 void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
513 hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
514 {
515 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
516 getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
517 ASSERT_TRUE(pfn) << "failed to get function";
518
519 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
520 transform));
521 if (outErr) {
522 *outErr = err;
523 } else {
524 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
525 << getTransformName(transform);
526 }
527 }
528
Marissa Wallf7618ed2016-12-15 12:34:39 -0800529 void setLayerVisibleRegion(hwc2_display_t display, hwc2_layer_t layer,
530 const hwc_region_t& visibleRegion, hwc2_error_t* outErr = nullptr)
531 {
532 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_VISIBLE_REGION>(
533 getFunction(HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION));
534 ASSERT_TRUE(pfn) << "failed to get function";
535
536 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
537 visibleRegion));
538 if (outErr) {
539 *outErr = err;
540 } else {
541 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer visible"
542 " region";
543 }
544 }
545
Marissa Wall273b1df2016-12-15 12:28:47 -0800546 void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
547 uint32_t zOrder, hwc2_error_t* outErr = nullptr)
548 {
549 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
550 getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
551 ASSERT_TRUE(pfn) << "failed to get function";
552
553 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
554 zOrder));
555 if (outErr) {
556 *outErr = err;
557 } else {
558 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
559 << zOrder;
560 }
561 }
562
Marissa Wall1cd789c2017-01-27 12:55:36 -0800563 void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
564 uint32_t* outNumRequests, hwc2_error_t* outErr)
565 {
566 auto pfn = reinterpret_cast<HWC2_PFN_VALIDATE_DISPLAY>(
567 getFunction(HWC2_FUNCTION_VALIDATE_DISPLAY));
568 ASSERT_TRUE(pfn) << "failed to get function";
569
570 *outErr = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
571 outNumTypes, outNumRequests));
572 }
573
574 void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
575 uint32_t* outNumRequests, bool* outHasChanges)
576 {
577 hwc2_error_t err = HWC2_ERROR_NONE;
578
579 EXPECT_NO_FATAL_FAILURE(validateDisplay(display, outNumTypes,
580 outNumRequests, &err));
581
582 if (err != HWC2_ERROR_HAS_CHANGES) {
583 *outHasChanges = false;
584 EXPECT_EQ(err, HWC2_ERROR_NONE) << "failed to validate display";
585 } else {
586 *outHasChanges = true;
587 }
588 }
589
Marissa Wall706178d2016-12-15 12:39:14 -0800590 void getDisplayRequests(hwc2_display_t display,
591 hwc2_display_request_t* outDisplayRequests,
592 std::vector<hwc2_layer_t>* outLayers,
593 std::vector<hwc2_layer_request_t>* outLayerRequests,
594 hwc2_error_t* outErr = nullptr)
595 {
596 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_REQUESTS>(
597 getFunction(HWC2_FUNCTION_GET_DISPLAY_REQUESTS));
598 ASSERT_TRUE(pfn) << "failed to get function";
599
600 uint32_t numElements = 0;
601
602 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
603 reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
604 nullptr, nullptr));
605
606 if (err == HWC2_ERROR_NONE && numElements > 0) {
607 outLayers->resize(numElements);
608 outLayerRequests->resize(numElements);
609
610 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
611 reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
612 reinterpret_cast<uint64_t*>(outLayers->data()),
613 reinterpret_cast<int32_t*>(outLayerRequests->data())));
614 }
615
616 if (outErr) {
617 *outErr = err;
618 } else {
619 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display requests";
620 }
621 }
622
623 void handleRequests(hwc2_display_t display,
624 const std::vector<hwc2_layer_t>& layers, uint32_t numRequests,
625 std::set<hwc2_layer_t>* outClearLayers = nullptr,
626 bool* outFlipClientTarget = nullptr)
627 {
628 hwc2_display_request_t displayRequest =
629 static_cast<hwc2_display_request_t>(0);
630 std::vector<hwc2_layer_t> requestedLayers;
631 std::vector<hwc2_layer_request_t> requests;
632
633 ASSERT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequest,
634 &requestedLayers, &requests));
635
636 EXPECT_EQ(numRequests, requests.size()) << "validate returned "
637 << numRequests << " requests and get display requests returned "
638 << requests.size() << " requests";
639
640 for (size_t i = 0; i < requests.size(); i++) {
641 hwc2_layer_t requestedLayer = requestedLayers.at(i);
642 hwc2_layer_request_t request = requests.at(i);
643
644 EXPECT_EQ(std::count(layers.begin(), layers.end(), requestedLayer),
645 0) << "get display requests returned an unknown layer";
646 EXPECT_NE(request, 0) << "returned empty request for layer "
647 << requestedLayer;
648
649 if (outClearLayers && request
650 == HWC2_LAYER_REQUEST_CLEAR_CLIENT_TARGET)
651 outClearLayers->insert(requestedLayer);
652 }
653
654 if (outFlipClientTarget)
655 *outFlipClientTarget = displayRequest
656 & HWC2_DISPLAY_REQUEST_FLIP_CLIENT_TARGET;
657 }
658
659 void getChangedCompositionTypes(hwc2_display_t display,
660 std::vector<hwc2_layer_t>* outLayers,
661 std::vector<hwc2_composition_t>* outTypes,
662 hwc2_error_t* outErr = nullptr)
663 {
664 auto pfn = reinterpret_cast<HWC2_PFN_GET_CHANGED_COMPOSITION_TYPES>(
665 getFunction(HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES));
666 ASSERT_TRUE(pfn) << "failed to get function";
667
668 uint32_t numElements = 0;
669
670 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
671 &numElements, nullptr, nullptr));
672
673 if (err == HWC2_ERROR_NONE && numElements > 0) {
674 outLayers->resize(numElements);
675 outTypes->resize(numElements);
676
677 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
678 &numElements, reinterpret_cast<uint64_t*>(outLayers->data()),
679 reinterpret_cast<int32_t*>(outTypes->data())));
680 }
681
682 if (outErr) {
683 *outErr = err;
684 } else {
685 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get changed"
686 " composition types";
687 }
688 }
689
690 void handleCompositionChanges(hwc2_display_t display,
691 const Hwc2TestLayers& testLayers,
692 const std::vector<hwc2_layer_t>& layers, uint32_t numTypes,
693 std::set<hwc2_layer_t>* outClientLayers = nullptr)
694 {
695 std::vector<hwc2_layer_t> changedLayers;
696 std::vector<hwc2_composition_t> types;
697
698 ASSERT_NO_FATAL_FAILURE(getChangedCompositionTypes(display,
699 &changedLayers, &types));
700
701 EXPECT_EQ(numTypes, types.size()) << "validate returned "
702 << numTypes << " types and get changed composition types"
703 " returned " << types.size() << " types";
704
705 for (size_t i = 0; i < types.size(); i++) {
706
707 auto layer = std::find(layers.begin(), layers.end(),
708 changedLayers.at(i));
709
710 EXPECT_TRUE(layer != layers.end() || !testLayers.contains(*layer))
711 << "get changed composition types returned an unknown layer";
712
713 hwc2_composition_t requestedType = testLayers.getComposition(*layer);
714 hwc2_composition_t returnedType = types.at(i);
715
716 EXPECT_NE(returnedType, HWC2_COMPOSITION_INVALID) << "get changed"
717 " composition types returned invalid composition";
718
719 switch (requestedType) {
720 case HWC2_COMPOSITION_CLIENT:
721 EXPECT_TRUE(false) << getCompositionName(returnedType)
722 << " cannot be changed";
723 break;
724 case HWC2_COMPOSITION_DEVICE:
725 case HWC2_COMPOSITION_SOLID_COLOR:
726 EXPECT_EQ(returnedType, HWC2_COMPOSITION_CLIENT)
727 << "composition of type "
728 << getCompositionName(requestedType)
729 << " can only be changed to "
730 << getCompositionName(HWC2_COMPOSITION_CLIENT);
731 break;
732 case HWC2_COMPOSITION_CURSOR:
733 case HWC2_COMPOSITION_SIDEBAND:
734 EXPECT_TRUE(returnedType == HWC2_COMPOSITION_CLIENT
735 || returnedType == HWC2_COMPOSITION_DEVICE)
736 << "composition of type "
737 << getCompositionName(requestedType)
738 << " can only be changed to "
739 << getCompositionName(HWC2_COMPOSITION_CLIENT) << " or "
740 << getCompositionName(HWC2_COMPOSITION_DEVICE);
741 break;
742 default:
743 EXPECT_TRUE(false) << "unknown type "
744 << getCompositionName(requestedType);
745 break;
746 }
747
748 if (outClientLayers)
749 if (returnedType == HWC2_COMPOSITION_CLIENT)
750 outClientLayers->insert(*layer);
751 }
752
753 if (outClientLayers) {
754 for (auto layer : layers) {
755 if (testLayers.getComposition(layer) == HWC2_COMPOSITION_CLIENT)
756 outClientLayers->insert(layer);
757 }
758 }
759 }
760
761 void acceptDisplayChanges(hwc2_display_t display,
762 hwc2_error_t* outErr = nullptr)
763 {
764 auto pfn = reinterpret_cast<HWC2_PFN_ACCEPT_DISPLAY_CHANGES>(
765 getFunction(HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES));
766 ASSERT_TRUE(pfn) << "failed to get function";
767
768 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display));
769 if (outErr) {
770 *outErr = err;
771 } else {
772 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to accept display changes";
773 }
774 }
775
Marissa Wallf18cfb02017-02-21 14:01:05 -0800776 void getClientTargetSupport(hwc2_display_t display, int32_t width,
777 int32_t height, android_pixel_format_t format,
778 android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
779 {
780 auto pfn = reinterpret_cast<HWC2_PFN_GET_CLIENT_TARGET_SUPPORT>(
781 getFunction(HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT));
782 ASSERT_TRUE(pfn) << "failed to get function";
783
784 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, width,
785 height, format, dataspace));
786 if (outErr) {
787 *outErr = err;
788 } else {
789 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get client target"
790 " support";
791 }
792 }
793
794 void setClientTarget(hwc2_display_t display, buffer_handle_t handle,
795 int32_t acquireFence, android_dataspace_t dataspace,
796 hwc_region_t damage, hwc2_error_t* outErr = nullptr)
797 {
798 auto pfn = reinterpret_cast<HWC2_PFN_SET_CLIENT_TARGET>(
799 getFunction(HWC2_FUNCTION_SET_CLIENT_TARGET));
800 ASSERT_TRUE(pfn) << "failed to get function";
801
802 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, handle,
803 acquireFence, dataspace, damage));
804 if (outErr) {
805 *outErr = err;
806 } else {
807 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set client target";
808 }
809 }
810
811 void getBadDisplay(hwc2_display_t* outDisplay)
812 {
813 for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
814 if (mDisplays.count(display) == 0) {
815 *outDisplay = display;
816 return;
817 }
818 }
819 ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
820 " are registered. This should never happen.";
821 }
822
Marissa Wall4d600052016-12-15 12:16:01 -0800823protected:
824 hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
825 {
826 return mHwc2Device->getFunction(mHwc2Device, descriptor);
827 }
828
829 void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
830 {
831 uint32_t num = 0;
832
833 mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
834
835 outCapabilities->resize(num);
836
837 mHwc2Device->getCapabilities(mHwc2Device, &num,
838 reinterpret_cast<int32_t*>(outCapabilities->data()));
839 }
840
Marissa Wallcfb9a072017-02-17 20:53:18 -0800841 /* Registers a hotplug callback and waits for hotplug callbacks. This
842 * function will have no effect if called more than once. */
843 void populateDisplays()
844 {
845 /* Sets the hotplug status to receiving */
846 {
847 std::lock_guard<std::mutex> lock(mHotplugMutex);
848
849 if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
850 return;
851 mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
852 }
853
854 /* Registers the callback. This function call cannot be locked because
855 * a callback could happen on the same thread */
856 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
857 reinterpret_cast<hwc2_function_pointer_t>(
858 hwc2TestHotplugCallback)));
859
860 /* Waits for hotplug events. If a hotplug event has not come within 1
861 * second, stop waiting. */
862 std::unique_lock<std::mutex> lock(mHotplugMutex);
863
864 while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
865 std::cv_status::timeout) { }
866
867 /* Sets the hotplug status to done. Future calls will have no effect */
868 mHotplugStatus = Hwc2TestHotplugStatus::Done;
869 }
870
Marissa Wall1db2e372016-12-15 12:19:39 -0800871 /* NOTE: will create min(newlayerCnt, max supported layers) layers */
872 void createLayers(hwc2_display_t display,
873 std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
874 {
875 std::vector<hwc2_layer_t> newLayers;
876 hwc2_layer_t layer;
877 hwc2_error_t err = HWC2_ERROR_NONE;
878
879 for (size_t i = 0; i < newLayerCnt; i++) {
880
881 EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
882 if (err == HWC2_ERROR_NO_RESOURCES)
883 break;
884 if (err != HWC2_ERROR_NONE) {
885 newLayers.clear();
886 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
887 }
888 newLayers.push_back(layer);
889 }
890
891 *outLayers = std::move(newLayers);
892 }
893
894 void destroyLayers(hwc2_display_t display,
895 std::vector<hwc2_layer_t>&& layers)
896 {
897 for (hwc2_layer_t layer : layers) {
898 EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
899 }
900 }
901
Marissa Wallcf935cb2016-12-15 12:20:47 -0800902 void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
903 {
904 std::vector<hwc2_config_t> configs;
905
906 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
907
908 hwc2_config_t CONFIG_MAX = UINT32_MAX;
909
910 ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
911 " (2^32 values) has been taken which shouldn't happen";
912
913 hwc2_config_t config;
914 for (config = 0; config < CONFIG_MAX; config++) {
915 if (std::count(configs.begin(), configs.end(), config) == 0)
916 break;
917 }
918
919 *outConfig = config;
920 }
921
Marissa Wall572a1ee2016-12-15 12:24:13 -0800922 void enableVsync(hwc2_display_t display)
923 {
924 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
925 reinterpret_cast<hwc2_function_pointer_t>(
926 hwc2TestVsyncCallback)));
927 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
928 }
929
930 void disableVsync(hwc2_display_t display)
931 {
932 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
933 }
934
935 void waitForVsync(hwc2_display_t* outDisplay = nullptr,
936 int64_t* outTimestamp = nullptr)
937 {
938 std::unique_lock<std::mutex> lock(mVsyncMutex);
939 ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
940 std::cv_status::no_timeout) << "timed out attempting to get"
941 " vsync callback";
942 if (outDisplay)
943 *outDisplay = mVsyncDisplay;
944 if (outTimestamp)
945 *outTimestamp = mVsyncTimestamp;
946 }
947
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800948 /* Calls a set property function from Hwc2Test to set a property value from
949 * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
950 using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
951 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800952 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800953
Marissa Wall273b1df2016-12-15 12:28:47 -0800954 /* Calls a set property function from Hwc2Test to set property values from
955 * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
956 using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
957 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800958 Hwc2TestLayers* testLayers);
Marissa Wall273b1df2016-12-15 12:28:47 -0800959
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800960 /* Calls a set property function from Hwc2Test to set a bad property value
961 * on hwc2_layer_t on hwc2_display_t */
962 using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
963 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800964 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800965
966 /* Calls a set property function from Hwc2Test to set a bad property value
967 * on hwc2_layer_t on hwc2_display_t */
968 using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
969 hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
970
Marissa Wall1cd789c2017-01-27 12:55:36 -0800971 /* Is called after a display is powered on and all layer properties have
972 * been set. It should be used to test functions such as validate, accepting
973 * changes, present, etc. */
974 using TestDisplayLayersFunction = void (*)(Hwc2Test* test,
Marissa Wall706178d2016-12-15 12:39:14 -0800975 hwc2_display_t display, const std::vector<hwc2_layer_t>& layers,
976 const Hwc2TestLayers& testLayers);
977
978 /* It is called on an non validated display */
979 using TestDisplayNonValidatedLayersFunction = void (*)(Hwc2Test* test,
980 hwc2_display_t display, std::vector<hwc2_layer_t>* layers);
Marissa Wall1cd789c2017-01-27 12:55:36 -0800981
Marissa Wallf18cfb02017-02-21 14:01:05 -0800982 /* Tests client target support on a particular display and config */
983 using TestClientTargetSupportFunction = void (*)(Hwc2Test* test,
984 hwc2_display_t display,
985 const Hwc2TestClientTargetSupport& testClientTargetSupport);
986
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800987 /* Advances a property of Hwc2TestLayer */
988 using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
989
Marissa Wallf7618ed2016-12-15 12:34:39 -0800990 /* Advances properties of Hwc2TestLayers */
991 using AdvanceProperties = bool (*)(Hwc2TestLayers* testLayer);
992
Marissa Wallf18cfb02017-02-21 14:01:05 -0800993 /* Advances properties of Hwc2TestClientTargetSupport */
994 using AdvanceClientTargetSupport = bool (*)(
995 Hwc2TestClientTargetSupport* testClientTargetSupport);
996
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800997 /* For each active display it cycles through each display config and tests
998 * each property value. It creates a layer, sets the property and then
999 * destroys the layer */
1000 void setLayerProperty(Hwc2TestCoverage coverage,
1001 TestLayerPropertyFunction function, AdvanceProperty advance)
1002 {
1003 for (auto display : mDisplays) {
1004 std::vector<hwc2_config_t> configs;
1005
1006 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1007
1008 for (auto config : configs) {
1009 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -08001010 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001011
1012 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001013 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1014 &displayArea));
1015 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001016
1017 do {
1018 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1019
1020 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001021 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001022
1023 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1024 } while (advance(&testLayer));
1025 }
1026 }
1027 }
1028
1029 /* For each active display it cycles through each display config and tests
1030 * each property value. It creates a layer, cycles through each property
1031 * value and updates the layer property value and then destroys the layer */
1032 void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
1033 TestLayerPropertyFunction function, AdvanceProperty advance)
1034 {
1035 for (auto display : mDisplays) {
1036 std::vector<hwc2_config_t> configs;
1037
1038 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1039
1040 for (auto config : configs) {
1041 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -08001042 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001043
1044 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001045 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1046 &displayArea));
1047 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001048
1049 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1050
1051 do {
1052 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001053 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001054 } while (advance(&testLayer));
1055
1056 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1057 }
1058 }
1059 }
1060
Marissa Wall273b1df2016-12-15 12:28:47 -08001061 /* For each active display it cycles through each display config and tests
1062 * each property value. It creates multiple layers, calls the
1063 * TestLayerPropertiesFunction to set property values and then
1064 * destroys the layers */
1065 void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
Marissa Wallf7618ed2016-12-15 12:34:39 -08001066 TestLayerPropertiesFunction function, AdvanceProperties advance)
Marissa Wall273b1df2016-12-15 12:28:47 -08001067 {
1068 for (auto display : mDisplays) {
1069 std::vector<hwc2_config_t> configs;
1070
1071 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1072
1073 for (auto config : configs) {
1074 std::vector<hwc2_layer_t> layers;
Marissa Wall600a73b2016-12-15 12:30:39 -08001075 Area displayArea;
Marissa Wall273b1df2016-12-15 12:28:47 -08001076
1077 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001078 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1079 &displayArea));
Marissa Wall273b1df2016-12-15 12:28:47 -08001080
1081 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
Marissa Wall600a73b2016-12-15 12:30:39 -08001082 Hwc2TestLayers testLayers(layers, coverage, displayArea);
Marissa Wall273b1df2016-12-15 12:28:47 -08001083
Marissa Wallf7618ed2016-12-15 12:34:39 -08001084 do {
1085 for (auto layer : layers) {
1086 EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
1087 &testLayers));
1088 }
1089 } while (advance(&testLayers));
Marissa Wall273b1df2016-12-15 12:28:47 -08001090
1091 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1092 }
1093 }
1094 }
1095
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001096 /* For each active display it cycles through each display config.
1097 * 1) It attempts to set a valid property value to bad layer handle.
1098 * 2) It creates a layer x and attempts to set a valid property value to
1099 * layer x + 1
1100 * 3) It destroys the layer x and attempts to set a valid property value to
1101 * the destroyed layer x.
1102 */
1103 void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
1104 TestLayerPropertyBadLayerFunction function)
1105 {
1106 for (auto display : mDisplays) {
1107 std::vector<hwc2_config_t> configs;
1108
1109 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1110
1111 for (auto config : configs) {
1112 hwc2_layer_t layer = 0;
Marissa Wall600a73b2016-12-15 12:30:39 -08001113 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001114 hwc2_error_t err = HWC2_ERROR_NONE;
1115
1116 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001117 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1118 &displayArea));
1119 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001120
1121 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001122 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001123 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1124
1125 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1126
1127 ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001128 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001129 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1130
1131 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1132
1133 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001134 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001135 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1136 }
1137 }
1138 }
1139
1140 /* For each active display it cycles through each display config and tests
1141 * each property value. It creates a layer, sets a bad property value and
1142 * then destroys the layer */
1143 void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
1144 {
1145 for (auto display : mDisplays) {
1146 std::vector<hwc2_config_t> configs;
1147
1148 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1149
1150 for (auto config : configs) {
1151 hwc2_layer_t layer;
1152 hwc2_error_t err = HWC2_ERROR_NONE;
1153
1154 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1155
1156 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1157
1158 ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
1159 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
1160 " error code";
1161
1162 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1163 }
1164 }
1165 }
1166
Marissa Wall1cd789c2017-01-27 12:55:36 -08001167 /* For each active display it powers on the display, cycles through each
1168 * config and creates a set of layers with a certain amount of coverage.
1169 * For each active display, for each config and for each set of layers,
1170 * it calls the TestDisplayLayersFunction */
1171 void displayLayers(Hwc2TestCoverage coverage, size_t layerCnt,
1172 TestDisplayLayersFunction function)
1173 {
1174 for (auto display : mDisplays) {
1175 std::vector<hwc2_config_t> configs;
1176
1177 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1178
1179 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1180
1181 for (auto config : configs) {
1182 Area displayArea;
1183 std::vector<hwc2_layer_t> layers;
1184
1185 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1186 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
1187
1188 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1189 Hwc2TestLayers testLayers(layers, coverage, displayArea);
1190
1191 do {
1192 bool skip;
1193
1194 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
1195 &testLayers, &skip));
1196 if (!skip)
Marissa Wall706178d2016-12-15 12:39:14 -08001197 EXPECT_NO_FATAL_FAILURE(function(this, display, layers,
1198 testLayers));
Marissa Wall1cd789c2017-01-27 12:55:36 -08001199
1200 } while (testLayers.advance());
1201
1202 ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
1203 std::move(layers)));
1204 }
1205
1206 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1207 }
1208 }
1209
Marissa Wall706178d2016-12-15 12:39:14 -08001210 /* For each active display, it calls the
1211 * TestDisplayNonValidatedLayersFunction on a variety on non-validated
1212 * layer combinations */
1213 void displayNonValidatedLayers(size_t layerCnt,
1214 TestDisplayNonValidatedLayersFunction function)
1215 {
1216 for (auto display : mDisplays) {
1217 uint32_t numTypes, numRequests;
1218 std::vector<hwc2_layer_t> layers;
1219 bool hasChanges;
1220
1221 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1222
1223 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1224
1225 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1226
1227 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1228
1229 for (auto layer : layers) {
1230 ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1231 HWC2_COMPOSITION_CLIENT));
1232 }
1233
1234 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1235
1236 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1237 &numRequests, &hasChanges));
1238
1239 for (auto layer : layers) {
1240 ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1241 HWC2_COMPOSITION_DEVICE));
1242 }
1243
1244 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1245
1246 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1247
1248 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1249
1250 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1251 }
1252 }
1253
Marissa Wallf18cfb02017-02-21 14:01:05 -08001254 /* Test client target support on each config on each active display */
1255 void setClientTargetSupport(Hwc2TestCoverage coverage,
1256 TestClientTargetSupportFunction function,
1257 AdvanceClientTargetSupport advance)
1258 {
1259 for (auto display : mDisplays) {
1260 std::vector<hwc2_config_t> configs;
1261
1262 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1263
1264 for (auto config : configs) {
1265 Area displayArea;
1266
1267 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1268 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1269 &displayArea));
1270 Hwc2TestClientTargetSupport testClientTargetSupport(coverage,
1271 displayArea);
1272
1273 do {
1274 EXPECT_NO_FATAL_FAILURE(function(this, display,
1275 testClientTargetSupport));
1276
1277 } while (advance(&testClientTargetSupport));
1278 }
1279 }
1280 }
1281
Marissa Wall600a73b2016-12-15 12:30:39 -08001282 void getActiveConfigAttribute(hwc2_display_t display,
1283 hwc2_attribute_t attribute, int32_t* outValue)
1284 {
1285 hwc2_config_t config;
1286 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
1287 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1288 attribute, outValue));
1289 ASSERT_GE(*outValue, 0) << "failed to get valid "
1290 << getAttributeName(attribute);
1291 }
1292
1293 void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
1294 {
1295 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1296 HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
1297 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1298 HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
1299 }
1300
Marissa Wall1cd789c2017-01-27 12:55:36 -08001301 void setLayerProperties(hwc2_display_t display, hwc2_layer_t layer,
1302 Hwc2TestLayers* testLayers, bool* outSkip)
1303 {
1304 hwc2_composition_t composition;
1305 buffer_handle_t handle = nullptr;
1306 int32_t acquireFence;
1307 hwc2_error_t err = HWC2_ERROR_NONE;
1308 *outSkip = true;
1309
1310 if (!testLayers->contains(layer))
1311 return;
1312
1313 composition = testLayers->getComposition(layer);
1314
1315 /* If the device cannot support a buffer format, then do not continue */
1316 if ((composition == HWC2_COMPOSITION_DEVICE
1317 || composition == HWC2_COMPOSITION_CURSOR)
1318 && testLayers->getBuffer(layer, &handle, &acquireFence) < 0)
1319 return;
1320
1321 EXPECT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1322 composition, &err));
1323 if (err == HWC2_ERROR_UNSUPPORTED)
1324 EXPECT_TRUE(composition != HWC2_COMPOSITION_CLIENT
1325 && composition != HWC2_COMPOSITION_DEVICE);
1326
1327 const hwc_rect_t cursor = testLayers->getCursorPosition(layer);
1328
1329 EXPECT_NO_FATAL_FAILURE(setLayerBuffer(display, layer, handle,
1330 acquireFence));
1331 EXPECT_NO_FATAL_FAILURE(setLayerBlendMode(display, layer,
1332 testLayers->getBlendMode(layer)));
1333 EXPECT_NO_FATAL_FAILURE(setLayerColor(display, layer,
1334 testLayers->getColor(layer)));
1335 EXPECT_NO_FATAL_FAILURE(setCursorPosition(display, layer, cursor.left,
1336 cursor.top));
1337 EXPECT_NO_FATAL_FAILURE(setLayerDataspace(display, layer,
1338 testLayers->getDataspace(layer)));
1339 EXPECT_NO_FATAL_FAILURE(setLayerDisplayFrame(display, layer,
1340 testLayers->getDisplayFrame(layer)));
1341 EXPECT_NO_FATAL_FAILURE(setLayerPlaneAlpha(display, layer,
1342 testLayers->getPlaneAlpha(layer)));
1343 EXPECT_NO_FATAL_FAILURE(setLayerSourceCrop(display, layer,
1344 testLayers->getSourceCrop(layer)));
1345 EXPECT_NO_FATAL_FAILURE(setLayerSurfaceDamage(display, layer,
1346 testLayers->getSurfaceDamage(layer)));
1347 EXPECT_NO_FATAL_FAILURE(setLayerTransform(display, layer,
1348 testLayers->getTransform(layer)));
1349 EXPECT_NO_FATAL_FAILURE(setLayerVisibleRegion(display, layer,
1350 testLayers->getVisibleRegion(layer)));
1351 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer,
1352 testLayers->getZOrder(layer)));
1353
1354 *outSkip = false;
1355 }
1356
1357 void setLayerProperties(hwc2_display_t display,
1358 const std::vector<hwc2_layer_t>& layers,
1359 Hwc2TestLayers* testLayers, bool* outSkip)
1360 {
1361 for (auto layer : layers) {
1362 EXPECT_NO_FATAL_FAILURE(setLayerProperties(display, layer,
1363 testLayers, outSkip));
1364 if (*outSkip)
1365 return;
1366 }
1367 }
1368
Marissa Wall4d600052016-12-15 12:16:01 -08001369 hwc2_device_t* mHwc2Device = nullptr;
Marissa Wallcfb9a072017-02-17 20:53:18 -08001370
1371 enum class Hwc2TestHotplugStatus {
1372 Init = 1,
1373 Receiving,
1374 Done,
1375 };
1376
1377 std::mutex mHotplugMutex;
1378 std::condition_variable mHotplugCv;
1379 Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
1380 std::unordered_set<hwc2_display_t> mDisplays;
Marissa Wall1db2e372016-12-15 12:19:39 -08001381
1382 /* Store all created layers that have not been destroyed. If an ASSERT_*
1383 * fails, then destroy the layers on exit */
1384 std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
Marissa Wall03c91732016-12-15 12:23:16 -08001385
1386 /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
1387 * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
1388 std::set<hwc2_display_t> mActiveDisplays;
Marissa Wall572a1ee2016-12-15 12:24:13 -08001389
1390 std::mutex mVsyncMutex;
1391 std::condition_variable mVsyncCv;
1392 hwc2_display_t mVsyncDisplay;
1393 int64_t mVsyncTimestamp = -1;
Marissa Wall4d600052016-12-15 12:16:01 -08001394};
1395
Marissa Wallcfb9a072017-02-17 20:53:18 -08001396void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
1397 hwc2_display_t display, int32_t connection)
1398{
1399 if (callbackData)
1400 static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
1401 connection);
1402}
1403
Marissa Wall572a1ee2016-12-15 12:24:13 -08001404void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
1405 hwc2_display_t display, int64_t timestamp)
1406{
1407 if (callbackData)
1408 static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
1409 timestamp);
1410}
1411
Marissa Wallffc67da2016-12-15 12:26:09 -08001412void setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001413 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallffc67da2016-12-15 12:26:09 -08001414{
1415 EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001416 testLayer->getBlendMode(), outErr));
1417}
1418
1419void setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1420 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1421{
1422 buffer_handle_t handle;
1423 android::base::unique_fd acquireFence;
1424 hwc2_composition_t composition = testLayer->getComposition();
1425
1426 if (composition == HWC2_COMPOSITION_CLIENT
1427 || composition == HWC2_COMPOSITION_SOLID_COLOR
1428 || composition == HWC2_COMPOSITION_SIDEBAND)
1429 return;
1430
1431 if (testLayer->getBuffer(&handle, &acquireFence) < 0)
1432 return;
1433
1434 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
1435 composition));
1436 EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
1437 handle, acquireFence, outErr));
Marissa Wallffc67da2016-12-15 12:26:09 -08001438}
1439
Marissa Wallee242782016-12-15 12:30:12 -08001440void setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001441 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallee242782016-12-15 12:30:12 -08001442{
1443 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1444 layer, HWC2_COMPOSITION_SOLID_COLOR));
1445 ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001446 layer, testLayer->getPlaneAlpha()));
Marissa Wallee242782016-12-15 12:30:12 -08001447 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001448 layer, testLayer->getBlendMode()));
Marissa Wallee242782016-12-15 12:30:12 -08001449 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001450 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08001451}
1452
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001453void setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001454 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001455{
Marissa Wall5a240aa2016-12-15 12:34:06 -08001456 hwc2_composition_t composition = testLayer->getComposition();
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001457 hwc2_error_t err = HWC2_ERROR_NONE;
1458
1459 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
1460 composition, &err));
1461 if (outErr) {
1462 *outErr = err;
1463 return;
1464 }
1465
1466 if (composition != HWC2_COMPOSITION_SIDEBAND) {
1467 EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
1468 } else {
1469 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
1470 << "returned wrong error code";
1471 }
1472}
1473
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001474void setCursorPosition(Hwc2Test* test, hwc2_display_t display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001475 hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001476{
1477 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1478 layer, HWC2_COMPOSITION_CURSOR));
1479
Marissa Wall5a240aa2016-12-15 12:34:06 -08001480 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001481 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
1482 cursorPosition.left, cursorPosition.top, outErr));
1483}
1484
Marissa Wallb72b5c92016-12-15 12:26:39 -08001485void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001486 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallb72b5c92016-12-15 12:26:39 -08001487{
1488 EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001489 testLayer->getDataspace(), outErr));
Marissa Wallb72b5c92016-12-15 12:26:39 -08001490}
1491
Marissa Wall600a73b2016-12-15 12:30:39 -08001492void setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001493 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall600a73b2016-12-15 12:30:39 -08001494{
1495 EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001496 testLayer->getDisplayFrame(), outErr));
Marissa Wall600a73b2016-12-15 12:30:39 -08001497}
1498
Marissa Wall2b1f5302016-12-15 12:27:20 -08001499void setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001500 Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
Marissa Wall2b1f5302016-12-15 12:27:20 -08001501{
1502 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001503 testLayer->getBlendMode()));
Marissa Wall2b1f5302016-12-15 12:27:20 -08001504 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001505 testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08001506}
1507
Marissa Wallc57468f2016-12-15 12:31:12 -08001508void setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001509 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallc57468f2016-12-15 12:31:12 -08001510{
1511 EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001512 testLayer->getSourceCrop(), outErr));
Marissa Wallc57468f2016-12-15 12:31:12 -08001513}
1514
Marissa Wallad761812016-12-15 12:32:24 -08001515void setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001516 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallad761812016-12-15 12:32:24 -08001517{
1518 EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001519 testLayer->getSurfaceDamage(), outErr));
Marissa Wallad761812016-12-15 12:32:24 -08001520}
1521
Marissa Wallac108192016-12-15 12:27:48 -08001522void setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001523 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallac108192016-12-15 12:27:48 -08001524{
1525 EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001526 testLayer->getTransform(), outErr));
Marissa Wallac108192016-12-15 12:27:48 -08001527}
1528
Marissa Wallf7618ed2016-12-15 12:34:39 -08001529void setVisibleRegion(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1530 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1531{
1532 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display, layer,
1533 testLayer->getVisibleRegion(), outErr));
1534}
1535
Marissa Wall273b1df2016-12-15 12:28:47 -08001536void setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001537 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall273b1df2016-12-15 12:28:47 -08001538{
1539 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001540 testLayer->getZOrder(), outErr));
Marissa Wall273b1df2016-12-15 12:28:47 -08001541}
1542
Marissa Wallffc67da2016-12-15 12:26:09 -08001543bool advanceBlendMode(Hwc2TestLayer* testLayer)
1544{
1545 return testLayer->advanceBlendMode();
1546}
1547
Marissa Wall5a240aa2016-12-15 12:34:06 -08001548bool advanceBuffer(Hwc2TestLayer* testLayer)
1549{
1550 if (testLayer->advanceComposition())
1551 return true;
1552 return testLayer->advanceBufferArea();
1553}
1554
Marissa Wallee242782016-12-15 12:30:12 -08001555bool advanceColor(Hwc2TestLayer* testLayer)
1556{
1557 /* Color depends on blend mode so advance blend mode last so color is not
1558 * force to update as often */
1559 if (testLayer->advancePlaneAlpha())
1560 return true;
1561 if (testLayer->advanceColor())
1562 return true;
1563 return testLayer->advanceBlendMode();
1564}
1565
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001566bool advanceComposition(Hwc2TestLayer* testLayer)
1567{
1568 return testLayer->advanceComposition();
1569}
1570
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001571bool advanceCursorPosition(Hwc2TestLayer* testLayer)
1572{
1573 return testLayer->advanceCursorPosition();
1574}
1575
Marissa Wallb72b5c92016-12-15 12:26:39 -08001576bool advanceDataspace(Hwc2TestLayer* testLayer)
1577{
1578 return testLayer->advanceDataspace();
1579}
1580
Marissa Wall600a73b2016-12-15 12:30:39 -08001581bool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1582{
1583 return testLayer->advanceDisplayFrame();
1584}
1585
Marissa Wall2b1f5302016-12-15 12:27:20 -08001586bool advancePlaneAlpha(Hwc2TestLayer* testLayer)
1587{
1588 return testLayer->advancePlaneAlpha();
1589}
1590
Marissa Wallc57468f2016-12-15 12:31:12 -08001591bool advanceSourceCrop(Hwc2TestLayer* testLayer)
1592{
1593 if (testLayer->advanceSourceCrop())
1594 return true;
1595 return testLayer->advanceBufferArea();
1596}
1597
Marissa Wallad761812016-12-15 12:32:24 -08001598bool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
1599{
1600 if (testLayer->advanceSurfaceDamage())
1601 return true;
1602 return testLayer->advanceBufferArea();
1603}
1604
Marissa Wallac108192016-12-15 12:27:48 -08001605bool advanceTransform(Hwc2TestLayer* testLayer)
1606{
1607 return testLayer->advanceTransform();
1608}
1609
Marissa Wallf7618ed2016-12-15 12:34:39 -08001610bool advanceVisibleRegions(Hwc2TestLayers* testLayers)
1611{
1612 return testLayers->advanceVisibleRegions();
1613}
1614
Marissa Wallf18cfb02017-02-21 14:01:05 -08001615bool advanceClientTargetSupport(
1616 Hwc2TestClientTargetSupport* testClientTargetSupport)
1617{
1618 return testClientTargetSupport->advance();
1619}
Marissa Wall4d600052016-12-15 12:16:01 -08001620
1621static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
1622 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
1623 HWC2_FUNCTION_CREATE_LAYER,
1624 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
1625 HWC2_FUNCTION_DESTROY_LAYER,
1626 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
1627 HWC2_FUNCTION_DUMP,
1628 HWC2_FUNCTION_GET_ACTIVE_CONFIG,
1629 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
1630 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
1631 HWC2_FUNCTION_GET_COLOR_MODES,
1632 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
1633 HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
1634 HWC2_FUNCTION_GET_DISPLAY_NAME,
1635 HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
1636 HWC2_FUNCTION_GET_DISPLAY_TYPE,
1637 HWC2_FUNCTION_GET_DOZE_SUPPORT,
1638 HWC2_FUNCTION_GET_HDR_CAPABILITIES,
1639 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
1640 HWC2_FUNCTION_GET_RELEASE_FENCES,
1641 HWC2_FUNCTION_PRESENT_DISPLAY,
1642 HWC2_FUNCTION_REGISTER_CALLBACK,
1643 HWC2_FUNCTION_SET_ACTIVE_CONFIG,
1644 HWC2_FUNCTION_SET_CLIENT_TARGET,
1645 HWC2_FUNCTION_SET_COLOR_MODE,
1646 HWC2_FUNCTION_SET_COLOR_TRANSFORM,
1647 HWC2_FUNCTION_SET_CURSOR_POSITION,
1648 HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
1649 HWC2_FUNCTION_SET_LAYER_BUFFER,
1650 HWC2_FUNCTION_SET_LAYER_COLOR,
1651 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
1652 HWC2_FUNCTION_SET_LAYER_DATASPACE,
1653 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
1654 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
1655 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
1656 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
1657 HWC2_FUNCTION_SET_LAYER_TRANSFORM,
1658 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
1659 HWC2_FUNCTION_SET_LAYER_Z_ORDER,
1660 HWC2_FUNCTION_SET_OUTPUT_BUFFER,
1661 HWC2_FUNCTION_SET_POWER_MODE,
1662 HWC2_FUNCTION_SET_VSYNC_ENABLED,
1663 HWC2_FUNCTION_VALIDATE_DISPLAY,
1664}};
1665
1666/* TESTCASE: Tests that the HWC2 supports all required functions. */
1667TEST_F(Hwc2Test, GET_FUNCTION)
1668{
1669 for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
1670 hwc2_function_pointer_t pfn = getFunction(descriptor);
1671 EXPECT_TRUE(pfn) << "failed to get function "
1672 << getFunctionDescriptorName(descriptor);
1673 }
1674}
1675
1676/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
1677TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
1678{
1679 hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
1680 EXPECT_FALSE(pfn) << "failed to get invalid function";
1681}
1682
1683/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
1684TEST_F(Hwc2Test, GET_CAPABILITIES)
1685{
1686 std::vector<hwc2_capability_t> capabilities;
1687
1688 getCapabilities(&capabilities);
1689
1690 EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
1691 HWC2_CAPABILITY_INVALID), 0);
1692}
Marissa Walla4b01482017-02-17 20:52:03 -08001693
1694static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1695 HWC2_CALLBACK_HOTPLUG,
1696 HWC2_CALLBACK_REFRESH,
1697 HWC2_CALLBACK_VSYNC,
1698}};
1699
1700/* TESTCASE: Tests that the HWC2 can successfully register all required
1701 * callback functions. */
1702TEST_F(Hwc2Test, REGISTER_CALLBACK)
1703{
1704 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1705 const_cast<char*>("data"));
1706
1707 for (auto descriptor : callbackDescriptors) {
1708 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1709 []() { return; }));
1710 }
1711}
1712
1713/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1714TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1715{
1716 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1717 const_cast<char*>("data"));
1718 hwc2_error_t err = HWC2_ERROR_NONE;
1719
1720 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1721 []() { return; }, &err));
1722 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1723}
1724
1725/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
1726TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
1727{
1728 hwc2_callback_data_t data = nullptr;
1729
1730 for (auto descriptor : callbackDescriptors) {
1731 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1732 []() { return; }));
1733 }
1734}
Marissa Wallcfb9a072017-02-17 20:53:18 -08001735
1736/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1737 * physical display. */
1738TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1739{
1740 for (auto display : mDisplays) {
1741 hwc2_display_type_t type;
1742
1743 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1744 EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1745 " correct display type";
1746 }
1747}
1748
1749/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1750 * display is requested. */
1751TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1752{
1753 hwc2_display_t display;
1754 hwc2_display_type_t type;
1755 hwc2_error_t err = HWC2_ERROR_NONE;
1756
1757 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1758
1759 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1760 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1761}
Marissa Wall1db2e372016-12-15 12:19:39 -08001762
1763/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
1764TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
1765{
1766 for (auto display : mDisplays) {
1767 hwc2_layer_t layer;
1768
1769 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1770
1771 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1772 }
1773}
1774
1775/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
1776TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
1777{
1778 hwc2_display_t display;
1779 hwc2_layer_t layer;
1780 hwc2_error_t err = HWC2_ERROR_NONE;
1781
1782 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1783
1784 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
1785 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1786}
1787
1788/* TESTCASE: Tests that the HWC2 will either support a large number of resources
1789 * or will return no resources. */
1790TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
1791{
1792 const size_t layerCnt = 1000;
1793
1794 for (auto display : mDisplays) {
1795 std::vector<hwc2_layer_t> layers;
1796
1797 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1798
1799 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1800 }
1801}
1802
1803/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
1804TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
1805{
1806 hwc2_display_t badDisplay;
1807
1808 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
1809
1810 for (auto display : mDisplays) {
1811 hwc2_layer_t layer = 0;
1812 hwc2_error_t err = HWC2_ERROR_NONE;
1813
1814 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1815 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1816
1817 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1818
1819 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1820 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1821
1822 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1823 }
1824}
1825
1826/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
1827TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
1828{
1829 for (auto display : mDisplays) {
1830 hwc2_layer_t layer;
1831 hwc2_error_t err = HWC2_ERROR_NONE;
1832
1833 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
1834 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1835
1836 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
1837 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1838
1839 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
1840 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1841
1842 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
1843 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1844
1845 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
1846 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1847
1848 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1849
1850 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
1851 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1852
1853 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1854
1855 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
1856 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1857 }
1858}
Marissa Wallcf935cb2016-12-15 12:20:47 -08001859
1860static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1861 HWC2_ATTRIBUTE_WIDTH,
1862 HWC2_ATTRIBUTE_HEIGHT,
1863}};
1864
1865static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1866 HWC2_ATTRIBUTE_VSYNC_PERIOD,
1867 HWC2_ATTRIBUTE_DPI_X,
1868 HWC2_ATTRIBUTE_DPI_Y,
1869}};
1870
1871/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1872 * config. */
1873TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1874{
1875 for (auto display : mDisplays) {
1876 std::vector<hwc2_config_t> configs;
1877
1878 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1879
1880 for (auto config : configs) {
1881 int32_t value;
1882
1883 for (auto attribute : requiredAttributes) {
1884 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1885 attribute, &value));
1886 EXPECT_GE(value, 0) << "missing required attribute "
1887 << getAttributeName(attribute) << " for config "
1888 << config;
1889 }
1890 for (auto attribute : optionalAttributes) {
1891 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1892 attribute, &value));
1893 }
1894 }
1895 }
1896}
1897
1898/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1899 * attribute */
1900TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1901{
1902 const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1903
1904 for (auto display : mDisplays) {
1905 std::vector<hwc2_config_t> configs;
1906
1907 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1908
1909 for (auto config : configs) {
1910 int32_t value;
1911 hwc2_error_t err = HWC2_ERROR_NONE;
1912
1913 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1914 attribute, &value, &err));
1915 EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1916 " attribute for config " << config;
1917 }
1918 }
1919}
1920
1921/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1922TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1923{
1924 hwc2_display_t display;
1925 const hwc2_config_t config = 0;
1926 int32_t value;
1927 hwc2_error_t err = HWC2_ERROR_NONE;
1928
1929 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1930
1931 for (auto attribute : requiredAttributes) {
1932 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1933 &value, &err));
1934 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1935 }
1936
1937 for (auto attribute : optionalAttributes) {
1938 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1939 &value, &err));
1940 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1941 }
1942}
1943
1944/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1945TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1946{
1947 for (auto display : mDisplays) {
1948 hwc2_config_t config;
1949 int32_t value;
1950 hwc2_error_t err = HWC2_ERROR_NONE;
1951
1952 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1953
1954 for (auto attribute : requiredAttributes) {
1955 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1956 attribute, &value, &err));
1957 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1958 }
1959
1960 for (auto attribute : optionalAttributes) {
1961 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1962 attribute, &value, &err));
1963 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1964 }
1965 }
1966}
1967
1968/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1969TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1970{
1971 for (auto display : mDisplays) {
1972 std::vector<hwc2_config_t> configs;
1973
1974 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1975 }
1976}
1977
1978/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1979TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1980{
1981 hwc2_display_t display;
1982 std::vector<hwc2_config_t> configs;
1983 hwc2_error_t err = HWC2_ERROR_NONE;
1984
1985 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1986
1987 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1988
1989 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1990 EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1991}
1992
1993/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1994 * times in a row. */
1995TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1996{
1997 for (auto display : mDisplays) {
1998 std::vector<hwc2_config_t> configs1, configs2;
1999
2000 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
2001 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
2002
2003 EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
2004 configs2.begin())) << "returned two different config sets";
2005 }
2006}
2007
2008/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
2009TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
2010{
2011 for (auto display : mDisplays) {
2012 std::vector<hwc2_config_t> configs;
2013
2014 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2015
2016 std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
2017 configs.end());
2018 EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
2019 " configs";
2020 }
2021}
Marissa Wall93dc04f2016-12-15 12:21:46 -08002022
2023/* TESTCASE: Tests that the HWC2 returns the active config for a display */
2024TEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
2025{
2026 for (auto display : mDisplays) {
2027 std::vector<hwc2_config_t> configs;
2028
2029 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2030
2031 for (auto config : configs) {
2032 hwc2_config_t activeConfig;
2033
2034 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2035 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
2036
2037 EXPECT_EQ(activeConfig, config) << "failed to get active config";
2038 }
2039 }
2040}
2041
2042/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
2043 * display. */
2044TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
2045{
2046 hwc2_display_t display;
2047 hwc2_config_t activeConfig;
2048 hwc2_error_t err = HWC2_ERROR_NONE;
2049
2050 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2051
2052 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
2053
2054 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2055}
2056
2057/* TESTCASE: Tests that the HWC2 either begins with a valid active config
2058 * or returns an error when getActiveConfig is called. */
2059TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
2060{
2061 for (auto display : mDisplays) {
2062 std::vector<hwc2_config_t> configs;
2063 hwc2_config_t activeConfig;
2064 hwc2_error_t err = HWC2_ERROR_NONE;
2065
2066 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2067
2068 if (configs.empty())
2069 return;
2070
2071 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
2072 if (err == HWC2_ERROR_NONE) {
2073 EXPECT_NE(std::count(configs.begin(), configs.end(),
2074 activeConfig), 0) << "active config is not found in "
2075 " configs for display";
2076 } else {
2077 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2078 }
2079 }
2080}
2081
2082/* TESTCASE: Tests that the HWC2 can set every display config as an active
2083 * config */
2084TEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
2085{
2086 for (auto display : mDisplays) {
2087 std::vector<hwc2_config_t> configs;
2088
2089 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2090
2091 for (auto config : configs) {
2092 EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2093 }
2094 }
2095}
2096
2097/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
2098TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
2099{
2100 hwc2_display_t display;
2101 const hwc2_config_t config = 0;
2102 hwc2_error_t err = HWC2_ERROR_NONE;
2103
2104 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2105
2106 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
2107 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2108}
2109
2110/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
2111TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
2112{
2113 for (auto display : mDisplays) {
2114 hwc2_config_t config;
2115 hwc2_error_t err = HWC2_ERROR_NONE;
2116
2117 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
2118
2119 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
2120 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2121 }
2122}
Marissa Wall03c91732016-12-15 12:23:16 -08002123
2124/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
2125TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
2126{
2127 for (auto display : mDisplays) {
2128 int32_t support = -1;
2129
2130 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2131
2132 EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
2133 }
2134}
2135
2136/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
2137TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
2138{
2139 hwc2_display_t display;
2140 int32_t support = -1;
2141 hwc2_error_t err = HWC2_ERROR_NONE;
2142
2143 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2144
2145 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2146
2147 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2148}
2149
2150/* TESTCASE: Tests that the HWC2 can set all supported power modes */
2151TEST_F(Hwc2Test, SET_POWER_MODE)
2152{
2153 for (auto display : mDisplays) {
2154 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2155 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2156
2157 int32_t support = -1;
2158 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2159 if (support != 1)
2160 return;
2161
2162 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2163 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2164 HWC2_POWER_MODE_DOZE_SUSPEND));
2165
2166 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2167 }
2168}
2169
2170/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
2171TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
2172{
2173 hwc2_display_t display;
2174 hwc2_error_t err = HWC2_ERROR_NONE;
2175
2176 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2177
2178 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
2179 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2180
2181 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
2182 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2183
2184 int32_t support = -1;
2185 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2186 if (support != 1)
2187 return;
2188
2189 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
2190 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2191
2192 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
2193 &err));
2194 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2195}
2196
2197/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
2198TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
2199{
2200 for (auto display : mDisplays) {
2201 hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
2202 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
2203 hwc2_error_t err = HWC2_ERROR_NONE;
2204
2205 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
2206 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
2207 << mode;
2208 }
2209}
2210
2211/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
2212 * an optional power mode. */
2213TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
2214{
2215 for (auto display : mDisplays) {
2216 int32_t support = -1;
2217 hwc2_error_t err = HWC2_ERROR_NONE;
2218
2219 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2220 if (support == 1)
2221 return;
2222
2223 ASSERT_EQ(support, 0) << "invalid doze support value";
2224
2225 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
2226 &err));
2227 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
2228
2229 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2230 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
2231 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
2232 }
2233}
2234
2235/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
2236TEST_F(Hwc2Test, SET_POWER_MODE_stress)
2237{
2238 for (auto display : mDisplays) {
2239 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2240 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2241
2242 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2243 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2244
2245 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2246 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2247
2248 int32_t support = -1;
2249 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2250 if (support != 1)
2251 return;
2252
2253 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2254 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2255
2256 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2257 HWC2_POWER_MODE_DOZE_SUSPEND));
2258 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2259 HWC2_POWER_MODE_DOZE_SUSPEND));
2260
2261 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2262 }
2263}
Marissa Wall572a1ee2016-12-15 12:24:13 -08002264
2265/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
2266 * displays */
2267TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
2268{
2269 for (auto display : mDisplays) {
2270 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2271 const_cast<char*>("data"));
2272
2273 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2274
2275 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2276 []() { return; }));
2277
2278 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2279
2280 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2281
2282 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2283 }
2284}
2285
2286/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
2287TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
2288{
2289 for (auto display : mDisplays) {
2290 hwc2_display_t receivedDisplay;
2291 int64_t receivedTimestamp;
2292
2293 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2294
2295 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
2296
2297 ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
2298 &receivedTimestamp));
2299
2300 EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
2301 EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
2302
2303 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
2304
2305 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2306 }
2307}
2308
2309/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
2310TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
2311{
2312 hwc2_display_t display;
2313 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2314 const_cast<char*>("data"));
2315 hwc2_error_t err = HWC2_ERROR_NONE;
2316
2317 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2318
2319 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2320 []() { return; }));
2321
2322 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
2323 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2324
2325 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
2326 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2327}
2328
2329/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
2330TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
2331{
2332 for (auto display : mDisplays) {
2333 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2334 const_cast<char*>("data"));
2335 hwc2_error_t err = HWC2_ERROR_NONE;
2336
2337 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2338
2339 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2340 []() { return; }));
2341
2342 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
2343 &err));
2344 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2345
2346 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2347 }
2348}
2349
2350/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
2351 * times. */
2352TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
2353{
2354 for (auto display : mDisplays) {
2355 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2356 const_cast<char*>("data"));
2357
2358 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2359
2360 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2361 []() { return; }));
2362
2363 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2364
2365 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2366 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2367
2368 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2369 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2370
2371 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2372 }
2373}
2374
2375/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
2376 * is off and no callback is registered. */
2377TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
2378{
2379 const uint secs = 1;
2380
2381 for (auto display : mDisplays) {
2382 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2383
2384 sleep(secs);
2385
2386 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2387 }
2388}
2389
2390/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
2391 * is registered. */
2392TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
2393{
2394 const uint secs = 1;
2395
2396 for (auto display : mDisplays) {
2397 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2398
2399 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2400
2401 sleep(secs);
2402
2403 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2404
2405 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2406 }
2407}
Marissa Walldd4087f2016-12-15 12:24:52 -08002408
2409/* TESTCASE: Tests that the HWC2 returns a display name for each display */
2410TEST_F(Hwc2Test, GET_DISPLAY_NAME)
2411{
2412 for (auto display : mDisplays) {
2413 std::string name;
2414
2415 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
2416 }
2417}
2418
2419/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
2420 * display */
2421TEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
2422{
2423 hwc2_display_t display;
2424 std::string name;
2425 hwc2_error_t err = HWC2_ERROR_NONE;
2426
2427 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2428
2429 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
2430 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2431}
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08002432
2433/* TESTCASE: Tests that the HWC2 can set basic composition types. */
2434TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
2435{
2436 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2437 setComposition, advanceComposition));
2438}
2439
2440/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
2441 * layer. */
2442TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
2443{
2444 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2445 setComposition, advanceComposition));
2446}
2447
2448/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
2449TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
2450{
2451 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2452 setComposition));
2453}
2454
2455/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
2456TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
2457{
2458 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2459 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2460 hwc2_error_t* outErr) {
2461
2462 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
2463 layer, HWC2_COMPOSITION_INVALID, outErr));
2464 }
2465 ));
2466}
Marissa Wallffc67da2016-12-15 12:26:09 -08002467
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002468/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
2469TEST_F(Hwc2Test, SET_CURSOR_POSITION)
2470{
2471 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2472 ::setCursorPosition, advanceCursorPosition));
2473}
2474
2475/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
2476TEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
2477{
2478 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2479 ::setCursorPosition, advanceCursorPosition));
2480}
2481
2482/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
2483 * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
2484TEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
2485{
2486 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2487 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002488 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002489
Marissa Wall5a240aa2016-12-15 12:34:06 -08002490 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002491 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
2492 cursorPosition.left, cursorPosition.top, outErr));
2493 },
2494
2495 advanceCursorPosition));
2496}
2497
2498/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
2499 * display. */
2500TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
2501{
2502 hwc2_display_t display;
2503 hwc2_layer_t layer = 0;
2504 int32_t x = 0, y = 0;
2505 hwc2_error_t err = HWC2_ERROR_NONE;
2506
2507 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2508
2509 ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
2510 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2511}
2512
2513/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
2514TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
2515{
2516 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2517 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002518 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002519
Marissa Wall5a240aa2016-12-15 12:34:06 -08002520 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002521 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
2522 badLayer, cursorPosition.left, cursorPosition.top,
2523 outErr));
2524 }
2525 ));
2526}
2527
Marissa Wallffc67da2016-12-15 12:26:09 -08002528/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
2529TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
2530{
2531 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2532 setBlendMode, advanceBlendMode));
2533}
2534
2535/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
2536TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
2537{
2538 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2539 setBlendMode, advanceBlendMode));
2540}
2541
2542/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
2543TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
2544{
2545 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2546 setBlendMode));
2547}
2548
2549/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
2550TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
2551{
2552 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2553 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2554 hwc2_error_t* outErr) {
2555
2556 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
2557 layer, HWC2_BLEND_MODE_INVALID, outErr));
2558 }
2559 ));
2560}
Marissa Wallb72b5c92016-12-15 12:26:39 -08002561
Marissa Wall5a240aa2016-12-15 12:34:06 -08002562/* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
2563TEST_F(Hwc2Test, SET_LAYER_BUFFER)
2564{
2565 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2566 setBuffer, advanceBuffer));
2567}
2568
2569/* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
2570TEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
2571{
2572 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2573 setBuffer, advanceBuffer));
2574}
2575
2576/* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
2577TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
2578{
2579 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2580 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
2581 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2582
2583 buffer_handle_t handle = nullptr;
2584 android::base::unique_fd acquireFence;
2585
2586 /* If there is not available buffer for the given buffer
2587 * properties, it should not fail this test case */
2588 if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
2589 *outErr = HWC2_ERROR_BAD_LAYER;
2590 return;
2591 }
2592
2593 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
2594 handle, acquireFence, outErr));
2595 }
2596 ));
2597}
2598
2599/* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
2600TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
2601{
2602 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2603 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2604 hwc2_error_t* outErr) {
2605
2606 buffer_handle_t handle = nullptr;
2607 int32_t acquireFence = -1;
2608
2609 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
2610 handle, acquireFence, outErr));
2611 }
2612 ));
2613}
2614
Marissa Wallee242782016-12-15 12:30:12 -08002615/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
2616TEST_F(Hwc2Test, SET_LAYER_COLOR)
2617{
2618 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2619 setColor, advanceColor));
2620}
2621
2622/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
2623TEST_F(Hwc2Test, SET_LAYER_COLOR_update)
2624{
2625 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2626 setColor, advanceColor));
2627}
2628
2629/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
2630 * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
2631TEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
2632{
2633 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
2634 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002635 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08002636
2637 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002638 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08002639 },
2640
2641 advanceColor));
2642}
2643
2644/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
2645TEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
2646{
2647 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2648 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002649 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08002650
2651 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002652 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08002653 }
2654 ));
2655}
2656
Marissa Wallb72b5c92016-12-15 12:26:39 -08002657/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
2658TEST_F(Hwc2Test, SET_LAYER_DATASPACE)
2659{
2660 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2661 setDataspace, advanceDataspace));
2662}
2663
2664/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
2665TEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
2666{
2667 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2668 setDataspace, advanceDataspace));
2669}
2670
2671/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
2672TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
2673{
2674 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2675 setDataspace));
2676}
Marissa Wall2b1f5302016-12-15 12:27:20 -08002677
Marissa Wall600a73b2016-12-15 12:30:39 -08002678/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
2679TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
2680{
2681 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2682 setDisplayFrame, advanceDisplayFrame));
2683}
2684
2685/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
2686TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
2687{
2688 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2689 setDisplayFrame, advanceDisplayFrame));
2690}
2691
2692/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
2693TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
2694{
2695 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2696 setDisplayFrame));
2697}
2698
Marissa Wall2b1f5302016-12-15 12:27:20 -08002699/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
2700TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
2701{
2702 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2703 setPlaneAlpha, advancePlaneAlpha));
2704}
2705
2706/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
2707TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
2708{
2709 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2710 setPlaneAlpha, advancePlaneAlpha));
2711}
2712
2713/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
2714TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
2715{
2716 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2717 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002718 Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
Marissa Wall2b1f5302016-12-15 12:27:20 -08002719
2720 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002721 badLayer, testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08002722 }
2723 ));
2724}
Marissa Wallac108192016-12-15 12:27:48 -08002725
Marissa Wallc57468f2016-12-15 12:31:12 -08002726/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
2727TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
2728{
2729 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2730 setSourceCrop, advanceSourceCrop));
2731}
2732
2733/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
2734TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
2735{
2736 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2737 setSourceCrop, advanceSourceCrop));
2738}
2739
2740/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
2741TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
2742{
2743 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2744 setSourceCrop));
2745}
2746
Marissa Wallad761812016-12-15 12:32:24 -08002747/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
2748TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
2749{
2750 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2751 setSurfaceDamage, advanceSurfaceDamage));
2752}
2753
2754/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
2755TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
2756{
2757 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2758 setSurfaceDamage, advanceSurfaceDamage));
2759}
2760
2761/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
2762TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
2763{
2764 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2765 setSurfaceDamage));
2766}
2767
Marissa Wallac108192016-12-15 12:27:48 -08002768/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
2769TEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
2770{
2771 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2772 setTransform, advanceTransform));
2773}
2774
2775/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
2776TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
2777{
2778 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2779 setTransform, advanceTransform));
2780}
2781
2782/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
2783TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
2784{
2785 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2786 setTransform));
2787}
Marissa Wall273b1df2016-12-15 12:28:47 -08002788
Marissa Wallf7618ed2016-12-15 12:34:39 -08002789/* TESTCASE: Tests that the HWC2 can set the visible region of a layer. */
2790TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION)
2791{
2792 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Basic, 5,
2793 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2794 Hwc2TestLayers* testLayers) {
2795
2796 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display,
2797 layer, testLayers->getVisibleRegion(layer)));
2798 },
2799
2800 advanceVisibleRegions));
2801}
2802
2803/* TESTCASE: Tests that the HWC2 cannot set the visible region of a bad layer. */
2804TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION_bad_layer)
2805{
2806 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2807 setVisibleRegion));
2808}
2809
Marissa Wall273b1df2016-12-15 12:28:47 -08002810/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
2811TEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
2812{
2813 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
2814 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002815 Hwc2TestLayers* testLayers) {
Marissa Wall273b1df2016-12-15 12:28:47 -08002816
2817 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002818 testLayers->getZOrder(layer)));
Marissa Wallf7618ed2016-12-15 12:34:39 -08002819 },
2820
2821 /* TestLayer z orders are set during the construction of TestLayers
2822 * and cannot be updated. There is no need (or ability) to cycle
2823 * through additional z order configurations. */
2824 [] (Hwc2TestLayers* /*testLayers*/) {
2825 return false;
Marissa Wall273b1df2016-12-15 12:28:47 -08002826 }
2827 ));
2828}
2829
2830/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
2831TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
2832{
2833 const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
2834 static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
2835 static_cast<uint32_t>(UINT32_MAX / 2),
2836 static_cast<uint32_t>(UINT32_MAX) };
2837
2838 for (auto display : mDisplays) {
2839 std::vector<hwc2_config_t> configs;
2840
2841 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2842
2843 for (auto config : configs) {
2844 hwc2_layer_t layer;
2845
2846 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2847
2848 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2849
2850 for (uint32_t zOrder : zOrders) {
2851 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
2852 }
2853
2854 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2855 }
2856 }
2857}
2858
2859/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
2860TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
2861{
2862 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2863 setZOrder));
2864}
Marissa Wall1cd789c2017-01-27 12:55:36 -08002865
2866/* TESTCASE: Tests that the HWC2 can display a layer with basic property
2867 * coverage */
2868TEST_F(Hwc2Test, VALIDATE_DISPLAY_basic)
2869{
2870 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
2871 [] (Hwc2Test* test, hwc2_display_t display,
Marissa Wall706178d2016-12-15 12:39:14 -08002872 const std::vector<hwc2_layer_t>& layers,
2873 const Hwc2TestLayers& /*testLayers*/) {
Marissa Wall1cd789c2017-01-27 12:55:36 -08002874
2875 uint32_t numTypes, numRequests;
2876 bool hasChanges = false;
2877
2878 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
2879 &numRequests, &hasChanges));
2880 if (hasChanges)
2881 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
2882 << "wrong number of requests";
2883 }
2884 ));
2885}
2886
2887/* TESTCASE: Tests that the HWC2 can display 5 layers with default coverage. */
2888TEST_F(Hwc2Test, VALIDATE_DISPLAY_default_5)
2889{
2890 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 5,
2891 [] (Hwc2Test* test, hwc2_display_t display,
Marissa Wall706178d2016-12-15 12:39:14 -08002892 const std::vector<hwc2_layer_t>& layers,
2893 const Hwc2TestLayers& /*testLayers*/) {
Marissa Wall1cd789c2017-01-27 12:55:36 -08002894
2895 uint32_t numTypes, numRequests;
2896 bool hasChanges = false;
2897
2898 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
2899 &numRequests, &hasChanges));
2900 if (hasChanges)
2901 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
2902 << "wrong number of requests";
2903 }
2904 ));
2905}
2906
2907/* TESTCASE: Tests that the HWC2 cannot validate a bad display */
2908TEST_F(Hwc2Test, VALIDATE_DISPLAY_bad_display)
2909{
2910 hwc2_display_t display;
2911 uint32_t numTypes, numRequests;
2912 hwc2_error_t err = HWC2_ERROR_NONE;
2913
2914 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2915
2916 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes, &numRequests,
2917 &err));
2918 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2919}
Marissa Wall706178d2016-12-15 12:39:14 -08002920
2921/* TESTCASE: Tests that the HWC2 can get display requests after validating a
2922 * basic layer. */
2923TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_basic)
2924{
2925 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
2926 [] (Hwc2Test* test, hwc2_display_t display,
2927 const std::vector<hwc2_layer_t>& layers,
2928 const Hwc2TestLayers& /*testLayers*/) {
2929
2930 uint32_t numTypes, numRequests;
2931 bool hasChanges = false;
2932
2933 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
2934 &numRequests, &hasChanges));
2935 if (hasChanges)
2936 EXPECT_LE(numTypes, layers.size())
2937 << "wrong number of requests";
2938
2939 EXPECT_NO_FATAL_FAILURE(test->handleRequests(display, layers,
2940 numRequests));
2941 }
2942 ));
2943}
2944
2945/* TESTCASE: Tests that the HWC2 cannot get display requests from a bad display */
2946TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_bad_display)
2947{
2948 hwc2_display_t display;
2949 hwc2_display_request_t displayRequests;
2950 std::vector<hwc2_layer_t> layers;
2951 std::vector<hwc2_layer_request_t> layerRequests;
2952 hwc2_error_t err = HWC2_ERROR_NONE;
2953
2954 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2955
2956 EXPECT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequests,
2957 &layers, &layerRequests, &err));
2958 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2959}
2960
2961/* TESTCASE: Tests that the HWC2 cannot get display requests from an non
2962 * validated display. */
2963TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_not_validated)
2964{
2965 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
2966 [] (Hwc2Test* test, hwc2_display_t display,
2967 std::vector<hwc2_layer_t>* layers) {
2968
2969 hwc2_display_request_t displayRequests;
2970 std::vector<hwc2_layer_request_t> layerRequests;
2971 hwc2_error_t err = HWC2_ERROR_NONE;
2972
2973 ASSERT_NO_FATAL_FAILURE(test->getDisplayRequests(display,
2974 &displayRequests, layers, &layerRequests, &err));
2975 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
2976 << "returned wrong error code";
2977 }
2978 ));
2979}
2980
2981/* TESTCASE: Tests that the HWC2 can get changed composition types after
2982 * validating a basic layer. */
2983TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_basic)
2984{
2985 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
2986 [] (Hwc2Test* test, hwc2_display_t display,
2987 const std::vector<hwc2_layer_t>& layers,
2988 const Hwc2TestLayers& testLayers) {
2989
2990 uint32_t numTypes, numRequests;
2991 bool hasChanges = false;
2992
2993 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
2994 &numRequests, &hasChanges));
2995 if (hasChanges)
2996 EXPECT_LE(numTypes, layers.size())
2997 << "wrong number of requests";
2998
2999 EXPECT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
3000 testLayers, layers, numTypes));
3001 }
3002 ));
3003}
3004
3005/* TESTCASE: Tests that the HWC2 cannot get changed composition types from a bad
3006 * display */
3007TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_bad_display)
3008{
3009 hwc2_display_t display;
3010 std::vector<hwc2_layer_t> layers;
3011 std::vector<hwc2_composition_t> types;
3012 hwc2_error_t err = HWC2_ERROR_NONE;
3013
3014 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3015
3016 EXPECT_NO_FATAL_FAILURE(getChangedCompositionTypes(display, &layers,
3017 &types, &err));
3018 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3019}
3020
3021/* TESTCASE: Tests that the HWC2 cannot get changed composition types from an non
3022 * validated display. */
3023TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_not_validated)
3024{
3025 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3026 [] (Hwc2Test* test, hwc2_display_t display,
3027 std::vector<hwc2_layer_t>* layers) {
3028
3029 std::vector<hwc2_composition_t> types;
3030 hwc2_error_t err = HWC2_ERROR_NONE;
3031
3032 ASSERT_NO_FATAL_FAILURE(test->getChangedCompositionTypes(
3033 display, layers, &types, &err));
3034 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3035 << "returned wrong error code";
3036 }
3037 ));
3038}
3039
3040/* TESTCASE: Tests that the HWC2 can accept display changes after validating a
3041 * basic layer. */
3042TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_basic)
3043{
3044 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3045 [] (Hwc2Test* test, hwc2_display_t display,
3046 const std::vector<hwc2_layer_t>& layers,
3047 const Hwc2TestLayers& testLayers) {
3048
3049 uint32_t numTypes, numRequests;
3050 bool hasChanges = false;
3051
3052 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3053 &numRequests, &hasChanges));
3054 if (hasChanges)
3055 EXPECT_LE(numTypes, layers.size())
3056 << "wrong number of requests";
3057
3058 ASSERT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
3059 testLayers, layers, numTypes));
3060
3061 EXPECT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display));
3062 }
3063 ));
3064}
3065
3066/* TESTCASE: Tests that the HWC2 cannot accept display changes from a bad
3067 * display */
3068TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_bad_display)
3069{
3070 hwc2_display_t display;
3071 hwc2_error_t err = HWC2_ERROR_NONE;
3072
3073 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3074
3075 EXPECT_NO_FATAL_FAILURE(acceptDisplayChanges(display, &err));
3076 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3077}
3078
3079/* TESTCASE: Tests that the HWC2 cannot accept display changes from an non
3080 * validated display. */
3081TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_not_validated)
3082{
3083 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3084 [] (Hwc2Test* test, hwc2_display_t display,
3085 std::vector<hwc2_layer_t>* /*layers*/) {
3086
3087 hwc2_error_t err = HWC2_ERROR_NONE;
3088
3089 ASSERT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display, &err));
3090 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3091 << "returned wrong error code";
3092 }
3093 ));
3094}
Marissa Wallf18cfb02017-02-21 14:01:05 -08003095
3096/* TESTCASE: Tests that the HWC2 supports client target with required values */
3097TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT)
3098{
3099 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3100 [] (Hwc2Test* test, hwc2_display_t display,
3101 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3102
3103 const Area bufferArea = testClientTargetSupport.getBufferArea();
3104 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3105
3106 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3107 bufferArea.width, bufferArea.height, format,
3108 testClientTargetSupport.getDataspace()));
3109 },
3110
3111 advanceClientTargetSupport));
3112}
3113
3114/* TESTCASE: Tests that the HWC2 cannot get client target support for a bad
3115 * display. */
3116TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_bad_display)
3117{
3118 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3119 [] (Hwc2Test* test, hwc2_display_t /*display*/,
3120 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3121
3122 const Area bufferArea = testClientTargetSupport.getBufferArea();
3123 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3124 hwc2_display_t badDisplay;
3125 hwc2_error_t err = HWC2_ERROR_NONE;
3126
3127 ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
3128
3129 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(badDisplay,
3130 bufferArea.width, bufferArea.height, format,
3131 testClientTargetSupport.getDataspace(), &err));
3132 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3133 },
3134
3135 advanceClientTargetSupport));
3136}
3137
3138/* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
3139 * for a variety of client target values. */
3140TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_unsupported)
3141{
3142 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Complete,
3143 [] (Hwc2Test* test, hwc2_display_t display,
3144 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3145
3146 const Area bufferArea = testClientTargetSupport.getBufferArea();
3147 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3148 hwc2_error_t err = HWC2_ERROR_NONE;
3149
3150 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3151 bufferArea.width, bufferArea.height, format,
3152 testClientTargetSupport.getDataspace(), &err));
3153 EXPECT_TRUE(err == HWC2_ERROR_NONE
3154 || err == HWC2_ERROR_UNSUPPORTED)
3155 << "returned wrong error code";
3156 },
3157
3158 advanceClientTargetSupport));
3159}
3160
3161/* TESTCASE: Tests that the HWC2 can set a client target buffer for a basic
3162 * layer. */
3163TEST_F(Hwc2Test, SET_CLIENT_TARGET_basic)
3164{
3165 const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3166 const hwc_region_t damage = { };
3167 const size_t layerCnt = 1;
3168
3169 for (auto display : mDisplays) {
3170 std::vector<hwc2_config_t> configs;
3171
3172 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
3173
3174 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3175
3176 for (auto config : configs) {
3177 Area displayArea;
3178 std::vector<hwc2_layer_t> layers;
3179
3180 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3181 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
3182
3183 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
3184 Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Basic,
3185 displayArea);
3186
3187 if (!testLayers.optimizeLayouts())
3188 continue;
3189
3190 Hwc2TestClientTarget testClientTarget;
3191
3192 do {
3193 std::set<hwc2_layer_t> clientLayers;
3194 std::set<hwc2_layer_t> clearLayers;
3195 uint32_t numTypes, numRequests;
3196 bool hasChanges, skip;
3197 bool flipClientTarget;
3198 buffer_handle_t handle;
3199 int32_t acquireFence;
3200
3201 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
3202 &testLayers, &skip));
3203 if (skip)
3204 continue;
3205
3206 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
3207 &numRequests, &hasChanges));
3208 if (hasChanges)
3209 EXPECT_LE(numTypes, layers.size())
3210 << "wrong number of requests";
3211
3212 ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
3213 testLayers, layers, numTypes, &clientLayers));
3214 ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
3215 numRequests, &clearLayers, &flipClientTarget));
3216 ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3217 clearLayers, flipClientTarget, displayArea, &handle,
3218 &acquireFence), 0);
3219 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle,
3220 acquireFence, dataspace, damage));
3221
3222 if (acquireFence >= 0)
3223 close(acquireFence);
3224
3225 } while (testLayers.advance());
3226
3227 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
3228 }
3229
3230 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
3231 }
3232}
3233
3234/* TESTCASE: Tests that the HWC2 cannot set a client target for a bad display. */
3235TEST_F(Hwc2Test, SET_CLIENT_TARGET_bad_display)
3236{
3237 hwc2_display_t display;
3238 std::vector<hwc2_layer_t> layers;
3239 const Area displayArea = {0, 0};
3240 Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Default, displayArea);
3241 std::set<hwc2_layer_t> clientLayers;
3242 std::set<hwc2_layer_t> flipClientTargetLayers;
3243 bool flipClientTarget = true;
3244 const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3245 const hwc_region_t damage = { };
3246 buffer_handle_t handle;
3247 int32_t acquireFence;
3248 hwc2_error_t err = HWC2_ERROR_NONE;
3249
3250 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3251
3252 Hwc2TestClientTarget testClientTarget;
3253
3254 ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3255 flipClientTargetLayers, flipClientTarget, displayArea, &handle,
3256 &acquireFence), 0);
3257
3258 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
3259 dataspace, damage, &err));
3260
3261 if (acquireFence >= 0)
3262 close(acquireFence);
3263
3264 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3265}