blob: f441089f37fa3cfc65bd6cc57f897af60dd6d5fe [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>
21#include <hardware/hardware.h>
22
23#define HWC2_INCLUDE_STRINGIFICATION
24#define HWC2_USE_CPP11
25#include <hardware/hwcomposer2.h>
26#undef HWC2_INCLUDE_STRINGIFICATION
27#undef HWC2_USE_CPP11
28
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080029#include "Hwc2TestLayer.h"
Marissa Wall273b1df2016-12-15 12:28:47 -080030#include "Hwc2TestLayers.h"
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080031
Marissa Wallcfb9a072017-02-17 20:53:18 -080032void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
33 hwc2_display_t display, int32_t connected);
Marissa Wall572a1ee2016-12-15 12:24:13 -080034void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
35 hwc2_display_t display, int64_t timestamp);
Marissa Wallcfb9a072017-02-17 20:53:18 -080036
Marissa Wall4d600052016-12-15 12:16:01 -080037class Hwc2Test : public testing::Test {
38public:
39
40 virtual void SetUp()
41 {
42 hw_module_t const* hwc2Module;
43
44 int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
45 ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
46 << strerror(-err);
47
48 /* The following method will fail if you have not run
49 * "adb shell stop" */
50 err = hwc2_open(hwc2Module, &mHwc2Device);
51 ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
52 << strerror(-err);
Marissa Wallcfb9a072017-02-17 20:53:18 -080053
54 populateDisplays();
Marissa Wall4d600052016-12-15 12:16:01 -080055 }
56
57 virtual void TearDown()
58 {
Marissa Wall1db2e372016-12-15 12:19:39 -080059
60 for (auto itr = mLayers.begin(); itr != mLayers.end();) {
61 hwc2_display_t display = itr->first;
62 hwc2_layer_t layer = itr->second;
63 itr++;
64 /* Destroys and removes the layer from mLayers */
65 destroyLayer(display, layer);
66 }
67
Marissa Wall03c91732016-12-15 12:23:16 -080068 for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
69 hwc2_display_t display = *itr;
70 itr++;
71 /* Sets power mode to off and removes the display from
72 * mActiveDisplays */
73 setPowerMode(display, HWC2_POWER_MODE_OFF);
74 }
75
Marissa Wall4d600052016-12-15 12:16:01 -080076 if (mHwc2Device)
77 hwc2_close(mHwc2Device);
78 }
79
Marissa Walla4b01482017-02-17 20:52:03 -080080 void registerCallback(hwc2_callback_descriptor_t descriptor,
81 hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
82 hwc2_error_t* outErr = nullptr)
83 {
84 auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
85 getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
86 ASSERT_TRUE(pfn) << "failed to get function";
87
88 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
89 callbackData, pointer));
90 if (outErr) {
91 *outErr = err;
92 } else {
93 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
94 }
95 }
96
Marissa Wallcfb9a072017-02-17 20:53:18 -080097 void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
98 hwc2_error_t* outErr = nullptr)
99 {
100 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
101 getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
102 ASSERT_TRUE(pfn) << "failed to get function";
103
104 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
105 reinterpret_cast<int32_t*>(outType)));
106 if (outErr) {
107 *outErr = err;
108 } else {
109 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
110 }
111 }
112
113 /* If the populateDisplays function is still receiving displays and the
114 * display is connected, the display handle is stored in mDisplays. */
115 void hotplugCallback(hwc2_display_t display, int32_t connected)
116 {
117 std::lock_guard<std::mutex> lock(mHotplugMutex);
118
119 if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
120 return;
121
122 if (connected == HWC2_CONNECTION_CONNECTED)
123 mDisplays.insert(display);
124
125 mHotplugCv.notify_all();
126 }
127
Marissa Wall1db2e372016-12-15 12:19:39 -0800128 void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
129 hwc2_error_t* outErr = nullptr)
130 {
131 auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
132 getFunction(HWC2_FUNCTION_CREATE_LAYER));
133 ASSERT_TRUE(pfn) << "failed to get function";
134
135 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
136 outLayer));
137
138 if (err == HWC2_ERROR_NONE)
139 mLayers.insert(std::make_pair(display, *outLayer));
140
141 if (outErr) {
142 *outErr = err;
143 } else {
144 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
145 }
146 }
147
148 void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
149 hwc2_error_t* outErr = nullptr)
150 {
151 auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
152 getFunction(HWC2_FUNCTION_DESTROY_LAYER));
153 ASSERT_TRUE(pfn) << "failed to get function";
154
155 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
156
157 if (err == HWC2_ERROR_NONE)
158 mLayers.erase(std::make_pair(display, layer));
159
160 if (outErr) {
161 *outErr = err;
162 } else {
163 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
164 << layer;
165 }
166 }
167
Marissa Wallcf935cb2016-12-15 12:20:47 -0800168 void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
169 hwc2_attribute_t attribute, int32_t* outValue,
170 hwc2_error_t* outErr = nullptr)
171 {
172 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
173 getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
174 ASSERT_TRUE(pfn) << "failed to get function";
175
176 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
177 attribute, outValue));
178
179 if (outErr) {
180 *outErr = err;
181 } else {
182 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
183 << getAttributeName(attribute) << " for config " << config;
184 }
185 }
186
187 void getDisplayConfigs(hwc2_display_t display,
188 std::vector<hwc2_config_t>* outConfigs,
189 hwc2_error_t* outErr = nullptr)
190 {
191 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
192 getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
193 ASSERT_TRUE(pfn) << "failed to get function";
194
195 uint32_t numConfigs = 0;
196
197 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
198 &numConfigs, nullptr));
199
200 if (err == HWC2_ERROR_NONE) {
201 outConfigs->resize(numConfigs);
202
203 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
204 &numConfigs, outConfigs->data()));
205 }
206
207 if (outErr) {
208 *outErr = err;
209 } else {
210 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
211 " display " << display;
212 }
213 }
214
Marissa Wall93dc04f2016-12-15 12:21:46 -0800215 void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
216 hwc2_error_t* outErr = nullptr)
217 {
218 auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
219 getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
220 ASSERT_TRUE(pfn) << "failed to get function";
221
222 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
223 outConfig));
224 if (outErr) {
225 *outErr = err;
226 } else {
227 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
228 " display " << display;
229 }
230 }
231
232 void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
233 hwc2_error_t* outErr = nullptr)
234 {
235 auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
236 getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
237 ASSERT_TRUE(pfn) << "failed to get function";
238
239 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
240 if (outErr) {
241 *outErr = err;
242 } else {
243 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
244 << config;
245 }
246 }
247
Marissa Wall03c91732016-12-15 12:23:16 -0800248 void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
249 hwc2_error_t* outErr = nullptr)
250 {
251 auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
252 getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
253 ASSERT_TRUE(pfn) << "failed to get function";
254
255 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
256 outSupport));
257 if (outErr) {
258 *outErr = err;
259 } else {
260 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
261 " display " << display;
262 }
263 }
264
265 void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
266 hwc2_error_t* outErr = nullptr)
267 {
268 auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
269 getFunction(HWC2_FUNCTION_SET_POWER_MODE));
270 ASSERT_TRUE(pfn) << "failed to get function";
271
272 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
273 mode));
274 if (outErr) {
275 *outErr = err;
276 if (err != HWC2_ERROR_NONE)
277 return;
278 } else {
279 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
280 << getPowerModeName(mode) << " on display " << display;
281 }
282
283 if (mode == HWC2_POWER_MODE_OFF) {
284 mActiveDisplays.erase(display);
285 } else {
286 mActiveDisplays.insert(display);
287 }
288 }
289
Marissa Wall572a1ee2016-12-15 12:24:13 -0800290 void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
291 hwc2_error_t* outErr = nullptr)
292 {
293 auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
294 getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
295 ASSERT_TRUE(pfn) << "failed to get function";
296
297 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
298 enabled));
299 if (outErr) {
300 *outErr = err;
301 } else {
302 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
303 << getVsyncName(enabled);
304 }
305 }
306
307 void vsyncCallback(hwc2_display_t display, int64_t timestamp)
308 {
309 std::lock_guard<std::mutex> lock(mVsyncMutex);
310 mVsyncDisplay = display;
311 mVsyncTimestamp = timestamp;
312 mVsyncCv.notify_all();
313 }
314
Marissa Walldd4087f2016-12-15 12:24:52 -0800315 void getDisplayName(hwc2_display_t display, std::string* outName,
316 hwc2_error_t* outErr = nullptr)
317 {
318 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
319 getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
320 ASSERT_TRUE(pfn) << "failed to get function";
321
322 uint32_t size = 0;
323
324 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
325 nullptr));
326
327 if (err == HWC2_ERROR_NONE) {
328 std::vector<char> name(size);
329
330 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
331 name.data()));
332
333 outName->assign(name.data());
334 }
335
336 if (outErr) {
337 *outErr = err;
338 } else {
339 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
340 << display;
341 }
342 }
343
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800344 void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
345 hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
346 {
347 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
348 getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
349 ASSERT_TRUE(pfn) << "failed to get function";
350
351 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
352 composition));
353 if (outErr) {
354 *outErr = err;
355 } else {
356 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
357 " type " << getCompositionName(composition);
358 }
359 }
360
Marissa Wall2a0aaf92016-12-15 12:31:37 -0800361 void setCursorPosition(hwc2_display_t display, hwc2_layer_t layer,
362 int32_t x, int32_t y, hwc2_error_t* outErr = nullptr)
363 {
364 auto pfn = reinterpret_cast<HWC2_PFN_SET_CURSOR_POSITION>(
365 getFunction(HWC2_FUNCTION_SET_CURSOR_POSITION));
366 ASSERT_TRUE(pfn) << "failed to get function";
367
368 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, x,
369 y));
370 if (outErr) {
371 *outErr = err;
372 } else {
373 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set cursor position";
374 }
375 }
376
Marissa Wallffc67da2016-12-15 12:26:09 -0800377 void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
378 hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
379 {
380 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
381 getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
382 ASSERT_TRUE(pfn) << "failed to get function";
383
384 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
385 mode));
386 if (outErr) {
387 *outErr = err;
388 } else {
389 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
390 << getBlendModeName(mode);
391 }
392 }
393
Marissa Wallee242782016-12-15 12:30:12 -0800394 void setLayerColor(hwc2_display_t display, hwc2_layer_t layer,
395 hwc_color_t color, hwc2_error_t* outErr = nullptr)
396 {
397 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COLOR>(
398 getFunction(HWC2_FUNCTION_SET_LAYER_COLOR));
399 ASSERT_TRUE(pfn) << "failed to get function";
400
401 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
402 color));
403 if (outErr) {
404 *outErr = err;
405 } else {
406 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer color";
407 }
408 }
409
Marissa Wallb72b5c92016-12-15 12:26:39 -0800410 void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
411 android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
412 {
413 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
414 getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
415 ASSERT_TRUE(pfn) << "failed to get function";
416
417 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
418 layer, dataspace));
419 if (outErr) {
420 *outErr = err;
421 } else {
422 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
423 }
424 }
425
Marissa Wall600a73b2016-12-15 12:30:39 -0800426 void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
427 const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
428 {
429 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
430 getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
431 ASSERT_TRUE(pfn) << "failed to get function";
432
433 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
434 displayFrame));
435 if (outErr) {
436 *outErr = err;
437 } else {
438 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
439 " frame";
440 }
441 }
442
Marissa Wall2b1f5302016-12-15 12:27:20 -0800443 void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
444 float alpha, hwc2_error_t* outErr = nullptr)
445 {
446 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
447 getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
448 ASSERT_TRUE(pfn) << "failed to get function";
449
450 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
451 alpha));
452 if (outErr) {
453 *outErr = err;
454 } else {
455 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
456 << alpha;
457 }
458 }
459
Marissa Wallc57468f2016-12-15 12:31:12 -0800460 void setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer,
461 const hwc_frect_t& sourceCrop, hwc2_error_t* outErr = nullptr)
462 {
463 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
464 getFunction(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP));
465 ASSERT_TRUE(pfn) << "failed to get function";
466
467 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
468 sourceCrop));
469 if (outErr) {
470 *outErr = err;
471 } else {
472 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer source crop";
473 }
474 }
475
Marissa Wallad761812016-12-15 12:32:24 -0800476 void setLayerSurfaceDamage(hwc2_display_t display, hwc2_layer_t layer,
477 const hwc_region_t& surfaceDamage, hwc2_error_t* outErr = nullptr)
478 {
479 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
480 getFunction(HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE));
481 ASSERT_TRUE(pfn) << "failed to get function";
482
483 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
484 surfaceDamage));
485 if (outErr) {
486 *outErr = err;
487 } else {
488 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer surface"
489 " damage";
490 }
491 }
492
Marissa Wallac108192016-12-15 12:27:48 -0800493 void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
494 hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
495 {
496 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
497 getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
498 ASSERT_TRUE(pfn) << "failed to get function";
499
500 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
501 transform));
502 if (outErr) {
503 *outErr = err;
504 } else {
505 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
506 << getTransformName(transform);
507 }
508 }
509
Marissa Wall273b1df2016-12-15 12:28:47 -0800510 void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
511 uint32_t zOrder, hwc2_error_t* outErr = nullptr)
512 {
513 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
514 getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
515 ASSERT_TRUE(pfn) << "failed to get function";
516
517 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
518 zOrder));
519 if (outErr) {
520 *outErr = err;
521 } else {
522 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
523 << zOrder;
524 }
525 }
526
Marissa Wall4d600052016-12-15 12:16:01 -0800527protected:
528 hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
529 {
530 return mHwc2Device->getFunction(mHwc2Device, descriptor);
531 }
532
533 void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
534 {
535 uint32_t num = 0;
536
537 mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
538
539 outCapabilities->resize(num);
540
541 mHwc2Device->getCapabilities(mHwc2Device, &num,
542 reinterpret_cast<int32_t*>(outCapabilities->data()));
543 }
544
Marissa Wallcfb9a072017-02-17 20:53:18 -0800545 /* Registers a hotplug callback and waits for hotplug callbacks. This
546 * function will have no effect if called more than once. */
547 void populateDisplays()
548 {
549 /* Sets the hotplug status to receiving */
550 {
551 std::lock_guard<std::mutex> lock(mHotplugMutex);
552
553 if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
554 return;
555 mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
556 }
557
558 /* Registers the callback. This function call cannot be locked because
559 * a callback could happen on the same thread */
560 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
561 reinterpret_cast<hwc2_function_pointer_t>(
562 hwc2TestHotplugCallback)));
563
564 /* Waits for hotplug events. If a hotplug event has not come within 1
565 * second, stop waiting. */
566 std::unique_lock<std::mutex> lock(mHotplugMutex);
567
568 while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
569 std::cv_status::timeout) { }
570
571 /* Sets the hotplug status to done. Future calls will have no effect */
572 mHotplugStatus = Hwc2TestHotplugStatus::Done;
573 }
574
575 void getBadDisplay(hwc2_display_t* outDisplay)
576 {
577 for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
578 if (mDisplays.count(display) == 0) {
579 *outDisplay = display;
580 return;
581 }
582 }
583 ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
584 " are registered. This should never happen.";
585 }
586
Marissa Wall1db2e372016-12-15 12:19:39 -0800587 /* NOTE: will create min(newlayerCnt, max supported layers) layers */
588 void createLayers(hwc2_display_t display,
589 std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
590 {
591 std::vector<hwc2_layer_t> newLayers;
592 hwc2_layer_t layer;
593 hwc2_error_t err = HWC2_ERROR_NONE;
594
595 for (size_t i = 0; i < newLayerCnt; i++) {
596
597 EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
598 if (err == HWC2_ERROR_NO_RESOURCES)
599 break;
600 if (err != HWC2_ERROR_NONE) {
601 newLayers.clear();
602 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
603 }
604 newLayers.push_back(layer);
605 }
606
607 *outLayers = std::move(newLayers);
608 }
609
610 void destroyLayers(hwc2_display_t display,
611 std::vector<hwc2_layer_t>&& layers)
612 {
613 for (hwc2_layer_t layer : layers) {
614 EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
615 }
616 }
617
Marissa Wallcf935cb2016-12-15 12:20:47 -0800618 void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
619 {
620 std::vector<hwc2_config_t> configs;
621
622 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
623
624 hwc2_config_t CONFIG_MAX = UINT32_MAX;
625
626 ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
627 " (2^32 values) has been taken which shouldn't happen";
628
629 hwc2_config_t config;
630 for (config = 0; config < CONFIG_MAX; config++) {
631 if (std::count(configs.begin(), configs.end(), config) == 0)
632 break;
633 }
634
635 *outConfig = config;
636 }
637
Marissa Wall572a1ee2016-12-15 12:24:13 -0800638 void enableVsync(hwc2_display_t display)
639 {
640 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
641 reinterpret_cast<hwc2_function_pointer_t>(
642 hwc2TestVsyncCallback)));
643 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
644 }
645
646 void disableVsync(hwc2_display_t display)
647 {
648 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
649 }
650
651 void waitForVsync(hwc2_display_t* outDisplay = nullptr,
652 int64_t* outTimestamp = nullptr)
653 {
654 std::unique_lock<std::mutex> lock(mVsyncMutex);
655 ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
656 std::cv_status::no_timeout) << "timed out attempting to get"
657 " vsync callback";
658 if (outDisplay)
659 *outDisplay = mVsyncDisplay;
660 if (outTimestamp)
661 *outTimestamp = mVsyncTimestamp;
662 }
663
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800664 /* Calls a set property function from Hwc2Test to set a property value from
665 * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
666 using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
667 hwc2_display_t display, hwc2_layer_t layer,
668 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
669
Marissa Wall273b1df2016-12-15 12:28:47 -0800670 /* Calls a set property function from Hwc2Test to set property values from
671 * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
672 using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
673 hwc2_display_t display, hwc2_layer_t layer,
674 const Hwc2TestLayers& testLayers);
675
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800676 /* Calls a set property function from Hwc2Test to set a bad property value
677 * on hwc2_layer_t on hwc2_display_t */
678 using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
679 hwc2_display_t display, hwc2_layer_t layer,
680 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
681
682 /* Calls a set property function from Hwc2Test to set a bad property value
683 * on hwc2_layer_t on hwc2_display_t */
684 using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
685 hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
686
687 /* Advances a property of Hwc2TestLayer */
688 using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
689
690 /* For each active display it cycles through each display config and tests
691 * each property value. It creates a layer, sets the property and then
692 * destroys the layer */
693 void setLayerProperty(Hwc2TestCoverage coverage,
694 TestLayerPropertyFunction function, AdvanceProperty advance)
695 {
696 for (auto display : mDisplays) {
697 std::vector<hwc2_config_t> configs;
698
699 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
700
701 for (auto config : configs) {
702 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -0800703 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800704
705 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800706 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
707 &displayArea));
708 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800709
710 do {
711 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
712
713 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
714 testLayer, nullptr));
715
716 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
717 } while (advance(&testLayer));
718 }
719 }
720 }
721
722 /* For each active display it cycles through each display config and tests
723 * each property value. It creates a layer, cycles through each property
724 * value and updates the layer property value and then destroys the layer */
725 void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
726 TestLayerPropertyFunction function, AdvanceProperty advance)
727 {
728 for (auto display : mDisplays) {
729 std::vector<hwc2_config_t> configs;
730
731 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
732
733 for (auto config : configs) {
734 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -0800735 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800736
737 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800738 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
739 &displayArea));
740 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800741
742 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
743
744 do {
745 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
746 testLayer, nullptr));
747 } while (advance(&testLayer));
748
749 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
750 }
751 }
752 }
753
Marissa Wall273b1df2016-12-15 12:28:47 -0800754 /* For each active display it cycles through each display config and tests
755 * each property value. It creates multiple layers, calls the
756 * TestLayerPropertiesFunction to set property values and then
757 * destroys the layers */
758 void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
759 TestLayerPropertiesFunction function)
760 {
761 for (auto display : mDisplays) {
762 std::vector<hwc2_config_t> configs;
763
764 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
765
766 for (auto config : configs) {
767 std::vector<hwc2_layer_t> layers;
Marissa Wall600a73b2016-12-15 12:30:39 -0800768 Area displayArea;
Marissa Wall273b1df2016-12-15 12:28:47 -0800769
770 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800771 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
772 &displayArea));
Marissa Wall273b1df2016-12-15 12:28:47 -0800773
774 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
Marissa Wall600a73b2016-12-15 12:30:39 -0800775 Hwc2TestLayers testLayers(layers, coverage, displayArea);
Marissa Wall273b1df2016-12-15 12:28:47 -0800776
777 for (auto layer : layers) {
778 EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
779 testLayers));
780 }
781
782 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
783 }
784 }
785 }
786
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800787 /* For each active display it cycles through each display config.
788 * 1) It attempts to set a valid property value to bad layer handle.
789 * 2) It creates a layer x and attempts to set a valid property value to
790 * layer x + 1
791 * 3) It destroys the layer x and attempts to set a valid property value to
792 * the destroyed layer x.
793 */
794 void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
795 TestLayerPropertyBadLayerFunction function)
796 {
797 for (auto display : mDisplays) {
798 std::vector<hwc2_config_t> configs;
799
800 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
801
802 for (auto config : configs) {
803 hwc2_layer_t layer = 0;
Marissa Wall600a73b2016-12-15 12:30:39 -0800804 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800805 hwc2_error_t err = HWC2_ERROR_NONE;
806
807 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800808 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
809 &displayArea));
810 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800811
812 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
813 testLayer, &err));
814 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
815
816 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
817
818 ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
819 testLayer, &err));
820 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
821
822 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
823
824 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
825 testLayer, &err));
826 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
827 }
828 }
829 }
830
831 /* For each active display it cycles through each display config and tests
832 * each property value. It creates a layer, sets a bad property value and
833 * then destroys the layer */
834 void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
835 {
836 for (auto display : mDisplays) {
837 std::vector<hwc2_config_t> configs;
838
839 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
840
841 for (auto config : configs) {
842 hwc2_layer_t layer;
843 hwc2_error_t err = HWC2_ERROR_NONE;
844
845 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
846
847 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
848
849 ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
850 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
851 " error code";
852
853 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
854 }
855 }
856 }
857
Marissa Wall600a73b2016-12-15 12:30:39 -0800858 void getActiveConfigAttribute(hwc2_display_t display,
859 hwc2_attribute_t attribute, int32_t* outValue)
860 {
861 hwc2_config_t config;
862 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
863 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
864 attribute, outValue));
865 ASSERT_GE(*outValue, 0) << "failed to get valid "
866 << getAttributeName(attribute);
867 }
868
869 void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
870 {
871 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
872 HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
873 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
874 HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
875 }
876
Marissa Wall4d600052016-12-15 12:16:01 -0800877 hwc2_device_t* mHwc2Device = nullptr;
Marissa Wallcfb9a072017-02-17 20:53:18 -0800878
879 enum class Hwc2TestHotplugStatus {
880 Init = 1,
881 Receiving,
882 Done,
883 };
884
885 std::mutex mHotplugMutex;
886 std::condition_variable mHotplugCv;
887 Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
888 std::unordered_set<hwc2_display_t> mDisplays;
Marissa Wall1db2e372016-12-15 12:19:39 -0800889
890 /* Store all created layers that have not been destroyed. If an ASSERT_*
891 * fails, then destroy the layers on exit */
892 std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
Marissa Wall03c91732016-12-15 12:23:16 -0800893
894 /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
895 * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
896 std::set<hwc2_display_t> mActiveDisplays;
Marissa Wall572a1ee2016-12-15 12:24:13 -0800897
898 std::mutex mVsyncMutex;
899 std::condition_variable mVsyncCv;
900 hwc2_display_t mVsyncDisplay;
901 int64_t mVsyncTimestamp = -1;
Marissa Wall4d600052016-12-15 12:16:01 -0800902};
903
Marissa Wallcfb9a072017-02-17 20:53:18 -0800904void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
905 hwc2_display_t display, int32_t connection)
906{
907 if (callbackData)
908 static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
909 connection);
910}
911
Marissa Wall572a1ee2016-12-15 12:24:13 -0800912void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
913 hwc2_display_t display, int64_t timestamp)
914{
915 if (callbackData)
916 static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
917 timestamp);
918}
919
Marissa Wallffc67da2016-12-15 12:26:09 -0800920void setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
921 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
922{
923 EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
924 testLayer.getBlendMode(), outErr));
925}
926
Marissa Wallee242782016-12-15 12:30:12 -0800927void setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
928 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
929{
930 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
931 layer, HWC2_COMPOSITION_SOLID_COLOR));
932 ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
933 layer, testLayer.getPlaneAlpha()));
934 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
935 layer, testLayer.getBlendMode()));
936 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
937 testLayer.getColor(), outErr));
938}
939
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800940void setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
941 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
942{
943 hwc2_composition_t composition = testLayer.getComposition();
944 hwc2_error_t err = HWC2_ERROR_NONE;
945
946 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
947 composition, &err));
948 if (outErr) {
949 *outErr = err;
950 return;
951 }
952
953 if (composition != HWC2_COMPOSITION_SIDEBAND) {
954 EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
955 } else {
956 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
957 << "returned wrong error code";
958 }
959}
960
Marissa Wall2a0aaf92016-12-15 12:31:37 -0800961void setCursorPosition(Hwc2Test* test, hwc2_display_t display,
962 hwc2_layer_t layer, const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
963{
964 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
965 layer, HWC2_COMPOSITION_CURSOR));
966
967 const hwc_rect_t cursorPosition = testLayer.getCursorPosition();
968 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
969 cursorPosition.left, cursorPosition.top, outErr));
970}
971
Marissa Wallb72b5c92016-12-15 12:26:39 -0800972void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
973 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
974{
975 EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
976 testLayer.getDataspace(), outErr));
977}
978
Marissa Wall600a73b2016-12-15 12:30:39 -0800979void setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
980 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
981{
982 EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
983 testLayer.getDisplayFrame(), outErr));
984}
985
Marissa Wall2b1f5302016-12-15 12:27:20 -0800986void setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
987 const Hwc2TestLayer& testLayer, hwc2_error_t *outErr)
988{
989 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
990 testLayer.getBlendMode()));
991 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
992 testLayer.getPlaneAlpha(), outErr));
993}
994
Marissa Wallc57468f2016-12-15 12:31:12 -0800995void setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
996 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
997{
998 EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
999 testLayer.getSourceCrop(), outErr));
1000}
1001
Marissa Wallad761812016-12-15 12:32:24 -08001002void setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1003 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
1004{
1005 EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
1006 testLayer.getSurfaceDamage(), outErr));
1007}
1008
Marissa Wallac108192016-12-15 12:27:48 -08001009void setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1010 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
1011{
1012 EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
1013 testLayer.getTransform(), outErr));
1014}
1015
Marissa Wall273b1df2016-12-15 12:28:47 -08001016void setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1017 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
1018{
1019 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
1020 testLayer.getZOrder(), outErr));
1021}
1022
Marissa Wallffc67da2016-12-15 12:26:09 -08001023bool advanceBlendMode(Hwc2TestLayer* testLayer)
1024{
1025 return testLayer->advanceBlendMode();
1026}
1027
Marissa Wallee242782016-12-15 12:30:12 -08001028bool advanceColor(Hwc2TestLayer* testLayer)
1029{
1030 /* Color depends on blend mode so advance blend mode last so color is not
1031 * force to update as often */
1032 if (testLayer->advancePlaneAlpha())
1033 return true;
1034 if (testLayer->advanceColor())
1035 return true;
1036 return testLayer->advanceBlendMode();
1037}
1038
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001039bool advanceComposition(Hwc2TestLayer* testLayer)
1040{
1041 return testLayer->advanceComposition();
1042}
1043
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001044bool advanceCursorPosition(Hwc2TestLayer* testLayer)
1045{
1046 return testLayer->advanceCursorPosition();
1047}
1048
Marissa Wallb72b5c92016-12-15 12:26:39 -08001049bool advanceDataspace(Hwc2TestLayer* testLayer)
1050{
1051 return testLayer->advanceDataspace();
1052}
1053
Marissa Wall600a73b2016-12-15 12:30:39 -08001054bool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1055{
1056 return testLayer->advanceDisplayFrame();
1057}
1058
Marissa Wall2b1f5302016-12-15 12:27:20 -08001059bool advancePlaneAlpha(Hwc2TestLayer* testLayer)
1060{
1061 return testLayer->advancePlaneAlpha();
1062}
1063
Marissa Wallc57468f2016-12-15 12:31:12 -08001064bool advanceSourceCrop(Hwc2TestLayer* testLayer)
1065{
1066 if (testLayer->advanceSourceCrop())
1067 return true;
1068 return testLayer->advanceBufferArea();
1069}
1070
Marissa Wallad761812016-12-15 12:32:24 -08001071bool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
1072{
1073 if (testLayer->advanceSurfaceDamage())
1074 return true;
1075 return testLayer->advanceBufferArea();
1076}
1077
Marissa Wallac108192016-12-15 12:27:48 -08001078bool advanceTransform(Hwc2TestLayer* testLayer)
1079{
1080 return testLayer->advanceTransform();
1081}
1082
Marissa Wall4d600052016-12-15 12:16:01 -08001083
1084static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
1085 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
1086 HWC2_FUNCTION_CREATE_LAYER,
1087 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
1088 HWC2_FUNCTION_DESTROY_LAYER,
1089 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
1090 HWC2_FUNCTION_DUMP,
1091 HWC2_FUNCTION_GET_ACTIVE_CONFIG,
1092 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
1093 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
1094 HWC2_FUNCTION_GET_COLOR_MODES,
1095 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
1096 HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
1097 HWC2_FUNCTION_GET_DISPLAY_NAME,
1098 HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
1099 HWC2_FUNCTION_GET_DISPLAY_TYPE,
1100 HWC2_FUNCTION_GET_DOZE_SUPPORT,
1101 HWC2_FUNCTION_GET_HDR_CAPABILITIES,
1102 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
1103 HWC2_FUNCTION_GET_RELEASE_FENCES,
1104 HWC2_FUNCTION_PRESENT_DISPLAY,
1105 HWC2_FUNCTION_REGISTER_CALLBACK,
1106 HWC2_FUNCTION_SET_ACTIVE_CONFIG,
1107 HWC2_FUNCTION_SET_CLIENT_TARGET,
1108 HWC2_FUNCTION_SET_COLOR_MODE,
1109 HWC2_FUNCTION_SET_COLOR_TRANSFORM,
1110 HWC2_FUNCTION_SET_CURSOR_POSITION,
1111 HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
1112 HWC2_FUNCTION_SET_LAYER_BUFFER,
1113 HWC2_FUNCTION_SET_LAYER_COLOR,
1114 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
1115 HWC2_FUNCTION_SET_LAYER_DATASPACE,
1116 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
1117 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
1118 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
1119 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
1120 HWC2_FUNCTION_SET_LAYER_TRANSFORM,
1121 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
1122 HWC2_FUNCTION_SET_LAYER_Z_ORDER,
1123 HWC2_FUNCTION_SET_OUTPUT_BUFFER,
1124 HWC2_FUNCTION_SET_POWER_MODE,
1125 HWC2_FUNCTION_SET_VSYNC_ENABLED,
1126 HWC2_FUNCTION_VALIDATE_DISPLAY,
1127}};
1128
1129/* TESTCASE: Tests that the HWC2 supports all required functions. */
1130TEST_F(Hwc2Test, GET_FUNCTION)
1131{
1132 for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
1133 hwc2_function_pointer_t pfn = getFunction(descriptor);
1134 EXPECT_TRUE(pfn) << "failed to get function "
1135 << getFunctionDescriptorName(descriptor);
1136 }
1137}
1138
1139/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
1140TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
1141{
1142 hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
1143 EXPECT_FALSE(pfn) << "failed to get invalid function";
1144}
1145
1146/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
1147TEST_F(Hwc2Test, GET_CAPABILITIES)
1148{
1149 std::vector<hwc2_capability_t> capabilities;
1150
1151 getCapabilities(&capabilities);
1152
1153 EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
1154 HWC2_CAPABILITY_INVALID), 0);
1155}
Marissa Walla4b01482017-02-17 20:52:03 -08001156
1157static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1158 HWC2_CALLBACK_HOTPLUG,
1159 HWC2_CALLBACK_REFRESH,
1160 HWC2_CALLBACK_VSYNC,
1161}};
1162
1163/* TESTCASE: Tests that the HWC2 can successfully register all required
1164 * callback functions. */
1165TEST_F(Hwc2Test, REGISTER_CALLBACK)
1166{
1167 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1168 const_cast<char*>("data"));
1169
1170 for (auto descriptor : callbackDescriptors) {
1171 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1172 []() { return; }));
1173 }
1174}
1175
1176/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1177TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1178{
1179 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1180 const_cast<char*>("data"));
1181 hwc2_error_t err = HWC2_ERROR_NONE;
1182
1183 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1184 []() { return; }, &err));
1185 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1186}
1187
1188/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
1189TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
1190{
1191 hwc2_callback_data_t data = nullptr;
1192
1193 for (auto descriptor : callbackDescriptors) {
1194 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1195 []() { return; }));
1196 }
1197}
Marissa Wallcfb9a072017-02-17 20:53:18 -08001198
1199/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1200 * physical display. */
1201TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1202{
1203 for (auto display : mDisplays) {
1204 hwc2_display_type_t type;
1205
1206 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1207 EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1208 " correct display type";
1209 }
1210}
1211
1212/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1213 * display is requested. */
1214TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1215{
1216 hwc2_display_t display;
1217 hwc2_display_type_t type;
1218 hwc2_error_t err = HWC2_ERROR_NONE;
1219
1220 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1221
1222 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1223 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1224}
Marissa Wall1db2e372016-12-15 12:19:39 -08001225
1226/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
1227TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
1228{
1229 for (auto display : mDisplays) {
1230 hwc2_layer_t layer;
1231
1232 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1233
1234 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1235 }
1236}
1237
1238/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
1239TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
1240{
1241 hwc2_display_t display;
1242 hwc2_layer_t layer;
1243 hwc2_error_t err = HWC2_ERROR_NONE;
1244
1245 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1246
1247 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
1248 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1249}
1250
1251/* TESTCASE: Tests that the HWC2 will either support a large number of resources
1252 * or will return no resources. */
1253TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
1254{
1255 const size_t layerCnt = 1000;
1256
1257 for (auto display : mDisplays) {
1258 std::vector<hwc2_layer_t> layers;
1259
1260 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1261
1262 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1263 }
1264}
1265
1266/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
1267TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
1268{
1269 hwc2_display_t badDisplay;
1270
1271 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
1272
1273 for (auto display : mDisplays) {
1274 hwc2_layer_t layer = 0;
1275 hwc2_error_t err = HWC2_ERROR_NONE;
1276
1277 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1278 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1279
1280 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1281
1282 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1283 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1284
1285 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1286 }
1287}
1288
1289/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
1290TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
1291{
1292 for (auto display : mDisplays) {
1293 hwc2_layer_t layer;
1294 hwc2_error_t err = HWC2_ERROR_NONE;
1295
1296 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
1297 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1298
1299 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
1300 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1301
1302 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
1303 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1304
1305 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
1306 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1307
1308 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
1309 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1310
1311 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1312
1313 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
1314 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1315
1316 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1317
1318 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
1319 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1320 }
1321}
Marissa Wallcf935cb2016-12-15 12:20:47 -08001322
1323static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1324 HWC2_ATTRIBUTE_WIDTH,
1325 HWC2_ATTRIBUTE_HEIGHT,
1326}};
1327
1328static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1329 HWC2_ATTRIBUTE_VSYNC_PERIOD,
1330 HWC2_ATTRIBUTE_DPI_X,
1331 HWC2_ATTRIBUTE_DPI_Y,
1332}};
1333
1334/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1335 * config. */
1336TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1337{
1338 for (auto display : mDisplays) {
1339 std::vector<hwc2_config_t> configs;
1340
1341 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1342
1343 for (auto config : configs) {
1344 int32_t value;
1345
1346 for (auto attribute : requiredAttributes) {
1347 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1348 attribute, &value));
1349 EXPECT_GE(value, 0) << "missing required attribute "
1350 << getAttributeName(attribute) << " for config "
1351 << config;
1352 }
1353 for (auto attribute : optionalAttributes) {
1354 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1355 attribute, &value));
1356 }
1357 }
1358 }
1359}
1360
1361/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1362 * attribute */
1363TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1364{
1365 const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1366
1367 for (auto display : mDisplays) {
1368 std::vector<hwc2_config_t> configs;
1369
1370 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1371
1372 for (auto config : configs) {
1373 int32_t value;
1374 hwc2_error_t err = HWC2_ERROR_NONE;
1375
1376 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1377 attribute, &value, &err));
1378 EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1379 " attribute for config " << config;
1380 }
1381 }
1382}
1383
1384/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1385TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1386{
1387 hwc2_display_t display;
1388 const hwc2_config_t config = 0;
1389 int32_t value;
1390 hwc2_error_t err = HWC2_ERROR_NONE;
1391
1392 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1393
1394 for (auto attribute : requiredAttributes) {
1395 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1396 &value, &err));
1397 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1398 }
1399
1400 for (auto attribute : optionalAttributes) {
1401 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1402 &value, &err));
1403 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1404 }
1405}
1406
1407/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1408TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1409{
1410 for (auto display : mDisplays) {
1411 hwc2_config_t config;
1412 int32_t value;
1413 hwc2_error_t err = HWC2_ERROR_NONE;
1414
1415 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1416
1417 for (auto attribute : requiredAttributes) {
1418 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1419 attribute, &value, &err));
1420 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1421 }
1422
1423 for (auto attribute : optionalAttributes) {
1424 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1425 attribute, &value, &err));
1426 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1427 }
1428 }
1429}
1430
1431/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1432TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1433{
1434 for (auto display : mDisplays) {
1435 std::vector<hwc2_config_t> configs;
1436
1437 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1438 }
1439}
1440
1441/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1442TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1443{
1444 hwc2_display_t display;
1445 std::vector<hwc2_config_t> configs;
1446 hwc2_error_t err = HWC2_ERROR_NONE;
1447
1448 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1449
1450 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1451
1452 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1453 EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1454}
1455
1456/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1457 * times in a row. */
1458TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1459{
1460 for (auto display : mDisplays) {
1461 std::vector<hwc2_config_t> configs1, configs2;
1462
1463 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
1464 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
1465
1466 EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
1467 configs2.begin())) << "returned two different config sets";
1468 }
1469}
1470
1471/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
1472TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
1473{
1474 for (auto display : mDisplays) {
1475 std::vector<hwc2_config_t> configs;
1476
1477 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1478
1479 std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
1480 configs.end());
1481 EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
1482 " configs";
1483 }
1484}
Marissa Wall93dc04f2016-12-15 12:21:46 -08001485
1486/* TESTCASE: Tests that the HWC2 returns the active config for a display */
1487TEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
1488{
1489 for (auto display : mDisplays) {
1490 std::vector<hwc2_config_t> configs;
1491
1492 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1493
1494 for (auto config : configs) {
1495 hwc2_config_t activeConfig;
1496
1497 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1498 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
1499
1500 EXPECT_EQ(activeConfig, config) << "failed to get active config";
1501 }
1502 }
1503}
1504
1505/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
1506 * display. */
1507TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
1508{
1509 hwc2_display_t display;
1510 hwc2_config_t activeConfig;
1511 hwc2_error_t err = HWC2_ERROR_NONE;
1512
1513 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1514
1515 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1516
1517 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1518}
1519
1520/* TESTCASE: Tests that the HWC2 either begins with a valid active config
1521 * or returns an error when getActiveConfig is called. */
1522TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
1523{
1524 for (auto display : mDisplays) {
1525 std::vector<hwc2_config_t> configs;
1526 hwc2_config_t activeConfig;
1527 hwc2_error_t err = HWC2_ERROR_NONE;
1528
1529 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1530
1531 if (configs.empty())
1532 return;
1533
1534 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1535 if (err == HWC2_ERROR_NONE) {
1536 EXPECT_NE(std::count(configs.begin(), configs.end(),
1537 activeConfig), 0) << "active config is not found in "
1538 " configs for display";
1539 } else {
1540 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1541 }
1542 }
1543}
1544
1545/* TESTCASE: Tests that the HWC2 can set every display config as an active
1546 * config */
1547TEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
1548{
1549 for (auto display : mDisplays) {
1550 std::vector<hwc2_config_t> configs;
1551
1552 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1553
1554 for (auto config : configs) {
1555 EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1556 }
1557 }
1558}
1559
1560/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
1561TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
1562{
1563 hwc2_display_t display;
1564 const hwc2_config_t config = 0;
1565 hwc2_error_t err = HWC2_ERROR_NONE;
1566
1567 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1568
1569 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
1570 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1571}
1572
1573/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
1574TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
1575{
1576 for (auto display : mDisplays) {
1577 hwc2_config_t config;
1578 hwc2_error_t err = HWC2_ERROR_NONE;
1579
1580 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1581
1582 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
1583 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1584 }
1585}
Marissa Wall03c91732016-12-15 12:23:16 -08001586
1587/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
1588TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
1589{
1590 for (auto display : mDisplays) {
1591 int32_t support = -1;
1592
1593 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1594
1595 EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
1596 }
1597}
1598
1599/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
1600TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
1601{
1602 hwc2_display_t display;
1603 int32_t support = -1;
1604 hwc2_error_t err = HWC2_ERROR_NONE;
1605
1606 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1607
1608 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1609
1610 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1611}
1612
1613/* TESTCASE: Tests that the HWC2 can set all supported power modes */
1614TEST_F(Hwc2Test, SET_POWER_MODE)
1615{
1616 for (auto display : mDisplays) {
1617 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1618 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1619
1620 int32_t support = -1;
1621 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1622 if (support != 1)
1623 return;
1624
1625 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1626 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1627 HWC2_POWER_MODE_DOZE_SUSPEND));
1628
1629 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1630 }
1631}
1632
1633/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
1634TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
1635{
1636 hwc2_display_t display;
1637 hwc2_error_t err = HWC2_ERROR_NONE;
1638
1639 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1640
1641 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
1642 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1643
1644 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
1645 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1646
1647 int32_t support = -1;
1648 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1649 if (support != 1)
1650 return;
1651
1652 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
1653 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1654
1655 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
1656 &err));
1657 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1658}
1659
1660/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
1661TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
1662{
1663 for (auto display : mDisplays) {
1664 hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
1665 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
1666 hwc2_error_t err = HWC2_ERROR_NONE;
1667
1668 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
1669 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
1670 << mode;
1671 }
1672}
1673
1674/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
1675 * an optional power mode. */
1676TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
1677{
1678 for (auto display : mDisplays) {
1679 int32_t support = -1;
1680 hwc2_error_t err = HWC2_ERROR_NONE;
1681
1682 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1683 if (support == 1)
1684 return;
1685
1686 ASSERT_EQ(support, 0) << "invalid doze support value";
1687
1688 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
1689 &err));
1690 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1691
1692 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1693 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
1694 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1695 }
1696}
1697
1698/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
1699TEST_F(Hwc2Test, SET_POWER_MODE_stress)
1700{
1701 for (auto display : mDisplays) {
1702 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1703 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1704
1705 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1706 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1707
1708 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1709 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1710
1711 int32_t support = -1;
1712 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1713 if (support != 1)
1714 return;
1715
1716 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1717 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1718
1719 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1720 HWC2_POWER_MODE_DOZE_SUSPEND));
1721 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1722 HWC2_POWER_MODE_DOZE_SUSPEND));
1723
1724 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1725 }
1726}
Marissa Wall572a1ee2016-12-15 12:24:13 -08001727
1728/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
1729 * displays */
1730TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
1731{
1732 for (auto display : mDisplays) {
1733 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1734 const_cast<char*>("data"));
1735
1736 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1737
1738 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1739 []() { return; }));
1740
1741 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1742
1743 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1744
1745 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1746 }
1747}
1748
1749/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
1750TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
1751{
1752 for (auto display : mDisplays) {
1753 hwc2_display_t receivedDisplay;
1754 int64_t receivedTimestamp;
1755
1756 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1757
1758 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1759
1760 ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
1761 &receivedTimestamp));
1762
1763 EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
1764 EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
1765
1766 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1767
1768 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1769 }
1770}
1771
1772/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
1773TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
1774{
1775 hwc2_display_t display;
1776 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1777 const_cast<char*>("data"));
1778 hwc2_error_t err = HWC2_ERROR_NONE;
1779
1780 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1781
1782 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1783 []() { return; }));
1784
1785 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
1786 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1787
1788 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
1789 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1790}
1791
1792/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
1793TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
1794{
1795 for (auto display : mDisplays) {
1796 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1797 const_cast<char*>("data"));
1798 hwc2_error_t err = HWC2_ERROR_NONE;
1799
1800 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1801
1802 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1803 []() { return; }));
1804
1805 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
1806 &err));
1807 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1808
1809 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1810 }
1811}
1812
1813/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
1814 * times. */
1815TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
1816{
1817 for (auto display : mDisplays) {
1818 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1819 const_cast<char*>("data"));
1820
1821 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1822
1823 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1824 []() { return; }));
1825
1826 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1827
1828 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1829 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1830
1831 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1832 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1833
1834 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1835 }
1836}
1837
1838/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
1839 * is off and no callback is registered. */
1840TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
1841{
1842 const uint secs = 1;
1843
1844 for (auto display : mDisplays) {
1845 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1846
1847 sleep(secs);
1848
1849 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1850 }
1851}
1852
1853/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
1854 * is registered. */
1855TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
1856{
1857 const uint secs = 1;
1858
1859 for (auto display : mDisplays) {
1860 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1861
1862 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1863
1864 sleep(secs);
1865
1866 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1867
1868 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1869 }
1870}
Marissa Walldd4087f2016-12-15 12:24:52 -08001871
1872/* TESTCASE: Tests that the HWC2 returns a display name for each display */
1873TEST_F(Hwc2Test, GET_DISPLAY_NAME)
1874{
1875 for (auto display : mDisplays) {
1876 std::string name;
1877
1878 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
1879 }
1880}
1881
1882/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
1883 * display */
1884TEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
1885{
1886 hwc2_display_t display;
1887 std::string name;
1888 hwc2_error_t err = HWC2_ERROR_NONE;
1889
1890 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1891
1892 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
1893 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1894}
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001895
1896/* TESTCASE: Tests that the HWC2 can set basic composition types. */
1897TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
1898{
1899 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1900 setComposition, advanceComposition));
1901}
1902
1903/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
1904 * layer. */
1905TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
1906{
1907 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1908 setComposition, advanceComposition));
1909}
1910
1911/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
1912TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
1913{
1914 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1915 setComposition));
1916}
1917
1918/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
1919TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
1920{
1921 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
1922 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1923 hwc2_error_t* outErr) {
1924
1925 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1926 layer, HWC2_COMPOSITION_INVALID, outErr));
1927 }
1928 ));
1929}
Marissa Wallffc67da2016-12-15 12:26:09 -08001930
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001931/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
1932TEST_F(Hwc2Test, SET_CURSOR_POSITION)
1933{
1934 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1935 ::setCursorPosition, advanceCursorPosition));
1936}
1937
1938/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
1939TEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
1940{
1941 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1942 ::setCursorPosition, advanceCursorPosition));
1943}
1944
1945/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
1946 * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
1947TEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
1948{
1949 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1950 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1951 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) {
1952
1953 const hwc_rect_t cursorPosition = testLayer.getCursorPosition();
1954 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
1955 cursorPosition.left, cursorPosition.top, outErr));
1956 },
1957
1958 advanceCursorPosition));
1959}
1960
1961/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
1962 * display. */
1963TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
1964{
1965 hwc2_display_t display;
1966 hwc2_layer_t layer = 0;
1967 int32_t x = 0, y = 0;
1968 hwc2_error_t err = HWC2_ERROR_NONE;
1969
1970 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1971
1972 ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
1973 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1974}
1975
1976/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
1977TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
1978{
1979 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1980 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
1981 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) {
1982
1983 const hwc_rect_t cursorPosition = testLayer.getCursorPosition();
1984 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
1985 badLayer, cursorPosition.left, cursorPosition.top,
1986 outErr));
1987 }
1988 ));
1989}
1990
Marissa Wallffc67da2016-12-15 12:26:09 -08001991/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
1992TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
1993{
1994 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1995 setBlendMode, advanceBlendMode));
1996}
1997
1998/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
1999TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
2000{
2001 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2002 setBlendMode, advanceBlendMode));
2003}
2004
2005/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
2006TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
2007{
2008 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2009 setBlendMode));
2010}
2011
2012/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
2013TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
2014{
2015 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2016 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2017 hwc2_error_t* outErr) {
2018
2019 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
2020 layer, HWC2_BLEND_MODE_INVALID, outErr));
2021 }
2022 ));
2023}
Marissa Wallb72b5c92016-12-15 12:26:39 -08002024
Marissa Wallee242782016-12-15 12:30:12 -08002025/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
2026TEST_F(Hwc2Test, SET_LAYER_COLOR)
2027{
2028 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2029 setColor, advanceColor));
2030}
2031
2032/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
2033TEST_F(Hwc2Test, SET_LAYER_COLOR_update)
2034{
2035 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2036 setColor, advanceColor));
2037}
2038
2039/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
2040 * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
2041TEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
2042{
2043 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
2044 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2045 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) {
2046
2047 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
2048 testLayer.getColor(), outErr));
2049 },
2050
2051 advanceColor));
2052}
2053
2054/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
2055TEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
2056{
2057 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2058 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
2059 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) {
2060
2061 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
2062 testLayer.getColor(), outErr));
2063 }
2064 ));
2065}
2066
Marissa Wallb72b5c92016-12-15 12:26:39 -08002067/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
2068TEST_F(Hwc2Test, SET_LAYER_DATASPACE)
2069{
2070 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2071 setDataspace, advanceDataspace));
2072}
2073
2074/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
2075TEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
2076{
2077 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2078 setDataspace, advanceDataspace));
2079}
2080
2081/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
2082TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
2083{
2084 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2085 setDataspace));
2086}
Marissa Wall2b1f5302016-12-15 12:27:20 -08002087
Marissa Wall600a73b2016-12-15 12:30:39 -08002088/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
2089TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
2090{
2091 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2092 setDisplayFrame, advanceDisplayFrame));
2093}
2094
2095/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
2096TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
2097{
2098 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2099 setDisplayFrame, advanceDisplayFrame));
2100}
2101
2102/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
2103TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
2104{
2105 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2106 setDisplayFrame));
2107}
2108
Marissa Wall2b1f5302016-12-15 12:27:20 -08002109/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
2110TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
2111{
2112 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2113 setPlaneAlpha, advancePlaneAlpha));
2114}
2115
2116/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
2117TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
2118{
2119 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2120 setPlaneAlpha, advancePlaneAlpha));
2121}
2122
2123/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
2124TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
2125{
2126 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2127 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
2128 const Hwc2TestLayer& testLayer, hwc2_error_t *outErr) {
2129
2130 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
2131 badLayer, testLayer.getPlaneAlpha(), outErr));
2132 }
2133 ));
2134}
Marissa Wallac108192016-12-15 12:27:48 -08002135
Marissa Wallc57468f2016-12-15 12:31:12 -08002136/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
2137TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
2138{
2139 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2140 setSourceCrop, advanceSourceCrop));
2141}
2142
2143/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
2144TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
2145{
2146 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2147 setSourceCrop, advanceSourceCrop));
2148}
2149
2150/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
2151TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
2152{
2153 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2154 setSourceCrop));
2155}
2156
Marissa Wallad761812016-12-15 12:32:24 -08002157/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
2158TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
2159{
2160 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2161 setSurfaceDamage, advanceSurfaceDamage));
2162}
2163
2164/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
2165TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
2166{
2167 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2168 setSurfaceDamage, advanceSurfaceDamage));
2169}
2170
2171/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
2172TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
2173{
2174 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2175 setSurfaceDamage));
2176}
2177
Marissa Wallac108192016-12-15 12:27:48 -08002178/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
2179TEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
2180{
2181 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2182 setTransform, advanceTransform));
2183}
2184
2185/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
2186TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
2187{
2188 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2189 setTransform, advanceTransform));
2190}
2191
2192/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
2193TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
2194{
2195 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2196 setTransform));
2197}
Marissa Wall273b1df2016-12-15 12:28:47 -08002198
2199/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
2200TEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
2201{
2202 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
2203 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2204 const Hwc2TestLayers& testLayers) {
2205
2206 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
2207 testLayers.getZOrder(layer)));
2208 }
2209 ));
2210}
2211
2212/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
2213TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
2214{
2215 const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
2216 static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
2217 static_cast<uint32_t>(UINT32_MAX / 2),
2218 static_cast<uint32_t>(UINT32_MAX) };
2219
2220 for (auto display : mDisplays) {
2221 std::vector<hwc2_config_t> configs;
2222
2223 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2224
2225 for (auto config : configs) {
2226 hwc2_layer_t layer;
2227
2228 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2229
2230 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2231
2232 for (uint32_t zOrder : zOrders) {
2233 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
2234 }
2235
2236 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2237 }
2238 }
2239}
2240
2241/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
2242TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
2243{
2244 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2245 setZOrder));
2246}