blob: 2a97a8c4227be3be2d6fa5450173b7f37e76e956 [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 Wallac108192016-12-15 12:27:48 -0800476 void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
477 hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
478 {
479 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
480 getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
481 ASSERT_TRUE(pfn) << "failed to get function";
482
483 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
484 transform));
485 if (outErr) {
486 *outErr = err;
487 } else {
488 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
489 << getTransformName(transform);
490 }
491 }
492
Marissa Wall273b1df2016-12-15 12:28:47 -0800493 void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
494 uint32_t zOrder, hwc2_error_t* outErr = nullptr)
495 {
496 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
497 getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
498 ASSERT_TRUE(pfn) << "failed to get function";
499
500 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
501 zOrder));
502 if (outErr) {
503 *outErr = err;
504 } else {
505 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
506 << zOrder;
507 }
508 }
509
Marissa Wall4d600052016-12-15 12:16:01 -0800510protected:
511 hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
512 {
513 return mHwc2Device->getFunction(mHwc2Device, descriptor);
514 }
515
516 void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
517 {
518 uint32_t num = 0;
519
520 mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
521
522 outCapabilities->resize(num);
523
524 mHwc2Device->getCapabilities(mHwc2Device, &num,
525 reinterpret_cast<int32_t*>(outCapabilities->data()));
526 }
527
Marissa Wallcfb9a072017-02-17 20:53:18 -0800528 /* Registers a hotplug callback and waits for hotplug callbacks. This
529 * function will have no effect if called more than once. */
530 void populateDisplays()
531 {
532 /* Sets the hotplug status to receiving */
533 {
534 std::lock_guard<std::mutex> lock(mHotplugMutex);
535
536 if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
537 return;
538 mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
539 }
540
541 /* Registers the callback. This function call cannot be locked because
542 * a callback could happen on the same thread */
543 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
544 reinterpret_cast<hwc2_function_pointer_t>(
545 hwc2TestHotplugCallback)));
546
547 /* Waits for hotplug events. If a hotplug event has not come within 1
548 * second, stop waiting. */
549 std::unique_lock<std::mutex> lock(mHotplugMutex);
550
551 while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
552 std::cv_status::timeout) { }
553
554 /* Sets the hotplug status to done. Future calls will have no effect */
555 mHotplugStatus = Hwc2TestHotplugStatus::Done;
556 }
557
558 void getBadDisplay(hwc2_display_t* outDisplay)
559 {
560 for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
561 if (mDisplays.count(display) == 0) {
562 *outDisplay = display;
563 return;
564 }
565 }
566 ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
567 " are registered. This should never happen.";
568 }
569
Marissa Wall1db2e372016-12-15 12:19:39 -0800570 /* NOTE: will create min(newlayerCnt, max supported layers) layers */
571 void createLayers(hwc2_display_t display,
572 std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
573 {
574 std::vector<hwc2_layer_t> newLayers;
575 hwc2_layer_t layer;
576 hwc2_error_t err = HWC2_ERROR_NONE;
577
578 for (size_t i = 0; i < newLayerCnt; i++) {
579
580 EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
581 if (err == HWC2_ERROR_NO_RESOURCES)
582 break;
583 if (err != HWC2_ERROR_NONE) {
584 newLayers.clear();
585 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
586 }
587 newLayers.push_back(layer);
588 }
589
590 *outLayers = std::move(newLayers);
591 }
592
593 void destroyLayers(hwc2_display_t display,
594 std::vector<hwc2_layer_t>&& layers)
595 {
596 for (hwc2_layer_t layer : layers) {
597 EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
598 }
599 }
600
Marissa Wallcf935cb2016-12-15 12:20:47 -0800601 void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
602 {
603 std::vector<hwc2_config_t> configs;
604
605 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
606
607 hwc2_config_t CONFIG_MAX = UINT32_MAX;
608
609 ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
610 " (2^32 values) has been taken which shouldn't happen";
611
612 hwc2_config_t config;
613 for (config = 0; config < CONFIG_MAX; config++) {
614 if (std::count(configs.begin(), configs.end(), config) == 0)
615 break;
616 }
617
618 *outConfig = config;
619 }
620
Marissa Wall572a1ee2016-12-15 12:24:13 -0800621 void enableVsync(hwc2_display_t display)
622 {
623 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
624 reinterpret_cast<hwc2_function_pointer_t>(
625 hwc2TestVsyncCallback)));
626 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
627 }
628
629 void disableVsync(hwc2_display_t display)
630 {
631 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
632 }
633
634 void waitForVsync(hwc2_display_t* outDisplay = nullptr,
635 int64_t* outTimestamp = nullptr)
636 {
637 std::unique_lock<std::mutex> lock(mVsyncMutex);
638 ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
639 std::cv_status::no_timeout) << "timed out attempting to get"
640 " vsync callback";
641 if (outDisplay)
642 *outDisplay = mVsyncDisplay;
643 if (outTimestamp)
644 *outTimestamp = mVsyncTimestamp;
645 }
646
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800647 /* Calls a set property function from Hwc2Test to set a property value from
648 * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
649 using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
650 hwc2_display_t display, hwc2_layer_t layer,
651 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
652
Marissa Wall273b1df2016-12-15 12:28:47 -0800653 /* Calls a set property function from Hwc2Test to set property values from
654 * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
655 using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
656 hwc2_display_t display, hwc2_layer_t layer,
657 const Hwc2TestLayers& testLayers);
658
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800659 /* Calls a set property function from Hwc2Test to set a bad property value
660 * on hwc2_layer_t on hwc2_display_t */
661 using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
662 hwc2_display_t display, hwc2_layer_t layer,
663 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
664
665 /* Calls a set property function from Hwc2Test to set a bad property value
666 * on hwc2_layer_t on hwc2_display_t */
667 using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
668 hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
669
670 /* Advances a property of Hwc2TestLayer */
671 using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
672
673 /* For each active display it cycles through each display config and tests
674 * each property value. It creates a layer, sets the property and then
675 * destroys the layer */
676 void setLayerProperty(Hwc2TestCoverage coverage,
677 TestLayerPropertyFunction function, AdvanceProperty advance)
678 {
679 for (auto display : mDisplays) {
680 std::vector<hwc2_config_t> configs;
681
682 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
683
684 for (auto config : configs) {
685 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -0800686 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800687
688 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800689 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
690 &displayArea));
691 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800692
693 do {
694 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
695
696 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
697 testLayer, nullptr));
698
699 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
700 } while (advance(&testLayer));
701 }
702 }
703 }
704
705 /* For each active display it cycles through each display config and tests
706 * each property value. It creates a layer, cycles through each property
707 * value and updates the layer property value and then destroys the layer */
708 void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
709 TestLayerPropertyFunction function, AdvanceProperty advance)
710 {
711 for (auto display : mDisplays) {
712 std::vector<hwc2_config_t> configs;
713
714 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
715
716 for (auto config : configs) {
717 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -0800718 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800719
720 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800721 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
722 &displayArea));
723 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800724
725 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
726
727 do {
728 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
729 testLayer, nullptr));
730 } while (advance(&testLayer));
731
732 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
733 }
734 }
735 }
736
Marissa Wall273b1df2016-12-15 12:28:47 -0800737 /* For each active display it cycles through each display config and tests
738 * each property value. It creates multiple layers, calls the
739 * TestLayerPropertiesFunction to set property values and then
740 * destroys the layers */
741 void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
742 TestLayerPropertiesFunction function)
743 {
744 for (auto display : mDisplays) {
745 std::vector<hwc2_config_t> configs;
746
747 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
748
749 for (auto config : configs) {
750 std::vector<hwc2_layer_t> layers;
Marissa Wall600a73b2016-12-15 12:30:39 -0800751 Area displayArea;
Marissa Wall273b1df2016-12-15 12:28:47 -0800752
753 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800754 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
755 &displayArea));
Marissa Wall273b1df2016-12-15 12:28:47 -0800756
757 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
Marissa Wall600a73b2016-12-15 12:30:39 -0800758 Hwc2TestLayers testLayers(layers, coverage, displayArea);
Marissa Wall273b1df2016-12-15 12:28:47 -0800759
760 for (auto layer : layers) {
761 EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
762 testLayers));
763 }
764
765 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
766 }
767 }
768 }
769
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800770 /* For each active display it cycles through each display config.
771 * 1) It attempts to set a valid property value to bad layer handle.
772 * 2) It creates a layer x and attempts to set a valid property value to
773 * layer x + 1
774 * 3) It destroys the layer x and attempts to set a valid property value to
775 * the destroyed layer x.
776 */
777 void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
778 TestLayerPropertyBadLayerFunction function)
779 {
780 for (auto display : mDisplays) {
781 std::vector<hwc2_config_t> configs;
782
783 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
784
785 for (auto config : configs) {
786 hwc2_layer_t layer = 0;
Marissa Wall600a73b2016-12-15 12:30:39 -0800787 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800788 hwc2_error_t err = HWC2_ERROR_NONE;
789
790 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800791 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
792 &displayArea));
793 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800794
795 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
796 testLayer, &err));
797 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
798
799 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
800
801 ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
802 testLayer, &err));
803 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
804
805 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
806
807 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
808 testLayer, &err));
809 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
810 }
811 }
812 }
813
814 /* For each active display it cycles through each display config and tests
815 * each property value. It creates a layer, sets a bad property value and
816 * then destroys the layer */
817 void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
818 {
819 for (auto display : mDisplays) {
820 std::vector<hwc2_config_t> configs;
821
822 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
823
824 for (auto config : configs) {
825 hwc2_layer_t layer;
826 hwc2_error_t err = HWC2_ERROR_NONE;
827
828 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
829
830 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
831
832 ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
833 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
834 " error code";
835
836 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
837 }
838 }
839 }
840
Marissa Wall600a73b2016-12-15 12:30:39 -0800841 void getActiveConfigAttribute(hwc2_display_t display,
842 hwc2_attribute_t attribute, int32_t* outValue)
843 {
844 hwc2_config_t config;
845 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
846 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
847 attribute, outValue));
848 ASSERT_GE(*outValue, 0) << "failed to get valid "
849 << getAttributeName(attribute);
850 }
851
852 void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
853 {
854 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
855 HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
856 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
857 HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
858 }
859
Marissa Wall4d600052016-12-15 12:16:01 -0800860 hwc2_device_t* mHwc2Device = nullptr;
Marissa Wallcfb9a072017-02-17 20:53:18 -0800861
862 enum class Hwc2TestHotplugStatus {
863 Init = 1,
864 Receiving,
865 Done,
866 };
867
868 std::mutex mHotplugMutex;
869 std::condition_variable mHotplugCv;
870 Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
871 std::unordered_set<hwc2_display_t> mDisplays;
Marissa Wall1db2e372016-12-15 12:19:39 -0800872
873 /* Store all created layers that have not been destroyed. If an ASSERT_*
874 * fails, then destroy the layers on exit */
875 std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
Marissa Wall03c91732016-12-15 12:23:16 -0800876
877 /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
878 * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
879 std::set<hwc2_display_t> mActiveDisplays;
Marissa Wall572a1ee2016-12-15 12:24:13 -0800880
881 std::mutex mVsyncMutex;
882 std::condition_variable mVsyncCv;
883 hwc2_display_t mVsyncDisplay;
884 int64_t mVsyncTimestamp = -1;
Marissa Wall4d600052016-12-15 12:16:01 -0800885};
886
Marissa Wallcfb9a072017-02-17 20:53:18 -0800887void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
888 hwc2_display_t display, int32_t connection)
889{
890 if (callbackData)
891 static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
892 connection);
893}
894
Marissa Wall572a1ee2016-12-15 12:24:13 -0800895void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
896 hwc2_display_t display, int64_t timestamp)
897{
898 if (callbackData)
899 static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
900 timestamp);
901}
902
Marissa Wallffc67da2016-12-15 12:26:09 -0800903void setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
904 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
905{
906 EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
907 testLayer.getBlendMode(), outErr));
908}
909
Marissa Wallee242782016-12-15 12:30:12 -0800910void setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
911 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
912{
913 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
914 layer, HWC2_COMPOSITION_SOLID_COLOR));
915 ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
916 layer, testLayer.getPlaneAlpha()));
917 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
918 layer, testLayer.getBlendMode()));
919 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
920 testLayer.getColor(), outErr));
921}
922
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800923void setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
924 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
925{
926 hwc2_composition_t composition = testLayer.getComposition();
927 hwc2_error_t err = HWC2_ERROR_NONE;
928
929 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
930 composition, &err));
931 if (outErr) {
932 *outErr = err;
933 return;
934 }
935
936 if (composition != HWC2_COMPOSITION_SIDEBAND) {
937 EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
938 } else {
939 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
940 << "returned wrong error code";
941 }
942}
943
Marissa Wall2a0aaf92016-12-15 12:31:37 -0800944void setCursorPosition(Hwc2Test* test, hwc2_display_t display,
945 hwc2_layer_t layer, const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
946{
947 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
948 layer, HWC2_COMPOSITION_CURSOR));
949
950 const hwc_rect_t cursorPosition = testLayer.getCursorPosition();
951 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
952 cursorPosition.left, cursorPosition.top, outErr));
953}
954
Marissa Wallb72b5c92016-12-15 12:26:39 -0800955void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
956 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
957{
958 EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
959 testLayer.getDataspace(), outErr));
960}
961
Marissa Wall600a73b2016-12-15 12:30:39 -0800962void setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
963 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
964{
965 EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
966 testLayer.getDisplayFrame(), outErr));
967}
968
Marissa Wall2b1f5302016-12-15 12:27:20 -0800969void setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
970 const Hwc2TestLayer& testLayer, hwc2_error_t *outErr)
971{
972 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
973 testLayer.getBlendMode()));
974 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
975 testLayer.getPlaneAlpha(), outErr));
976}
977
Marissa Wallc57468f2016-12-15 12:31:12 -0800978void setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
979 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
980{
981 EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
982 testLayer.getSourceCrop(), outErr));
983}
984
Marissa Wallac108192016-12-15 12:27:48 -0800985void setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
986 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
987{
988 EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
989 testLayer.getTransform(), outErr));
990}
991
Marissa Wall273b1df2016-12-15 12:28:47 -0800992void setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
993 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
994{
995 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
996 testLayer.getZOrder(), outErr));
997}
998
Marissa Wallffc67da2016-12-15 12:26:09 -0800999bool advanceBlendMode(Hwc2TestLayer* testLayer)
1000{
1001 return testLayer->advanceBlendMode();
1002}
1003
Marissa Wallee242782016-12-15 12:30:12 -08001004bool advanceColor(Hwc2TestLayer* testLayer)
1005{
1006 /* Color depends on blend mode so advance blend mode last so color is not
1007 * force to update as often */
1008 if (testLayer->advancePlaneAlpha())
1009 return true;
1010 if (testLayer->advanceColor())
1011 return true;
1012 return testLayer->advanceBlendMode();
1013}
1014
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001015bool advanceComposition(Hwc2TestLayer* testLayer)
1016{
1017 return testLayer->advanceComposition();
1018}
1019
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001020bool advanceCursorPosition(Hwc2TestLayer* testLayer)
1021{
1022 return testLayer->advanceCursorPosition();
1023}
1024
Marissa Wallb72b5c92016-12-15 12:26:39 -08001025bool advanceDataspace(Hwc2TestLayer* testLayer)
1026{
1027 return testLayer->advanceDataspace();
1028}
1029
Marissa Wall600a73b2016-12-15 12:30:39 -08001030bool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1031{
1032 return testLayer->advanceDisplayFrame();
1033}
1034
Marissa Wall2b1f5302016-12-15 12:27:20 -08001035bool advancePlaneAlpha(Hwc2TestLayer* testLayer)
1036{
1037 return testLayer->advancePlaneAlpha();
1038}
1039
Marissa Wallc57468f2016-12-15 12:31:12 -08001040bool advanceSourceCrop(Hwc2TestLayer* testLayer)
1041{
1042 if (testLayer->advanceSourceCrop())
1043 return true;
1044 return testLayer->advanceBufferArea();
1045}
1046
Marissa Wallac108192016-12-15 12:27:48 -08001047bool advanceTransform(Hwc2TestLayer* testLayer)
1048{
1049 return testLayer->advanceTransform();
1050}
1051
Marissa Wall4d600052016-12-15 12:16:01 -08001052
1053static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
1054 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
1055 HWC2_FUNCTION_CREATE_LAYER,
1056 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
1057 HWC2_FUNCTION_DESTROY_LAYER,
1058 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
1059 HWC2_FUNCTION_DUMP,
1060 HWC2_FUNCTION_GET_ACTIVE_CONFIG,
1061 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
1062 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
1063 HWC2_FUNCTION_GET_COLOR_MODES,
1064 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
1065 HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
1066 HWC2_FUNCTION_GET_DISPLAY_NAME,
1067 HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
1068 HWC2_FUNCTION_GET_DISPLAY_TYPE,
1069 HWC2_FUNCTION_GET_DOZE_SUPPORT,
1070 HWC2_FUNCTION_GET_HDR_CAPABILITIES,
1071 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
1072 HWC2_FUNCTION_GET_RELEASE_FENCES,
1073 HWC2_FUNCTION_PRESENT_DISPLAY,
1074 HWC2_FUNCTION_REGISTER_CALLBACK,
1075 HWC2_FUNCTION_SET_ACTIVE_CONFIG,
1076 HWC2_FUNCTION_SET_CLIENT_TARGET,
1077 HWC2_FUNCTION_SET_COLOR_MODE,
1078 HWC2_FUNCTION_SET_COLOR_TRANSFORM,
1079 HWC2_FUNCTION_SET_CURSOR_POSITION,
1080 HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
1081 HWC2_FUNCTION_SET_LAYER_BUFFER,
1082 HWC2_FUNCTION_SET_LAYER_COLOR,
1083 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
1084 HWC2_FUNCTION_SET_LAYER_DATASPACE,
1085 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
1086 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
1087 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
1088 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
1089 HWC2_FUNCTION_SET_LAYER_TRANSFORM,
1090 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
1091 HWC2_FUNCTION_SET_LAYER_Z_ORDER,
1092 HWC2_FUNCTION_SET_OUTPUT_BUFFER,
1093 HWC2_FUNCTION_SET_POWER_MODE,
1094 HWC2_FUNCTION_SET_VSYNC_ENABLED,
1095 HWC2_FUNCTION_VALIDATE_DISPLAY,
1096}};
1097
1098/* TESTCASE: Tests that the HWC2 supports all required functions. */
1099TEST_F(Hwc2Test, GET_FUNCTION)
1100{
1101 for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
1102 hwc2_function_pointer_t pfn = getFunction(descriptor);
1103 EXPECT_TRUE(pfn) << "failed to get function "
1104 << getFunctionDescriptorName(descriptor);
1105 }
1106}
1107
1108/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
1109TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
1110{
1111 hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
1112 EXPECT_FALSE(pfn) << "failed to get invalid function";
1113}
1114
1115/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
1116TEST_F(Hwc2Test, GET_CAPABILITIES)
1117{
1118 std::vector<hwc2_capability_t> capabilities;
1119
1120 getCapabilities(&capabilities);
1121
1122 EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
1123 HWC2_CAPABILITY_INVALID), 0);
1124}
Marissa Walla4b01482017-02-17 20:52:03 -08001125
1126static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1127 HWC2_CALLBACK_HOTPLUG,
1128 HWC2_CALLBACK_REFRESH,
1129 HWC2_CALLBACK_VSYNC,
1130}};
1131
1132/* TESTCASE: Tests that the HWC2 can successfully register all required
1133 * callback functions. */
1134TEST_F(Hwc2Test, REGISTER_CALLBACK)
1135{
1136 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1137 const_cast<char*>("data"));
1138
1139 for (auto descriptor : callbackDescriptors) {
1140 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1141 []() { return; }));
1142 }
1143}
1144
1145/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1146TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1147{
1148 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1149 const_cast<char*>("data"));
1150 hwc2_error_t err = HWC2_ERROR_NONE;
1151
1152 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1153 []() { return; }, &err));
1154 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1155}
1156
1157/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
1158TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
1159{
1160 hwc2_callback_data_t data = nullptr;
1161
1162 for (auto descriptor : callbackDescriptors) {
1163 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1164 []() { return; }));
1165 }
1166}
Marissa Wallcfb9a072017-02-17 20:53:18 -08001167
1168/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1169 * physical display. */
1170TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1171{
1172 for (auto display : mDisplays) {
1173 hwc2_display_type_t type;
1174
1175 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1176 EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1177 " correct display type";
1178 }
1179}
1180
1181/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1182 * display is requested. */
1183TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1184{
1185 hwc2_display_t display;
1186 hwc2_display_type_t type;
1187 hwc2_error_t err = HWC2_ERROR_NONE;
1188
1189 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1190
1191 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1192 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1193}
Marissa Wall1db2e372016-12-15 12:19:39 -08001194
1195/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
1196TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
1197{
1198 for (auto display : mDisplays) {
1199 hwc2_layer_t layer;
1200
1201 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1202
1203 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1204 }
1205}
1206
1207/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
1208TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
1209{
1210 hwc2_display_t display;
1211 hwc2_layer_t layer;
1212 hwc2_error_t err = HWC2_ERROR_NONE;
1213
1214 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1215
1216 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
1217 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1218}
1219
1220/* TESTCASE: Tests that the HWC2 will either support a large number of resources
1221 * or will return no resources. */
1222TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
1223{
1224 const size_t layerCnt = 1000;
1225
1226 for (auto display : mDisplays) {
1227 std::vector<hwc2_layer_t> layers;
1228
1229 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1230
1231 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1232 }
1233}
1234
1235/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
1236TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
1237{
1238 hwc2_display_t badDisplay;
1239
1240 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
1241
1242 for (auto display : mDisplays) {
1243 hwc2_layer_t layer = 0;
1244 hwc2_error_t err = HWC2_ERROR_NONE;
1245
1246 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1247 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1248
1249 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1250
1251 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1252 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1253
1254 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1255 }
1256}
1257
1258/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
1259TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
1260{
1261 for (auto display : mDisplays) {
1262 hwc2_layer_t layer;
1263 hwc2_error_t err = HWC2_ERROR_NONE;
1264
1265 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
1266 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1267
1268 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
1269 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1270
1271 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
1272 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1273
1274 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
1275 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1276
1277 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
1278 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1279
1280 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1281
1282 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
1283 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1284
1285 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1286
1287 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
1288 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1289 }
1290}
Marissa Wallcf935cb2016-12-15 12:20:47 -08001291
1292static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1293 HWC2_ATTRIBUTE_WIDTH,
1294 HWC2_ATTRIBUTE_HEIGHT,
1295}};
1296
1297static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1298 HWC2_ATTRIBUTE_VSYNC_PERIOD,
1299 HWC2_ATTRIBUTE_DPI_X,
1300 HWC2_ATTRIBUTE_DPI_Y,
1301}};
1302
1303/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1304 * config. */
1305TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1306{
1307 for (auto display : mDisplays) {
1308 std::vector<hwc2_config_t> configs;
1309
1310 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1311
1312 for (auto config : configs) {
1313 int32_t value;
1314
1315 for (auto attribute : requiredAttributes) {
1316 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1317 attribute, &value));
1318 EXPECT_GE(value, 0) << "missing required attribute "
1319 << getAttributeName(attribute) << " for config "
1320 << config;
1321 }
1322 for (auto attribute : optionalAttributes) {
1323 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1324 attribute, &value));
1325 }
1326 }
1327 }
1328}
1329
1330/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1331 * attribute */
1332TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1333{
1334 const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1335
1336 for (auto display : mDisplays) {
1337 std::vector<hwc2_config_t> configs;
1338
1339 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1340
1341 for (auto config : configs) {
1342 int32_t value;
1343 hwc2_error_t err = HWC2_ERROR_NONE;
1344
1345 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1346 attribute, &value, &err));
1347 EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1348 " attribute for config " << config;
1349 }
1350 }
1351}
1352
1353/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1354TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1355{
1356 hwc2_display_t display;
1357 const hwc2_config_t config = 0;
1358 int32_t value;
1359 hwc2_error_t err = HWC2_ERROR_NONE;
1360
1361 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1362
1363 for (auto attribute : requiredAttributes) {
1364 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1365 &value, &err));
1366 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1367 }
1368
1369 for (auto attribute : optionalAttributes) {
1370 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1371 &value, &err));
1372 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1373 }
1374}
1375
1376/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1377TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1378{
1379 for (auto display : mDisplays) {
1380 hwc2_config_t config;
1381 int32_t value;
1382 hwc2_error_t err = HWC2_ERROR_NONE;
1383
1384 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1385
1386 for (auto attribute : requiredAttributes) {
1387 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1388 attribute, &value, &err));
1389 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1390 }
1391
1392 for (auto attribute : optionalAttributes) {
1393 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1394 attribute, &value, &err));
1395 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1396 }
1397 }
1398}
1399
1400/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1401TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1402{
1403 for (auto display : mDisplays) {
1404 std::vector<hwc2_config_t> configs;
1405
1406 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1407 }
1408}
1409
1410/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1411TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1412{
1413 hwc2_display_t display;
1414 std::vector<hwc2_config_t> configs;
1415 hwc2_error_t err = HWC2_ERROR_NONE;
1416
1417 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1418
1419 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1420
1421 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1422 EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1423}
1424
1425/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1426 * times in a row. */
1427TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1428{
1429 for (auto display : mDisplays) {
1430 std::vector<hwc2_config_t> configs1, configs2;
1431
1432 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
1433 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
1434
1435 EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
1436 configs2.begin())) << "returned two different config sets";
1437 }
1438}
1439
1440/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
1441TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
1442{
1443 for (auto display : mDisplays) {
1444 std::vector<hwc2_config_t> configs;
1445
1446 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1447
1448 std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
1449 configs.end());
1450 EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
1451 " configs";
1452 }
1453}
Marissa Wall93dc04f2016-12-15 12:21:46 -08001454
1455/* TESTCASE: Tests that the HWC2 returns the active config for a display */
1456TEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
1457{
1458 for (auto display : mDisplays) {
1459 std::vector<hwc2_config_t> configs;
1460
1461 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1462
1463 for (auto config : configs) {
1464 hwc2_config_t activeConfig;
1465
1466 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1467 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
1468
1469 EXPECT_EQ(activeConfig, config) << "failed to get active config";
1470 }
1471 }
1472}
1473
1474/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
1475 * display. */
1476TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
1477{
1478 hwc2_display_t display;
1479 hwc2_config_t activeConfig;
1480 hwc2_error_t err = HWC2_ERROR_NONE;
1481
1482 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1483
1484 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1485
1486 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1487}
1488
1489/* TESTCASE: Tests that the HWC2 either begins with a valid active config
1490 * or returns an error when getActiveConfig is called. */
1491TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
1492{
1493 for (auto display : mDisplays) {
1494 std::vector<hwc2_config_t> configs;
1495 hwc2_config_t activeConfig;
1496 hwc2_error_t err = HWC2_ERROR_NONE;
1497
1498 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1499
1500 if (configs.empty())
1501 return;
1502
1503 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1504 if (err == HWC2_ERROR_NONE) {
1505 EXPECT_NE(std::count(configs.begin(), configs.end(),
1506 activeConfig), 0) << "active config is not found in "
1507 " configs for display";
1508 } else {
1509 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1510 }
1511 }
1512}
1513
1514/* TESTCASE: Tests that the HWC2 can set every display config as an active
1515 * config */
1516TEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
1517{
1518 for (auto display : mDisplays) {
1519 std::vector<hwc2_config_t> configs;
1520
1521 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1522
1523 for (auto config : configs) {
1524 EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1525 }
1526 }
1527}
1528
1529/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
1530TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
1531{
1532 hwc2_display_t display;
1533 const hwc2_config_t config = 0;
1534 hwc2_error_t err = HWC2_ERROR_NONE;
1535
1536 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1537
1538 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
1539 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1540}
1541
1542/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
1543TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
1544{
1545 for (auto display : mDisplays) {
1546 hwc2_config_t config;
1547 hwc2_error_t err = HWC2_ERROR_NONE;
1548
1549 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1550
1551 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
1552 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1553 }
1554}
Marissa Wall03c91732016-12-15 12:23:16 -08001555
1556/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
1557TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
1558{
1559 for (auto display : mDisplays) {
1560 int32_t support = -1;
1561
1562 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1563
1564 EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
1565 }
1566}
1567
1568/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
1569TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
1570{
1571 hwc2_display_t display;
1572 int32_t support = -1;
1573 hwc2_error_t err = HWC2_ERROR_NONE;
1574
1575 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1576
1577 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1578
1579 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1580}
1581
1582/* TESTCASE: Tests that the HWC2 can set all supported power modes */
1583TEST_F(Hwc2Test, SET_POWER_MODE)
1584{
1585 for (auto display : mDisplays) {
1586 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1587 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1588
1589 int32_t support = -1;
1590 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1591 if (support != 1)
1592 return;
1593
1594 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1595 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1596 HWC2_POWER_MODE_DOZE_SUSPEND));
1597
1598 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1599 }
1600}
1601
1602/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
1603TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
1604{
1605 hwc2_display_t display;
1606 hwc2_error_t err = HWC2_ERROR_NONE;
1607
1608 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1609
1610 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
1611 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1612
1613 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
1614 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1615
1616 int32_t support = -1;
1617 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1618 if (support != 1)
1619 return;
1620
1621 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
1622 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1623
1624 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
1625 &err));
1626 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1627}
1628
1629/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
1630TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
1631{
1632 for (auto display : mDisplays) {
1633 hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
1634 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
1635 hwc2_error_t err = HWC2_ERROR_NONE;
1636
1637 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
1638 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
1639 << mode;
1640 }
1641}
1642
1643/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
1644 * an optional power mode. */
1645TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
1646{
1647 for (auto display : mDisplays) {
1648 int32_t support = -1;
1649 hwc2_error_t err = HWC2_ERROR_NONE;
1650
1651 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1652 if (support == 1)
1653 return;
1654
1655 ASSERT_EQ(support, 0) << "invalid doze support value";
1656
1657 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
1658 &err));
1659 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1660
1661 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1662 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
1663 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1664 }
1665}
1666
1667/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
1668TEST_F(Hwc2Test, SET_POWER_MODE_stress)
1669{
1670 for (auto display : mDisplays) {
1671 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1672 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1673
1674 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1675 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1676
1677 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1678 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1679
1680 int32_t support = -1;
1681 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1682 if (support != 1)
1683 return;
1684
1685 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1686 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1687
1688 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1689 HWC2_POWER_MODE_DOZE_SUSPEND));
1690 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1691 HWC2_POWER_MODE_DOZE_SUSPEND));
1692
1693 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1694 }
1695}
Marissa Wall572a1ee2016-12-15 12:24:13 -08001696
1697/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
1698 * displays */
1699TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
1700{
1701 for (auto display : mDisplays) {
1702 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1703 const_cast<char*>("data"));
1704
1705 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1706
1707 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1708 []() { return; }));
1709
1710 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1711
1712 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1713
1714 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1715 }
1716}
1717
1718/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
1719TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
1720{
1721 for (auto display : mDisplays) {
1722 hwc2_display_t receivedDisplay;
1723 int64_t receivedTimestamp;
1724
1725 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1726
1727 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1728
1729 ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
1730 &receivedTimestamp));
1731
1732 EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
1733 EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
1734
1735 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1736
1737 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1738 }
1739}
1740
1741/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
1742TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
1743{
1744 hwc2_display_t display;
1745 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1746 const_cast<char*>("data"));
1747 hwc2_error_t err = HWC2_ERROR_NONE;
1748
1749 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1750
1751 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1752 []() { return; }));
1753
1754 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
1755 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1756
1757 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
1758 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1759}
1760
1761/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
1762TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
1763{
1764 for (auto display : mDisplays) {
1765 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1766 const_cast<char*>("data"));
1767 hwc2_error_t err = HWC2_ERROR_NONE;
1768
1769 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1770
1771 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1772 []() { return; }));
1773
1774 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
1775 &err));
1776 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1777
1778 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1779 }
1780}
1781
1782/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
1783 * times. */
1784TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
1785{
1786 for (auto display : mDisplays) {
1787 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1788 const_cast<char*>("data"));
1789
1790 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1791
1792 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1793 []() { return; }));
1794
1795 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1796
1797 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1798 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1799
1800 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1801 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1802
1803 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1804 }
1805}
1806
1807/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
1808 * is off and no callback is registered. */
1809TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
1810{
1811 const uint secs = 1;
1812
1813 for (auto display : mDisplays) {
1814 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1815
1816 sleep(secs);
1817
1818 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1819 }
1820}
1821
1822/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
1823 * is registered. */
1824TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
1825{
1826 const uint secs = 1;
1827
1828 for (auto display : mDisplays) {
1829 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1830
1831 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1832
1833 sleep(secs);
1834
1835 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1836
1837 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1838 }
1839}
Marissa Walldd4087f2016-12-15 12:24:52 -08001840
1841/* TESTCASE: Tests that the HWC2 returns a display name for each display */
1842TEST_F(Hwc2Test, GET_DISPLAY_NAME)
1843{
1844 for (auto display : mDisplays) {
1845 std::string name;
1846
1847 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
1848 }
1849}
1850
1851/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
1852 * display */
1853TEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
1854{
1855 hwc2_display_t display;
1856 std::string name;
1857 hwc2_error_t err = HWC2_ERROR_NONE;
1858
1859 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1860
1861 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
1862 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1863}
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001864
1865/* TESTCASE: Tests that the HWC2 can set basic composition types. */
1866TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
1867{
1868 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1869 setComposition, advanceComposition));
1870}
1871
1872/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
1873 * layer. */
1874TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
1875{
1876 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1877 setComposition, advanceComposition));
1878}
1879
1880/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
1881TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
1882{
1883 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1884 setComposition));
1885}
1886
1887/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
1888TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
1889{
1890 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
1891 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1892 hwc2_error_t* outErr) {
1893
1894 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1895 layer, HWC2_COMPOSITION_INVALID, outErr));
1896 }
1897 ));
1898}
Marissa Wallffc67da2016-12-15 12:26:09 -08001899
Marissa Wall2a0aaf92016-12-15 12:31:37 -08001900/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
1901TEST_F(Hwc2Test, SET_CURSOR_POSITION)
1902{
1903 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1904 ::setCursorPosition, advanceCursorPosition));
1905}
1906
1907/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
1908TEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
1909{
1910 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1911 ::setCursorPosition, advanceCursorPosition));
1912}
1913
1914/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
1915 * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
1916TEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
1917{
1918 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1919 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1920 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) {
1921
1922 const hwc_rect_t cursorPosition = testLayer.getCursorPosition();
1923 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
1924 cursorPosition.left, cursorPosition.top, outErr));
1925 },
1926
1927 advanceCursorPosition));
1928}
1929
1930/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
1931 * display. */
1932TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
1933{
1934 hwc2_display_t display;
1935 hwc2_layer_t layer = 0;
1936 int32_t x = 0, y = 0;
1937 hwc2_error_t err = HWC2_ERROR_NONE;
1938
1939 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1940
1941 ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
1942 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1943}
1944
1945/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
1946TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
1947{
1948 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1949 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
1950 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) {
1951
1952 const hwc_rect_t cursorPosition = testLayer.getCursorPosition();
1953 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
1954 badLayer, cursorPosition.left, cursorPosition.top,
1955 outErr));
1956 }
1957 ));
1958}
1959
Marissa Wallffc67da2016-12-15 12:26:09 -08001960/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
1961TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
1962{
1963 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1964 setBlendMode, advanceBlendMode));
1965}
1966
1967/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
1968TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
1969{
1970 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1971 setBlendMode, advanceBlendMode));
1972}
1973
1974/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
1975TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
1976{
1977 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1978 setBlendMode));
1979}
1980
1981/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
1982TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
1983{
1984 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
1985 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1986 hwc2_error_t* outErr) {
1987
1988 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
1989 layer, HWC2_BLEND_MODE_INVALID, outErr));
1990 }
1991 ));
1992}
Marissa Wallb72b5c92016-12-15 12:26:39 -08001993
Marissa Wallee242782016-12-15 12:30:12 -08001994/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
1995TEST_F(Hwc2Test, SET_LAYER_COLOR)
1996{
1997 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1998 setColor, advanceColor));
1999}
2000
2001/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
2002TEST_F(Hwc2Test, SET_LAYER_COLOR_update)
2003{
2004 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2005 setColor, advanceColor));
2006}
2007
2008/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
2009 * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
2010TEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
2011{
2012 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
2013 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2014 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) {
2015
2016 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
2017 testLayer.getColor(), outErr));
2018 },
2019
2020 advanceColor));
2021}
2022
2023/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
2024TEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
2025{
2026 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2027 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
2028 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) {
2029
2030 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
2031 testLayer.getColor(), outErr));
2032 }
2033 ));
2034}
2035
Marissa Wallb72b5c92016-12-15 12:26:39 -08002036/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
2037TEST_F(Hwc2Test, SET_LAYER_DATASPACE)
2038{
2039 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2040 setDataspace, advanceDataspace));
2041}
2042
2043/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
2044TEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
2045{
2046 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2047 setDataspace, advanceDataspace));
2048}
2049
2050/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
2051TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
2052{
2053 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2054 setDataspace));
2055}
Marissa Wall2b1f5302016-12-15 12:27:20 -08002056
Marissa Wall600a73b2016-12-15 12:30:39 -08002057/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
2058TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
2059{
2060 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2061 setDisplayFrame, advanceDisplayFrame));
2062}
2063
2064/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
2065TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
2066{
2067 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2068 setDisplayFrame, advanceDisplayFrame));
2069}
2070
2071/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
2072TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
2073{
2074 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2075 setDisplayFrame));
2076}
2077
Marissa Wall2b1f5302016-12-15 12:27:20 -08002078/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
2079TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
2080{
2081 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2082 setPlaneAlpha, advancePlaneAlpha));
2083}
2084
2085/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
2086TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
2087{
2088 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2089 setPlaneAlpha, advancePlaneAlpha));
2090}
2091
2092/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
2093TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
2094{
2095 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2096 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
2097 const Hwc2TestLayer& testLayer, hwc2_error_t *outErr) {
2098
2099 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
2100 badLayer, testLayer.getPlaneAlpha(), outErr));
2101 }
2102 ));
2103}
Marissa Wallac108192016-12-15 12:27:48 -08002104
Marissa Wallc57468f2016-12-15 12:31:12 -08002105/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
2106TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
2107{
2108 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2109 setSourceCrop, advanceSourceCrop));
2110}
2111
2112/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
2113TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
2114{
2115 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2116 setSourceCrop, advanceSourceCrop));
2117}
2118
2119/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
2120TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
2121{
2122 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2123 setSourceCrop));
2124}
2125
Marissa Wallac108192016-12-15 12:27:48 -08002126/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
2127TEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
2128{
2129 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2130 setTransform, advanceTransform));
2131}
2132
2133/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
2134TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
2135{
2136 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2137 setTransform, advanceTransform));
2138}
2139
2140/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
2141TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
2142{
2143 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2144 setTransform));
2145}
Marissa Wall273b1df2016-12-15 12:28:47 -08002146
2147/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
2148TEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
2149{
2150 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
2151 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2152 const Hwc2TestLayers& testLayers) {
2153
2154 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
2155 testLayers.getZOrder(layer)));
2156 }
2157 ));
2158}
2159
2160/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
2161TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
2162{
2163 const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
2164 static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
2165 static_cast<uint32_t>(UINT32_MAX / 2),
2166 static_cast<uint32_t>(UINT32_MAX) };
2167
2168 for (auto display : mDisplays) {
2169 std::vector<hwc2_config_t> configs;
2170
2171 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2172
2173 for (auto config : configs) {
2174 hwc2_layer_t layer;
2175
2176 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2177
2178 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2179
2180 for (uint32_t zOrder : zOrders) {
2181 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
2182 }
2183
2184 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2185 }
2186 }
2187}
2188
2189/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
2190TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
2191{
2192 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2193 setZOrder));
2194}