blob: 931cfc6c32dbb335ef3b217f80c4a07ae14b50cd [file] [log] [blame]
Marissa Wall4d600052016-12-15 12:16:01 -08001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <array>
Marissa Wallcfb9a072017-02-17 20:53:18 -080018#include <unordered_set>
Marissa Wall4d600052016-12-15 12:16:01 -080019#include <gtest/gtest.h>
20#include <dlfcn.h>
Marissa Wall5a240aa2016-12-15 12:34:06 -080021#include <android-base/unique_fd.h>
Marissa Wall4d600052016-12-15 12:16:01 -080022#include <hardware/hardware.h>
23
24#define HWC2_INCLUDE_STRINGIFICATION
25#define HWC2_USE_CPP11
26#include <hardware/hwcomposer2.h>
27#undef HWC2_INCLUDE_STRINGIFICATION
28#undef HWC2_USE_CPP11
29
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080030#include "Hwc2TestLayer.h"
Marissa Wall273b1df2016-12-15 12:28:47 -080031#include "Hwc2TestLayers.h"
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080032
Marissa Wallcfb9a072017-02-17 20:53:18 -080033void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
34 hwc2_display_t display, int32_t connected);
Marissa Wall572a1ee2016-12-15 12:24:13 -080035void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
36 hwc2_display_t display, int64_t timestamp);
Marissa Wallcfb9a072017-02-17 20:53:18 -080037
Marissa Wall4d600052016-12-15 12:16:01 -080038class Hwc2Test : public testing::Test {
39public:
40
41 virtual void SetUp()
42 {
43 hw_module_t const* hwc2Module;
44
45 int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
46 ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
47 << strerror(-err);
48
49 /* The following method will fail if you have not run
50 * "adb shell stop" */
51 err = hwc2_open(hwc2Module, &mHwc2Device);
52 ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
53 << strerror(-err);
Marissa Wallcfb9a072017-02-17 20:53:18 -080054
55 populateDisplays();
Marissa Wall4d600052016-12-15 12:16:01 -080056 }
57
58 virtual void TearDown()
59 {
Marissa Wall1db2e372016-12-15 12:19:39 -080060
61 for (auto itr = mLayers.begin(); itr != mLayers.end();) {
62 hwc2_display_t display = itr->first;
63 hwc2_layer_t layer = itr->second;
64 itr++;
65 /* Destroys and removes the layer from mLayers */
66 destroyLayer(display, layer);
67 }
68
Marissa Wall03c91732016-12-15 12:23:16 -080069 for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
70 hwc2_display_t display = *itr;
71 itr++;
72 /* Sets power mode to off and removes the display from
73 * mActiveDisplays */
74 setPowerMode(display, HWC2_POWER_MODE_OFF);
75 }
76
Marissa Wall4d600052016-12-15 12:16:01 -080077 if (mHwc2Device)
78 hwc2_close(mHwc2Device);
79 }
80
Marissa Walla4b01482017-02-17 20:52:03 -080081 void registerCallback(hwc2_callback_descriptor_t descriptor,
82 hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
83 hwc2_error_t* outErr = nullptr)
84 {
85 auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
86 getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
87 ASSERT_TRUE(pfn) << "failed to get function";
88
89 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
90 callbackData, pointer));
91 if (outErr) {
92 *outErr = err;
93 } else {
94 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
95 }
96 }
97
Marissa Wallcfb9a072017-02-17 20:53:18 -080098 void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
99 hwc2_error_t* outErr = nullptr)
100 {
101 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
102 getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
103 ASSERT_TRUE(pfn) << "failed to get function";
104
105 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
106 reinterpret_cast<int32_t*>(outType)));
107 if (outErr) {
108 *outErr = err;
109 } else {
110 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
111 }
112 }
113
114 /* If the populateDisplays function is still receiving displays and the
115 * display is connected, the display handle is stored in mDisplays. */
116 void hotplugCallback(hwc2_display_t display, int32_t connected)
117 {
118 std::lock_guard<std::mutex> lock(mHotplugMutex);
119
120 if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
121 return;
122
123 if (connected == HWC2_CONNECTION_CONNECTED)
124 mDisplays.insert(display);
125
126 mHotplugCv.notify_all();
127 }
128
Marissa Wall1db2e372016-12-15 12:19:39 -0800129 void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
130 hwc2_error_t* outErr = nullptr)
131 {
132 auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
133 getFunction(HWC2_FUNCTION_CREATE_LAYER));
134 ASSERT_TRUE(pfn) << "failed to get function";
135
136 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
137 outLayer));
138
139 if (err == HWC2_ERROR_NONE)
140 mLayers.insert(std::make_pair(display, *outLayer));
141
142 if (outErr) {
143 *outErr = err;
144 } else {
145 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
146 }
147 }
148
149 void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
150 hwc2_error_t* outErr = nullptr)
151 {
152 auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
153 getFunction(HWC2_FUNCTION_DESTROY_LAYER));
154 ASSERT_TRUE(pfn) << "failed to get function";
155
156 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
157
158 if (err == HWC2_ERROR_NONE)
159 mLayers.erase(std::make_pair(display, layer));
160
161 if (outErr) {
162 *outErr = err;
163 } else {
164 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
165 << layer;
166 }
167 }
168
Marissa Wallcf935cb2016-12-15 12:20:47 -0800169 void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
170 hwc2_attribute_t attribute, int32_t* outValue,
171 hwc2_error_t* outErr = nullptr)
172 {
173 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
174 getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
175 ASSERT_TRUE(pfn) << "failed to get function";
176
177 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
178 attribute, outValue));
179
180 if (outErr) {
181 *outErr = err;
182 } else {
183 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
184 << getAttributeName(attribute) << " for config " << config;
185 }
186 }
187
188 void getDisplayConfigs(hwc2_display_t display,
189 std::vector<hwc2_config_t>* outConfigs,
190 hwc2_error_t* outErr = nullptr)
191 {
192 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
193 getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
194 ASSERT_TRUE(pfn) << "failed to get function";
195
196 uint32_t numConfigs = 0;
197
198 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
199 &numConfigs, nullptr));
200
201 if (err == HWC2_ERROR_NONE) {
202 outConfigs->resize(numConfigs);
203
204 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
205 &numConfigs, outConfigs->data()));
206 }
207
208 if (outErr) {
209 *outErr = err;
210 } else {
211 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
212 " display " << display;
213 }
214 }
215
Marissa Wall93dc04f2016-12-15 12:21:46 -0800216 void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
217 hwc2_error_t* outErr = nullptr)
218 {
219 auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
220 getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
221 ASSERT_TRUE(pfn) << "failed to get function";
222
223 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
224 outConfig));
225 if (outErr) {
226 *outErr = err;
227 } else {
228 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
229 " display " << display;
230 }
231 }
232
233 void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
234 hwc2_error_t* outErr = nullptr)
235 {
236 auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
237 getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
238 ASSERT_TRUE(pfn) << "failed to get function";
239
240 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
241 if (outErr) {
242 *outErr = err;
243 } else {
244 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
245 << config;
246 }
247 }
248
Marissa Wall03c91732016-12-15 12:23:16 -0800249 void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
250 hwc2_error_t* outErr = nullptr)
251 {
252 auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
253 getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
254 ASSERT_TRUE(pfn) << "failed to get function";
255
256 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
257 outSupport));
258 if (outErr) {
259 *outErr = err;
260 } else {
261 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
262 " display " << display;
263 }
264 }
265
266 void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
267 hwc2_error_t* outErr = nullptr)
268 {
269 auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
270 getFunction(HWC2_FUNCTION_SET_POWER_MODE));
271 ASSERT_TRUE(pfn) << "failed to get function";
272
273 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
274 mode));
275 if (outErr) {
276 *outErr = err;
277 if (err != HWC2_ERROR_NONE)
278 return;
279 } else {
280 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
281 << getPowerModeName(mode) << " on display " << display;
282 }
283
284 if (mode == HWC2_POWER_MODE_OFF) {
285 mActiveDisplays.erase(display);
286 } else {
287 mActiveDisplays.insert(display);
288 }
289 }
290
Marissa Wall572a1ee2016-12-15 12:24:13 -0800291 void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
292 hwc2_error_t* outErr = nullptr)
293 {
294 auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
295 getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
296 ASSERT_TRUE(pfn) << "failed to get function";
297
298 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
299 enabled));
300 if (outErr) {
301 *outErr = err;
302 } else {
303 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
304 << getVsyncName(enabled);
305 }
306 }
307
308 void vsyncCallback(hwc2_display_t display, int64_t timestamp)
309 {
310 std::lock_guard<std::mutex> lock(mVsyncMutex);
311 mVsyncDisplay = display;
312 mVsyncTimestamp = timestamp;
313 mVsyncCv.notify_all();
314 }
315
Marissa Walldd4087f2016-12-15 12:24:52 -0800316 void getDisplayName(hwc2_display_t display, std::string* outName,
317 hwc2_error_t* outErr = nullptr)
318 {
319 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
320 getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
321 ASSERT_TRUE(pfn) << "failed to get function";
322
323 uint32_t size = 0;
324
325 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
326 nullptr));
327
328 if (err == HWC2_ERROR_NONE) {
329 std::vector<char> name(size);
330
331 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
332 name.data()));
333
334 outName->assign(name.data());
335 }
336
337 if (outErr) {
338 *outErr = err;
339 } else {
340 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
341 << display;
342 }
343 }
344
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800345 void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
346 hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
347 {
348 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
349 getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
350 ASSERT_TRUE(pfn) << "failed to get function";
351
352 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
353 composition));
354 if (outErr) {
355 *outErr = err;
356 } else {
357 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
358 " type " << getCompositionName(composition);
359 }
360 }
361
Marissa Wall2a0aaf92016-12-15 12:31:37 -0800362 void setCursorPosition(hwc2_display_t display, hwc2_layer_t layer,
363 int32_t x, int32_t y, hwc2_error_t* outErr = nullptr)
364 {
365 auto pfn = reinterpret_cast<HWC2_PFN_SET_CURSOR_POSITION>(
366 getFunction(HWC2_FUNCTION_SET_CURSOR_POSITION));
367 ASSERT_TRUE(pfn) << "failed to get function";
368
369 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, x,
370 y));
371 if (outErr) {
372 *outErr = err;
373 } else {
374 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set cursor position";
375 }
376 }
377
Marissa Wallffc67da2016-12-15 12:26:09 -0800378 void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
379 hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
380 {
381 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
382 getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
383 ASSERT_TRUE(pfn) << "failed to get function";
384
385 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
386 mode));
387 if (outErr) {
388 *outErr = err;
389 } else {
390 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
391 << getBlendModeName(mode);
392 }
393 }
394
Marissa Wall5a240aa2016-12-15 12:34:06 -0800395 void setLayerBuffer(hwc2_display_t display, hwc2_layer_t layer,
396 buffer_handle_t buffer, int32_t acquireFence,
397 hwc2_error_t* outErr = nullptr)
398 {
399 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BUFFER>(
400 getFunction(HWC2_FUNCTION_SET_LAYER_BUFFER));
401 ASSERT_TRUE(pfn) << "failed to get function";
402
403 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
404 buffer, acquireFence));
405 if (outErr) {
406 *outErr = err;
407 } else {
408 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer buffer";
409 }
410 }
411
Marissa Wallee242782016-12-15 12:30:12 -0800412 void setLayerColor(hwc2_display_t display, hwc2_layer_t layer,
413 hwc_color_t color, hwc2_error_t* outErr = nullptr)
414 {
415 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COLOR>(
416 getFunction(HWC2_FUNCTION_SET_LAYER_COLOR));
417 ASSERT_TRUE(pfn) << "failed to get function";
418
419 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
420 color));
421 if (outErr) {
422 *outErr = err;
423 } else {
424 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer color";
425 }
426 }
427
Marissa Wallb72b5c92016-12-15 12:26:39 -0800428 void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
429 android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
430 {
431 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
432 getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
433 ASSERT_TRUE(pfn) << "failed to get function";
434
435 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
436 layer, dataspace));
437 if (outErr) {
438 *outErr = err;
439 } else {
440 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
441 }
442 }
443
Marissa Wall600a73b2016-12-15 12:30:39 -0800444 void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
445 const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
446 {
447 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
448 getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
449 ASSERT_TRUE(pfn) << "failed to get function";
450
451 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
452 displayFrame));
453 if (outErr) {
454 *outErr = err;
455 } else {
456 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
457 " frame";
458 }
459 }
460
Marissa Wall2b1f5302016-12-15 12:27:20 -0800461 void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
462 float alpha, hwc2_error_t* outErr = nullptr)
463 {
464 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
465 getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
466 ASSERT_TRUE(pfn) << "failed to get function";
467
468 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
469 alpha));
470 if (outErr) {
471 *outErr = err;
472 } else {
473 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
474 << alpha;
475 }
476 }
477
Marissa Wallc57468f2016-12-15 12:31:12 -0800478 void setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer,
479 const hwc_frect_t& sourceCrop, hwc2_error_t* outErr = nullptr)
480 {
481 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
482 getFunction(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP));
483 ASSERT_TRUE(pfn) << "failed to get function";
484
485 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
486 sourceCrop));
487 if (outErr) {
488 *outErr = err;
489 } else {
490 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer source crop";
491 }
492 }
493
Marissa Wallad761812016-12-15 12:32:24 -0800494 void setLayerSurfaceDamage(hwc2_display_t display, hwc2_layer_t layer,
495 const hwc_region_t& surfaceDamage, hwc2_error_t* outErr = nullptr)
496 {
497 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
498 getFunction(HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE));
499 ASSERT_TRUE(pfn) << "failed to get function";
500
501 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
502 surfaceDamage));
503 if (outErr) {
504 *outErr = err;
505 } else {
506 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer surface"
507 " damage";
508 }
509 }
510
Marissa Wallac108192016-12-15 12:27:48 -0800511 void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
512 hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
513 {
514 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
515 getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
516 ASSERT_TRUE(pfn) << "failed to get function";
517
518 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
519 transform));
520 if (outErr) {
521 *outErr = err;
522 } else {
523 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
524 << getTransformName(transform);
525 }
526 }
527
Marissa Wall273b1df2016-12-15 12:28:47 -0800528 void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
529 uint32_t zOrder, hwc2_error_t* outErr = nullptr)
530 {
531 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
532 getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
533 ASSERT_TRUE(pfn) << "failed to get function";
534
535 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
536 zOrder));
537 if (outErr) {
538 *outErr = err;
539 } else {
540 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
541 << zOrder;
542 }
543 }
544
Marissa Wall4d600052016-12-15 12:16:01 -0800545protected:
546 hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
547 {
548 return mHwc2Device->getFunction(mHwc2Device, descriptor);
549 }
550
551 void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
552 {
553 uint32_t num = 0;
554
555 mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
556
557 outCapabilities->resize(num);
558
559 mHwc2Device->getCapabilities(mHwc2Device, &num,
560 reinterpret_cast<int32_t*>(outCapabilities->data()));
561 }
562
Marissa Wallcfb9a072017-02-17 20:53:18 -0800563 /* Registers a hotplug callback and waits for hotplug callbacks. This
564 * function will have no effect if called more than once. */
565 void populateDisplays()
566 {
567 /* Sets the hotplug status to receiving */
568 {
569 std::lock_guard<std::mutex> lock(mHotplugMutex);
570
571 if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
572 return;
573 mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
574 }
575
576 /* Registers the callback. This function call cannot be locked because
577 * a callback could happen on the same thread */
578 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
579 reinterpret_cast<hwc2_function_pointer_t>(
580 hwc2TestHotplugCallback)));
581
582 /* Waits for hotplug events. If a hotplug event has not come within 1
583 * second, stop waiting. */
584 std::unique_lock<std::mutex> lock(mHotplugMutex);
585
586 while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
587 std::cv_status::timeout) { }
588
589 /* Sets the hotplug status to done. Future calls will have no effect */
590 mHotplugStatus = Hwc2TestHotplugStatus::Done;
591 }
592
593 void getBadDisplay(hwc2_display_t* outDisplay)
594 {
595 for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
596 if (mDisplays.count(display) == 0) {
597 *outDisplay = display;
598 return;
599 }
600 }
601 ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
602 " are registered. This should never happen.";
603 }
604
Marissa Wall1db2e372016-12-15 12:19:39 -0800605 /* NOTE: will create min(newlayerCnt, max supported layers) layers */
606 void createLayers(hwc2_display_t display,
607 std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
608 {
609 std::vector<hwc2_layer_t> newLayers;
610 hwc2_layer_t layer;
611 hwc2_error_t err = HWC2_ERROR_NONE;
612
613 for (size_t i = 0; i < newLayerCnt; i++) {
614
615 EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
616 if (err == HWC2_ERROR_NO_RESOURCES)
617 break;
618 if (err != HWC2_ERROR_NONE) {
619 newLayers.clear();
620 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
621 }
622 newLayers.push_back(layer);
623 }
624
625 *outLayers = std::move(newLayers);
626 }
627
628 void destroyLayers(hwc2_display_t display,
629 std::vector<hwc2_layer_t>&& layers)
630 {
631 for (hwc2_layer_t layer : layers) {
632 EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
633 }
634 }
635
Marissa Wallcf935cb2016-12-15 12:20:47 -0800636 void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
637 {
638 std::vector<hwc2_config_t> configs;
639
640 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
641
642 hwc2_config_t CONFIG_MAX = UINT32_MAX;
643
644 ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
645 " (2^32 values) has been taken which shouldn't happen";
646
647 hwc2_config_t config;
648 for (config = 0; config < CONFIG_MAX; config++) {
649 if (std::count(configs.begin(), configs.end(), config) == 0)
650 break;
651 }
652
653 *outConfig = config;
654 }
655
Marissa Wall572a1ee2016-12-15 12:24:13 -0800656 void enableVsync(hwc2_display_t display)
657 {
658 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
659 reinterpret_cast<hwc2_function_pointer_t>(
660 hwc2TestVsyncCallback)));
661 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
662 }
663
664 void disableVsync(hwc2_display_t display)
665 {
666 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
667 }
668
669 void waitForVsync(hwc2_display_t* outDisplay = nullptr,
670 int64_t* outTimestamp = nullptr)
671 {
672 std::unique_lock<std::mutex> lock(mVsyncMutex);
673 ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
674 std::cv_status::no_timeout) << "timed out attempting to get"
675 " vsync callback";
676 if (outDisplay)
677 *outDisplay = mVsyncDisplay;
678 if (outTimestamp)
679 *outTimestamp = mVsyncTimestamp;
680 }
681
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800682 /* Calls a set property function from Hwc2Test to set a property value from
683 * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
684 using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
685 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800686 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800687
Marissa Wall273b1df2016-12-15 12:28:47 -0800688 /* Calls a set property function from Hwc2Test to set property values from
689 * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
690 using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
691 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800692 Hwc2TestLayers* testLayers);
Marissa Wall273b1df2016-12-15 12:28:47 -0800693
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800694 /* Calls a set property function from Hwc2Test to set a bad property value
695 * on hwc2_layer_t on hwc2_display_t */
696 using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
697 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800698 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800699
700 /* Calls a set property function from Hwc2Test to set a bad property value
701 * on hwc2_layer_t on hwc2_display_t */
702 using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
703 hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
704
705 /* Advances a property of Hwc2TestLayer */
706 using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
707
708 /* For each active display it cycles through each display config and tests
709 * each property value. It creates a layer, sets the property and then
710 * destroys the layer */
711 void setLayerProperty(Hwc2TestCoverage coverage,
712 TestLayerPropertyFunction function, AdvanceProperty advance)
713 {
714 for (auto display : mDisplays) {
715 std::vector<hwc2_config_t> configs;
716
717 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
718
719 for (auto config : configs) {
720 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -0800721 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800722
723 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800724 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
725 &displayArea));
726 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800727
728 do {
729 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
730
731 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800732 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800733
734 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
735 } while (advance(&testLayer));
736 }
737 }
738 }
739
740 /* For each active display it cycles through each display config and tests
741 * each property value. It creates a layer, cycles through each property
742 * value and updates the layer property value and then destroys the layer */
743 void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
744 TestLayerPropertyFunction function, AdvanceProperty advance)
745 {
746 for (auto display : mDisplays) {
747 std::vector<hwc2_config_t> configs;
748
749 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
750
751 for (auto config : configs) {
752 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -0800753 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800754
755 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800756 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
757 &displayArea));
758 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800759
760 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
761
762 do {
763 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800764 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800765 } while (advance(&testLayer));
766
767 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
768 }
769 }
770 }
771
Marissa Wall273b1df2016-12-15 12:28:47 -0800772 /* For each active display it cycles through each display config and tests
773 * each property value. It creates multiple layers, calls the
774 * TestLayerPropertiesFunction to set property values and then
775 * destroys the layers */
776 void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
777 TestLayerPropertiesFunction function)
778 {
779 for (auto display : mDisplays) {
780 std::vector<hwc2_config_t> configs;
781
782 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
783
784 for (auto config : configs) {
785 std::vector<hwc2_layer_t> layers;
Marissa Wall600a73b2016-12-15 12:30:39 -0800786 Area displayArea;
Marissa Wall273b1df2016-12-15 12:28:47 -0800787
788 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800789 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
790 &displayArea));
Marissa Wall273b1df2016-12-15 12:28:47 -0800791
792 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
Marissa Wall600a73b2016-12-15 12:30:39 -0800793 Hwc2TestLayers testLayers(layers, coverage, displayArea);
Marissa Wall273b1df2016-12-15 12:28:47 -0800794
795 for (auto layer : layers) {
796 EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800797 &testLayers));
Marissa Wall273b1df2016-12-15 12:28:47 -0800798 }
799
800 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
801 }
802 }
803 }
804
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800805 /* For each active display it cycles through each display config.
806 * 1) It attempts to set a valid property value to bad layer handle.
807 * 2) It creates a layer x and attempts to set a valid property value to
808 * layer x + 1
809 * 3) It destroys the layer x and attempts to set a valid property value to
810 * the destroyed layer x.
811 */
812 void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
813 TestLayerPropertyBadLayerFunction function)
814 {
815 for (auto display : mDisplays) {
816 std::vector<hwc2_config_t> configs;
817
818 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
819
820 for (auto config : configs) {
821 hwc2_layer_t layer = 0;
Marissa Wall600a73b2016-12-15 12:30:39 -0800822 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800823 hwc2_error_t err = HWC2_ERROR_NONE;
824
825 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800826 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
827 &displayArea));
828 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800829
830 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800831 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800832 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
833
834 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
835
836 ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800837 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800838 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
839
840 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
841
842 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800843 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800844 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
845 }
846 }
847 }
848
849 /* For each active display it cycles through each display config and tests
850 * each property value. It creates a layer, sets a bad property value and
851 * then destroys the layer */
852 void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
853 {
854 for (auto display : mDisplays) {
855 std::vector<hwc2_config_t> configs;
856
857 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
858
859 for (auto config : configs) {
860 hwc2_layer_t layer;
861 hwc2_error_t err = HWC2_ERROR_NONE;
862
863 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
864
865 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
866
867 ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
868 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
869 " error code";
870
871 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
872 }
873 }
874 }
875
Marissa Wall600a73b2016-12-15 12:30:39 -0800876 void getActiveConfigAttribute(hwc2_display_t display,
877 hwc2_attribute_t attribute, int32_t* outValue)
878 {
879 hwc2_config_t config;
880 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
881 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
882 attribute, outValue));
883 ASSERT_GE(*outValue, 0) << "failed to get valid "
884 << getAttributeName(attribute);
885 }
886
887 void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
888 {
889 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
890 HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
891 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
892 HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
893 }
894
Marissa Wall4d600052016-12-15 12:16:01 -0800895 hwc2_device_t* mHwc2Device = nullptr;
Marissa Wallcfb9a072017-02-17 20:53:18 -0800896
897 enum class Hwc2TestHotplugStatus {
898 Init = 1,
899 Receiving,
900 Done,
901 };
902
903 std::mutex mHotplugMutex;
904 std::condition_variable mHotplugCv;
905 Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
906 std::unordered_set<hwc2_display_t> mDisplays;
Marissa Wall1db2e372016-12-15 12:19:39 -0800907
908 /* Store all created layers that have not been destroyed. If an ASSERT_*
909 * fails, then destroy the layers on exit */
910 std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
Marissa Wall03c91732016-12-15 12:23:16 -0800911
912 /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
913 * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
914 std::set<hwc2_display_t> mActiveDisplays;
Marissa Wall572a1ee2016-12-15 12:24:13 -0800915
916 std::mutex mVsyncMutex;
917 std::condition_variable mVsyncCv;
918 hwc2_display_t mVsyncDisplay;
919 int64_t mVsyncTimestamp = -1;
Marissa Wall4d600052016-12-15 12:16:01 -0800920};
921
Marissa Wallcfb9a072017-02-17 20:53:18 -0800922void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
923 hwc2_display_t display, int32_t connection)
924{
925 if (callbackData)
926 static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
927 connection);
928}
929
Marissa Wall572a1ee2016-12-15 12:24:13 -0800930void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
931 hwc2_display_t display, int64_t timestamp)
932{
933 if (callbackData)
934 static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
935 timestamp);
936}
937
Marissa Wallffc67da2016-12-15 12:26:09 -0800938void setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800939 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallffc67da2016-12-15 12:26:09 -0800940{
941 EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800942 testLayer->getBlendMode(), outErr));
943}
944
945void setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
946 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
947{
948 buffer_handle_t handle;
949 android::base::unique_fd acquireFence;
950 hwc2_composition_t composition = testLayer->getComposition();
951
952 if (composition == HWC2_COMPOSITION_CLIENT
953 || composition == HWC2_COMPOSITION_SOLID_COLOR
954 || composition == HWC2_COMPOSITION_SIDEBAND)
955 return;
956
957 if (testLayer->getBuffer(&handle, &acquireFence) < 0)
958 return;
959
960 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
961 composition));
962 EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
963 handle, acquireFence, outErr));
Marissa Wallffc67da2016-12-15 12:26:09 -0800964}
965
Marissa Wallee242782016-12-15 12:30:12 -0800966void setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800967 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallee242782016-12-15 12:30:12 -0800968{
969 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
970 layer, HWC2_COMPOSITION_SOLID_COLOR));
971 ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800972 layer, testLayer->getPlaneAlpha()));
Marissa Wallee242782016-12-15 12:30:12 -0800973 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800974 layer, testLayer->getBlendMode()));
Marissa Wallee242782016-12-15 12:30:12 -0800975 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800976 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -0800977}
978
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800979void setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -0800980 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800981{
Marissa Wall5a240aa2016-12-15 12:34:06 -0800982 hwc2_composition_t composition = testLayer->getComposition();
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800983 hwc2_error_t err = HWC2_ERROR_NONE;
984
985 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
986 composition, &err));
987 if (outErr) {
988 *outErr = err;
989 return;
990 }
991
992 if (composition != HWC2_COMPOSITION_SIDEBAND) {
993 EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
994 } else {
995 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
996 << "returned wrong error code";
997 }
998}
999
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001000void setCursorPosition(Hwc2Test* test, hwc2_display_t display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001001 hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001002{
1003 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1004 layer, HWC2_COMPOSITION_CURSOR));
1005
Marissa Wall5a240aa2016-12-15 12:34:06 -08001006 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001007 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
1008 cursorPosition.left, cursorPosition.top, outErr));
1009}
1010
Marissa Wallb72b5c92016-12-15 12:26:39 -08001011void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001012 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallb72b5c92016-12-15 12:26:39 -08001013{
1014 EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001015 testLayer->getDataspace(), outErr));
Marissa Wallb72b5c92016-12-15 12:26:39 -08001016}
1017
Marissa Wall600a73b2016-12-15 12:30:39 -08001018void setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001019 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall600a73b2016-12-15 12:30:39 -08001020{
1021 EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001022 testLayer->getDisplayFrame(), outErr));
Marissa Wall600a73b2016-12-15 12:30:39 -08001023}
1024
Marissa Wall2b1f5302016-12-15 12:27:20 -08001025void setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001026 Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
Marissa Wall2b1f5302016-12-15 12:27:20 -08001027{
1028 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001029 testLayer->getBlendMode()));
Marissa Wall2b1f5302016-12-15 12:27:20 -08001030 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001031 testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08001032}
1033
Marissa Wallc57468f2016-12-15 12:31:12 -08001034void setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001035 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallc57468f2016-12-15 12:31:12 -08001036{
1037 EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001038 testLayer->getSourceCrop(), outErr));
Marissa Wallc57468f2016-12-15 12:31:12 -08001039}
1040
Marissa Wallad761812016-12-15 12:32:24 -08001041void setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001042 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallad761812016-12-15 12:32:24 -08001043{
1044 EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001045 testLayer->getSurfaceDamage(), outErr));
Marissa Wallad761812016-12-15 12:32:24 -08001046}
1047
Marissa Wallac108192016-12-15 12:27:48 -08001048void setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001049 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallac108192016-12-15 12:27:48 -08001050{
1051 EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001052 testLayer->getTransform(), outErr));
Marissa Wallac108192016-12-15 12:27:48 -08001053}
1054
Marissa Wall273b1df2016-12-15 12:28:47 -08001055void setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001056 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall273b1df2016-12-15 12:28:47 -08001057{
1058 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001059 testLayer->getZOrder(), outErr));
Marissa Wall273b1df2016-12-15 12:28:47 -08001060}
1061
Marissa Wallffc67da2016-12-15 12:26:09 -08001062bool advanceBlendMode(Hwc2TestLayer* testLayer)
1063{
1064 return testLayer->advanceBlendMode();
1065}
1066
Marissa Wall5a240aa2016-12-15 12:34:06 -08001067bool advanceBuffer(Hwc2TestLayer* testLayer)
1068{
1069 if (testLayer->advanceComposition())
1070 return true;
1071 return testLayer->advanceBufferArea();
1072}
1073
Marissa Wallee242782016-12-15 12:30:12 -08001074bool advanceColor(Hwc2TestLayer* testLayer)
1075{
1076 /* Color depends on blend mode so advance blend mode last so color is not
1077 * force to update as often */
1078 if (testLayer->advancePlaneAlpha())
1079 return true;
1080 if (testLayer->advanceColor())
1081 return true;
1082 return testLayer->advanceBlendMode();
1083}
1084
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001085bool advanceComposition(Hwc2TestLayer* testLayer)
1086{
1087 return testLayer->advanceComposition();
1088}
1089
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001090bool advanceCursorPosition(Hwc2TestLayer* testLayer)
1091{
1092 return testLayer->advanceCursorPosition();
1093}
1094
Marissa Wallb72b5c92016-12-15 12:26:39 -08001095bool advanceDataspace(Hwc2TestLayer* testLayer)
1096{
1097 return testLayer->advanceDataspace();
1098}
1099
Marissa Wall600a73b2016-12-15 12:30:39 -08001100bool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1101{
1102 return testLayer->advanceDisplayFrame();
1103}
1104
Marissa Wall2b1f5302016-12-15 12:27:20 -08001105bool advancePlaneAlpha(Hwc2TestLayer* testLayer)
1106{
1107 return testLayer->advancePlaneAlpha();
1108}
1109
Marissa Wallc57468f2016-12-15 12:31:12 -08001110bool advanceSourceCrop(Hwc2TestLayer* testLayer)
1111{
1112 if (testLayer->advanceSourceCrop())
1113 return true;
1114 return testLayer->advanceBufferArea();
1115}
1116
Marissa Wallad761812016-12-15 12:32:24 -08001117bool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
1118{
1119 if (testLayer->advanceSurfaceDamage())
1120 return true;
1121 return testLayer->advanceBufferArea();
1122}
1123
Marissa Wallac108192016-12-15 12:27:48 -08001124bool advanceTransform(Hwc2TestLayer* testLayer)
1125{
1126 return testLayer->advanceTransform();
1127}
1128
Marissa Wall4d600052016-12-15 12:16:01 -08001129
1130static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
1131 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
1132 HWC2_FUNCTION_CREATE_LAYER,
1133 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
1134 HWC2_FUNCTION_DESTROY_LAYER,
1135 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
1136 HWC2_FUNCTION_DUMP,
1137 HWC2_FUNCTION_GET_ACTIVE_CONFIG,
1138 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
1139 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
1140 HWC2_FUNCTION_GET_COLOR_MODES,
1141 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
1142 HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
1143 HWC2_FUNCTION_GET_DISPLAY_NAME,
1144 HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
1145 HWC2_FUNCTION_GET_DISPLAY_TYPE,
1146 HWC2_FUNCTION_GET_DOZE_SUPPORT,
1147 HWC2_FUNCTION_GET_HDR_CAPABILITIES,
1148 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
1149 HWC2_FUNCTION_GET_RELEASE_FENCES,
1150 HWC2_FUNCTION_PRESENT_DISPLAY,
1151 HWC2_FUNCTION_REGISTER_CALLBACK,
1152 HWC2_FUNCTION_SET_ACTIVE_CONFIG,
1153 HWC2_FUNCTION_SET_CLIENT_TARGET,
1154 HWC2_FUNCTION_SET_COLOR_MODE,
1155 HWC2_FUNCTION_SET_COLOR_TRANSFORM,
1156 HWC2_FUNCTION_SET_CURSOR_POSITION,
1157 HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
1158 HWC2_FUNCTION_SET_LAYER_BUFFER,
1159 HWC2_FUNCTION_SET_LAYER_COLOR,
1160 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
1161 HWC2_FUNCTION_SET_LAYER_DATASPACE,
1162 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
1163 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
1164 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
1165 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
1166 HWC2_FUNCTION_SET_LAYER_TRANSFORM,
1167 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
1168 HWC2_FUNCTION_SET_LAYER_Z_ORDER,
1169 HWC2_FUNCTION_SET_OUTPUT_BUFFER,
1170 HWC2_FUNCTION_SET_POWER_MODE,
1171 HWC2_FUNCTION_SET_VSYNC_ENABLED,
1172 HWC2_FUNCTION_VALIDATE_DISPLAY,
1173}};
1174
1175/* TESTCASE: Tests that the HWC2 supports all required functions. */
1176TEST_F(Hwc2Test, GET_FUNCTION)
1177{
1178 for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
1179 hwc2_function_pointer_t pfn = getFunction(descriptor);
1180 EXPECT_TRUE(pfn) << "failed to get function "
1181 << getFunctionDescriptorName(descriptor);
1182 }
1183}
1184
1185/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
1186TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
1187{
1188 hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
1189 EXPECT_FALSE(pfn) << "failed to get invalid function";
1190}
1191
1192/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
1193TEST_F(Hwc2Test, GET_CAPABILITIES)
1194{
1195 std::vector<hwc2_capability_t> capabilities;
1196
1197 getCapabilities(&capabilities);
1198
1199 EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
1200 HWC2_CAPABILITY_INVALID), 0);
1201}
Marissa Walla4b01482017-02-17 20:52:03 -08001202
1203static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1204 HWC2_CALLBACK_HOTPLUG,
1205 HWC2_CALLBACK_REFRESH,
1206 HWC2_CALLBACK_VSYNC,
1207}};
1208
1209/* TESTCASE: Tests that the HWC2 can successfully register all required
1210 * callback functions. */
1211TEST_F(Hwc2Test, REGISTER_CALLBACK)
1212{
1213 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1214 const_cast<char*>("data"));
1215
1216 for (auto descriptor : callbackDescriptors) {
1217 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1218 []() { return; }));
1219 }
1220}
1221
1222/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1223TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1224{
1225 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1226 const_cast<char*>("data"));
1227 hwc2_error_t err = HWC2_ERROR_NONE;
1228
1229 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1230 []() { return; }, &err));
1231 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1232}
1233
1234/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
1235TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
1236{
1237 hwc2_callback_data_t data = nullptr;
1238
1239 for (auto descriptor : callbackDescriptors) {
1240 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1241 []() { return; }));
1242 }
1243}
Marissa Wallcfb9a072017-02-17 20:53:18 -08001244
1245/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1246 * physical display. */
1247TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1248{
1249 for (auto display : mDisplays) {
1250 hwc2_display_type_t type;
1251
1252 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1253 EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1254 " correct display type";
1255 }
1256}
1257
1258/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1259 * display is requested. */
1260TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1261{
1262 hwc2_display_t display;
1263 hwc2_display_type_t type;
1264 hwc2_error_t err = HWC2_ERROR_NONE;
1265
1266 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1267
1268 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1269 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1270}
Marissa Wall1db2e372016-12-15 12:19:39 -08001271
1272/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
1273TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
1274{
1275 for (auto display : mDisplays) {
1276 hwc2_layer_t layer;
1277
1278 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1279
1280 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1281 }
1282}
1283
1284/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
1285TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
1286{
1287 hwc2_display_t display;
1288 hwc2_layer_t layer;
1289 hwc2_error_t err = HWC2_ERROR_NONE;
1290
1291 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1292
1293 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
1294 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1295}
1296
1297/* TESTCASE: Tests that the HWC2 will either support a large number of resources
1298 * or will return no resources. */
1299TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
1300{
1301 const size_t layerCnt = 1000;
1302
1303 for (auto display : mDisplays) {
1304 std::vector<hwc2_layer_t> layers;
1305
1306 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1307
1308 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1309 }
1310}
1311
1312/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
1313TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
1314{
1315 hwc2_display_t badDisplay;
1316
1317 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
1318
1319 for (auto display : mDisplays) {
1320 hwc2_layer_t layer = 0;
1321 hwc2_error_t err = HWC2_ERROR_NONE;
1322
1323 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1324 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1325
1326 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1327
1328 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1329 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1330
1331 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1332 }
1333}
1334
1335/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
1336TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
1337{
1338 for (auto display : mDisplays) {
1339 hwc2_layer_t layer;
1340 hwc2_error_t err = HWC2_ERROR_NONE;
1341
1342 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
1343 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1344
1345 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
1346 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1347
1348 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
1349 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1350
1351 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
1352 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1353
1354 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
1355 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1356
1357 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1358
1359 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
1360 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1361
1362 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1363
1364 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
1365 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1366 }
1367}
Marissa Wallcf935cb2016-12-15 12:20:47 -08001368
1369static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1370 HWC2_ATTRIBUTE_WIDTH,
1371 HWC2_ATTRIBUTE_HEIGHT,
1372}};
1373
1374static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1375 HWC2_ATTRIBUTE_VSYNC_PERIOD,
1376 HWC2_ATTRIBUTE_DPI_X,
1377 HWC2_ATTRIBUTE_DPI_Y,
1378}};
1379
1380/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1381 * config. */
1382TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1383{
1384 for (auto display : mDisplays) {
1385 std::vector<hwc2_config_t> configs;
1386
1387 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1388
1389 for (auto config : configs) {
1390 int32_t value;
1391
1392 for (auto attribute : requiredAttributes) {
1393 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1394 attribute, &value));
1395 EXPECT_GE(value, 0) << "missing required attribute "
1396 << getAttributeName(attribute) << " for config "
1397 << config;
1398 }
1399 for (auto attribute : optionalAttributes) {
1400 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1401 attribute, &value));
1402 }
1403 }
1404 }
1405}
1406
1407/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1408 * attribute */
1409TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1410{
1411 const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1412
1413 for (auto display : mDisplays) {
1414 std::vector<hwc2_config_t> configs;
1415
1416 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1417
1418 for (auto config : configs) {
1419 int32_t value;
1420 hwc2_error_t err = HWC2_ERROR_NONE;
1421
1422 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1423 attribute, &value, &err));
1424 EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1425 " attribute for config " << config;
1426 }
1427 }
1428}
1429
1430/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1431TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1432{
1433 hwc2_display_t display;
1434 const hwc2_config_t config = 0;
1435 int32_t value;
1436 hwc2_error_t err = HWC2_ERROR_NONE;
1437
1438 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1439
1440 for (auto attribute : requiredAttributes) {
1441 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1442 &value, &err));
1443 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1444 }
1445
1446 for (auto attribute : optionalAttributes) {
1447 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1448 &value, &err));
1449 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1450 }
1451}
1452
1453/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1454TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1455{
1456 for (auto display : mDisplays) {
1457 hwc2_config_t config;
1458 int32_t value;
1459 hwc2_error_t err = HWC2_ERROR_NONE;
1460
1461 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1462
1463 for (auto attribute : requiredAttributes) {
1464 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1465 attribute, &value, &err));
1466 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1467 }
1468
1469 for (auto attribute : optionalAttributes) {
1470 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1471 attribute, &value, &err));
1472 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1473 }
1474 }
1475}
1476
1477/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1478TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1479{
1480 for (auto display : mDisplays) {
1481 std::vector<hwc2_config_t> configs;
1482
1483 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1484 }
1485}
1486
1487/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1488TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1489{
1490 hwc2_display_t display;
1491 std::vector<hwc2_config_t> configs;
1492 hwc2_error_t err = HWC2_ERROR_NONE;
1493
1494 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1495
1496 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1497
1498 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1499 EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1500}
1501
1502/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1503 * times in a row. */
1504TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1505{
1506 for (auto display : mDisplays) {
1507 std::vector<hwc2_config_t> configs1, configs2;
1508
1509 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
1510 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
1511
1512 EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
1513 configs2.begin())) << "returned two different config sets";
1514 }
1515}
1516
1517/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
1518TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
1519{
1520 for (auto display : mDisplays) {
1521 std::vector<hwc2_config_t> configs;
1522
1523 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1524
1525 std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
1526 configs.end());
1527 EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
1528 " configs";
1529 }
1530}
Marissa Wall93dc04f2016-12-15 12:21:46 -08001531
1532/* TESTCASE: Tests that the HWC2 returns the active config for a display */
1533TEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
1534{
1535 for (auto display : mDisplays) {
1536 std::vector<hwc2_config_t> configs;
1537
1538 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1539
1540 for (auto config : configs) {
1541 hwc2_config_t activeConfig;
1542
1543 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1544 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
1545
1546 EXPECT_EQ(activeConfig, config) << "failed to get active config";
1547 }
1548 }
1549}
1550
1551/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
1552 * display. */
1553TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
1554{
1555 hwc2_display_t display;
1556 hwc2_config_t activeConfig;
1557 hwc2_error_t err = HWC2_ERROR_NONE;
1558
1559 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1560
1561 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1562
1563 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1564}
1565
1566/* TESTCASE: Tests that the HWC2 either begins with a valid active config
1567 * or returns an error when getActiveConfig is called. */
1568TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
1569{
1570 for (auto display : mDisplays) {
1571 std::vector<hwc2_config_t> configs;
1572 hwc2_config_t activeConfig;
1573 hwc2_error_t err = HWC2_ERROR_NONE;
1574
1575 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1576
1577 if (configs.empty())
1578 return;
1579
1580 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1581 if (err == HWC2_ERROR_NONE) {
1582 EXPECT_NE(std::count(configs.begin(), configs.end(),
1583 activeConfig), 0) << "active config is not found in "
1584 " configs for display";
1585 } else {
1586 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1587 }
1588 }
1589}
1590
1591/* TESTCASE: Tests that the HWC2 can set every display config as an active
1592 * config */
1593TEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
1594{
1595 for (auto display : mDisplays) {
1596 std::vector<hwc2_config_t> configs;
1597
1598 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1599
1600 for (auto config : configs) {
1601 EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1602 }
1603 }
1604}
1605
1606/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
1607TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
1608{
1609 hwc2_display_t display;
1610 const hwc2_config_t config = 0;
1611 hwc2_error_t err = HWC2_ERROR_NONE;
1612
1613 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1614
1615 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
1616 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1617}
1618
1619/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
1620TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
1621{
1622 for (auto display : mDisplays) {
1623 hwc2_config_t config;
1624 hwc2_error_t err = HWC2_ERROR_NONE;
1625
1626 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1627
1628 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
1629 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1630 }
1631}
Marissa Wall03c91732016-12-15 12:23:16 -08001632
1633/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
1634TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
1635{
1636 for (auto display : mDisplays) {
1637 int32_t support = -1;
1638
1639 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1640
1641 EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
1642 }
1643}
1644
1645/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
1646TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
1647{
1648 hwc2_display_t display;
1649 int32_t support = -1;
1650 hwc2_error_t err = HWC2_ERROR_NONE;
1651
1652 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1653
1654 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1655
1656 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1657}
1658
1659/* TESTCASE: Tests that the HWC2 can set all supported power modes */
1660TEST_F(Hwc2Test, SET_POWER_MODE)
1661{
1662 for (auto display : mDisplays) {
1663 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1664 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1665
1666 int32_t support = -1;
1667 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1668 if (support != 1)
1669 return;
1670
1671 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1672 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1673 HWC2_POWER_MODE_DOZE_SUSPEND));
1674
1675 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1676 }
1677}
1678
1679/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
1680TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
1681{
1682 hwc2_display_t display;
1683 hwc2_error_t err = HWC2_ERROR_NONE;
1684
1685 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1686
1687 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
1688 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1689
1690 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
1691 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1692
1693 int32_t support = -1;
1694 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1695 if (support != 1)
1696 return;
1697
1698 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
1699 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1700
1701 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
1702 &err));
1703 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1704}
1705
1706/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
1707TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
1708{
1709 for (auto display : mDisplays) {
1710 hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
1711 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
1712 hwc2_error_t err = HWC2_ERROR_NONE;
1713
1714 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
1715 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
1716 << mode;
1717 }
1718}
1719
1720/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
1721 * an optional power mode. */
1722TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
1723{
1724 for (auto display : mDisplays) {
1725 int32_t support = -1;
1726 hwc2_error_t err = HWC2_ERROR_NONE;
1727
1728 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1729 if (support == 1)
1730 return;
1731
1732 ASSERT_EQ(support, 0) << "invalid doze support value";
1733
1734 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
1735 &err));
1736 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1737
1738 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1739 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
1740 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1741 }
1742}
1743
1744/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
1745TEST_F(Hwc2Test, SET_POWER_MODE_stress)
1746{
1747 for (auto display : mDisplays) {
1748 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1749 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1750
1751 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1752 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1753
1754 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1755 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1756
1757 int32_t support = -1;
1758 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1759 if (support != 1)
1760 return;
1761
1762 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1763 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1764
1765 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1766 HWC2_POWER_MODE_DOZE_SUSPEND));
1767 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1768 HWC2_POWER_MODE_DOZE_SUSPEND));
1769
1770 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1771 }
1772}
Marissa Wall572a1ee2016-12-15 12:24:13 -08001773
1774/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
1775 * displays */
1776TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
1777{
1778 for (auto display : mDisplays) {
1779 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1780 const_cast<char*>("data"));
1781
1782 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1783
1784 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1785 []() { return; }));
1786
1787 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1788
1789 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1790
1791 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1792 }
1793}
1794
1795/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
1796TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
1797{
1798 for (auto display : mDisplays) {
1799 hwc2_display_t receivedDisplay;
1800 int64_t receivedTimestamp;
1801
1802 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1803
1804 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1805
1806 ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
1807 &receivedTimestamp));
1808
1809 EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
1810 EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
1811
1812 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1813
1814 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1815 }
1816}
1817
1818/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
1819TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
1820{
1821 hwc2_display_t display;
1822 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1823 const_cast<char*>("data"));
1824 hwc2_error_t err = HWC2_ERROR_NONE;
1825
1826 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1827
1828 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1829 []() { return; }));
1830
1831 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
1832 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1833
1834 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
1835 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1836}
1837
1838/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
1839TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
1840{
1841 for (auto display : mDisplays) {
1842 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1843 const_cast<char*>("data"));
1844 hwc2_error_t err = HWC2_ERROR_NONE;
1845
1846 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1847
1848 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1849 []() { return; }));
1850
1851 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
1852 &err));
1853 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1854
1855 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1856 }
1857}
1858
1859/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
1860 * times. */
1861TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
1862{
1863 for (auto display : mDisplays) {
1864 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1865 const_cast<char*>("data"));
1866
1867 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1868
1869 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1870 []() { return; }));
1871
1872 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1873
1874 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1875 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1876
1877 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1878 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1879
1880 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1881 }
1882}
1883
1884/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
1885 * is off and no callback is registered. */
1886TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
1887{
1888 const uint secs = 1;
1889
1890 for (auto display : mDisplays) {
1891 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1892
1893 sleep(secs);
1894
1895 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1896 }
1897}
1898
1899/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
1900 * is registered. */
1901TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
1902{
1903 const uint secs = 1;
1904
1905 for (auto display : mDisplays) {
1906 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1907
1908 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1909
1910 sleep(secs);
1911
1912 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1913
1914 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1915 }
1916}
Marissa Walldd4087f2016-12-15 12:24:52 -08001917
1918/* TESTCASE: Tests that the HWC2 returns a display name for each display */
1919TEST_F(Hwc2Test, GET_DISPLAY_NAME)
1920{
1921 for (auto display : mDisplays) {
1922 std::string name;
1923
1924 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
1925 }
1926}
1927
1928/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
1929 * display */
1930TEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
1931{
1932 hwc2_display_t display;
1933 std::string name;
1934 hwc2_error_t err = HWC2_ERROR_NONE;
1935
1936 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1937
1938 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
1939 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1940}
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001941
1942/* TESTCASE: Tests that the HWC2 can set basic composition types. */
1943TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
1944{
1945 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1946 setComposition, advanceComposition));
1947}
1948
1949/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
1950 * layer. */
1951TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
1952{
1953 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1954 setComposition, advanceComposition));
1955}
1956
1957/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
1958TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
1959{
1960 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1961 setComposition));
1962}
1963
1964/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
1965TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
1966{
1967 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
1968 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1969 hwc2_error_t* outErr) {
1970
1971 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1972 layer, HWC2_COMPOSITION_INVALID, outErr));
1973 }
1974 ));
1975}
Marissa Wallffc67da2016-12-15 12:26:09 -08001976
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001977/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
1978TEST_F(Hwc2Test, SET_CURSOR_POSITION)
1979{
1980 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1981 ::setCursorPosition, advanceCursorPosition));
1982}
1983
1984/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
1985TEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
1986{
1987 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1988 ::setCursorPosition, advanceCursorPosition));
1989}
1990
1991/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
1992 * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
1993TEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
1994{
1995 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1996 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001997 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001998
Marissa Wall5a240aa2016-12-15 12:34:06 -08001999 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002000 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
2001 cursorPosition.left, cursorPosition.top, outErr));
2002 },
2003
2004 advanceCursorPosition));
2005}
2006
2007/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
2008 * display. */
2009TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
2010{
2011 hwc2_display_t display;
2012 hwc2_layer_t layer = 0;
2013 int32_t x = 0, y = 0;
2014 hwc2_error_t err = HWC2_ERROR_NONE;
2015
2016 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2017
2018 ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
2019 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2020}
2021
2022/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
2023TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
2024{
2025 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2026 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002027 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002028
Marissa Wall5a240aa2016-12-15 12:34:06 -08002029 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002030 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
2031 badLayer, cursorPosition.left, cursorPosition.top,
2032 outErr));
2033 }
2034 ));
2035}
2036
Marissa Wallffc67da2016-12-15 12:26:09 -08002037/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
2038TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
2039{
2040 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2041 setBlendMode, advanceBlendMode));
2042}
2043
2044/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
2045TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
2046{
2047 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2048 setBlendMode, advanceBlendMode));
2049}
2050
2051/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
2052TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
2053{
2054 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2055 setBlendMode));
2056}
2057
2058/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
2059TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
2060{
2061 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2062 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2063 hwc2_error_t* outErr) {
2064
2065 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
2066 layer, HWC2_BLEND_MODE_INVALID, outErr));
2067 }
2068 ));
2069}
Marissa Wallb72b5c92016-12-15 12:26:39 -08002070
Marissa Wall5a240aa2016-12-15 12:34:06 -08002071/* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
2072TEST_F(Hwc2Test, SET_LAYER_BUFFER)
2073{
2074 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2075 setBuffer, advanceBuffer));
2076}
2077
2078/* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
2079TEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
2080{
2081 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2082 setBuffer, advanceBuffer));
2083}
2084
2085/* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
2086TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
2087{
2088 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2089 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
2090 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2091
2092 buffer_handle_t handle = nullptr;
2093 android::base::unique_fd acquireFence;
2094
2095 /* If there is not available buffer for the given buffer
2096 * properties, it should not fail this test case */
2097 if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
2098 *outErr = HWC2_ERROR_BAD_LAYER;
2099 return;
2100 }
2101
2102 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
2103 handle, acquireFence, outErr));
2104 }
2105 ));
2106}
2107
2108/* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
2109TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
2110{
2111 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2112 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2113 hwc2_error_t* outErr) {
2114
2115 buffer_handle_t handle = nullptr;
2116 int32_t acquireFence = -1;
2117
2118 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
2119 handle, acquireFence, outErr));
2120 }
2121 ));
2122}
2123
Marissa Wallee242782016-12-15 12:30:12 -08002124/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
2125TEST_F(Hwc2Test, SET_LAYER_COLOR)
2126{
2127 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2128 setColor, advanceColor));
2129}
2130
2131/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
2132TEST_F(Hwc2Test, SET_LAYER_COLOR_update)
2133{
2134 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2135 setColor, advanceColor));
2136}
2137
2138/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
2139 * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
2140TEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
2141{
2142 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
2143 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002144 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08002145
2146 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002147 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08002148 },
2149
2150 advanceColor));
2151}
2152
2153/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
2154TEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
2155{
2156 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2157 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002158 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08002159
2160 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002161 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08002162 }
2163 ));
2164}
2165
Marissa Wallb72b5c92016-12-15 12:26:39 -08002166/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
2167TEST_F(Hwc2Test, SET_LAYER_DATASPACE)
2168{
2169 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2170 setDataspace, advanceDataspace));
2171}
2172
2173/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
2174TEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
2175{
2176 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2177 setDataspace, advanceDataspace));
2178}
2179
2180/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
2181TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
2182{
2183 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2184 setDataspace));
2185}
Marissa Wall2b1f5302016-12-15 12:27:20 -08002186
Marissa Wall600a73b2016-12-15 12:30:39 -08002187/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
2188TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
2189{
2190 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2191 setDisplayFrame, advanceDisplayFrame));
2192}
2193
2194/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
2195TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
2196{
2197 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2198 setDisplayFrame, advanceDisplayFrame));
2199}
2200
2201/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
2202TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
2203{
2204 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2205 setDisplayFrame));
2206}
2207
Marissa Wall2b1f5302016-12-15 12:27:20 -08002208/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
2209TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
2210{
2211 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2212 setPlaneAlpha, advancePlaneAlpha));
2213}
2214
2215/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
2216TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
2217{
2218 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2219 setPlaneAlpha, advancePlaneAlpha));
2220}
2221
2222/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
2223TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
2224{
2225 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2226 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002227 Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
Marissa Wall2b1f5302016-12-15 12:27:20 -08002228
2229 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002230 badLayer, testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08002231 }
2232 ));
2233}
Marissa Wallac108192016-12-15 12:27:48 -08002234
Marissa Wallc57468f2016-12-15 12:31:12 -08002235/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
2236TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
2237{
2238 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2239 setSourceCrop, advanceSourceCrop));
2240}
2241
2242/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
2243TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
2244{
2245 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2246 setSourceCrop, advanceSourceCrop));
2247}
2248
2249/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
2250TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
2251{
2252 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2253 setSourceCrop));
2254}
2255
Marissa Wallad761812016-12-15 12:32:24 -08002256/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
2257TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
2258{
2259 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2260 setSurfaceDamage, advanceSurfaceDamage));
2261}
2262
2263/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
2264TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
2265{
2266 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2267 setSurfaceDamage, advanceSurfaceDamage));
2268}
2269
2270/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
2271TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
2272{
2273 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2274 setSurfaceDamage));
2275}
2276
Marissa Wallac108192016-12-15 12:27:48 -08002277/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
2278TEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
2279{
2280 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2281 setTransform, advanceTransform));
2282}
2283
2284/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
2285TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
2286{
2287 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2288 setTransform, advanceTransform));
2289}
2290
2291/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
2292TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
2293{
2294 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2295 setTransform));
2296}
Marissa Wall273b1df2016-12-15 12:28:47 -08002297
2298/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
2299TEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
2300{
2301 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
2302 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002303 Hwc2TestLayers* testLayers) {
Marissa Wall273b1df2016-12-15 12:28:47 -08002304
2305 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002306 testLayers->getZOrder(layer)));
Marissa Wall273b1df2016-12-15 12:28:47 -08002307 }
2308 ));
2309}
2310
2311/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
2312TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
2313{
2314 const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
2315 static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
2316 static_cast<uint32_t>(UINT32_MAX / 2),
2317 static_cast<uint32_t>(UINT32_MAX) };
2318
2319 for (auto display : mDisplays) {
2320 std::vector<hwc2_config_t> configs;
2321
2322 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2323
2324 for (auto config : configs) {
2325 hwc2_layer_t layer;
2326
2327 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2328
2329 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2330
2331 for (uint32_t zOrder : zOrders) {
2332 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
2333 }
2334
2335 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2336 }
2337 }
2338}
2339
2340/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
2341TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
2342{
2343 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2344 setZOrder));
2345}