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