blob: b060be90bd7917ebc68683c0deefe4712f1fe0e1 [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 Wallffc67da2016-12-15 12:26:09 -0800361 void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
362 hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
363 {
364 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
365 getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
366 ASSERT_TRUE(pfn) << "failed to get function";
367
368 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
369 mode));
370 if (outErr) {
371 *outErr = err;
372 } else {
373 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
374 << getBlendModeName(mode);
375 }
376 }
377
Marissa Wallb72b5c92016-12-15 12:26:39 -0800378 void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
379 android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
380 {
381 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
382 getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
383 ASSERT_TRUE(pfn) << "failed to get function";
384
385 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
386 layer, dataspace));
387 if (outErr) {
388 *outErr = err;
389 } else {
390 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
391 }
392 }
393
Marissa Wall600a73b2016-12-15 12:30:39 -0800394 void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
395 const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
396 {
397 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
398 getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
399 ASSERT_TRUE(pfn) << "failed to get function";
400
401 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
402 displayFrame));
403 if (outErr) {
404 *outErr = err;
405 } else {
406 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
407 " frame";
408 }
409 }
410
Marissa Wall2b1f5302016-12-15 12:27:20 -0800411 void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
412 float alpha, hwc2_error_t* outErr = nullptr)
413 {
414 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
415 getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
416 ASSERT_TRUE(pfn) << "failed to get function";
417
418 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
419 alpha));
420 if (outErr) {
421 *outErr = err;
422 } else {
423 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
424 << alpha;
425 }
426 }
427
Marissa Wallc57468f2016-12-15 12:31:12 -0800428 void setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer,
429 const hwc_frect_t& sourceCrop, hwc2_error_t* outErr = nullptr)
430 {
431 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
432 getFunction(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP));
433 ASSERT_TRUE(pfn) << "failed to get function";
434
435 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
436 sourceCrop));
437 if (outErr) {
438 *outErr = err;
439 } else {
440 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer source crop";
441 }
442 }
443
Marissa Wallac108192016-12-15 12:27:48 -0800444 void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
445 hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
446 {
447 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
448 getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
449 ASSERT_TRUE(pfn) << "failed to get function";
450
451 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
452 transform));
453 if (outErr) {
454 *outErr = err;
455 } else {
456 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
457 << getTransformName(transform);
458 }
459 }
460
Marissa Wall273b1df2016-12-15 12:28:47 -0800461 void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
462 uint32_t zOrder, hwc2_error_t* outErr = nullptr)
463 {
464 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
465 getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
466 ASSERT_TRUE(pfn) << "failed to get function";
467
468 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
469 zOrder));
470 if (outErr) {
471 *outErr = err;
472 } else {
473 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
474 << zOrder;
475 }
476 }
477
Marissa Wall4d600052016-12-15 12:16:01 -0800478protected:
479 hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
480 {
481 return mHwc2Device->getFunction(mHwc2Device, descriptor);
482 }
483
484 void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
485 {
486 uint32_t num = 0;
487
488 mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
489
490 outCapabilities->resize(num);
491
492 mHwc2Device->getCapabilities(mHwc2Device, &num,
493 reinterpret_cast<int32_t*>(outCapabilities->data()));
494 }
495
Marissa Wallcfb9a072017-02-17 20:53:18 -0800496 /* Registers a hotplug callback and waits for hotplug callbacks. This
497 * function will have no effect if called more than once. */
498 void populateDisplays()
499 {
500 /* Sets the hotplug status to receiving */
501 {
502 std::lock_guard<std::mutex> lock(mHotplugMutex);
503
504 if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
505 return;
506 mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
507 }
508
509 /* Registers the callback. This function call cannot be locked because
510 * a callback could happen on the same thread */
511 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
512 reinterpret_cast<hwc2_function_pointer_t>(
513 hwc2TestHotplugCallback)));
514
515 /* Waits for hotplug events. If a hotplug event has not come within 1
516 * second, stop waiting. */
517 std::unique_lock<std::mutex> lock(mHotplugMutex);
518
519 while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
520 std::cv_status::timeout) { }
521
522 /* Sets the hotplug status to done. Future calls will have no effect */
523 mHotplugStatus = Hwc2TestHotplugStatus::Done;
524 }
525
526 void getBadDisplay(hwc2_display_t* outDisplay)
527 {
528 for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
529 if (mDisplays.count(display) == 0) {
530 *outDisplay = display;
531 return;
532 }
533 }
534 ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
535 " are registered. This should never happen.";
536 }
537
Marissa Wall1db2e372016-12-15 12:19:39 -0800538 /* NOTE: will create min(newlayerCnt, max supported layers) layers */
539 void createLayers(hwc2_display_t display,
540 std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
541 {
542 std::vector<hwc2_layer_t> newLayers;
543 hwc2_layer_t layer;
544 hwc2_error_t err = HWC2_ERROR_NONE;
545
546 for (size_t i = 0; i < newLayerCnt; i++) {
547
548 EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
549 if (err == HWC2_ERROR_NO_RESOURCES)
550 break;
551 if (err != HWC2_ERROR_NONE) {
552 newLayers.clear();
553 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
554 }
555 newLayers.push_back(layer);
556 }
557
558 *outLayers = std::move(newLayers);
559 }
560
561 void destroyLayers(hwc2_display_t display,
562 std::vector<hwc2_layer_t>&& layers)
563 {
564 for (hwc2_layer_t layer : layers) {
565 EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
566 }
567 }
568
Marissa Wallcf935cb2016-12-15 12:20:47 -0800569 void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
570 {
571 std::vector<hwc2_config_t> configs;
572
573 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
574
575 hwc2_config_t CONFIG_MAX = UINT32_MAX;
576
577 ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
578 " (2^32 values) has been taken which shouldn't happen";
579
580 hwc2_config_t config;
581 for (config = 0; config < CONFIG_MAX; config++) {
582 if (std::count(configs.begin(), configs.end(), config) == 0)
583 break;
584 }
585
586 *outConfig = config;
587 }
588
Marissa Wall572a1ee2016-12-15 12:24:13 -0800589 void enableVsync(hwc2_display_t display)
590 {
591 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
592 reinterpret_cast<hwc2_function_pointer_t>(
593 hwc2TestVsyncCallback)));
594 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
595 }
596
597 void disableVsync(hwc2_display_t display)
598 {
599 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
600 }
601
602 void waitForVsync(hwc2_display_t* outDisplay = nullptr,
603 int64_t* outTimestamp = nullptr)
604 {
605 std::unique_lock<std::mutex> lock(mVsyncMutex);
606 ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
607 std::cv_status::no_timeout) << "timed out attempting to get"
608 " vsync callback";
609 if (outDisplay)
610 *outDisplay = mVsyncDisplay;
611 if (outTimestamp)
612 *outTimestamp = mVsyncTimestamp;
613 }
614
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800615 /* Calls a set property function from Hwc2Test to set a property value from
616 * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
617 using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
618 hwc2_display_t display, hwc2_layer_t layer,
619 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
620
Marissa Wall273b1df2016-12-15 12:28:47 -0800621 /* Calls a set property function from Hwc2Test to set property values from
622 * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
623 using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
624 hwc2_display_t display, hwc2_layer_t layer,
625 const Hwc2TestLayers& testLayers);
626
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800627 /* Calls a set property function from Hwc2Test to set a bad property value
628 * on hwc2_layer_t on hwc2_display_t */
629 using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
630 hwc2_display_t display, hwc2_layer_t layer,
631 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
632
633 /* Calls a set property function from Hwc2Test to set a bad property value
634 * on hwc2_layer_t on hwc2_display_t */
635 using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
636 hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
637
638 /* Advances a property of Hwc2TestLayer */
639 using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
640
641 /* For each active display it cycles through each display config and tests
642 * each property value. It creates a layer, sets the property and then
643 * destroys the layer */
644 void setLayerProperty(Hwc2TestCoverage coverage,
645 TestLayerPropertyFunction function, AdvanceProperty advance)
646 {
647 for (auto display : mDisplays) {
648 std::vector<hwc2_config_t> configs;
649
650 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
651
652 for (auto config : configs) {
653 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -0800654 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800655
656 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800657 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
658 &displayArea));
659 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800660
661 do {
662 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
663
664 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
665 testLayer, nullptr));
666
667 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
668 } while (advance(&testLayer));
669 }
670 }
671 }
672
673 /* For each active display it cycles through each display config and tests
674 * each property value. It creates a layer, cycles through each property
675 * value and updates the layer property value and then destroys the layer */
676 void setLayerPropertyUpdate(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 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
694
695 do {
696 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
697 testLayer, nullptr));
698 } while (advance(&testLayer));
699
700 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
701 }
702 }
703 }
704
Marissa Wall273b1df2016-12-15 12:28:47 -0800705 /* For each active display it cycles through each display config and tests
706 * each property value. It creates multiple layers, calls the
707 * TestLayerPropertiesFunction to set property values and then
708 * destroys the layers */
709 void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
710 TestLayerPropertiesFunction function)
711 {
712 for (auto display : mDisplays) {
713 std::vector<hwc2_config_t> configs;
714
715 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
716
717 for (auto config : configs) {
718 std::vector<hwc2_layer_t> layers;
Marissa Wall600a73b2016-12-15 12:30:39 -0800719 Area displayArea;
Marissa Wall273b1df2016-12-15 12:28:47 -0800720
721 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800722 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
723 &displayArea));
Marissa Wall273b1df2016-12-15 12:28:47 -0800724
725 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
Marissa Wall600a73b2016-12-15 12:30:39 -0800726 Hwc2TestLayers testLayers(layers, coverage, displayArea);
Marissa Wall273b1df2016-12-15 12:28:47 -0800727
728 for (auto layer : layers) {
729 EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
730 testLayers));
731 }
732
733 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
734 }
735 }
736 }
737
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800738 /* For each active display it cycles through each display config.
739 * 1) It attempts to set a valid property value to bad layer handle.
740 * 2) It creates a layer x and attempts to set a valid property value to
741 * layer x + 1
742 * 3) It destroys the layer x and attempts to set a valid property value to
743 * the destroyed layer x.
744 */
745 void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
746 TestLayerPropertyBadLayerFunction function)
747 {
748 for (auto display : mDisplays) {
749 std::vector<hwc2_config_t> configs;
750
751 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
752
753 for (auto config : configs) {
754 hwc2_layer_t layer = 0;
Marissa Wall600a73b2016-12-15 12:30:39 -0800755 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800756 hwc2_error_t err = HWC2_ERROR_NONE;
757
758 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800759 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
760 &displayArea));
761 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800762
763 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
764 testLayer, &err));
765 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
766
767 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
768
769 ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
770 testLayer, &err));
771 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
772
773 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
774
775 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
776 testLayer, &err));
777 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
778 }
779 }
780 }
781
782 /* For each active display it cycles through each display config and tests
783 * each property value. It creates a layer, sets a bad property value and
784 * then destroys the layer */
785 void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
786 {
787 for (auto display : mDisplays) {
788 std::vector<hwc2_config_t> configs;
789
790 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
791
792 for (auto config : configs) {
793 hwc2_layer_t layer;
794 hwc2_error_t err = HWC2_ERROR_NONE;
795
796 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
797
798 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
799
800 ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
801 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
802 " error code";
803
804 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
805 }
806 }
807 }
808
Marissa Wall600a73b2016-12-15 12:30:39 -0800809 void getActiveConfigAttribute(hwc2_display_t display,
810 hwc2_attribute_t attribute, int32_t* outValue)
811 {
812 hwc2_config_t config;
813 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
814 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
815 attribute, outValue));
816 ASSERT_GE(*outValue, 0) << "failed to get valid "
817 << getAttributeName(attribute);
818 }
819
820 void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
821 {
822 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
823 HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
824 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
825 HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
826 }
827
Marissa Wall4d600052016-12-15 12:16:01 -0800828 hwc2_device_t* mHwc2Device = nullptr;
Marissa Wallcfb9a072017-02-17 20:53:18 -0800829
830 enum class Hwc2TestHotplugStatus {
831 Init = 1,
832 Receiving,
833 Done,
834 };
835
836 std::mutex mHotplugMutex;
837 std::condition_variable mHotplugCv;
838 Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
839 std::unordered_set<hwc2_display_t> mDisplays;
Marissa Wall1db2e372016-12-15 12:19:39 -0800840
841 /* Store all created layers that have not been destroyed. If an ASSERT_*
842 * fails, then destroy the layers on exit */
843 std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
Marissa Wall03c91732016-12-15 12:23:16 -0800844
845 /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
846 * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
847 std::set<hwc2_display_t> mActiveDisplays;
Marissa Wall572a1ee2016-12-15 12:24:13 -0800848
849 std::mutex mVsyncMutex;
850 std::condition_variable mVsyncCv;
851 hwc2_display_t mVsyncDisplay;
852 int64_t mVsyncTimestamp = -1;
Marissa Wall4d600052016-12-15 12:16:01 -0800853};
854
Marissa Wallcfb9a072017-02-17 20:53:18 -0800855void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
856 hwc2_display_t display, int32_t connection)
857{
858 if (callbackData)
859 static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
860 connection);
861}
862
Marissa Wall572a1ee2016-12-15 12:24:13 -0800863void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
864 hwc2_display_t display, int64_t timestamp)
865{
866 if (callbackData)
867 static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
868 timestamp);
869}
870
Marissa Wallffc67da2016-12-15 12:26:09 -0800871void setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
872 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
873{
874 EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
875 testLayer.getBlendMode(), outErr));
876}
877
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800878void setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
879 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
880{
881 hwc2_composition_t composition = testLayer.getComposition();
882 hwc2_error_t err = HWC2_ERROR_NONE;
883
884 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
885 composition, &err));
886 if (outErr) {
887 *outErr = err;
888 return;
889 }
890
891 if (composition != HWC2_COMPOSITION_SIDEBAND) {
892 EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
893 } else {
894 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
895 << "returned wrong error code";
896 }
897}
898
Marissa Wallb72b5c92016-12-15 12:26:39 -0800899void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
900 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
901{
902 EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
903 testLayer.getDataspace(), outErr));
904}
905
Marissa Wall600a73b2016-12-15 12:30:39 -0800906void setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
907 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
908{
909 EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
910 testLayer.getDisplayFrame(), outErr));
911}
912
Marissa Wall2b1f5302016-12-15 12:27:20 -0800913void setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
914 const Hwc2TestLayer& testLayer, hwc2_error_t *outErr)
915{
916 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
917 testLayer.getBlendMode()));
918 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
919 testLayer.getPlaneAlpha(), outErr));
920}
921
Marissa Wallc57468f2016-12-15 12:31:12 -0800922void setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
923 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
924{
925 EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
926 testLayer.getSourceCrop(), outErr));
927}
928
Marissa Wallac108192016-12-15 12:27:48 -0800929void setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
930 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
931{
932 EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
933 testLayer.getTransform(), outErr));
934}
935
Marissa Wall273b1df2016-12-15 12:28:47 -0800936void setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
937 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
938{
939 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
940 testLayer.getZOrder(), outErr));
941}
942
Marissa Wallffc67da2016-12-15 12:26:09 -0800943bool advanceBlendMode(Hwc2TestLayer* testLayer)
944{
945 return testLayer->advanceBlendMode();
946}
947
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800948bool advanceComposition(Hwc2TestLayer* testLayer)
949{
950 return testLayer->advanceComposition();
951}
952
Marissa Wallb72b5c92016-12-15 12:26:39 -0800953bool advanceDataspace(Hwc2TestLayer* testLayer)
954{
955 return testLayer->advanceDataspace();
956}
957
Marissa Wall600a73b2016-12-15 12:30:39 -0800958bool advanceDisplayFrame(Hwc2TestLayer* testLayer)
959{
960 return testLayer->advanceDisplayFrame();
961}
962
Marissa Wall2b1f5302016-12-15 12:27:20 -0800963bool advancePlaneAlpha(Hwc2TestLayer* testLayer)
964{
965 return testLayer->advancePlaneAlpha();
966}
967
Marissa Wallc57468f2016-12-15 12:31:12 -0800968bool advanceSourceCrop(Hwc2TestLayer* testLayer)
969{
970 if (testLayer->advanceSourceCrop())
971 return true;
972 return testLayer->advanceBufferArea();
973}
974
Marissa Wallac108192016-12-15 12:27:48 -0800975bool advanceTransform(Hwc2TestLayer* testLayer)
976{
977 return testLayer->advanceTransform();
978}
979
Marissa Wall4d600052016-12-15 12:16:01 -0800980
981static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
982 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
983 HWC2_FUNCTION_CREATE_LAYER,
984 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
985 HWC2_FUNCTION_DESTROY_LAYER,
986 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
987 HWC2_FUNCTION_DUMP,
988 HWC2_FUNCTION_GET_ACTIVE_CONFIG,
989 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
990 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
991 HWC2_FUNCTION_GET_COLOR_MODES,
992 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
993 HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
994 HWC2_FUNCTION_GET_DISPLAY_NAME,
995 HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
996 HWC2_FUNCTION_GET_DISPLAY_TYPE,
997 HWC2_FUNCTION_GET_DOZE_SUPPORT,
998 HWC2_FUNCTION_GET_HDR_CAPABILITIES,
999 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
1000 HWC2_FUNCTION_GET_RELEASE_FENCES,
1001 HWC2_FUNCTION_PRESENT_DISPLAY,
1002 HWC2_FUNCTION_REGISTER_CALLBACK,
1003 HWC2_FUNCTION_SET_ACTIVE_CONFIG,
1004 HWC2_FUNCTION_SET_CLIENT_TARGET,
1005 HWC2_FUNCTION_SET_COLOR_MODE,
1006 HWC2_FUNCTION_SET_COLOR_TRANSFORM,
1007 HWC2_FUNCTION_SET_CURSOR_POSITION,
1008 HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
1009 HWC2_FUNCTION_SET_LAYER_BUFFER,
1010 HWC2_FUNCTION_SET_LAYER_COLOR,
1011 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
1012 HWC2_FUNCTION_SET_LAYER_DATASPACE,
1013 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
1014 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
1015 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
1016 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
1017 HWC2_FUNCTION_SET_LAYER_TRANSFORM,
1018 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
1019 HWC2_FUNCTION_SET_LAYER_Z_ORDER,
1020 HWC2_FUNCTION_SET_OUTPUT_BUFFER,
1021 HWC2_FUNCTION_SET_POWER_MODE,
1022 HWC2_FUNCTION_SET_VSYNC_ENABLED,
1023 HWC2_FUNCTION_VALIDATE_DISPLAY,
1024}};
1025
1026/* TESTCASE: Tests that the HWC2 supports all required functions. */
1027TEST_F(Hwc2Test, GET_FUNCTION)
1028{
1029 for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
1030 hwc2_function_pointer_t pfn = getFunction(descriptor);
1031 EXPECT_TRUE(pfn) << "failed to get function "
1032 << getFunctionDescriptorName(descriptor);
1033 }
1034}
1035
1036/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
1037TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
1038{
1039 hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
1040 EXPECT_FALSE(pfn) << "failed to get invalid function";
1041}
1042
1043/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
1044TEST_F(Hwc2Test, GET_CAPABILITIES)
1045{
1046 std::vector<hwc2_capability_t> capabilities;
1047
1048 getCapabilities(&capabilities);
1049
1050 EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
1051 HWC2_CAPABILITY_INVALID), 0);
1052}
Marissa Walla4b01482017-02-17 20:52:03 -08001053
1054static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1055 HWC2_CALLBACK_HOTPLUG,
1056 HWC2_CALLBACK_REFRESH,
1057 HWC2_CALLBACK_VSYNC,
1058}};
1059
1060/* TESTCASE: Tests that the HWC2 can successfully register all required
1061 * callback functions. */
1062TEST_F(Hwc2Test, REGISTER_CALLBACK)
1063{
1064 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1065 const_cast<char*>("data"));
1066
1067 for (auto descriptor : callbackDescriptors) {
1068 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1069 []() { return; }));
1070 }
1071}
1072
1073/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1074TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1075{
1076 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1077 const_cast<char*>("data"));
1078 hwc2_error_t err = HWC2_ERROR_NONE;
1079
1080 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1081 []() { return; }, &err));
1082 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1083}
1084
1085/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
1086TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
1087{
1088 hwc2_callback_data_t data = nullptr;
1089
1090 for (auto descriptor : callbackDescriptors) {
1091 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1092 []() { return; }));
1093 }
1094}
Marissa Wallcfb9a072017-02-17 20:53:18 -08001095
1096/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1097 * physical display. */
1098TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1099{
1100 for (auto display : mDisplays) {
1101 hwc2_display_type_t type;
1102
1103 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1104 EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1105 " correct display type";
1106 }
1107}
1108
1109/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1110 * display is requested. */
1111TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1112{
1113 hwc2_display_t display;
1114 hwc2_display_type_t type;
1115 hwc2_error_t err = HWC2_ERROR_NONE;
1116
1117 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1118
1119 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1120 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1121}
Marissa Wall1db2e372016-12-15 12:19:39 -08001122
1123/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
1124TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
1125{
1126 for (auto display : mDisplays) {
1127 hwc2_layer_t layer;
1128
1129 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1130
1131 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1132 }
1133}
1134
1135/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
1136TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
1137{
1138 hwc2_display_t display;
1139 hwc2_layer_t layer;
1140 hwc2_error_t err = HWC2_ERROR_NONE;
1141
1142 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1143
1144 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
1145 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1146}
1147
1148/* TESTCASE: Tests that the HWC2 will either support a large number of resources
1149 * or will return no resources. */
1150TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
1151{
1152 const size_t layerCnt = 1000;
1153
1154 for (auto display : mDisplays) {
1155 std::vector<hwc2_layer_t> layers;
1156
1157 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1158
1159 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1160 }
1161}
1162
1163/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
1164TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
1165{
1166 hwc2_display_t badDisplay;
1167
1168 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
1169
1170 for (auto display : mDisplays) {
1171 hwc2_layer_t layer = 0;
1172 hwc2_error_t err = HWC2_ERROR_NONE;
1173
1174 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1175 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1176
1177 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1178
1179 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1180 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1181
1182 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1183 }
1184}
1185
1186/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
1187TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
1188{
1189 for (auto display : mDisplays) {
1190 hwc2_layer_t layer;
1191 hwc2_error_t err = HWC2_ERROR_NONE;
1192
1193 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
1194 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1195
1196 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
1197 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1198
1199 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
1200 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1201
1202 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
1203 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1204
1205 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
1206 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1207
1208 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1209
1210 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
1211 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1212
1213 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1214
1215 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
1216 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1217 }
1218}
Marissa Wallcf935cb2016-12-15 12:20:47 -08001219
1220static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1221 HWC2_ATTRIBUTE_WIDTH,
1222 HWC2_ATTRIBUTE_HEIGHT,
1223}};
1224
1225static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1226 HWC2_ATTRIBUTE_VSYNC_PERIOD,
1227 HWC2_ATTRIBUTE_DPI_X,
1228 HWC2_ATTRIBUTE_DPI_Y,
1229}};
1230
1231/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1232 * config. */
1233TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1234{
1235 for (auto display : mDisplays) {
1236 std::vector<hwc2_config_t> configs;
1237
1238 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1239
1240 for (auto config : configs) {
1241 int32_t value;
1242
1243 for (auto attribute : requiredAttributes) {
1244 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1245 attribute, &value));
1246 EXPECT_GE(value, 0) << "missing required attribute "
1247 << getAttributeName(attribute) << " for config "
1248 << config;
1249 }
1250 for (auto attribute : optionalAttributes) {
1251 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1252 attribute, &value));
1253 }
1254 }
1255 }
1256}
1257
1258/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1259 * attribute */
1260TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1261{
1262 const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1263
1264 for (auto display : mDisplays) {
1265 std::vector<hwc2_config_t> configs;
1266
1267 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1268
1269 for (auto config : configs) {
1270 int32_t value;
1271 hwc2_error_t err = HWC2_ERROR_NONE;
1272
1273 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1274 attribute, &value, &err));
1275 EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1276 " attribute for config " << config;
1277 }
1278 }
1279}
1280
1281/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1282TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1283{
1284 hwc2_display_t display;
1285 const hwc2_config_t config = 0;
1286 int32_t value;
1287 hwc2_error_t err = HWC2_ERROR_NONE;
1288
1289 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1290
1291 for (auto attribute : requiredAttributes) {
1292 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1293 &value, &err));
1294 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1295 }
1296
1297 for (auto attribute : optionalAttributes) {
1298 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1299 &value, &err));
1300 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1301 }
1302}
1303
1304/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1305TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1306{
1307 for (auto display : mDisplays) {
1308 hwc2_config_t config;
1309 int32_t value;
1310 hwc2_error_t err = HWC2_ERROR_NONE;
1311
1312 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1313
1314 for (auto attribute : requiredAttributes) {
1315 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1316 attribute, &value, &err));
1317 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1318 }
1319
1320 for (auto attribute : optionalAttributes) {
1321 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1322 attribute, &value, &err));
1323 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1324 }
1325 }
1326}
1327
1328/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1329TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1330{
1331 for (auto display : mDisplays) {
1332 std::vector<hwc2_config_t> configs;
1333
1334 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1335 }
1336}
1337
1338/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1339TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1340{
1341 hwc2_display_t display;
1342 std::vector<hwc2_config_t> configs;
1343 hwc2_error_t err = HWC2_ERROR_NONE;
1344
1345 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1346
1347 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1348
1349 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1350 EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1351}
1352
1353/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1354 * times in a row. */
1355TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1356{
1357 for (auto display : mDisplays) {
1358 std::vector<hwc2_config_t> configs1, configs2;
1359
1360 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
1361 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
1362
1363 EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
1364 configs2.begin())) << "returned two different config sets";
1365 }
1366}
1367
1368/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
1369TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
1370{
1371 for (auto display : mDisplays) {
1372 std::vector<hwc2_config_t> configs;
1373
1374 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1375
1376 std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
1377 configs.end());
1378 EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
1379 " configs";
1380 }
1381}
Marissa Wall93dc04f2016-12-15 12:21:46 -08001382
1383/* TESTCASE: Tests that the HWC2 returns the active config for a display */
1384TEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
1385{
1386 for (auto display : mDisplays) {
1387 std::vector<hwc2_config_t> configs;
1388
1389 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1390
1391 for (auto config : configs) {
1392 hwc2_config_t activeConfig;
1393
1394 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1395 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
1396
1397 EXPECT_EQ(activeConfig, config) << "failed to get active config";
1398 }
1399 }
1400}
1401
1402/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
1403 * display. */
1404TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
1405{
1406 hwc2_display_t display;
1407 hwc2_config_t activeConfig;
1408 hwc2_error_t err = HWC2_ERROR_NONE;
1409
1410 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1411
1412 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1413
1414 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1415}
1416
1417/* TESTCASE: Tests that the HWC2 either begins with a valid active config
1418 * or returns an error when getActiveConfig is called. */
1419TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
1420{
1421 for (auto display : mDisplays) {
1422 std::vector<hwc2_config_t> configs;
1423 hwc2_config_t activeConfig;
1424 hwc2_error_t err = HWC2_ERROR_NONE;
1425
1426 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1427
1428 if (configs.empty())
1429 return;
1430
1431 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1432 if (err == HWC2_ERROR_NONE) {
1433 EXPECT_NE(std::count(configs.begin(), configs.end(),
1434 activeConfig), 0) << "active config is not found in "
1435 " configs for display";
1436 } else {
1437 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1438 }
1439 }
1440}
1441
1442/* TESTCASE: Tests that the HWC2 can set every display config as an active
1443 * config */
1444TEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
1445{
1446 for (auto display : mDisplays) {
1447 std::vector<hwc2_config_t> configs;
1448
1449 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1450
1451 for (auto config : configs) {
1452 EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1453 }
1454 }
1455}
1456
1457/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
1458TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
1459{
1460 hwc2_display_t display;
1461 const hwc2_config_t config = 0;
1462 hwc2_error_t err = HWC2_ERROR_NONE;
1463
1464 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1465
1466 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
1467 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1468}
1469
1470/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
1471TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
1472{
1473 for (auto display : mDisplays) {
1474 hwc2_config_t config;
1475 hwc2_error_t err = HWC2_ERROR_NONE;
1476
1477 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1478
1479 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
1480 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1481 }
1482}
Marissa Wall03c91732016-12-15 12:23:16 -08001483
1484/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
1485TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
1486{
1487 for (auto display : mDisplays) {
1488 int32_t support = -1;
1489
1490 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1491
1492 EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
1493 }
1494}
1495
1496/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
1497TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
1498{
1499 hwc2_display_t display;
1500 int32_t support = -1;
1501 hwc2_error_t err = HWC2_ERROR_NONE;
1502
1503 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1504
1505 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1506
1507 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1508}
1509
1510/* TESTCASE: Tests that the HWC2 can set all supported power modes */
1511TEST_F(Hwc2Test, SET_POWER_MODE)
1512{
1513 for (auto display : mDisplays) {
1514 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1515 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1516
1517 int32_t support = -1;
1518 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1519 if (support != 1)
1520 return;
1521
1522 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1523 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1524 HWC2_POWER_MODE_DOZE_SUSPEND));
1525
1526 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1527 }
1528}
1529
1530/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
1531TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
1532{
1533 hwc2_display_t display;
1534 hwc2_error_t err = HWC2_ERROR_NONE;
1535
1536 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1537
1538 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
1539 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1540
1541 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
1542 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1543
1544 int32_t support = -1;
1545 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1546 if (support != 1)
1547 return;
1548
1549 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
1550 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1551
1552 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
1553 &err));
1554 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1555}
1556
1557/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
1558TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
1559{
1560 for (auto display : mDisplays) {
1561 hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
1562 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
1563 hwc2_error_t err = HWC2_ERROR_NONE;
1564
1565 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
1566 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
1567 << mode;
1568 }
1569}
1570
1571/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
1572 * an optional power mode. */
1573TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
1574{
1575 for (auto display : mDisplays) {
1576 int32_t support = -1;
1577 hwc2_error_t err = HWC2_ERROR_NONE;
1578
1579 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1580 if (support == 1)
1581 return;
1582
1583 ASSERT_EQ(support, 0) << "invalid doze support value";
1584
1585 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
1586 &err));
1587 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1588
1589 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1590 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
1591 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1592 }
1593}
1594
1595/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
1596TEST_F(Hwc2Test, SET_POWER_MODE_stress)
1597{
1598 for (auto display : mDisplays) {
1599 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1600 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1601
1602 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1603 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1604
1605 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1606 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1607
1608 int32_t support = -1;
1609 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1610 if (support != 1)
1611 return;
1612
1613 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1614 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1615
1616 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1617 HWC2_POWER_MODE_DOZE_SUSPEND));
1618 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1619 HWC2_POWER_MODE_DOZE_SUSPEND));
1620
1621 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1622 }
1623}
Marissa Wall572a1ee2016-12-15 12:24:13 -08001624
1625/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
1626 * displays */
1627TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
1628{
1629 for (auto display : mDisplays) {
1630 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1631 const_cast<char*>("data"));
1632
1633 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1634
1635 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1636 []() { return; }));
1637
1638 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1639
1640 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1641
1642 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1643 }
1644}
1645
1646/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
1647TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
1648{
1649 for (auto display : mDisplays) {
1650 hwc2_display_t receivedDisplay;
1651 int64_t receivedTimestamp;
1652
1653 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1654
1655 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1656
1657 ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
1658 &receivedTimestamp));
1659
1660 EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
1661 EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
1662
1663 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1664
1665 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1666 }
1667}
1668
1669/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
1670TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
1671{
1672 hwc2_display_t display;
1673 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1674 const_cast<char*>("data"));
1675 hwc2_error_t err = HWC2_ERROR_NONE;
1676
1677 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1678
1679 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1680 []() { return; }));
1681
1682 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
1683 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1684
1685 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
1686 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1687}
1688
1689/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
1690TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
1691{
1692 for (auto display : mDisplays) {
1693 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1694 const_cast<char*>("data"));
1695 hwc2_error_t err = HWC2_ERROR_NONE;
1696
1697 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1698
1699 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1700 []() { return; }));
1701
1702 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
1703 &err));
1704 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1705
1706 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1707 }
1708}
1709
1710/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
1711 * times. */
1712TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
1713{
1714 for (auto display : mDisplays) {
1715 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1716 const_cast<char*>("data"));
1717
1718 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1719
1720 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1721 []() { return; }));
1722
1723 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1724
1725 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1726 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1727
1728 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1729 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1730
1731 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1732 }
1733}
1734
1735/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
1736 * is off and no callback is registered. */
1737TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
1738{
1739 const uint secs = 1;
1740
1741 for (auto display : mDisplays) {
1742 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1743
1744 sleep(secs);
1745
1746 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1747 }
1748}
1749
1750/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
1751 * is registered. */
1752TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
1753{
1754 const uint secs = 1;
1755
1756 for (auto display : mDisplays) {
1757 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1758
1759 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1760
1761 sleep(secs);
1762
1763 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1764
1765 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1766 }
1767}
Marissa Walldd4087f2016-12-15 12:24:52 -08001768
1769/* TESTCASE: Tests that the HWC2 returns a display name for each display */
1770TEST_F(Hwc2Test, GET_DISPLAY_NAME)
1771{
1772 for (auto display : mDisplays) {
1773 std::string name;
1774
1775 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
1776 }
1777}
1778
1779/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
1780 * display */
1781TEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
1782{
1783 hwc2_display_t display;
1784 std::string name;
1785 hwc2_error_t err = HWC2_ERROR_NONE;
1786
1787 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1788
1789 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
1790 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1791}
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001792
1793/* TESTCASE: Tests that the HWC2 can set basic composition types. */
1794TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
1795{
1796 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1797 setComposition, advanceComposition));
1798}
1799
1800/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
1801 * layer. */
1802TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
1803{
1804 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1805 setComposition, advanceComposition));
1806}
1807
1808/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
1809TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
1810{
1811 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1812 setComposition));
1813}
1814
1815/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
1816TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
1817{
1818 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
1819 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1820 hwc2_error_t* outErr) {
1821
1822 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1823 layer, HWC2_COMPOSITION_INVALID, outErr));
1824 }
1825 ));
1826}
Marissa Wallffc67da2016-12-15 12:26:09 -08001827
1828/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
1829TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
1830{
1831 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1832 setBlendMode, advanceBlendMode));
1833}
1834
1835/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
1836TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
1837{
1838 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1839 setBlendMode, advanceBlendMode));
1840}
1841
1842/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
1843TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
1844{
1845 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1846 setBlendMode));
1847}
1848
1849/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
1850TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
1851{
1852 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
1853 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1854 hwc2_error_t* outErr) {
1855
1856 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
1857 layer, HWC2_BLEND_MODE_INVALID, outErr));
1858 }
1859 ));
1860}
Marissa Wallb72b5c92016-12-15 12:26:39 -08001861
1862/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
1863TEST_F(Hwc2Test, SET_LAYER_DATASPACE)
1864{
1865 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1866 setDataspace, advanceDataspace));
1867}
1868
1869/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
1870TEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
1871{
1872 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1873 setDataspace, advanceDataspace));
1874}
1875
1876/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
1877TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
1878{
1879 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1880 setDataspace));
1881}
Marissa Wall2b1f5302016-12-15 12:27:20 -08001882
Marissa Wall600a73b2016-12-15 12:30:39 -08001883/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
1884TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
1885{
1886 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1887 setDisplayFrame, advanceDisplayFrame));
1888}
1889
1890/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
1891TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
1892{
1893 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1894 setDisplayFrame, advanceDisplayFrame));
1895}
1896
1897/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
1898TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
1899{
1900 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1901 setDisplayFrame));
1902}
1903
Marissa Wall2b1f5302016-12-15 12:27:20 -08001904/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
1905TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
1906{
1907 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1908 setPlaneAlpha, advancePlaneAlpha));
1909}
1910
1911/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
1912TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
1913{
1914 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1915 setPlaneAlpha, advancePlaneAlpha));
1916}
1917
1918/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
1919TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
1920{
1921 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1922 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
1923 const Hwc2TestLayer& testLayer, hwc2_error_t *outErr) {
1924
1925 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
1926 badLayer, testLayer.getPlaneAlpha(), outErr));
1927 }
1928 ));
1929}
Marissa Wallac108192016-12-15 12:27:48 -08001930
Marissa Wallc57468f2016-12-15 12:31:12 -08001931/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
1932TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
1933{
1934 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1935 setSourceCrop, advanceSourceCrop));
1936}
1937
1938/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
1939TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
1940{
1941 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1942 setSourceCrop, advanceSourceCrop));
1943}
1944
1945/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
1946TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
1947{
1948 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1949 setSourceCrop));
1950}
1951
Marissa Wallac108192016-12-15 12:27:48 -08001952/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
1953TEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
1954{
1955 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1956 setTransform, advanceTransform));
1957}
1958
1959/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
1960TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
1961{
1962 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1963 setTransform, advanceTransform));
1964}
1965
1966/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
1967TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
1968{
1969 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1970 setTransform));
1971}
Marissa Wall273b1df2016-12-15 12:28:47 -08001972
1973/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
1974TEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
1975{
1976 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
1977 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1978 const Hwc2TestLayers& testLayers) {
1979
1980 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
1981 testLayers.getZOrder(layer)));
1982 }
1983 ));
1984}
1985
1986/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
1987TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
1988{
1989 const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
1990 static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
1991 static_cast<uint32_t>(UINT32_MAX / 2),
1992 static_cast<uint32_t>(UINT32_MAX) };
1993
1994 for (auto display : mDisplays) {
1995 std::vector<hwc2_config_t> configs;
1996
1997 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1998
1999 for (auto config : configs) {
2000 hwc2_layer_t layer;
2001
2002 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2003
2004 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2005
2006 for (uint32_t zOrder : zOrders) {
2007 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
2008 }
2009
2010 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2011 }
2012 }
2013}
2014
2015/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
2016TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
2017{
2018 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2019 setZOrder));
2020}