blob: 13774b4ed37caa3c72591b98d95b64722fdbfb81 [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 Wall563030b2017-02-21 14:01:05 -080019#include <unordered_map>
Marissa Wall4d600052016-12-15 12:16:01 -080020#include <gtest/gtest.h>
21#include <dlfcn.h>
Marissa Wall5a240aa2016-12-15 12:34:06 -080022#include <android-base/unique_fd.h>
Marissa Wall4d600052016-12-15 12:16:01 -080023#include <hardware/hardware.h>
Marissa Wall563030b2017-02-21 14:01:05 -080024#include <sync/sync.h>
Peiyong Linfd997e02018-03-28 15:29:00 -070025#include <ui/GraphicTypes.h>
Marissa Wall4d600052016-12-15 12:16:01 -080026
27#define HWC2_INCLUDE_STRINGIFICATION
28#define HWC2_USE_CPP11
29#include <hardware/hwcomposer2.h>
30#undef HWC2_INCLUDE_STRINGIFICATION
31#undef HWC2_USE_CPP11
32
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080033#include "Hwc2TestLayer.h"
Marissa Wall273b1df2016-12-15 12:28:47 -080034#include "Hwc2TestLayers.h"
Marissa Wallf18cfb02017-02-21 14:01:05 -080035#include "Hwc2TestClientTarget.h"
Marissa Wallbad1bc72017-02-21 14:33:46 -080036#include "Hwc2TestVirtualDisplay.h"
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080037
Peiyong Linfd997e02018-03-28 15:29:00 -070038using android::ui::ColorMode;
Peiyong Lin34beb7a2018-03-28 11:57:12 -070039using android::ui::Dataspace;
Peiyong Lina52f0292018-03-14 17:26:31 -070040
Marissa Wallcfb9a072017-02-17 20:53:18 -080041void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
42 hwc2_display_t display, int32_t connected);
Marissa Wall572a1ee2016-12-15 12:24:13 -080043void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
44 hwc2_display_t display, int64_t timestamp);
Marissa Wallcfb9a072017-02-17 20:53:18 -080045
Marissa Wall4d600052016-12-15 12:16:01 -080046class Hwc2Test : public testing::Test {
47public:
48
49 virtual void SetUp()
50 {
51 hw_module_t const* hwc2Module;
52
53 int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
54 ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
55 << strerror(-err);
56
57 /* The following method will fail if you have not run
58 * "adb shell stop" */
59 err = hwc2_open(hwc2Module, &mHwc2Device);
60 ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
61 << strerror(-err);
Marissa Wallcfb9a072017-02-17 20:53:18 -080062
63 populateDisplays();
Marissa Wall4d600052016-12-15 12:16:01 -080064 }
65
66 virtual void TearDown()
67 {
Marissa Wall1db2e372016-12-15 12:19:39 -080068
69 for (auto itr = mLayers.begin(); itr != mLayers.end();) {
70 hwc2_display_t display = itr->first;
71 hwc2_layer_t layer = itr->second;
72 itr++;
73 /* Destroys and removes the layer from mLayers */
74 destroyLayer(display, layer);
75 }
76
Marissa Wall03c91732016-12-15 12:23:16 -080077 for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
78 hwc2_display_t display = *itr;
79 itr++;
80 /* Sets power mode to off and removes the display from
81 * mActiveDisplays */
82 setPowerMode(display, HWC2_POWER_MODE_OFF);
83 }
84
Marissa Wallbad1bc72017-02-21 14:33:46 -080085 for (auto itr = mVirtualDisplays.begin(); itr != mVirtualDisplays.end();) {
86 hwc2_display_t display = *itr;
87 itr++;
88 /* Destroys virtual displays */
89 destroyVirtualDisplay(display);
90 }
91
Marissa Wall4d600052016-12-15 12:16:01 -080092 if (mHwc2Device)
93 hwc2_close(mHwc2Device);
94 }
95
Marissa Walla4b01482017-02-17 20:52:03 -080096 void registerCallback(hwc2_callback_descriptor_t descriptor,
97 hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
98 hwc2_error_t* outErr = nullptr)
99 {
100 auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
101 getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
102 ASSERT_TRUE(pfn) << "failed to get function";
103
104 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
105 callbackData, pointer));
106 if (outErr) {
107 *outErr = err;
108 } else {
109 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
110 }
111 }
112
Marissa Wallcfb9a072017-02-17 20:53:18 -0800113 void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
114 hwc2_error_t* outErr = nullptr)
115 {
116 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
117 getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
118 ASSERT_TRUE(pfn) << "failed to get function";
119
120 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
121 reinterpret_cast<int32_t*>(outType)));
122 if (outErr) {
123 *outErr = err;
124 } else {
125 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
126 }
127 }
128
129 /* If the populateDisplays function is still receiving displays and the
130 * display is connected, the display handle is stored in mDisplays. */
131 void hotplugCallback(hwc2_display_t display, int32_t connected)
132 {
133 std::lock_guard<std::mutex> lock(mHotplugMutex);
134
135 if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
136 return;
137
138 if (connected == HWC2_CONNECTION_CONNECTED)
139 mDisplays.insert(display);
140
141 mHotplugCv.notify_all();
142 }
143
Marissa Wall1db2e372016-12-15 12:19:39 -0800144 void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
145 hwc2_error_t* outErr = nullptr)
146 {
147 auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
148 getFunction(HWC2_FUNCTION_CREATE_LAYER));
149 ASSERT_TRUE(pfn) << "failed to get function";
150
151 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
152 outLayer));
153
154 if (err == HWC2_ERROR_NONE)
155 mLayers.insert(std::make_pair(display, *outLayer));
156
157 if (outErr) {
158 *outErr = err;
159 } else {
160 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
161 }
162 }
163
164 void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
165 hwc2_error_t* outErr = nullptr)
166 {
167 auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
168 getFunction(HWC2_FUNCTION_DESTROY_LAYER));
169 ASSERT_TRUE(pfn) << "failed to get function";
170
171 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
172
173 if (err == HWC2_ERROR_NONE)
174 mLayers.erase(std::make_pair(display, layer));
175
176 if (outErr) {
177 *outErr = err;
178 } else {
179 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
180 << layer;
181 }
182 }
183
Marissa Wallcf935cb2016-12-15 12:20:47 -0800184 void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
185 hwc2_attribute_t attribute, int32_t* outValue,
186 hwc2_error_t* outErr = nullptr)
187 {
188 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
189 getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
190 ASSERT_TRUE(pfn) << "failed to get function";
191
192 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
193 attribute, outValue));
194
195 if (outErr) {
196 *outErr = err;
197 } else {
198 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
199 << getAttributeName(attribute) << " for config " << config;
200 }
201 }
202
203 void getDisplayConfigs(hwc2_display_t display,
204 std::vector<hwc2_config_t>* outConfigs,
205 hwc2_error_t* outErr = nullptr)
206 {
207 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
208 getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
209 ASSERT_TRUE(pfn) << "failed to get function";
210
211 uint32_t numConfigs = 0;
212
213 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
214 &numConfigs, nullptr));
215
216 if (err == HWC2_ERROR_NONE) {
217 outConfigs->resize(numConfigs);
218
219 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
220 &numConfigs, outConfigs->data()));
221 }
222
223 if (outErr) {
224 *outErr = err;
225 } else {
226 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
227 " display " << display;
228 }
229 }
230
Marissa Wall93dc04f2016-12-15 12:21:46 -0800231 void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
232 hwc2_error_t* outErr = nullptr)
233 {
234 auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
235 getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
236 ASSERT_TRUE(pfn) << "failed to get function";
237
238 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
239 outConfig));
240 if (outErr) {
241 *outErr = err;
242 } else {
243 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
244 " display " << display;
245 }
246 }
247
248 void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
249 hwc2_error_t* outErr = nullptr)
250 {
251 auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
252 getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
253 ASSERT_TRUE(pfn) << "failed to get function";
254
255 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
256 if (outErr) {
257 *outErr = err;
258 } else {
259 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
260 << config;
261 }
262 }
263
Marissa Wall03c91732016-12-15 12:23:16 -0800264 void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
265 hwc2_error_t* outErr = nullptr)
266 {
267 auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
268 getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
269 ASSERT_TRUE(pfn) << "failed to get function";
270
271 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
272 outSupport));
273 if (outErr) {
274 *outErr = err;
275 } else {
276 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
277 " display " << display;
278 }
279 }
280
281 void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
282 hwc2_error_t* outErr = nullptr)
283 {
284 auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
285 getFunction(HWC2_FUNCTION_SET_POWER_MODE));
286 ASSERT_TRUE(pfn) << "failed to get function";
287
288 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
289 mode));
290 if (outErr) {
291 *outErr = err;
292 if (err != HWC2_ERROR_NONE)
293 return;
294 } else {
295 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
296 << getPowerModeName(mode) << " on display " << display;
297 }
298
299 if (mode == HWC2_POWER_MODE_OFF) {
300 mActiveDisplays.erase(display);
301 } else {
302 mActiveDisplays.insert(display);
303 }
304 }
305
Marissa Wall572a1ee2016-12-15 12:24:13 -0800306 void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
307 hwc2_error_t* outErr = nullptr)
308 {
309 auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
310 getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
311 ASSERT_TRUE(pfn) << "failed to get function";
312
313 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
314 enabled));
315 if (outErr) {
316 *outErr = err;
317 } else {
318 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
319 << getVsyncName(enabled);
320 }
321 }
322
323 void vsyncCallback(hwc2_display_t display, int64_t timestamp)
324 {
325 std::lock_guard<std::mutex> lock(mVsyncMutex);
326 mVsyncDisplay = display;
327 mVsyncTimestamp = timestamp;
328 mVsyncCv.notify_all();
329 }
330
Marissa Walldd4087f2016-12-15 12:24:52 -0800331 void getDisplayName(hwc2_display_t display, std::string* outName,
332 hwc2_error_t* outErr = nullptr)
333 {
334 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
335 getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
336 ASSERT_TRUE(pfn) << "failed to get function";
337
338 uint32_t size = 0;
339
340 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
341 nullptr));
342
343 if (err == HWC2_ERROR_NONE) {
344 std::vector<char> name(size);
345
346 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
347 name.data()));
348
349 outName->assign(name.data());
350 }
351
352 if (outErr) {
353 *outErr = err;
354 } else {
355 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
356 << display;
357 }
358 }
359
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800360 void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
361 hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
362 {
363 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
364 getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
365 ASSERT_TRUE(pfn) << "failed to get function";
366
367 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
368 composition));
369 if (outErr) {
370 *outErr = err;
371 } else {
372 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
373 " type " << getCompositionName(composition);
374 }
375 }
376
Marissa Wall2a0aaf92016-12-15 12:31:37 -0800377 void setCursorPosition(hwc2_display_t display, hwc2_layer_t layer,
378 int32_t x, int32_t y, hwc2_error_t* outErr = nullptr)
379 {
380 auto pfn = reinterpret_cast<HWC2_PFN_SET_CURSOR_POSITION>(
381 getFunction(HWC2_FUNCTION_SET_CURSOR_POSITION));
382 ASSERT_TRUE(pfn) << "failed to get function";
383
384 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, x,
385 y));
386 if (outErr) {
387 *outErr = err;
388 } else {
Arun Kumar K.R0b8fd892017-06-16 15:20:01 +0530389 ASSERT_TRUE((err == HWC2_ERROR_NONE) ||
390 (err == HWC2_ERROR_BAD_LAYER)) <<
391 "failed to set cursor position";
Marissa Wall2a0aaf92016-12-15 12:31:37 -0800392 }
393 }
394
Marissa Wallffc67da2016-12-15 12:26:09 -0800395 void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
396 hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
397 {
398 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
399 getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
400 ASSERT_TRUE(pfn) << "failed to get function";
401
402 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
403 mode));
404 if (outErr) {
405 *outErr = err;
406 } else {
407 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
408 << getBlendModeName(mode);
409 }
410 }
411
Marissa Wall5a240aa2016-12-15 12:34:06 -0800412 void setLayerBuffer(hwc2_display_t display, hwc2_layer_t layer,
413 buffer_handle_t buffer, int32_t acquireFence,
414 hwc2_error_t* outErr = nullptr)
415 {
416 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BUFFER>(
417 getFunction(HWC2_FUNCTION_SET_LAYER_BUFFER));
418 ASSERT_TRUE(pfn) << "failed to get function";
419
420 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
421 buffer, acquireFence));
422 if (outErr) {
423 *outErr = err;
424 } else {
425 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer buffer";
426 }
427 }
428
Marissa Wallee242782016-12-15 12:30:12 -0800429 void setLayerColor(hwc2_display_t display, hwc2_layer_t layer,
430 hwc_color_t color, hwc2_error_t* outErr = nullptr)
431 {
432 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COLOR>(
433 getFunction(HWC2_FUNCTION_SET_LAYER_COLOR));
434 ASSERT_TRUE(pfn) << "failed to get function";
435
436 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
437 color));
438 if (outErr) {
439 *outErr = err;
440 } else {
441 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer color";
442 }
443 }
444
Marissa Wallb72b5c92016-12-15 12:26:39 -0800445 void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700446 Dataspace dataspace, hwc2_error_t* outErr = nullptr)
Marissa Wallb72b5c92016-12-15 12:26:39 -0800447 {
448 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
449 getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
450 ASSERT_TRUE(pfn) << "failed to get function";
451
452 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700453 layer, static_cast<int>(dataspace)));
Marissa Wallb72b5c92016-12-15 12:26:39 -0800454 if (outErr) {
455 *outErr = err;
456 } else {
457 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
458 }
459 }
460
Marissa Wall600a73b2016-12-15 12:30:39 -0800461 void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
462 const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
463 {
464 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
465 getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
466 ASSERT_TRUE(pfn) << "failed to get function";
467
468 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
469 displayFrame));
470 if (outErr) {
471 *outErr = err;
472 } else {
473 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
474 " frame";
475 }
476 }
477
Marissa Wall2b1f5302016-12-15 12:27:20 -0800478 void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
479 float alpha, hwc2_error_t* outErr = nullptr)
480 {
481 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
482 getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
483 ASSERT_TRUE(pfn) << "failed to get function";
484
485 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
486 alpha));
487 if (outErr) {
488 *outErr = err;
489 } else {
490 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
491 << alpha;
492 }
493 }
494
Marissa Wallc57468f2016-12-15 12:31:12 -0800495 void setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer,
496 const hwc_frect_t& sourceCrop, hwc2_error_t* outErr = nullptr)
497 {
498 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
499 getFunction(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP));
500 ASSERT_TRUE(pfn) << "failed to get function";
501
502 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
503 sourceCrop));
504 if (outErr) {
505 *outErr = err;
506 } else {
507 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer source crop";
508 }
509 }
510
Marissa Wallad761812016-12-15 12:32:24 -0800511 void setLayerSurfaceDamage(hwc2_display_t display, hwc2_layer_t layer,
512 const hwc_region_t& surfaceDamage, hwc2_error_t* outErr = nullptr)
513 {
514 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
515 getFunction(HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE));
516 ASSERT_TRUE(pfn) << "failed to get function";
517
518 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
519 surfaceDamage));
520 if (outErr) {
521 *outErr = err;
522 } else {
523 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer surface"
524 " damage";
525 }
526 }
527
Marissa Wallac108192016-12-15 12:27:48 -0800528 void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
529 hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
530 {
531 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
532 getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
533 ASSERT_TRUE(pfn) << "failed to get function";
534
535 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
536 transform));
537 if (outErr) {
538 *outErr = err;
539 } else {
540 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
541 << getTransformName(transform);
542 }
543 }
544
Marissa Wallf7618ed2016-12-15 12:34:39 -0800545 void setLayerVisibleRegion(hwc2_display_t display, hwc2_layer_t layer,
546 const hwc_region_t& visibleRegion, hwc2_error_t* outErr = nullptr)
547 {
548 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_VISIBLE_REGION>(
549 getFunction(HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION));
550 ASSERT_TRUE(pfn) << "failed to get function";
551
552 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
553 visibleRegion));
554 if (outErr) {
555 *outErr = err;
556 } else {
557 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer visible"
558 " region";
559 }
560 }
561
Marissa Wall273b1df2016-12-15 12:28:47 -0800562 void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
563 uint32_t zOrder, hwc2_error_t* outErr = nullptr)
564 {
565 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
566 getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
567 ASSERT_TRUE(pfn) << "failed to get function";
568
569 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
570 zOrder));
571 if (outErr) {
572 *outErr = err;
573 } else {
574 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
575 << zOrder;
576 }
577 }
578
Marissa Wall1cd789c2017-01-27 12:55:36 -0800579 void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
580 uint32_t* outNumRequests, hwc2_error_t* outErr)
581 {
582 auto pfn = reinterpret_cast<HWC2_PFN_VALIDATE_DISPLAY>(
583 getFunction(HWC2_FUNCTION_VALIDATE_DISPLAY));
584 ASSERT_TRUE(pfn) << "failed to get function";
585
586 *outErr = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
587 outNumTypes, outNumRequests));
588 }
589
590 void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
591 uint32_t* outNumRequests, bool* outHasChanges)
592 {
593 hwc2_error_t err = HWC2_ERROR_NONE;
594
595 EXPECT_NO_FATAL_FAILURE(validateDisplay(display, outNumTypes,
596 outNumRequests, &err));
597
598 if (err != HWC2_ERROR_HAS_CHANGES) {
599 *outHasChanges = false;
600 EXPECT_EQ(err, HWC2_ERROR_NONE) << "failed to validate display";
601 } else {
602 *outHasChanges = true;
603 }
604 }
605
Marissa Wall706178d2016-12-15 12:39:14 -0800606 void getDisplayRequests(hwc2_display_t display,
607 hwc2_display_request_t* outDisplayRequests,
608 std::vector<hwc2_layer_t>* outLayers,
609 std::vector<hwc2_layer_request_t>* outLayerRequests,
610 hwc2_error_t* outErr = nullptr)
611 {
612 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_REQUESTS>(
613 getFunction(HWC2_FUNCTION_GET_DISPLAY_REQUESTS));
614 ASSERT_TRUE(pfn) << "failed to get function";
615
616 uint32_t numElements = 0;
617
618 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
619 reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
620 nullptr, nullptr));
621
622 if (err == HWC2_ERROR_NONE && numElements > 0) {
623 outLayers->resize(numElements);
624 outLayerRequests->resize(numElements);
625
626 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
627 reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
628 reinterpret_cast<uint64_t*>(outLayers->data()),
629 reinterpret_cast<int32_t*>(outLayerRequests->data())));
630 }
631
632 if (outErr) {
633 *outErr = err;
634 } else {
635 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display requests";
636 }
637 }
638
639 void handleRequests(hwc2_display_t display,
640 const std::vector<hwc2_layer_t>& layers, uint32_t numRequests,
641 std::set<hwc2_layer_t>* outClearLayers = nullptr,
642 bool* outFlipClientTarget = nullptr)
643 {
644 hwc2_display_request_t displayRequest =
645 static_cast<hwc2_display_request_t>(0);
646 std::vector<hwc2_layer_t> requestedLayers;
647 std::vector<hwc2_layer_request_t> requests;
648
649 ASSERT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequest,
650 &requestedLayers, &requests));
651
652 EXPECT_EQ(numRequests, requests.size()) << "validate returned "
653 << numRequests << " requests and get display requests returned "
654 << requests.size() << " requests";
655
656 for (size_t i = 0; i < requests.size(); i++) {
657 hwc2_layer_t requestedLayer = requestedLayers.at(i);
658 hwc2_layer_request_t request = requests.at(i);
659
660 EXPECT_EQ(std::count(layers.begin(), layers.end(), requestedLayer),
Arun Kumar K.R0b8fd892017-06-16 15:20:01 +0530661 1) << "get display requests returned an unknown layer";
Marissa Wall706178d2016-12-15 12:39:14 -0800662 EXPECT_NE(request, 0) << "returned empty request for layer "
663 << requestedLayer;
664
665 if (outClearLayers && request
666 == HWC2_LAYER_REQUEST_CLEAR_CLIENT_TARGET)
667 outClearLayers->insert(requestedLayer);
668 }
669
670 if (outFlipClientTarget)
671 *outFlipClientTarget = displayRequest
672 & HWC2_DISPLAY_REQUEST_FLIP_CLIENT_TARGET;
673 }
674
675 void getChangedCompositionTypes(hwc2_display_t display,
676 std::vector<hwc2_layer_t>* outLayers,
677 std::vector<hwc2_composition_t>* outTypes,
678 hwc2_error_t* outErr = nullptr)
679 {
680 auto pfn = reinterpret_cast<HWC2_PFN_GET_CHANGED_COMPOSITION_TYPES>(
681 getFunction(HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES));
682 ASSERT_TRUE(pfn) << "failed to get function";
683
684 uint32_t numElements = 0;
685
686 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
687 &numElements, nullptr, nullptr));
688
689 if (err == HWC2_ERROR_NONE && numElements > 0) {
690 outLayers->resize(numElements);
691 outTypes->resize(numElements);
692
693 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
694 &numElements, reinterpret_cast<uint64_t*>(outLayers->data()),
695 reinterpret_cast<int32_t*>(outTypes->data())));
696 }
697
698 if (outErr) {
699 *outErr = err;
700 } else {
701 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get changed"
702 " composition types";
703 }
704 }
705
706 void handleCompositionChanges(hwc2_display_t display,
707 const Hwc2TestLayers& testLayers,
708 const std::vector<hwc2_layer_t>& layers, uint32_t numTypes,
709 std::set<hwc2_layer_t>* outClientLayers = nullptr)
710 {
711 std::vector<hwc2_layer_t> changedLayers;
712 std::vector<hwc2_composition_t> types;
713
714 ASSERT_NO_FATAL_FAILURE(getChangedCompositionTypes(display,
715 &changedLayers, &types));
716
717 EXPECT_EQ(numTypes, types.size()) << "validate returned "
718 << numTypes << " types and get changed composition types"
719 " returned " << types.size() << " types";
720
721 for (size_t i = 0; i < types.size(); i++) {
722
723 auto layer = std::find(layers.begin(), layers.end(),
724 changedLayers.at(i));
725
726 EXPECT_TRUE(layer != layers.end() || !testLayers.contains(*layer))
727 << "get changed composition types returned an unknown layer";
728
729 hwc2_composition_t requestedType = testLayers.getComposition(*layer);
730 hwc2_composition_t returnedType = types.at(i);
731
732 EXPECT_NE(returnedType, HWC2_COMPOSITION_INVALID) << "get changed"
733 " composition types returned invalid composition";
734
735 switch (requestedType) {
736 case HWC2_COMPOSITION_CLIENT:
737 EXPECT_TRUE(false) << getCompositionName(returnedType)
738 << " cannot be changed";
739 break;
740 case HWC2_COMPOSITION_DEVICE:
741 case HWC2_COMPOSITION_SOLID_COLOR:
742 EXPECT_EQ(returnedType, HWC2_COMPOSITION_CLIENT)
743 << "composition of type "
744 << getCompositionName(requestedType)
745 << " can only be changed to "
746 << getCompositionName(HWC2_COMPOSITION_CLIENT);
747 break;
748 case HWC2_COMPOSITION_CURSOR:
749 case HWC2_COMPOSITION_SIDEBAND:
750 EXPECT_TRUE(returnedType == HWC2_COMPOSITION_CLIENT
751 || returnedType == HWC2_COMPOSITION_DEVICE)
752 << "composition of type "
753 << getCompositionName(requestedType)
754 << " can only be changed to "
755 << getCompositionName(HWC2_COMPOSITION_CLIENT) << " or "
756 << getCompositionName(HWC2_COMPOSITION_DEVICE);
757 break;
758 default:
759 EXPECT_TRUE(false) << "unknown type "
760 << getCompositionName(requestedType);
761 break;
762 }
763
764 if (outClientLayers)
765 if (returnedType == HWC2_COMPOSITION_CLIENT)
766 outClientLayers->insert(*layer);
767 }
768
769 if (outClientLayers) {
770 for (auto layer : layers) {
771 if (testLayers.getComposition(layer) == HWC2_COMPOSITION_CLIENT)
772 outClientLayers->insert(layer);
773 }
774 }
775 }
776
777 void acceptDisplayChanges(hwc2_display_t display,
778 hwc2_error_t* outErr = nullptr)
779 {
780 auto pfn = reinterpret_cast<HWC2_PFN_ACCEPT_DISPLAY_CHANGES>(
781 getFunction(HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES));
782 ASSERT_TRUE(pfn) << "failed to get function";
783
784 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display));
785 if (outErr) {
786 *outErr = err;
787 } else {
788 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to accept display changes";
789 }
790 }
791
Marissa Wallf18cfb02017-02-21 14:01:05 -0800792 void getClientTargetSupport(hwc2_display_t display, int32_t width,
793 int32_t height, android_pixel_format_t format,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700794 Dataspace dataspace, hwc2_error_t* outErr = nullptr)
Marissa Wallf18cfb02017-02-21 14:01:05 -0800795 {
796 auto pfn = reinterpret_cast<HWC2_PFN_GET_CLIENT_TARGET_SUPPORT>(
797 getFunction(HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT));
798 ASSERT_TRUE(pfn) << "failed to get function";
799
800 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, width,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700801 height, format, static_cast<int>(dataspace)));
Marissa Wallf18cfb02017-02-21 14:01:05 -0800802 if (outErr) {
803 *outErr = err;
804 } else {
805 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get client target"
806 " support";
807 }
808 }
809
810 void setClientTarget(hwc2_display_t display, buffer_handle_t handle,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700811 int32_t acquireFence, Dataspace dataspace,
Marissa Wallf18cfb02017-02-21 14:01:05 -0800812 hwc_region_t damage, hwc2_error_t* outErr = nullptr)
813 {
814 auto pfn = reinterpret_cast<HWC2_PFN_SET_CLIENT_TARGET>(
815 getFunction(HWC2_FUNCTION_SET_CLIENT_TARGET));
816 ASSERT_TRUE(pfn) << "failed to get function";
817
818 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, handle,
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700819 acquireFence, static_cast<int>(dataspace), damage));
Marissa Wallf18cfb02017-02-21 14:01:05 -0800820 if (outErr) {
821 *outErr = err;
822 } else {
823 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set client target";
824 }
825 }
826
Marissa Wall563030b2017-02-21 14:01:05 -0800827 void presentDisplay(hwc2_display_t display, int32_t* outPresentFence,
828 hwc2_error_t* outErr = nullptr)
829 {
830 auto pfn = reinterpret_cast<HWC2_PFN_PRESENT_DISPLAY>(
831 getFunction(HWC2_FUNCTION_PRESENT_DISPLAY));
832 ASSERT_TRUE(pfn) << "failed to get function";
833
834 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
835 outPresentFence));
836 if (outErr) {
837 *outErr = err;
838 } else {
839 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to present display";
840 }
841 }
842
843 void getReleaseFences(hwc2_display_t display,
844 std::vector<hwc2_layer_t>* outLayers,
845 std::vector<int32_t>* outFences, hwc2_error_t* outErr = nullptr)
846 {
847 auto pfn = reinterpret_cast<HWC2_PFN_GET_RELEASE_FENCES>(
848 getFunction(HWC2_FUNCTION_GET_RELEASE_FENCES));
849 ASSERT_TRUE(pfn) << "failed to get function";
850
851 uint32_t numElements = 0;
852
853 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
854 &numElements, nullptr, nullptr));
855
856 if (err == HWC2_ERROR_NONE) {
857 outLayers->resize(numElements);
858 outFences->resize(numElements);
859
860 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
861 &numElements, outLayers->data(), outFences->data()));
862 }
863
864 if (outErr) {
865 *outErr = err;
866 } else {
867 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get release fences";
868 }
869 }
870
Marissa Wall35040c52016-12-15 12:41:06 -0800871 void getColorModes(hwc2_display_t display,
Peiyong Lina52f0292018-03-14 17:26:31 -0700872 std::vector<ColorMode>* outColorModes,
Marissa Wall35040c52016-12-15 12:41:06 -0800873 hwc2_error_t* outErr = nullptr)
874 {
875 auto pfn = reinterpret_cast<HWC2_PFN_GET_COLOR_MODES>(
876 getFunction(HWC2_FUNCTION_GET_COLOR_MODES));
877 ASSERT_TRUE(pfn) << "failed to get function";
878
879 uint32_t numColorModes = 0;
880
881 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
882 &numColorModes, nullptr));
883 if (err == HWC2_ERROR_NONE) {
884 outColorModes->resize(numColorModes);
885
886 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
887 &numColorModes,
888 reinterpret_cast<int32_t*>(outColorModes->data())));
889 }
890
891 if (outErr) {
892 *outErr = err;
893 } else {
894 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get color modes for"
895 " display " << display;
896 }
897 }
898
Peiyong Lina52f0292018-03-14 17:26:31 -0700899 void setColorMode(hwc2_display_t display, ColorMode colorMode,
Marissa Wall35040c52016-12-15 12:41:06 -0800900 hwc2_error_t* outErr = nullptr)
901 {
902 auto pfn = reinterpret_cast<HWC2_PFN_SET_COLOR_MODE>(
903 getFunction(HWC2_FUNCTION_SET_COLOR_MODE));
904 ASSERT_TRUE(pfn) << "failed to get function";
905
906 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
907 static_cast<int32_t>(colorMode)));
908 if (outErr) {
909 *outErr = err;
910 } else {
911 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set color mode "
Peiyong Lina52f0292018-03-14 17:26:31 -0700912 << static_cast<int>(colorMode);
Marissa Wall35040c52016-12-15 12:41:06 -0800913 }
914 }
915
916 void getHdrCapabilities(hwc2_display_t display,
917 std::vector<android_hdr_t>* outTypes, float* outMaxLuminance,
918 float* outMaxAverageLuminance, float* outMinLuminance,
919 hwc2_error_t* outErr = nullptr)
920 {
921 auto pfn = reinterpret_cast<HWC2_PFN_GET_HDR_CAPABILITIES>(
922 getFunction(HWC2_FUNCTION_GET_HDR_CAPABILITIES));
923 ASSERT_TRUE(pfn) << "failed to get function";
924
925 uint32_t numTypes = 0;
926
927 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
928 &numTypes, nullptr, outMaxLuminance, outMaxAverageLuminance,
929 outMinLuminance));
930
931 if (err == HWC2_ERROR_NONE) {
932 outTypes->resize(numTypes);
933
934 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &numTypes,
935 reinterpret_cast<int32_t*>(outTypes->data()), outMaxLuminance,
936 outMaxAverageLuminance, outMinLuminance));
937 }
938
939 if (outErr) {
940 *outErr = err;
941 } else {
942 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get hdr capabilities"
943 " for display " << display;
944 }
945 }
946
947 void setColorTransform(hwc2_display_t display,
948 const std::array<float, 16>& matrix, android_color_transform_t hint,
949 hwc2_error_t* outErr = nullptr)
950 {
951 auto pfn = reinterpret_cast<HWC2_PFN_SET_COLOR_TRANSFORM>(
952 getFunction(HWC2_FUNCTION_SET_COLOR_TRANSFORM));
953 ASSERT_TRUE(pfn) << "failed to get function";
954
955 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
956 matrix.data(), hint));
957
958 if (outErr) {
959 *outErr = err;
960 } else {
961 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set color transform "
962 << hint;
963 }
964 }
965
Marissa Wallbad1bc72017-02-21 14:33:46 -0800966 void createVirtualDisplay(uint32_t width, uint32_t height,
967 android_pixel_format_t* outFormat, hwc2_display_t* outDisplay,
968 hwc2_error_t* outErr = nullptr)
969 {
970 auto pfn = reinterpret_cast<HWC2_PFN_CREATE_VIRTUAL_DISPLAY>(
971 getFunction(HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY));
972 ASSERT_TRUE(pfn) << "failed to get function";
973
974 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, width, height,
975 reinterpret_cast<int32_t*>(outFormat), outDisplay));
976
977 if (err == HWC2_ERROR_NONE)
978 mVirtualDisplays.insert(*outDisplay);
979
980 if (outErr) {
981 *outErr = err;
982 } else {
983 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create virtual display";
984 }
985 }
986
987 void destroyVirtualDisplay(hwc2_display_t display,
988 hwc2_error_t* outErr = nullptr)
989 {
990 auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_VIRTUAL_DISPLAY>(
991 getFunction(HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY));
992 ASSERT_TRUE(pfn) << "failed to get function";
993
994 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display));
995
996 if (err == HWC2_ERROR_NONE)
997 mVirtualDisplays.erase(display);
998
999 if (outErr) {
1000 *outErr = err;
1001 } else {
1002 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy virtual display";
1003 }
1004 }
1005
1006 void getMaxVirtualDisplayCount(uint32_t* outMaxCnt)
1007 {
1008 auto pfn = reinterpret_cast<HWC2_PFN_GET_MAX_VIRTUAL_DISPLAY_COUNT>(
1009 getFunction(HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT));
1010 ASSERT_TRUE(pfn) << "failed to get function";
1011
1012 *outMaxCnt = pfn(mHwc2Device);
1013 }
1014
1015 void setOutputBuffer(hwc2_display_t display, buffer_handle_t buffer,
1016 int32_t releaseFence, hwc2_error_t* outErr = nullptr)
1017 {
1018 auto pfn = reinterpret_cast<HWC2_PFN_SET_OUTPUT_BUFFER>(
1019 getFunction(HWC2_FUNCTION_SET_OUTPUT_BUFFER));
1020 ASSERT_TRUE(pfn) << "failed to get function";
1021
1022 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, buffer,
1023 releaseFence));
1024 if (outErr) {
1025 *outErr = err;
1026 } else {
1027 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set output buffer";
1028 }
1029 }
1030
Marissa Wallae7d3242016-12-15 12:42:07 -08001031 void dump(std::string* outBuffer)
1032 {
1033 auto pfn = reinterpret_cast<HWC2_PFN_DUMP>(
1034 getFunction(HWC2_FUNCTION_DUMP));
1035 ASSERT_TRUE(pfn) << "failed to get function";
1036
1037 uint32_t size = 0;
1038
1039 pfn(mHwc2Device, &size, nullptr);
1040
1041 std::vector<char> buffer(size);
1042
1043 pfn(mHwc2Device, &size, buffer.data());
1044
1045 outBuffer->assign(buffer.data());
1046 }
1047
Marissa Wallf18cfb02017-02-21 14:01:05 -08001048 void getBadDisplay(hwc2_display_t* outDisplay)
1049 {
1050 for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
1051 if (mDisplays.count(display) == 0) {
1052 *outDisplay = display;
1053 return;
1054 }
1055 }
1056 ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
1057 " are registered. This should never happen.";
1058 }
1059
Marissa Wall563030b2017-02-21 14:01:05 -08001060 void waitForVsync(hwc2_display_t* outDisplay = nullptr,
1061 int64_t* outTimestamp = nullptr)
1062 {
1063 std::unique_lock<std::mutex> lock(mVsyncMutex);
1064 ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
1065 std::cv_status::no_timeout) << "timed out attempting to get"
1066 " vsync callback";
1067 if (outDisplay)
1068 *outDisplay = mVsyncDisplay;
1069 if (outTimestamp)
1070 *outTimestamp = mVsyncTimestamp;
1071 }
1072
1073 void enableVsync(hwc2_display_t display)
1074 {
1075 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
1076 reinterpret_cast<hwc2_function_pointer_t>(
1077 hwc2TestVsyncCallback)));
1078 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1079 }
1080
1081 void disableVsync(hwc2_display_t display)
1082 {
1083 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1084 }
1085
Marissa Wall4d600052016-12-15 12:16:01 -08001086protected:
1087 hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
1088 {
1089 return mHwc2Device->getFunction(mHwc2Device, descriptor);
1090 }
1091
1092 void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
1093 {
1094 uint32_t num = 0;
1095
1096 mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
1097
1098 outCapabilities->resize(num);
1099
1100 mHwc2Device->getCapabilities(mHwc2Device, &num,
1101 reinterpret_cast<int32_t*>(outCapabilities->data()));
1102 }
1103
Marissa Wallcfb9a072017-02-17 20:53:18 -08001104 /* Registers a hotplug callback and waits for hotplug callbacks. This
1105 * function will have no effect if called more than once. */
1106 void populateDisplays()
1107 {
1108 /* Sets the hotplug status to receiving */
1109 {
1110 std::lock_guard<std::mutex> lock(mHotplugMutex);
1111
1112 if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
1113 return;
1114 mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
1115 }
1116
1117 /* Registers the callback. This function call cannot be locked because
1118 * a callback could happen on the same thread */
1119 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
1120 reinterpret_cast<hwc2_function_pointer_t>(
1121 hwc2TestHotplugCallback)));
1122
1123 /* Waits for hotplug events. If a hotplug event has not come within 1
1124 * second, stop waiting. */
1125 std::unique_lock<std::mutex> lock(mHotplugMutex);
1126
1127 while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
1128 std::cv_status::timeout) { }
1129
1130 /* Sets the hotplug status to done. Future calls will have no effect */
1131 mHotplugStatus = Hwc2TestHotplugStatus::Done;
1132 }
1133
Marissa Wall1db2e372016-12-15 12:19:39 -08001134 /* NOTE: will create min(newlayerCnt, max supported layers) layers */
1135 void createLayers(hwc2_display_t display,
1136 std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
1137 {
1138 std::vector<hwc2_layer_t> newLayers;
1139 hwc2_layer_t layer;
1140 hwc2_error_t err = HWC2_ERROR_NONE;
1141
1142 for (size_t i = 0; i < newLayerCnt; i++) {
1143
1144 EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
1145 if (err == HWC2_ERROR_NO_RESOURCES)
1146 break;
1147 if (err != HWC2_ERROR_NONE) {
1148 newLayers.clear();
1149 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
1150 }
1151 newLayers.push_back(layer);
1152 }
1153
1154 *outLayers = std::move(newLayers);
1155 }
1156
1157 void destroyLayers(hwc2_display_t display,
1158 std::vector<hwc2_layer_t>&& layers)
1159 {
1160 for (hwc2_layer_t layer : layers) {
1161 EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1162 }
1163 }
1164
Marissa Wallcf935cb2016-12-15 12:20:47 -08001165 void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
1166 {
1167 std::vector<hwc2_config_t> configs;
1168
1169 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1170
1171 hwc2_config_t CONFIG_MAX = UINT32_MAX;
1172
1173 ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
1174 " (2^32 values) has been taken which shouldn't happen";
1175
1176 hwc2_config_t config;
1177 for (config = 0; config < CONFIG_MAX; config++) {
1178 if (std::count(configs.begin(), configs.end(), config) == 0)
1179 break;
1180 }
1181
1182 *outConfig = config;
1183 }
1184
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001185 /* Calls a set property function from Hwc2Test to set a property value from
1186 * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
1187 using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
1188 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001189 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001190
Marissa Wall273b1df2016-12-15 12:28:47 -08001191 /* Calls a set property function from Hwc2Test to set property values from
1192 * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
1193 using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
1194 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001195 Hwc2TestLayers* testLayers);
Marissa Wall273b1df2016-12-15 12:28:47 -08001196
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001197 /* Calls a set property function from Hwc2Test to set a bad property value
1198 * on hwc2_layer_t on hwc2_display_t */
1199 using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
1200 hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001201 Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001202
1203 /* Calls a set property function from Hwc2Test to set a bad property value
1204 * on hwc2_layer_t on hwc2_display_t */
1205 using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
1206 hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
1207
Marissa Wall1cd789c2017-01-27 12:55:36 -08001208 /* Is called after a display is powered on and all layer properties have
1209 * been set. It should be used to test functions such as validate, accepting
1210 * changes, present, etc. */
1211 using TestDisplayLayersFunction = void (*)(Hwc2Test* test,
Marissa Wall706178d2016-12-15 12:39:14 -08001212 hwc2_display_t display, const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08001213 Hwc2TestLayers* testLayers);
Marissa Wall706178d2016-12-15 12:39:14 -08001214
1215 /* It is called on an non validated display */
1216 using TestDisplayNonValidatedLayersFunction = void (*)(Hwc2Test* test,
1217 hwc2_display_t display, std::vector<hwc2_layer_t>* layers);
Marissa Wall1cd789c2017-01-27 12:55:36 -08001218
Marissa Wallf18cfb02017-02-21 14:01:05 -08001219 /* Tests client target support on a particular display and config */
1220 using TestClientTargetSupportFunction = void (*)(Hwc2Test* test,
1221 hwc2_display_t display,
1222 const Hwc2TestClientTargetSupport& testClientTargetSupport);
1223
Marissa Wall35040c52016-12-15 12:41:06 -08001224 /* Tests a particular active display config */
1225 using TestActiveDisplayConfigFunction = void (*)(Hwc2Test* test,
1226 hwc2_display_t display);
1227
Marissa Wallbad1bc72017-02-21 14:33:46 -08001228 /* Tests a newly created virtual display */
1229 using TestCreateVirtualDisplayFunction = void (*)(Hwc2Test* test,
1230 hwc2_display_t display, Hwc2TestVirtualDisplay* testVirtualDisplay);
1231
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001232 /* Advances a property of Hwc2TestLayer */
1233 using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
1234
Marissa Wallf7618ed2016-12-15 12:34:39 -08001235 /* Advances properties of Hwc2TestLayers */
1236 using AdvanceProperties = bool (*)(Hwc2TestLayers* testLayer);
1237
Marissa Wallf18cfb02017-02-21 14:01:05 -08001238 /* Advances properties of Hwc2TestClientTargetSupport */
1239 using AdvanceClientTargetSupport = bool (*)(
1240 Hwc2TestClientTargetSupport* testClientTargetSupport);
1241
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001242 /* For each active display it cycles through each display config and tests
1243 * each property value. It creates a layer, sets the property and then
1244 * destroys the layer */
1245 void setLayerProperty(Hwc2TestCoverage coverage,
1246 TestLayerPropertyFunction function, AdvanceProperty advance)
1247 {
1248 for (auto display : mDisplays) {
1249 std::vector<hwc2_config_t> configs;
1250
1251 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1252
1253 for (auto config : configs) {
1254 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -08001255 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001256
1257 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001258 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1259 &displayArea));
1260 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001261
1262 do {
1263 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1264
1265 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001266 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001267
1268 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1269 } while (advance(&testLayer));
1270 }
1271 }
1272 }
1273
1274 /* For each active display it cycles through each display config and tests
1275 * each property value. It creates a layer, cycles through each property
1276 * value and updates the layer property value and then destroys the layer */
1277 void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
1278 TestLayerPropertyFunction function, AdvanceProperty advance)
1279 {
1280 for (auto display : mDisplays) {
1281 std::vector<hwc2_config_t> configs;
1282
1283 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1284
1285 for (auto config : configs) {
1286 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -08001287 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001288
1289 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001290 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1291 &displayArea));
1292 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001293
1294 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1295
1296 do {
1297 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001298 &testLayer, nullptr));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001299 } while (advance(&testLayer));
1300
1301 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1302 }
1303 }
1304 }
1305
Marissa Wall273b1df2016-12-15 12:28:47 -08001306 /* For each active display it cycles through each display config and tests
1307 * each property value. It creates multiple layers, calls the
1308 * TestLayerPropertiesFunction to set property values and then
1309 * destroys the layers */
1310 void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
Marissa Wallf7618ed2016-12-15 12:34:39 -08001311 TestLayerPropertiesFunction function, AdvanceProperties advance)
Marissa Wall273b1df2016-12-15 12:28:47 -08001312 {
1313 for (auto display : mDisplays) {
1314 std::vector<hwc2_config_t> configs;
1315
1316 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1317
1318 for (auto config : configs) {
1319 std::vector<hwc2_layer_t> layers;
Marissa Wall600a73b2016-12-15 12:30:39 -08001320 Area displayArea;
Marissa Wall273b1df2016-12-15 12:28:47 -08001321
1322 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001323 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1324 &displayArea));
Marissa Wall273b1df2016-12-15 12:28:47 -08001325
1326 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
Marissa Wall600a73b2016-12-15 12:30:39 -08001327 Hwc2TestLayers testLayers(layers, coverage, displayArea);
Marissa Wall273b1df2016-12-15 12:28:47 -08001328
Marissa Wallf7618ed2016-12-15 12:34:39 -08001329 do {
1330 for (auto layer : layers) {
1331 EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
1332 &testLayers));
1333 }
1334 } while (advance(&testLayers));
Marissa Wall273b1df2016-12-15 12:28:47 -08001335
1336 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1337 }
1338 }
1339 }
1340
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001341 /* For each active display it cycles through each display config.
1342 * 1) It attempts to set a valid property value to bad layer handle.
1343 * 2) It creates a layer x and attempts to set a valid property value to
1344 * layer x + 1
1345 * 3) It destroys the layer x and attempts to set a valid property value to
1346 * the destroyed layer x.
1347 */
1348 void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
1349 TestLayerPropertyBadLayerFunction function)
1350 {
1351 for (auto display : mDisplays) {
1352 std::vector<hwc2_config_t> configs;
1353
1354 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1355
1356 for (auto config : configs) {
1357 hwc2_layer_t layer = 0;
Marissa Wall600a73b2016-12-15 12:30:39 -08001358 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001359 hwc2_error_t err = HWC2_ERROR_NONE;
1360
1361 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -08001362 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1363 &displayArea));
1364 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001365
1366 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001367 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001368 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1369
1370 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1371
1372 ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001373 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001374 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1375
1376 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1377
1378 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001379 &testLayer, &err));
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001380 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1381 }
1382 }
1383 }
1384
1385 /* For each active display it cycles through each display config and tests
1386 * each property value. It creates a layer, sets a bad property value and
1387 * then destroys the layer */
1388 void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
1389 {
1390 for (auto display : mDisplays) {
1391 std::vector<hwc2_config_t> configs;
1392
1393 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1394
1395 for (auto config : configs) {
1396 hwc2_layer_t layer;
1397 hwc2_error_t err = HWC2_ERROR_NONE;
1398
1399 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1400
1401 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1402
1403 ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
1404 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
1405 " error code";
1406
1407 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1408 }
1409 }
1410 }
1411
Marissa Wall1cd789c2017-01-27 12:55:36 -08001412 /* For each active display it powers on the display, cycles through each
1413 * config and creates a set of layers with a certain amount of coverage.
1414 * For each active display, for each config and for each set of layers,
1415 * it calls the TestDisplayLayersFunction */
1416 void displayLayers(Hwc2TestCoverage coverage, size_t layerCnt,
1417 TestDisplayLayersFunction function)
1418 {
1419 for (auto display : mDisplays) {
1420 std::vector<hwc2_config_t> configs;
1421
1422 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1423
1424 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1425
1426 for (auto config : configs) {
1427 Area displayArea;
1428 std::vector<hwc2_layer_t> layers;
1429
1430 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1431 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
1432
1433 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1434 Hwc2TestLayers testLayers(layers, coverage, displayArea);
1435
1436 do {
1437 bool skip;
1438
1439 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
1440 &testLayers, &skip));
1441 if (!skip)
Marissa Wall706178d2016-12-15 12:39:14 -08001442 EXPECT_NO_FATAL_FAILURE(function(this, display, layers,
Marissa Wall563030b2017-02-21 14:01:05 -08001443 &testLayers));
Marissa Wall1cd789c2017-01-27 12:55:36 -08001444
1445 } while (testLayers.advance());
1446
1447 ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
1448 std::move(layers)));
1449 }
1450
1451 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1452 }
1453 }
1454
Marissa Wall706178d2016-12-15 12:39:14 -08001455 /* For each active display, it calls the
1456 * TestDisplayNonValidatedLayersFunction on a variety on non-validated
1457 * layer combinations */
1458 void displayNonValidatedLayers(size_t layerCnt,
1459 TestDisplayNonValidatedLayersFunction function)
1460 {
1461 for (auto display : mDisplays) {
1462 uint32_t numTypes, numRequests;
1463 std::vector<hwc2_layer_t> layers;
1464 bool hasChanges;
1465
1466 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1467
1468 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1469
1470 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1471
1472 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1473
1474 for (auto layer : layers) {
1475 ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1476 HWC2_COMPOSITION_CLIENT));
1477 }
1478
1479 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1480
1481 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1482 &numRequests, &hasChanges));
1483
1484 for (auto layer : layers) {
1485 ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1486 HWC2_COMPOSITION_DEVICE));
1487 }
1488
1489 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1490
1491 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1492
1493 EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1494
1495 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1496 }
1497 }
1498
Marissa Wallf18cfb02017-02-21 14:01:05 -08001499 /* Test client target support on each config on each active display */
1500 void setClientTargetSupport(Hwc2TestCoverage coverage,
1501 TestClientTargetSupportFunction function,
1502 AdvanceClientTargetSupport advance)
1503 {
1504 for (auto display : mDisplays) {
1505 std::vector<hwc2_config_t> configs;
1506
1507 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1508
1509 for (auto config : configs) {
1510 Area displayArea;
1511
1512 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1513 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1514 &displayArea));
1515 Hwc2TestClientTargetSupport testClientTargetSupport(coverage,
1516 displayArea);
1517
1518 do {
1519 EXPECT_NO_FATAL_FAILURE(function(this, display,
1520 testClientTargetSupport));
1521
1522 } while (advance(&testClientTargetSupport));
1523 }
1524 }
1525 }
1526
Marissa Wall35040c52016-12-15 12:41:06 -08001527 /* Cycles through each config on each active display and calls
1528 * a TestActiveDisplayConfigFunction */
1529 void setActiveDisplayConfig(TestActiveDisplayConfigFunction function)
1530 {
1531 for (auto display : mDisplays) {
1532 std::vector<hwc2_config_t> configs;
1533
1534 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1535
1536 for (auto config : configs) {
1537 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1538
1539 EXPECT_NO_FATAL_FAILURE(function(this, display));
1540 }
1541 }
1542 }
1543
Marissa Wallbad1bc72017-02-21 14:33:46 -08001544 /* Creates a virtual display for testing */
1545 void createVirtualDisplay(Hwc2TestCoverage coverage,
1546 TestCreateVirtualDisplayFunction function)
1547 {
1548 Hwc2TestVirtualDisplay testVirtualDisplay(coverage);
1549
1550 do {
1551 hwc2_display_t display;
1552 hwc2_error_t err = HWC2_ERROR_NONE;
1553
1554 const UnsignedArea& dimension =
1555 testVirtualDisplay.getDisplayDimension();
1556 android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
1557
1558 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(dimension.width,
1559 dimension.height, &desiredFormat, &display, &err));
1560
1561 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_NO_RESOURCES
1562 || err == HWC2_ERROR_UNSUPPORTED)
1563 << "returned wrong error code";
1564 EXPECT_GE(desiredFormat, 0) << "invalid format";
1565
1566 if (err != HWC2_ERROR_NONE)
1567 continue;
1568
1569 EXPECT_NO_FATAL_FAILURE(function(this, display,
1570 &testVirtualDisplay));
1571
1572 ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
1573
1574 } while (testVirtualDisplay.advance());
1575 }
1576
1577
Marissa Wall600a73b2016-12-15 12:30:39 -08001578 void getActiveConfigAttribute(hwc2_display_t display,
1579 hwc2_attribute_t attribute, int32_t* outValue)
1580 {
1581 hwc2_config_t config;
1582 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
1583 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1584 attribute, outValue));
1585 ASSERT_GE(*outValue, 0) << "failed to get valid "
1586 << getAttributeName(attribute);
1587 }
1588
1589 void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
1590 {
1591 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1592 HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
1593 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1594 HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
1595 }
1596
Marissa Wall563030b2017-02-21 14:01:05 -08001597 void closeFences(hwc2_display_t display, int32_t presentFence)
1598 {
1599 std::vector<hwc2_layer_t> layers;
1600 std::vector<int32_t> fences;
1601 const int msWait = 3000;
1602
1603 if (presentFence >= 0) {
1604 ASSERT_GE(sync_wait(presentFence, msWait), 0);
1605 close(presentFence);
1606 }
1607
1608 ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences));
1609 EXPECT_EQ(layers.size(), fences.size());
1610
1611 for (int32_t fence : fences) {
Arun Kumar K.R0b8fd892017-06-16 15:20:01 +05301612 if (fence >= 0) {
1613 EXPECT_GE(sync_wait(fence, msWait), 0);
Marissa Wall563030b2017-02-21 14:01:05 -08001614 close(fence);
Arun Kumar K.R0b8fd892017-06-16 15:20:01 +05301615 }
Marissa Wall563030b2017-02-21 14:01:05 -08001616 }
1617 }
1618
Marissa Wall1cd789c2017-01-27 12:55:36 -08001619 void setLayerProperties(hwc2_display_t display, hwc2_layer_t layer,
1620 Hwc2TestLayers* testLayers, bool* outSkip)
1621 {
1622 hwc2_composition_t composition;
1623 buffer_handle_t handle = nullptr;
1624 int32_t acquireFence;
1625 hwc2_error_t err = HWC2_ERROR_NONE;
1626 *outSkip = true;
1627
1628 if (!testLayers->contains(layer))
1629 return;
1630
1631 composition = testLayers->getComposition(layer);
1632
1633 /* If the device cannot support a buffer format, then do not continue */
1634 if ((composition == HWC2_COMPOSITION_DEVICE
1635 || composition == HWC2_COMPOSITION_CURSOR)
1636 && testLayers->getBuffer(layer, &handle, &acquireFence) < 0)
1637 return;
1638
1639 EXPECT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1640 composition, &err));
1641 if (err == HWC2_ERROR_UNSUPPORTED)
1642 EXPECT_TRUE(composition != HWC2_COMPOSITION_CLIENT
1643 && composition != HWC2_COMPOSITION_DEVICE);
1644
1645 const hwc_rect_t cursor = testLayers->getCursorPosition(layer);
1646
1647 EXPECT_NO_FATAL_FAILURE(setLayerBuffer(display, layer, handle,
1648 acquireFence));
1649 EXPECT_NO_FATAL_FAILURE(setLayerBlendMode(display, layer,
1650 testLayers->getBlendMode(layer)));
1651 EXPECT_NO_FATAL_FAILURE(setLayerColor(display, layer,
1652 testLayers->getColor(layer)));
Arun Kumar K.R0b8fd892017-06-16 15:20:01 +05301653 if (composition == HWC2_COMPOSITION_CURSOR)
1654 EXPECT_NO_FATAL_FAILURE(setCursorPosition(display, layer,
1655 cursor.left, cursor.top));
Marissa Wall1cd789c2017-01-27 12:55:36 -08001656 EXPECT_NO_FATAL_FAILURE(setLayerDataspace(display, layer,
1657 testLayers->getDataspace(layer)));
1658 EXPECT_NO_FATAL_FAILURE(setLayerDisplayFrame(display, layer,
1659 testLayers->getDisplayFrame(layer)));
1660 EXPECT_NO_FATAL_FAILURE(setLayerPlaneAlpha(display, layer,
1661 testLayers->getPlaneAlpha(layer)));
1662 EXPECT_NO_FATAL_FAILURE(setLayerSourceCrop(display, layer,
1663 testLayers->getSourceCrop(layer)));
1664 EXPECT_NO_FATAL_FAILURE(setLayerSurfaceDamage(display, layer,
1665 testLayers->getSurfaceDamage(layer)));
1666 EXPECT_NO_FATAL_FAILURE(setLayerTransform(display, layer,
1667 testLayers->getTransform(layer)));
1668 EXPECT_NO_FATAL_FAILURE(setLayerVisibleRegion(display, layer,
1669 testLayers->getVisibleRegion(layer)));
1670 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer,
1671 testLayers->getZOrder(layer)));
1672
1673 *outSkip = false;
1674 }
1675
1676 void setLayerProperties(hwc2_display_t display,
1677 const std::vector<hwc2_layer_t>& layers,
1678 Hwc2TestLayers* testLayers, bool* outSkip)
1679 {
1680 for (auto layer : layers) {
1681 EXPECT_NO_FATAL_FAILURE(setLayerProperties(display, layer,
1682 testLayers, outSkip));
1683 if (*outSkip)
1684 return;
1685 }
1686 }
1687
Marissa Wall563030b2017-02-21 14:01:05 -08001688 void setClientTarget(hwc2_display_t display,
1689 Hwc2TestClientTarget* testClientTarget,
1690 const Hwc2TestLayers& testLayers,
1691 const std::set<hwc2_layer_t>& clientLayers,
1692 const std::set<hwc2_layer_t>& clearLayers, bool flipClientTarget,
1693 const Area& displayArea)
1694 {
Peiyong Lin34beb7a2018-03-28 11:57:12 -07001695 Dataspace dataspace = Dataspace::UNKNOWN;
Marissa Wall563030b2017-02-21 14:01:05 -08001696 hwc_region_t damage = { };
1697 buffer_handle_t handle;
1698 int32_t acquireFence;
1699
1700 ASSERT_EQ(testClientTarget->getBuffer(testLayers, clientLayers,
1701 clearLayers, flipClientTarget, displayArea, &handle,
1702 &acquireFence), 0);
1703 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
1704 dataspace, damage));
1705 }
1706
1707 void presentDisplays(size_t layerCnt, Hwc2TestCoverage coverage,
1708 const std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>&
1709 coverageExceptions, bool optimize)
1710 {
1711 for (auto display : mDisplays) {
1712 std::vector<hwc2_config_t> configs;
1713
1714 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1715 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1716
1717 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1718
1719 for (auto config : configs) {
1720 Area displayArea;
1721 std::vector<hwc2_layer_t> layers;
1722
1723 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1724 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1725 &displayArea));
1726
1727 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1728 Hwc2TestLayers testLayers(layers, coverage, displayArea,
1729 coverageExceptions);
1730
1731 if (optimize && !testLayers.optimizeLayouts())
1732 continue;
1733
1734 std::set<hwc2_layer_t> clientLayers;
1735 std::set<hwc2_layer_t> clearLayers;
1736 Hwc2TestClientTarget testClientTarget;
1737
1738 do {
1739 uint32_t numTypes, numRequests;
1740 bool hasChanges, skip;
1741 bool flipClientTarget;
1742 int32_t presentFence;
1743
1744 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
1745 &testLayers, &skip));
1746 if (skip)
1747 continue;
1748
1749 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1750 &numRequests, &hasChanges));
1751 if (hasChanges)
1752 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
1753 << "wrong number of requests";
1754
1755 ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
1756 testLayers, layers, numTypes, &clientLayers));
1757 ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
1758 numRequests, &clearLayers, &flipClientTarget));
1759 ASSERT_NO_FATAL_FAILURE(setClientTarget(display,
1760 &testClientTarget, testLayers, clientLayers,
1761 clearLayers, flipClientTarget, displayArea));
1762 ASSERT_NO_FATAL_FAILURE(acceptDisplayChanges(display));
1763
1764 ASSERT_NO_FATAL_FAILURE(waitForVsync());
1765
1766 EXPECT_NO_FATAL_FAILURE(presentDisplay(display,
1767 &presentFence));
1768
1769 ASSERT_NO_FATAL_FAILURE(closeFences(display, presentFence));
1770
1771 } while (testLayers.advance());
1772
1773 ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
1774 std::move(layers)));
1775 }
1776
1777 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1778 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1779 }
1780 }
1781
David Hanna Jr3f056022017-07-27 19:19:15 -07001782 void createAndPresentVirtualDisplay(size_t layerCnt,
1783 Hwc2TestCoverage coverage,
1784 const std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>&
1785 coverageExceptions)
1786 {
1787 Hwc2TestVirtualDisplay testVirtualDisplay(coverage);
1788 hwc2_display_t display;
1789 android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
1790
1791 do {
1792 // Items dependent on the display dimensions
1793 hwc2_error_t err = HWC2_ERROR_NONE;
1794 const UnsignedArea& dimension =
1795 testVirtualDisplay.getDisplayDimension();
1796 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(dimension.width,
1797 dimension.height, &desiredFormat, &display, &err));
1798 ASSERT_TRUE(err == HWC2_ERROR_NONE)
1799 << "Cannot allocate virtual display";
1800
1801 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1802 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1803
1804 std::vector<hwc2_config_t> configs;
1805 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1806
1807 for (auto config : configs) {
1808 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1809
1810 Area displayArea;
1811 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1812 &displayArea));
1813
1814 std::vector<hwc2_layer_t> layers;
1815 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers,
1816 layerCnt));
1817 Hwc2TestLayers testLayers(layers, coverage, displayArea,
1818 coverageExceptions);
1819
1820 /*
1821 * Layouts that do not cover an entire virtual display will
1822 * cause undefined behavior.
1823 * Enable optimizeLayouts to avoid this.
1824 */
1825 testLayers.optimizeLayouts();
1826 do {
1827 // Items dependent on the testLayers properties
1828 std::set<hwc2_layer_t> clientLayers;
1829 std::set<hwc2_layer_t> clearLayers;
1830 uint32_t numTypes, numRequests;
1831 bool hasChanges, skip;
1832 bool flipClientTarget;
1833 int32_t presentFence;
1834 Hwc2TestClientTarget testClientTarget;
1835 buffer_handle_t outputBufferHandle;
1836 android::base::unique_fd outputBufferReleaseFence;
1837
1838 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
1839 &testLayers, &skip));
1840
1841 if (skip)
1842 continue;
1843
1844 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1845 &numRequests, &hasChanges));
1846
1847 if (hasChanges)
1848 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
1849 << "wrong number of requests";
1850
1851 ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
1852 testLayers, layers, numTypes, &clientLayers));
1853
1854 ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
1855 numRequests, &clearLayers, &flipClientTarget));
1856 ASSERT_NO_FATAL_FAILURE(setClientTarget(display,
1857 &testClientTarget, testLayers, clientLayers,
1858 clearLayers, flipClientTarget, displayArea));
1859 ASSERT_NO_FATAL_FAILURE(acceptDisplayChanges(display));
1860
1861 ASSERT_EQ(testVirtualDisplay.getOutputBuffer(
1862 &outputBufferHandle, &outputBufferReleaseFence), 0);
1863 ASSERT_NO_FATAL_FAILURE(setOutputBuffer(display,
1864 outputBufferHandle, outputBufferReleaseFence));
1865
1866 EXPECT_NO_FATAL_FAILURE(presentDisplay(display,
1867 &presentFence));
1868 ASSERT_NO_FATAL_FAILURE(closeFences(display, presentFence));
1869
1870 ASSERT_EQ(testVirtualDisplay.verifyOutputBuffer(&testLayers,
1871 &layers, &clearLayers), 0);
1872
1873 /*
1874 * Upscaling the image causes minor pixel differences.
1875 * Work around this by using some threshold.
1876 *
1877 * Fail test if we are off by more than 1% of our
1878 * pixels.
1879 */
1880 ComparatorResult& comparatorResult = ComparatorResult::get();
1881 int threshold = (dimension.width * dimension.height) / 100;
1882 double diffPercent = (comparatorResult.getDifferentPixelCount() * 100.0) /
1883 (dimension.width * dimension.height);
1884
1885 if (comparatorResult.getDifferentPixelCount() != 0)
1886 EXPECT_TRUE(false)
1887 << comparatorResult.getDifferentPixelCount() << " pixels ("
1888 << diffPercent << "%) are different.";
1889
1890 if (comparatorResult.getDifferentPixelCount() > threshold) {
1891 EXPECT_TRUE(false)
1892 << "Mismatched pixel count exceeds threshold. "
1893 << "Writing buffers to file.";
1894
1895 const ::testing::TestInfo* const test_info =
1896 ::testing::UnitTest::GetInstance()
1897 ->current_test_info();
1898
1899 EXPECT_EQ(testVirtualDisplay.writeBuffersToFile(
1900 test_info->name()), 0)
1901 << "Failed to write buffers.";
1902 }
1903
1904 ASSERT_LE(comparatorResult.getDifferentPixelCount(), threshold)
1905 << comparatorResult.getDifferentPixelCount() << " pixels ("
1906 << diffPercent << "%) are different. "
1907 << "Exceeds 1% threshold, terminating test. "
1908 << "Test case: " << testLayers.dump();
1909
1910 } while (testLayers.advance());
1911
1912 ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
1913 std::move(layers)));
1914 }
1915 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1916 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1917 ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
1918 } while (testVirtualDisplay.advance());
1919 }
1920
Marissa Wall4d600052016-12-15 12:16:01 -08001921 hwc2_device_t* mHwc2Device = nullptr;
Marissa Wallcfb9a072017-02-17 20:53:18 -08001922
1923 enum class Hwc2TestHotplugStatus {
1924 Init = 1,
1925 Receiving,
1926 Done,
1927 };
1928
1929 std::mutex mHotplugMutex;
1930 std::condition_variable mHotplugCv;
1931 Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
1932 std::unordered_set<hwc2_display_t> mDisplays;
Marissa Wall1db2e372016-12-15 12:19:39 -08001933
1934 /* Store all created layers that have not been destroyed. If an ASSERT_*
1935 * fails, then destroy the layers on exit */
1936 std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
Marissa Wall03c91732016-12-15 12:23:16 -08001937
1938 /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
1939 * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
1940 std::set<hwc2_display_t> mActiveDisplays;
Marissa Wall572a1ee2016-12-15 12:24:13 -08001941
Marissa Wallbad1bc72017-02-21 14:33:46 -08001942 /* Store all created virtual displays that have not been destroyed. If an
1943 * ASSERT_* fails, then destroy the virtual displays on exit */
1944 std::set<hwc2_display_t> mVirtualDisplays;
1945
Marissa Wall572a1ee2016-12-15 12:24:13 -08001946 std::mutex mVsyncMutex;
1947 std::condition_variable mVsyncCv;
1948 hwc2_display_t mVsyncDisplay;
1949 int64_t mVsyncTimestamp = -1;
Marissa Wall4d600052016-12-15 12:16:01 -08001950};
1951
Marissa Wallcfb9a072017-02-17 20:53:18 -08001952void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
1953 hwc2_display_t display, int32_t connection)
1954{
1955 if (callbackData)
1956 static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
1957 connection);
1958}
1959
Marissa Wall572a1ee2016-12-15 12:24:13 -08001960void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
1961 hwc2_display_t display, int64_t timestamp)
1962{
1963 if (callbackData)
1964 static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
1965 timestamp);
1966}
1967
Marissa Wallffc67da2016-12-15 12:26:09 -08001968void setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001969 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallffc67da2016-12-15 12:26:09 -08001970{
1971 EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001972 testLayer->getBlendMode(), outErr));
1973}
1974
1975void setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1976 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1977{
1978 buffer_handle_t handle;
1979 android::base::unique_fd acquireFence;
1980 hwc2_composition_t composition = testLayer->getComposition();
1981
1982 if (composition == HWC2_COMPOSITION_CLIENT
1983 || composition == HWC2_COMPOSITION_SOLID_COLOR
1984 || composition == HWC2_COMPOSITION_SIDEBAND)
1985 return;
1986
1987 if (testLayer->getBuffer(&handle, &acquireFence) < 0)
1988 return;
1989
1990 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
1991 composition));
1992 EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
1993 handle, acquireFence, outErr));
Marissa Wallffc67da2016-12-15 12:26:09 -08001994}
1995
Marissa Wallee242782016-12-15 12:30:12 -08001996void setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08001997 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallee242782016-12-15 12:30:12 -08001998{
1999 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
2000 layer, HWC2_COMPOSITION_SOLID_COLOR));
2001 ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002002 layer, testLayer->getPlaneAlpha()));
Marissa Wallee242782016-12-15 12:30:12 -08002003 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002004 layer, testLayer->getBlendMode()));
Marissa Wallee242782016-12-15 12:30:12 -08002005 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002006 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08002007}
2008
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08002009void setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002010 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08002011{
Marissa Wall5a240aa2016-12-15 12:34:06 -08002012 hwc2_composition_t composition = testLayer->getComposition();
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08002013 hwc2_error_t err = HWC2_ERROR_NONE;
2014
2015 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
2016 composition, &err));
2017 if (outErr) {
2018 *outErr = err;
2019 return;
2020 }
2021
2022 if (composition != HWC2_COMPOSITION_SIDEBAND) {
2023 EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
2024 } else {
2025 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
2026 << "returned wrong error code";
2027 }
2028}
2029
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002030void setCursorPosition(Hwc2Test* test, hwc2_display_t display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002031 hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002032{
2033 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
2034 layer, HWC2_COMPOSITION_CURSOR));
2035
Marissa Wall5a240aa2016-12-15 12:34:06 -08002036 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002037 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
2038 cursorPosition.left, cursorPosition.top, outErr));
2039}
2040
Marissa Wallb72b5c92016-12-15 12:26:39 -08002041void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002042 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallb72b5c92016-12-15 12:26:39 -08002043{
2044 EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002045 testLayer->getDataspace(), outErr));
Marissa Wallb72b5c92016-12-15 12:26:39 -08002046}
2047
Marissa Wall600a73b2016-12-15 12:30:39 -08002048void setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002049 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall600a73b2016-12-15 12:30:39 -08002050{
2051 EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002052 testLayer->getDisplayFrame(), outErr));
Marissa Wall600a73b2016-12-15 12:30:39 -08002053}
2054
Marissa Wall2b1f5302016-12-15 12:27:20 -08002055void setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002056 Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
Marissa Wall2b1f5302016-12-15 12:27:20 -08002057{
2058 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002059 testLayer->getBlendMode()));
Marissa Wall2b1f5302016-12-15 12:27:20 -08002060 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002061 testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08002062}
2063
Marissa Wallc57468f2016-12-15 12:31:12 -08002064void setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002065 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallc57468f2016-12-15 12:31:12 -08002066{
2067 EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002068 testLayer->getSourceCrop(), outErr));
Marissa Wallc57468f2016-12-15 12:31:12 -08002069}
2070
Marissa Wallad761812016-12-15 12:32:24 -08002071void setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002072 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallad761812016-12-15 12:32:24 -08002073{
2074 EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002075 testLayer->getSurfaceDamage(), outErr));
Marissa Wallad761812016-12-15 12:32:24 -08002076}
2077
Marissa Wallac108192016-12-15 12:27:48 -08002078void setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002079 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wallac108192016-12-15 12:27:48 -08002080{
2081 EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002082 testLayer->getTransform(), outErr));
Marissa Wallac108192016-12-15 12:27:48 -08002083}
2084
Marissa Wallf7618ed2016-12-15 12:34:39 -08002085void setVisibleRegion(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2086 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
2087{
2088 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display, layer,
2089 testLayer->getVisibleRegion(), outErr));
2090}
2091
Marissa Wall273b1df2016-12-15 12:28:47 -08002092void setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002093 Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
Marissa Wall273b1df2016-12-15 12:28:47 -08002094{
2095 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08002096 testLayer->getZOrder(), outErr));
Marissa Wall273b1df2016-12-15 12:28:47 -08002097}
2098
Marissa Wallffc67da2016-12-15 12:26:09 -08002099bool advanceBlendMode(Hwc2TestLayer* testLayer)
2100{
2101 return testLayer->advanceBlendMode();
2102}
2103
Marissa Wall5a240aa2016-12-15 12:34:06 -08002104bool advanceBuffer(Hwc2TestLayer* testLayer)
2105{
2106 if (testLayer->advanceComposition())
2107 return true;
2108 return testLayer->advanceBufferArea();
2109}
2110
Marissa Wallee242782016-12-15 12:30:12 -08002111bool advanceColor(Hwc2TestLayer* testLayer)
2112{
2113 /* Color depends on blend mode so advance blend mode last so color is not
2114 * force to update as often */
2115 if (testLayer->advancePlaneAlpha())
2116 return true;
2117 if (testLayer->advanceColor())
2118 return true;
2119 return testLayer->advanceBlendMode();
2120}
2121
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08002122bool advanceComposition(Hwc2TestLayer* testLayer)
2123{
2124 return testLayer->advanceComposition();
2125}
2126
Marissa Wall2a0aaf92016-12-15 12:31:37 -08002127bool advanceCursorPosition(Hwc2TestLayer* testLayer)
2128{
2129 return testLayer->advanceCursorPosition();
2130}
2131
Marissa Wallb72b5c92016-12-15 12:26:39 -08002132bool advanceDataspace(Hwc2TestLayer* testLayer)
2133{
2134 return testLayer->advanceDataspace();
2135}
2136
Marissa Wall600a73b2016-12-15 12:30:39 -08002137bool advanceDisplayFrame(Hwc2TestLayer* testLayer)
2138{
2139 return testLayer->advanceDisplayFrame();
2140}
2141
Marissa Wall2b1f5302016-12-15 12:27:20 -08002142bool advancePlaneAlpha(Hwc2TestLayer* testLayer)
2143{
2144 return testLayer->advancePlaneAlpha();
2145}
2146
Marissa Wallc57468f2016-12-15 12:31:12 -08002147bool advanceSourceCrop(Hwc2TestLayer* testLayer)
2148{
2149 if (testLayer->advanceSourceCrop())
2150 return true;
2151 return testLayer->advanceBufferArea();
2152}
2153
Marissa Wallad761812016-12-15 12:32:24 -08002154bool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
2155{
2156 if (testLayer->advanceSurfaceDamage())
2157 return true;
2158 return testLayer->advanceBufferArea();
2159}
2160
Marissa Wallac108192016-12-15 12:27:48 -08002161bool advanceTransform(Hwc2TestLayer* testLayer)
2162{
2163 return testLayer->advanceTransform();
2164}
2165
Marissa Wallf7618ed2016-12-15 12:34:39 -08002166bool advanceVisibleRegions(Hwc2TestLayers* testLayers)
2167{
2168 return testLayers->advanceVisibleRegions();
2169}
2170
Marissa Wallf18cfb02017-02-21 14:01:05 -08002171bool advanceClientTargetSupport(
2172 Hwc2TestClientTargetSupport* testClientTargetSupport)
2173{
2174 return testClientTargetSupport->advance();
2175}
Marissa Wall4d600052016-12-15 12:16:01 -08002176
2177static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
2178 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
2179 HWC2_FUNCTION_CREATE_LAYER,
2180 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
2181 HWC2_FUNCTION_DESTROY_LAYER,
2182 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
2183 HWC2_FUNCTION_DUMP,
2184 HWC2_FUNCTION_GET_ACTIVE_CONFIG,
2185 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
2186 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
2187 HWC2_FUNCTION_GET_COLOR_MODES,
2188 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
2189 HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
2190 HWC2_FUNCTION_GET_DISPLAY_NAME,
2191 HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
2192 HWC2_FUNCTION_GET_DISPLAY_TYPE,
2193 HWC2_FUNCTION_GET_DOZE_SUPPORT,
2194 HWC2_FUNCTION_GET_HDR_CAPABILITIES,
2195 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
2196 HWC2_FUNCTION_GET_RELEASE_FENCES,
2197 HWC2_FUNCTION_PRESENT_DISPLAY,
2198 HWC2_FUNCTION_REGISTER_CALLBACK,
2199 HWC2_FUNCTION_SET_ACTIVE_CONFIG,
2200 HWC2_FUNCTION_SET_CLIENT_TARGET,
2201 HWC2_FUNCTION_SET_COLOR_MODE,
2202 HWC2_FUNCTION_SET_COLOR_TRANSFORM,
2203 HWC2_FUNCTION_SET_CURSOR_POSITION,
2204 HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
2205 HWC2_FUNCTION_SET_LAYER_BUFFER,
2206 HWC2_FUNCTION_SET_LAYER_COLOR,
2207 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
2208 HWC2_FUNCTION_SET_LAYER_DATASPACE,
2209 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
2210 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
2211 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
2212 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
2213 HWC2_FUNCTION_SET_LAYER_TRANSFORM,
2214 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
2215 HWC2_FUNCTION_SET_LAYER_Z_ORDER,
2216 HWC2_FUNCTION_SET_OUTPUT_BUFFER,
2217 HWC2_FUNCTION_SET_POWER_MODE,
2218 HWC2_FUNCTION_SET_VSYNC_ENABLED,
2219 HWC2_FUNCTION_VALIDATE_DISPLAY,
2220}};
2221
2222/* TESTCASE: Tests that the HWC2 supports all required functions. */
2223TEST_F(Hwc2Test, GET_FUNCTION)
2224{
2225 for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
2226 hwc2_function_pointer_t pfn = getFunction(descriptor);
2227 EXPECT_TRUE(pfn) << "failed to get function "
2228 << getFunctionDescriptorName(descriptor);
2229 }
2230}
2231
2232/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
2233TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
2234{
2235 hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
2236 EXPECT_FALSE(pfn) << "failed to get invalid function";
2237}
2238
2239/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
2240TEST_F(Hwc2Test, GET_CAPABILITIES)
2241{
2242 std::vector<hwc2_capability_t> capabilities;
2243
2244 getCapabilities(&capabilities);
2245
2246 EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
2247 HWC2_CAPABILITY_INVALID), 0);
2248}
Marissa Walla4b01482017-02-17 20:52:03 -08002249
2250static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
2251 HWC2_CALLBACK_HOTPLUG,
2252 HWC2_CALLBACK_REFRESH,
2253 HWC2_CALLBACK_VSYNC,
2254}};
2255
2256/* TESTCASE: Tests that the HWC2 can successfully register all required
2257 * callback functions. */
2258TEST_F(Hwc2Test, REGISTER_CALLBACK)
2259{
2260 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2261 const_cast<char*>("data"));
2262
2263 for (auto descriptor : callbackDescriptors) {
2264 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
2265 []() { return; }));
2266 }
2267}
2268
2269/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
2270TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
2271{
2272 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2273 const_cast<char*>("data"));
2274 hwc2_error_t err = HWC2_ERROR_NONE;
2275
2276 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
2277 []() { return; }, &err));
2278 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2279}
2280
2281/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
2282TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
2283{
2284 hwc2_callback_data_t data = nullptr;
2285
2286 for (auto descriptor : callbackDescriptors) {
2287 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
2288 []() { return; }));
2289 }
2290}
Marissa Wallcfb9a072017-02-17 20:53:18 -08002291
2292/* TESTCASE: Tests that the HWC2 returns the correct display type for each
2293 * physical display. */
2294TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
2295{
2296 for (auto display : mDisplays) {
2297 hwc2_display_type_t type;
2298
2299 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
2300 EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
2301 " correct display type";
2302 }
2303}
2304
2305/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
2306 * display is requested. */
2307TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
2308{
2309 hwc2_display_t display;
2310 hwc2_display_type_t type;
2311 hwc2_error_t err = HWC2_ERROR_NONE;
2312
2313 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2314
2315 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
2316 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2317}
Marissa Wall1db2e372016-12-15 12:19:39 -08002318
2319/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
2320TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
2321{
2322 for (auto display : mDisplays) {
2323 hwc2_layer_t layer;
2324
2325 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2326
2327 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2328 }
2329}
2330
2331/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
2332TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
2333{
2334 hwc2_display_t display;
2335 hwc2_layer_t layer;
2336 hwc2_error_t err = HWC2_ERROR_NONE;
2337
2338 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2339
2340 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
2341 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2342}
2343
2344/* TESTCASE: Tests that the HWC2 will either support a large number of resources
2345 * or will return no resources. */
2346TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
2347{
2348 const size_t layerCnt = 1000;
2349
2350 for (auto display : mDisplays) {
2351 std::vector<hwc2_layer_t> layers;
2352
2353 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
2354
2355 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
2356 }
2357}
2358
2359/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
2360TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
2361{
2362 hwc2_display_t badDisplay;
2363
2364 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
2365
2366 for (auto display : mDisplays) {
2367 hwc2_layer_t layer = 0;
2368 hwc2_error_t err = HWC2_ERROR_NONE;
2369
2370 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
2371 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2372
2373 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2374
2375 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
2376 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2377
2378 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2379 }
2380}
2381
2382/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
2383TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
2384{
2385 for (auto display : mDisplays) {
2386 hwc2_layer_t layer;
2387 hwc2_error_t err = HWC2_ERROR_NONE;
2388
2389 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
2390 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2391
2392 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
2393 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2394
2395 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
2396 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2397
2398 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
2399 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2400
2401 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
2402 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2403
2404 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2405
2406 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
2407 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2408
2409 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2410
2411 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
2412 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
2413 }
2414}
Marissa Wallcf935cb2016-12-15 12:20:47 -08002415
2416static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
2417 HWC2_ATTRIBUTE_WIDTH,
2418 HWC2_ATTRIBUTE_HEIGHT,
2419}};
2420
2421static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
2422 HWC2_ATTRIBUTE_VSYNC_PERIOD,
2423 HWC2_ATTRIBUTE_DPI_X,
2424 HWC2_ATTRIBUTE_DPI_Y,
2425}};
2426
2427/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
2428 * config. */
2429TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
2430{
2431 for (auto display : mDisplays) {
2432 std::vector<hwc2_config_t> configs;
2433
2434 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2435
2436 for (auto config : configs) {
2437 int32_t value;
2438
2439 for (auto attribute : requiredAttributes) {
2440 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2441 attribute, &value));
2442 EXPECT_GE(value, 0) << "missing required attribute "
2443 << getAttributeName(attribute) << " for config "
2444 << config;
2445 }
2446 for (auto attribute : optionalAttributes) {
2447 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2448 attribute, &value));
2449 }
2450 }
2451 }
2452}
2453
2454/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
2455 * attribute */
2456TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
2457{
2458 const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
2459
2460 for (auto display : mDisplays) {
2461 std::vector<hwc2_config_t> configs;
2462
2463 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2464
2465 for (auto config : configs) {
2466 int32_t value;
2467 hwc2_error_t err = HWC2_ERROR_NONE;
2468
2469 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2470 attribute, &value, &err));
2471 EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
2472 " attribute for config " << config;
2473 }
2474 }
2475}
2476
2477/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
2478TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
2479{
2480 hwc2_display_t display;
2481 const hwc2_config_t config = 0;
2482 int32_t value;
2483 hwc2_error_t err = HWC2_ERROR_NONE;
2484
2485 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2486
2487 for (auto attribute : requiredAttributes) {
2488 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
2489 &value, &err));
2490 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2491 }
2492
2493 for (auto attribute : optionalAttributes) {
2494 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
2495 &value, &err));
2496 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2497 }
2498}
2499
2500/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
2501TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
2502{
2503 for (auto display : mDisplays) {
2504 hwc2_config_t config;
2505 int32_t value;
2506 hwc2_error_t err = HWC2_ERROR_NONE;
2507
2508 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
2509
2510 for (auto attribute : requiredAttributes) {
2511 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2512 attribute, &value, &err));
2513 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2514 }
2515
2516 for (auto attribute : optionalAttributes) {
2517 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2518 attribute, &value, &err));
2519 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2520 }
2521 }
2522}
2523
2524/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
2525TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
2526{
2527 for (auto display : mDisplays) {
2528 std::vector<hwc2_config_t> configs;
2529
2530 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2531 }
2532}
2533
2534/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
2535TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
2536{
2537 hwc2_display_t display;
2538 std::vector<hwc2_config_t> configs;
2539 hwc2_error_t err = HWC2_ERROR_NONE;
2540
2541 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2542
2543 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
2544
2545 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2546 EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
2547}
2548
2549/* TESTCASE: Tests that the HWC2 will return the same config list multiple
2550 * times in a row. */
2551TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
2552{
2553 for (auto display : mDisplays) {
2554 std::vector<hwc2_config_t> configs1, configs2;
2555
2556 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
2557 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
2558
2559 EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
2560 configs2.begin())) << "returned two different config sets";
2561 }
2562}
2563
2564/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
2565TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
2566{
2567 for (auto display : mDisplays) {
2568 std::vector<hwc2_config_t> configs;
2569
2570 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2571
2572 std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
2573 configs.end());
2574 EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
2575 " configs";
2576 }
2577}
Marissa Wall93dc04f2016-12-15 12:21:46 -08002578
2579/* TESTCASE: Tests that the HWC2 returns the active config for a display */
2580TEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
2581{
2582 for (auto display : mDisplays) {
2583 std::vector<hwc2_config_t> configs;
2584
2585 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2586
2587 for (auto config : configs) {
2588 hwc2_config_t activeConfig;
2589
2590 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2591 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
2592
2593 EXPECT_EQ(activeConfig, config) << "failed to get active config";
2594 }
2595 }
2596}
2597
2598/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
2599 * display. */
2600TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
2601{
2602 hwc2_display_t display;
2603 hwc2_config_t activeConfig;
2604 hwc2_error_t err = HWC2_ERROR_NONE;
2605
2606 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2607
2608 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
2609
2610 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2611}
2612
2613/* TESTCASE: Tests that the HWC2 either begins with a valid active config
2614 * or returns an error when getActiveConfig is called. */
2615TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
2616{
2617 for (auto display : mDisplays) {
2618 std::vector<hwc2_config_t> configs;
2619 hwc2_config_t activeConfig;
2620 hwc2_error_t err = HWC2_ERROR_NONE;
2621
2622 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2623
2624 if (configs.empty())
2625 return;
2626
2627 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
2628 if (err == HWC2_ERROR_NONE) {
2629 EXPECT_NE(std::count(configs.begin(), configs.end(),
2630 activeConfig), 0) << "active config is not found in "
2631 " configs for display";
2632 } else {
2633 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2634 }
2635 }
2636}
2637
2638/* TESTCASE: Tests that the HWC2 can set every display config as an active
2639 * config */
2640TEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
2641{
2642 for (auto display : mDisplays) {
2643 std::vector<hwc2_config_t> configs;
2644
2645 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2646
2647 for (auto config : configs) {
2648 EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2649 }
2650 }
2651}
2652
2653/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
2654TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
2655{
2656 hwc2_display_t display;
2657 const hwc2_config_t config = 0;
2658 hwc2_error_t err = HWC2_ERROR_NONE;
2659
2660 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2661
2662 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
2663 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2664}
2665
2666/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
2667TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
2668{
2669 for (auto display : mDisplays) {
2670 hwc2_config_t config;
2671 hwc2_error_t err = HWC2_ERROR_NONE;
2672
2673 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
2674
2675 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
2676 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2677 }
2678}
Marissa Wall03c91732016-12-15 12:23:16 -08002679
2680/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
2681TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
2682{
2683 for (auto display : mDisplays) {
2684 int32_t support = -1;
2685
2686 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2687
2688 EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
2689 }
2690}
2691
2692/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
2693TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
2694{
2695 hwc2_display_t display;
2696 int32_t support = -1;
2697 hwc2_error_t err = HWC2_ERROR_NONE;
2698
2699 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2700
2701 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2702
2703 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2704}
2705
2706/* TESTCASE: Tests that the HWC2 can set all supported power modes */
2707TEST_F(Hwc2Test, SET_POWER_MODE)
2708{
2709 for (auto display : mDisplays) {
2710 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2711 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2712
2713 int32_t support = -1;
2714 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2715 if (support != 1)
2716 return;
2717
2718 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2719 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2720 HWC2_POWER_MODE_DOZE_SUSPEND));
2721
2722 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2723 }
2724}
2725
2726/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
2727TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
2728{
2729 hwc2_display_t display;
2730 hwc2_error_t err = HWC2_ERROR_NONE;
2731
2732 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2733
2734 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
2735 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2736
2737 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
2738 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2739
2740 int32_t support = -1;
2741 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2742 if (support != 1)
2743 return;
2744
2745 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
2746 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2747
2748 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
2749 &err));
2750 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2751}
2752
2753/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
2754TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
2755{
2756 for (auto display : mDisplays) {
2757 hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
2758 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
2759 hwc2_error_t err = HWC2_ERROR_NONE;
2760
2761 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
2762 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
2763 << mode;
2764 }
2765}
2766
2767/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
2768 * an optional power mode. */
2769TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
2770{
2771 for (auto display : mDisplays) {
2772 int32_t support = -1;
2773 hwc2_error_t err = HWC2_ERROR_NONE;
2774
2775 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
2776 if (support == 1)
2777 return;
2778
2779 ASSERT_EQ(support, 0) << "invalid doze support value";
2780
2781 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
2782 &err));
2783 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
2784
2785 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2786 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
2787 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
2788 }
2789}
2790
2791/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
2792TEST_F(Hwc2Test, SET_POWER_MODE_stress)
2793{
2794 for (auto display : mDisplays) {
2795 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2796 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2797
2798 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2799 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2800
2801 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2802 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2803
2804 int32_t support = -1;
2805 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
2806 if (support != 1)
2807 return;
2808
2809 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2810 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
2811
2812 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2813 HWC2_POWER_MODE_DOZE_SUSPEND));
2814 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
2815 HWC2_POWER_MODE_DOZE_SUSPEND));
2816
2817 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2818 }
2819}
Marissa Wall572a1ee2016-12-15 12:24:13 -08002820
2821/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
2822 * displays */
2823TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
2824{
2825 for (auto display : mDisplays) {
2826 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2827 const_cast<char*>("data"));
2828
2829 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2830
2831 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2832 []() { return; }));
2833
2834 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2835
2836 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2837
2838 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2839 }
2840}
2841
2842/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
2843TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
2844{
2845 for (auto display : mDisplays) {
2846 hwc2_display_t receivedDisplay;
2847 int64_t receivedTimestamp;
2848
2849 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2850
2851 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
2852
2853 ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
2854 &receivedTimestamp));
2855
2856 EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
2857 EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
2858
2859 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
2860
2861 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2862 }
2863}
2864
2865/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
2866TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
2867{
2868 hwc2_display_t display;
2869 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2870 const_cast<char*>("data"));
2871 hwc2_error_t err = HWC2_ERROR_NONE;
2872
2873 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2874
2875 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2876 []() { return; }));
2877
2878 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
2879 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2880
2881 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
2882 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2883}
2884
2885/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
2886TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
2887{
2888 for (auto display : mDisplays) {
2889 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2890 const_cast<char*>("data"));
2891 hwc2_error_t err = HWC2_ERROR_NONE;
2892
2893 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2894
2895 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2896 []() { return; }));
2897
2898 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
2899 &err));
2900 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2901
2902 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2903 }
2904}
2905
2906/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
2907 * times. */
2908TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
2909{
2910 for (auto display : mDisplays) {
2911 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2912 const_cast<char*>("data"));
2913
2914 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2915
2916 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2917 []() { return; }));
2918
2919 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2920
2921 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2922 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2923
2924 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2925 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2926
2927 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2928 }
2929}
2930
2931/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
2932 * is off and no callback is registered. */
2933TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
2934{
2935 const uint secs = 1;
2936
2937 for (auto display : mDisplays) {
2938 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2939
2940 sleep(secs);
2941
2942 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2943 }
2944}
2945
2946/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
2947 * is registered. */
2948TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
2949{
2950 const uint secs = 1;
2951
2952 for (auto display : mDisplays) {
2953 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2954
2955 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2956
2957 sleep(secs);
2958
2959 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2960
2961 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2962 }
2963}
Marissa Walldd4087f2016-12-15 12:24:52 -08002964
2965/* TESTCASE: Tests that the HWC2 returns a display name for each display */
2966TEST_F(Hwc2Test, GET_DISPLAY_NAME)
2967{
2968 for (auto display : mDisplays) {
2969 std::string name;
2970
2971 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
2972 }
2973}
2974
2975/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
2976 * display */
2977TEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
2978{
2979 hwc2_display_t display;
2980 std::string name;
2981 hwc2_error_t err = HWC2_ERROR_NONE;
2982
2983 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2984
2985 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
2986 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2987}
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08002988
2989/* TESTCASE: Tests that the HWC2 can set basic composition types. */
2990TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
2991{
2992 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2993 setComposition, advanceComposition));
2994}
2995
2996/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
2997 * layer. */
2998TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
2999{
3000 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3001 setComposition, advanceComposition));
3002}
3003
3004/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
3005TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
3006{
3007 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3008 setComposition));
3009}
3010
3011/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
3012TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
3013{
3014 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
3015 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
3016 hwc2_error_t* outErr) {
3017
3018 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
3019 layer, HWC2_COMPOSITION_INVALID, outErr));
3020 }
3021 ));
3022}
Marissa Wallffc67da2016-12-15 12:26:09 -08003023
Marissa Wall2a0aaf92016-12-15 12:31:37 -08003024/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
3025TEST_F(Hwc2Test, SET_CURSOR_POSITION)
3026{
3027 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3028 ::setCursorPosition, advanceCursorPosition));
3029}
3030
3031/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
3032TEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
3033{
3034 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3035 ::setCursorPosition, advanceCursorPosition));
3036}
3037
3038/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
3039 * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
3040TEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
3041{
3042 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3043 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003044 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall5a240aa2016-12-15 12:34:06 -08003045 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08003046 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
3047 cursorPosition.left, cursorPosition.top, outErr));
3048 },
3049
3050 advanceCursorPosition));
3051}
3052
3053/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
3054 * display. */
3055TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
3056{
3057 hwc2_display_t display;
3058 hwc2_layer_t layer = 0;
3059 int32_t x = 0, y = 0;
3060 hwc2_error_t err = HWC2_ERROR_NONE;
3061
3062 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3063
3064 ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
3065 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3066}
3067
3068/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
3069TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
3070{
3071 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3072 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003073 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wall2a0aaf92016-12-15 12:31:37 -08003074
Marissa Wall5a240aa2016-12-15 12:34:06 -08003075 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
Marissa Wall2a0aaf92016-12-15 12:31:37 -08003076 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
3077 badLayer, cursorPosition.left, cursorPosition.top,
3078 outErr));
3079 }
3080 ));
3081}
3082
Marissa Wallffc67da2016-12-15 12:26:09 -08003083/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
3084TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
3085{
3086 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3087 setBlendMode, advanceBlendMode));
3088}
3089
3090/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
3091TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
3092{
3093 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3094 setBlendMode, advanceBlendMode));
3095}
3096
3097/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
3098TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
3099{
3100 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3101 setBlendMode));
3102}
3103
3104/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
3105TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
3106{
3107 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
3108 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
3109 hwc2_error_t* outErr) {
3110
3111 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
3112 layer, HWC2_BLEND_MODE_INVALID, outErr));
3113 }
3114 ));
3115}
Marissa Wallb72b5c92016-12-15 12:26:39 -08003116
Marissa Wall5a240aa2016-12-15 12:34:06 -08003117/* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
3118TEST_F(Hwc2Test, SET_LAYER_BUFFER)
3119{
3120 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3121 setBuffer, advanceBuffer));
3122}
3123
3124/* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
3125TEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
3126{
3127 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3128 setBuffer, advanceBuffer));
3129}
3130
3131/* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
3132TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
3133{
3134 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3135 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
3136 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
3137
3138 buffer_handle_t handle = nullptr;
3139 android::base::unique_fd acquireFence;
3140
3141 /* If there is not available buffer for the given buffer
3142 * properties, it should not fail this test case */
3143 if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
3144 *outErr = HWC2_ERROR_BAD_LAYER;
3145 return;
3146 }
3147
3148 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
3149 handle, acquireFence, outErr));
3150 }
3151 ));
3152}
3153
3154/* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
3155TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
3156{
3157 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
3158 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
3159 hwc2_error_t* outErr) {
3160
3161 buffer_handle_t handle = nullptr;
3162 int32_t acquireFence = -1;
3163
3164 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
3165 handle, acquireFence, outErr));
3166 }
3167 ));
3168}
3169
Marissa Wallee242782016-12-15 12:30:12 -08003170/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
3171TEST_F(Hwc2Test, SET_LAYER_COLOR)
3172{
3173 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3174 setColor, advanceColor));
3175}
3176
3177/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
3178TEST_F(Hwc2Test, SET_LAYER_COLOR_update)
3179{
3180 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3181 setColor, advanceColor));
3182}
3183
3184/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
3185 * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
3186TEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
3187{
3188 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
3189 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003190 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08003191
3192 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003193 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08003194 },
3195
3196 advanceColor));
3197}
3198
3199/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
3200TEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
3201{
3202 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3203 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003204 Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
Marissa Wallee242782016-12-15 12:30:12 -08003205
3206 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003207 testLayer->getColor(), outErr));
Marissa Wallee242782016-12-15 12:30:12 -08003208 }
3209 ));
3210}
3211
Marissa Wallb72b5c92016-12-15 12:26:39 -08003212/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
3213TEST_F(Hwc2Test, SET_LAYER_DATASPACE)
3214{
3215 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3216 setDataspace, advanceDataspace));
3217}
3218
3219/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
3220TEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
3221{
3222 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3223 setDataspace, advanceDataspace));
3224}
3225
3226/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
3227TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
3228{
3229 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3230 setDataspace));
3231}
Marissa Wall2b1f5302016-12-15 12:27:20 -08003232
Marissa Wall600a73b2016-12-15 12:30:39 -08003233/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
3234TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
3235{
3236 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3237 setDisplayFrame, advanceDisplayFrame));
3238}
3239
3240/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
3241TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
3242{
3243 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3244 setDisplayFrame, advanceDisplayFrame));
3245}
3246
3247/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
3248TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
3249{
3250 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3251 setDisplayFrame));
3252}
3253
Marissa Wall2b1f5302016-12-15 12:27:20 -08003254/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
3255TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
3256{
3257 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3258 setPlaneAlpha, advancePlaneAlpha));
3259}
3260
3261/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
3262TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
3263{
3264 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3265 setPlaneAlpha, advancePlaneAlpha));
3266}
3267
3268/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
3269TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
3270{
3271 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3272 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003273 Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
Marissa Wall2b1f5302016-12-15 12:27:20 -08003274
3275 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003276 badLayer, testLayer->getPlaneAlpha(), outErr));
Marissa Wall2b1f5302016-12-15 12:27:20 -08003277 }
3278 ));
3279}
Marissa Wallac108192016-12-15 12:27:48 -08003280
Marissa Wallc57468f2016-12-15 12:31:12 -08003281/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
3282TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
3283{
3284 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3285 setSourceCrop, advanceSourceCrop));
3286}
3287
3288/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
3289TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
3290{
3291 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3292 setSourceCrop, advanceSourceCrop));
3293}
3294
3295/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
3296TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
3297{
3298 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3299 setSourceCrop));
3300}
3301
Marissa Wallad761812016-12-15 12:32:24 -08003302/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
3303TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
3304{
3305 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3306 setSurfaceDamage, advanceSurfaceDamage));
3307}
3308
3309/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
3310TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
3311{
3312 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3313 setSurfaceDamage, advanceSurfaceDamage));
3314}
3315
3316/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
3317TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
3318{
3319 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3320 setSurfaceDamage));
3321}
3322
Marissa Wallac108192016-12-15 12:27:48 -08003323/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
3324TEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
3325{
3326 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3327 setTransform, advanceTransform));
3328}
3329
3330/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
3331TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
3332{
3333 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3334 setTransform, advanceTransform));
3335}
3336
3337/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
3338TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
3339{
3340 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3341 setTransform));
3342}
Marissa Wall273b1df2016-12-15 12:28:47 -08003343
Marissa Wallf7618ed2016-12-15 12:34:39 -08003344/* TESTCASE: Tests that the HWC2 can set the visible region of a layer. */
3345TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION)
3346{
3347 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Basic, 5,
3348 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
3349 Hwc2TestLayers* testLayers) {
3350
3351 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display,
3352 layer, testLayers->getVisibleRegion(layer)));
3353 },
3354
3355 advanceVisibleRegions));
3356}
3357
3358/* TESTCASE: Tests that the HWC2 cannot set the visible region of a bad layer. */
3359TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION_bad_layer)
3360{
3361 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3362 setVisibleRegion));
3363}
3364
Marissa Wall273b1df2016-12-15 12:28:47 -08003365/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
3366TEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
3367{
3368 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
3369 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003370 Hwc2TestLayers* testLayers) {
Marissa Wall273b1df2016-12-15 12:28:47 -08003371
3372 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
Marissa Wall5a240aa2016-12-15 12:34:06 -08003373 testLayers->getZOrder(layer)));
Marissa Wallf7618ed2016-12-15 12:34:39 -08003374 },
3375
3376 /* TestLayer z orders are set during the construction of TestLayers
3377 * and cannot be updated. There is no need (or ability) to cycle
3378 * through additional z order configurations. */
3379 [] (Hwc2TestLayers* /*testLayers*/) {
3380 return false;
Marissa Wall273b1df2016-12-15 12:28:47 -08003381 }
3382 ));
3383}
3384
3385/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
3386TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
3387{
3388 const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
3389 static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
3390 static_cast<uint32_t>(UINT32_MAX / 2),
3391 static_cast<uint32_t>(UINT32_MAX) };
3392
3393 for (auto display : mDisplays) {
3394 std::vector<hwc2_config_t> configs;
3395
3396 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3397
3398 for (auto config : configs) {
3399 hwc2_layer_t layer;
3400
3401 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3402
3403 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
3404
3405 for (uint32_t zOrder : zOrders) {
3406 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
3407 }
3408
3409 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
3410 }
3411 }
3412}
3413
3414/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
3415TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
3416{
3417 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3418 setZOrder));
3419}
Marissa Wall1cd789c2017-01-27 12:55:36 -08003420
3421/* TESTCASE: Tests that the HWC2 can display a layer with basic property
3422 * coverage */
3423TEST_F(Hwc2Test, VALIDATE_DISPLAY_basic)
3424{
3425 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3426 [] (Hwc2Test* test, hwc2_display_t display,
Marissa Wall706178d2016-12-15 12:39:14 -08003427 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003428 Hwc2TestLayers* /*testLayers*/) {
Marissa Wall1cd789c2017-01-27 12:55:36 -08003429
3430 uint32_t numTypes, numRequests;
3431 bool hasChanges = false;
3432
3433 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3434 &numRequests, &hasChanges));
3435 if (hasChanges)
3436 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
3437 << "wrong number of requests";
3438 }
3439 ));
3440}
3441
3442/* TESTCASE: Tests that the HWC2 can display 5 layers with default coverage. */
3443TEST_F(Hwc2Test, VALIDATE_DISPLAY_default_5)
3444{
3445 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 5,
3446 [] (Hwc2Test* test, hwc2_display_t display,
Marissa Wall706178d2016-12-15 12:39:14 -08003447 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003448 Hwc2TestLayers* /*testLayers*/) {
Marissa Wall1cd789c2017-01-27 12:55:36 -08003449
3450 uint32_t numTypes, numRequests;
3451 bool hasChanges = false;
3452
3453 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3454 &numRequests, &hasChanges));
3455 if (hasChanges)
3456 EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
3457 << "wrong number of requests";
3458 }
3459 ));
3460}
3461
3462/* TESTCASE: Tests that the HWC2 cannot validate a bad display */
3463TEST_F(Hwc2Test, VALIDATE_DISPLAY_bad_display)
3464{
3465 hwc2_display_t display;
3466 uint32_t numTypes, numRequests;
3467 hwc2_error_t err = HWC2_ERROR_NONE;
3468
3469 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3470
3471 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes, &numRequests,
3472 &err));
3473 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3474}
Marissa Wall706178d2016-12-15 12:39:14 -08003475
3476/* TESTCASE: Tests that the HWC2 can get display requests after validating a
3477 * basic layer. */
3478TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_basic)
3479{
3480 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3481 [] (Hwc2Test* test, hwc2_display_t display,
3482 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003483 Hwc2TestLayers* /*testLayers*/) {
Marissa Wall706178d2016-12-15 12:39:14 -08003484
3485 uint32_t numTypes, numRequests;
3486 bool hasChanges = false;
3487
3488 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3489 &numRequests, &hasChanges));
3490 if (hasChanges)
3491 EXPECT_LE(numTypes, layers.size())
3492 << "wrong number of requests";
3493
3494 EXPECT_NO_FATAL_FAILURE(test->handleRequests(display, layers,
3495 numRequests));
3496 }
3497 ));
3498}
3499
3500/* TESTCASE: Tests that the HWC2 cannot get display requests from a bad display */
3501TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_bad_display)
3502{
3503 hwc2_display_t display;
3504 hwc2_display_request_t displayRequests;
3505 std::vector<hwc2_layer_t> layers;
3506 std::vector<hwc2_layer_request_t> layerRequests;
3507 hwc2_error_t err = HWC2_ERROR_NONE;
3508
3509 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3510
3511 EXPECT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequests,
3512 &layers, &layerRequests, &err));
3513 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3514}
3515
3516/* TESTCASE: Tests that the HWC2 cannot get display requests from an non
3517 * validated display. */
3518TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_not_validated)
3519{
3520 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3521 [] (Hwc2Test* test, hwc2_display_t display,
3522 std::vector<hwc2_layer_t>* layers) {
3523
3524 hwc2_display_request_t displayRequests;
3525 std::vector<hwc2_layer_request_t> layerRequests;
3526 hwc2_error_t err = HWC2_ERROR_NONE;
3527
3528 ASSERT_NO_FATAL_FAILURE(test->getDisplayRequests(display,
3529 &displayRequests, layers, &layerRequests, &err));
3530 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3531 << "returned wrong error code";
3532 }
3533 ));
3534}
3535
3536/* TESTCASE: Tests that the HWC2 can get changed composition types after
3537 * validating a basic layer. */
3538TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_basic)
3539{
3540 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3541 [] (Hwc2Test* test, hwc2_display_t display,
3542 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003543 Hwc2TestLayers* testLayers) {
Marissa Wall706178d2016-12-15 12:39:14 -08003544
3545 uint32_t numTypes, numRequests;
3546 bool hasChanges = false;
3547
3548 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3549 &numRequests, &hasChanges));
3550 if (hasChanges)
3551 EXPECT_LE(numTypes, layers.size())
3552 << "wrong number of requests";
3553
3554 EXPECT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
Marissa Wall563030b2017-02-21 14:01:05 -08003555 *testLayers, layers, numTypes));
Marissa Wall706178d2016-12-15 12:39:14 -08003556 }
3557 ));
3558}
3559
3560/* TESTCASE: Tests that the HWC2 cannot get changed composition types from a bad
3561 * display */
3562TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_bad_display)
3563{
3564 hwc2_display_t display;
3565 std::vector<hwc2_layer_t> layers;
3566 std::vector<hwc2_composition_t> types;
3567 hwc2_error_t err = HWC2_ERROR_NONE;
3568
3569 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3570
3571 EXPECT_NO_FATAL_FAILURE(getChangedCompositionTypes(display, &layers,
3572 &types, &err));
3573 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3574}
3575
3576/* TESTCASE: Tests that the HWC2 cannot get changed composition types from an non
3577 * validated display. */
3578TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_not_validated)
3579{
3580 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3581 [] (Hwc2Test* test, hwc2_display_t display,
3582 std::vector<hwc2_layer_t>* layers) {
3583
3584 std::vector<hwc2_composition_t> types;
3585 hwc2_error_t err = HWC2_ERROR_NONE;
3586
3587 ASSERT_NO_FATAL_FAILURE(test->getChangedCompositionTypes(
3588 display, layers, &types, &err));
3589 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3590 << "returned wrong error code";
3591 }
3592 ));
3593}
3594
3595/* TESTCASE: Tests that the HWC2 can accept display changes after validating a
3596 * basic layer. */
3597TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_basic)
3598{
3599 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3600 [] (Hwc2Test* test, hwc2_display_t display,
3601 const std::vector<hwc2_layer_t>& layers,
Marissa Wall563030b2017-02-21 14:01:05 -08003602 Hwc2TestLayers* testLayers) {
Marissa Wall706178d2016-12-15 12:39:14 -08003603
3604 uint32_t numTypes, numRequests;
3605 bool hasChanges = false;
3606
3607 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3608 &numRequests, &hasChanges));
3609 if (hasChanges)
3610 EXPECT_LE(numTypes, layers.size())
3611 << "wrong number of requests";
3612
3613 ASSERT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
Marissa Wall563030b2017-02-21 14:01:05 -08003614 *testLayers, layers, numTypes));
Marissa Wall706178d2016-12-15 12:39:14 -08003615
3616 EXPECT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display));
3617 }
3618 ));
3619}
3620
3621/* TESTCASE: Tests that the HWC2 cannot accept display changes from a bad
3622 * display */
3623TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_bad_display)
3624{
3625 hwc2_display_t display;
3626 hwc2_error_t err = HWC2_ERROR_NONE;
3627
3628 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3629
3630 EXPECT_NO_FATAL_FAILURE(acceptDisplayChanges(display, &err));
3631 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3632}
3633
3634/* TESTCASE: Tests that the HWC2 cannot accept display changes from an non
3635 * validated display. */
3636TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_not_validated)
3637{
3638 ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3639 [] (Hwc2Test* test, hwc2_display_t display,
3640 std::vector<hwc2_layer_t>* /*layers*/) {
3641
3642 hwc2_error_t err = HWC2_ERROR_NONE;
3643
3644 ASSERT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display, &err));
3645 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3646 << "returned wrong error code";
3647 }
3648 ));
3649}
Marissa Wallf18cfb02017-02-21 14:01:05 -08003650
3651/* TESTCASE: Tests that the HWC2 supports client target with required values */
3652TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT)
3653{
3654 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3655 [] (Hwc2Test* test, hwc2_display_t display,
3656 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3657
3658 const Area bufferArea = testClientTargetSupport.getBufferArea();
3659 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3660
3661 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3662 bufferArea.width, bufferArea.height, format,
3663 testClientTargetSupport.getDataspace()));
3664 },
3665
3666 advanceClientTargetSupport));
3667}
3668
3669/* TESTCASE: Tests that the HWC2 cannot get client target support for a bad
3670 * display. */
3671TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_bad_display)
3672{
3673 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3674 [] (Hwc2Test* test, hwc2_display_t /*display*/,
3675 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3676
3677 const Area bufferArea = testClientTargetSupport.getBufferArea();
3678 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3679 hwc2_display_t badDisplay;
3680 hwc2_error_t err = HWC2_ERROR_NONE;
3681
3682 ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
3683
3684 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(badDisplay,
3685 bufferArea.width, bufferArea.height, format,
3686 testClientTargetSupport.getDataspace(), &err));
3687 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3688 },
3689
3690 advanceClientTargetSupport));
3691}
3692
3693/* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
3694 * for a variety of client target values. */
3695TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_unsupported)
3696{
3697 ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Complete,
3698 [] (Hwc2Test* test, hwc2_display_t display,
3699 const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3700
3701 const Area bufferArea = testClientTargetSupport.getBufferArea();
3702 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3703 hwc2_error_t err = HWC2_ERROR_NONE;
3704
3705 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3706 bufferArea.width, bufferArea.height, format,
3707 testClientTargetSupport.getDataspace(), &err));
3708 EXPECT_TRUE(err == HWC2_ERROR_NONE
3709 || err == HWC2_ERROR_UNSUPPORTED)
3710 << "returned wrong error code";
3711 },
3712
3713 advanceClientTargetSupport));
3714}
3715
3716/* TESTCASE: Tests that the HWC2 can set a client target buffer for a basic
3717 * layer. */
3718TEST_F(Hwc2Test, SET_CLIENT_TARGET_basic)
3719{
Peiyong Lin34beb7a2018-03-28 11:57:12 -07003720 const Dataspace dataspace = Dataspace::UNKNOWN;
Marissa Wallf18cfb02017-02-21 14:01:05 -08003721 const hwc_region_t damage = { };
3722 const size_t layerCnt = 1;
3723
3724 for (auto display : mDisplays) {
3725 std::vector<hwc2_config_t> configs;
3726
3727 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
3728
3729 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3730
3731 for (auto config : configs) {
3732 Area displayArea;
3733 std::vector<hwc2_layer_t> layers;
3734
3735 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3736 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
3737
3738 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
3739 Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Basic,
3740 displayArea);
3741
3742 if (!testLayers.optimizeLayouts())
3743 continue;
3744
3745 Hwc2TestClientTarget testClientTarget;
3746
3747 do {
3748 std::set<hwc2_layer_t> clientLayers;
3749 std::set<hwc2_layer_t> clearLayers;
3750 uint32_t numTypes, numRequests;
3751 bool hasChanges, skip;
3752 bool flipClientTarget;
3753 buffer_handle_t handle;
3754 int32_t acquireFence;
3755
3756 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
3757 &testLayers, &skip));
3758 if (skip)
3759 continue;
3760
3761 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
3762 &numRequests, &hasChanges));
3763 if (hasChanges)
3764 EXPECT_LE(numTypes, layers.size())
3765 << "wrong number of requests";
3766
3767 ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
3768 testLayers, layers, numTypes, &clientLayers));
3769 ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
3770 numRequests, &clearLayers, &flipClientTarget));
3771 ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3772 clearLayers, flipClientTarget, displayArea, &handle,
3773 &acquireFence), 0);
3774 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle,
3775 acquireFence, dataspace, damage));
3776
3777 if (acquireFence >= 0)
3778 close(acquireFence);
3779
3780 } while (testLayers.advance());
3781
3782 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
3783 }
3784
3785 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
3786 }
3787}
3788
3789/* TESTCASE: Tests that the HWC2 cannot set a client target for a bad display. */
3790TEST_F(Hwc2Test, SET_CLIENT_TARGET_bad_display)
3791{
3792 hwc2_display_t display;
3793 std::vector<hwc2_layer_t> layers;
3794 const Area displayArea = {0, 0};
3795 Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Default, displayArea);
3796 std::set<hwc2_layer_t> clientLayers;
3797 std::set<hwc2_layer_t> flipClientTargetLayers;
3798 bool flipClientTarget = true;
Peiyong Lin34beb7a2018-03-28 11:57:12 -07003799 const Dataspace dataspace = Dataspace::UNKNOWN;
Marissa Wallf18cfb02017-02-21 14:01:05 -08003800 const hwc_region_t damage = { };
3801 buffer_handle_t handle;
3802 int32_t acquireFence;
3803 hwc2_error_t err = HWC2_ERROR_NONE;
3804
3805 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3806
3807 Hwc2TestClientTarget testClientTarget;
3808
3809 ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3810 flipClientTargetLayers, flipClientTarget, displayArea, &handle,
3811 &acquireFence), 0);
3812
3813 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
3814 dataspace, damage, &err));
3815
3816 if (acquireFence >= 0)
3817 close(acquireFence);
3818
3819 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3820}
Marissa Wall563030b2017-02-21 14:01:05 -08003821
3822/* TESTCASE: Tests that the HWC2 can present 1 default layer. */
3823TEST_F(Hwc2Test, PRESENT_DISPLAY_default_1)
3824{
3825 const size_t layerCnt = 1;
3826 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3827 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3828 bool optimize = false;
3829
3830 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3831 optimize));
3832}
3833
3834/* TESTCASE: Tests that the HWC2 can present 2 default layers. */
3835TEST_F(Hwc2Test, PRESENT_DISPLAY_default_2)
3836{
3837 const size_t layerCnt = 2;
3838 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3839 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3840 bool optimize = false;
3841
3842 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3843 optimize));
3844}
3845
3846/* TESTCASE: Tests that the HWC2 can present 3 default layers. */
3847TEST_F(Hwc2Test, PRESENT_DISPLAY_default_3)
3848{
3849 const size_t layerCnt = 3;
3850 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3851 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3852 bool optimize = false;
3853
3854 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3855 optimize));
3856}
3857
3858/* TESTCASE: Tests that the HWC2 can present 4 default layers. */
3859TEST_F(Hwc2Test, PRESENT_DISPLAY_default_4)
3860{
3861 const size_t layerCnt = 4;
3862 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3863 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3864 bool optimize = false;
3865
3866 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3867 optimize));
3868}
3869
3870/* TESTCASE: Tests that the HWC2 can present 5 default layers. */
3871TEST_F(Hwc2Test, PRESENT_DISPLAY_default_5)
3872{
3873 const size_t layerCnt = 5;
3874 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3875 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3876 bool optimize = false;
3877
3878 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3879 optimize));
3880}
3881
3882/* TESTCASE: Tests that the HWC2 can present 6 default layers. */
3883TEST_F(Hwc2Test, PRESENT_DISPLAY_default_6)
3884{
3885 const size_t layerCnt = 6;
3886 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3887 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3888 bool optimize = false;
3889
3890 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3891 optimize));
3892}
3893
3894/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3895 * blend mode. */
3896TEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_1)
3897{
3898 const size_t layerCnt = 1;
3899 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3900 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3901 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
3902 {Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Basic},
3903 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
3904 bool optimize = false;
3905
3906 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3907 optimize));
3908}
3909
3910/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3911 * blend mode. */
3912TEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_2)
3913{
3914 const size_t layerCnt = 2;
3915 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3916 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3917 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
3918 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
3919 bool optimize = false;
3920
3921 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3922 optimize));
3923}
3924
3925/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3926 * buffer. */
3927TEST_F(Hwc2Test, PRESENT_DISPLAY_buffer_1)
3928{
3929 const size_t layerCnt = 1;
3930 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3931 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3932 {{Hwc2TestPropertyName::BufferArea, Hwc2TestCoverage::Complete}};
3933 bool optimize = true;
3934
3935 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3936 optimize));
3937}
3938
3939/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3940 * color. */
3941TEST_F(Hwc2Test, PRESENT_DISPLAY_color_1)
3942{
3943 const size_t layerCnt = 1;
3944 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3945 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3946 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3947 {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Complete}};
3948 bool optimize = true;
3949
3950 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3951 optimize));
3952}
3953
3954/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3955 * color. */
3956TEST_F(Hwc2Test, PRESENT_DISPLAY_color_2)
3957{
3958 const size_t layerCnt = 2;
3959 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3960 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3961 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3962 {Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3963 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic},
3964 {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Basic}};
3965 bool optimize = true;
3966
3967 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3968 optimize));
3969}
3970
3971/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3972 * composition. */
3973TEST_F(Hwc2Test, PRESENT_DISPLAY_composition_1)
3974{
3975 const size_t layerCnt = 1;
3976 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3977 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3978 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete}};
3979 bool optimize = true;
3980
3981 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3982 optimize));
3983}
3984
3985/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3986 * cursor. */
3987TEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_1)
3988{
3989 const size_t layerCnt = 1;
3990 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3991 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3992 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3993 {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete}};
3994 bool optimize = true;
3995
3996 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3997 optimize));
3998}
3999
4000/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
4001 * cursor. */
4002TEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_2)
4003{
4004 const size_t layerCnt = 2;
4005 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4006 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4007 {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
4008 {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete},
4009 {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
4010 bool optimize = true;
4011
4012 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4013 optimize));
4014}
4015
4016/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4017 * dataspace. */
4018TEST_F(Hwc2Test, PRESENT_DISPLAY_dataspace_1)
4019{
4020 const size_t layerCnt = 1;
4021 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4022 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4023 {{Hwc2TestPropertyName::Dataspace, Hwc2TestCoverage::Complete}};
4024 bool optimize = true;
4025
4026 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4027 optimize));
4028}
4029
4030/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4031 * display frame. */
4032TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_1)
4033{
4034 const size_t layerCnt = 1;
4035 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4036 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4037 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
4038 bool optimize = true;
4039
4040 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4041 optimize));
4042}
4043
4044/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
4045 * display frame. */
4046TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_2)
4047{
4048 const size_t layerCnt = 2;
4049 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4050 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4051 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
4052 bool optimize = true;
4053
4054 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4055 optimize));
4056}
4057
4058/* TESTCASE: Tests that the HWC2 can present 3 layers with complete coverage of
4059 * display frame. */
4060TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_3)
4061{
4062 const size_t layerCnt = 3;
4063 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4064 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4065 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
4066 bool optimize = true;
4067
4068 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4069 optimize));
4070}
4071
4072/* TESTCASE: Tests that the HWC2 can present 4 layers with complete coverage of
4073 * display frame. */
4074TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_4)
4075{
4076 const size_t layerCnt = 4;
4077 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4078 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4079 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
4080 bool optimize = true;
4081
4082 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4083 optimize));
4084}
4085
4086/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4087 * plane alpha. */
4088TEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_1)
4089{
4090 const size_t layerCnt = 1;
4091 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4092 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4093 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
4094 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
4095 bool optimize = false;
4096
4097 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4098 optimize));
4099}
4100
4101/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
4102 * plane alpha. */
4103TEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_2)
4104{
4105 const size_t layerCnt = 2;
4106 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4107 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4108 {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
4109 {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
4110 bool optimize = false;
4111
4112 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4113 optimize));
4114}
4115
4116/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4117 * source crop. */
4118TEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_1)
4119{
4120 const size_t layerCnt = 1;
4121 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4122 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4123 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
4124 {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
4125 bool optimize = true;
4126
4127 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4128 optimize));
4129}
4130
4131/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
4132 * source crop. */
4133TEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_2)
4134{
4135 const size_t layerCnt = 2;
4136 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4137 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4138 {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
4139 {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
4140 bool optimize = true;
4141
4142 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4143 optimize));
4144}
4145
4146
4147/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4148 * surface damage. */
4149TEST_F(Hwc2Test, PRESENT_DISPLAY_surface_damage_1)
4150{
4151 const size_t layerCnt = 1;
4152 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4153 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4154 {{Hwc2TestPropertyName::SurfaceDamage, Hwc2TestCoverage::Complete}};
4155 bool optimize = true;
4156
4157 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4158 optimize));
4159}
4160
4161/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4162 * transform. */
4163TEST_F(Hwc2Test, PRESENT_DISPLAY_transform_1)
4164{
4165 const size_t layerCnt = 1;
4166 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4167 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4168 {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete}};
4169 bool optimize = true;
4170
4171 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4172 optimize));
4173}
4174
4175/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
4176 * transform. */
4177TEST_F(Hwc2Test, PRESENT_DISPLAY_transform_2)
4178{
4179 const size_t layerCnt = 2;
4180 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4181 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4182 {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete},
4183 {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
4184 bool optimize = true;
4185
4186 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4187 optimize));
4188}
4189
4190/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4191 * basic. */
4192TEST_F(Hwc2Test, PRESENT_DISPLAY_basic_1)
4193{
4194 const size_t layerCnt = 1;
4195 Hwc2TestCoverage coverage = Hwc2TestCoverage::Basic;
4196 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
4197 bool optimize = true;
4198
4199 ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4200 optimize));
4201}
4202
4203/* TESTCASE: Tests that the HWC2 cannot present a bad display. */
4204TEST_F(Hwc2Test, PRESENT_DISPLAY_bad_display)
4205{
4206 hwc2_display_t display;
4207 int32_t presentFence;
4208 hwc2_error_t err = HWC2_ERROR_NONE;
4209
4210 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4211
4212 ASSERT_NO_FATAL_FAILURE(presentDisplay(display, &presentFence, &err));
4213 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4214}
4215
4216/* TESTCASE: Tests that the HWC2 cannot present an unvalidated display. */
4217TEST_F(Hwc2Test, PRESENT_DISPLAY_not_validated)
4218{
4219 ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 1,
4220 [] (Hwc2Test* test, hwc2_display_t display,
4221 const std::vector<hwc2_layer_t>& /*layers*/,
4222 Hwc2TestLayers* /*testLayers*/) {
4223
4224 int32_t presentFence;
4225 hwc2_error_t err = HWC2_ERROR_NONE;
4226
4227 ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
4228 HWC2_POWER_MODE_ON));
4229 ASSERT_NO_FATAL_FAILURE(test->enableVsync(display));
4230
4231 ASSERT_NO_FATAL_FAILURE(test->waitForVsync());
4232
4233 ASSERT_NO_FATAL_FAILURE(test->presentDisplay(display,
4234 &presentFence, &err));
4235 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
4236 << "returned wrong error code";
4237
4238 ASSERT_NO_FATAL_FAILURE(test->disableVsync(display));
4239 ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
4240 HWC2_POWER_MODE_OFF));
4241 }
4242 ));
4243}
4244
4245/* TESTCASE: Tests that the HWC2 cannot get release fences from a bad display. */
4246TEST_F(Hwc2Test, GET_RELEASE_FENCES_bad_display)
4247{
4248 hwc2_display_t display;
4249 std::vector<hwc2_layer_t> layers;
4250 std::vector<int32_t> fences;
4251 hwc2_error_t err = HWC2_ERROR_NONE;
4252
4253 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4254
4255 ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences, &err));
4256 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4257}
Marissa Wall35040c52016-12-15 12:41:06 -08004258
Peiyong Lina52f0292018-03-14 17:26:31 -07004259static const std::array<ColorMode, 9> androidColorModes = {{
4260 ColorMode::NATIVE,
4261 ColorMode::STANDARD_BT601_625,
4262 ColorMode::STANDARD_BT601_625_UNADJUSTED,
4263 ColorMode::STANDARD_BT601_525,
4264 ColorMode::STANDARD_BT601_525_UNADJUSTED,
4265 ColorMode::STANDARD_BT709,
4266 ColorMode::DCI_P3,
4267 ColorMode::SRGB,
4268 ColorMode::ADOBE_RGB,
Marissa Wall35040c52016-12-15 12:41:06 -08004269}};
4270
4271/* TESTCASE: Tests that the HWC2 can get the color modes for a display. The
Peiyong Lina52f0292018-03-14 17:26:31 -07004272 * display must support ColorMode::NATIVE */
Marissa Wall35040c52016-12-15 12:41:06 -08004273TEST_F(Hwc2Test, GET_COLOR_MODES)
4274{
4275 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4276 [] (Hwc2Test* test, hwc2_display_t display) {
4277
Peiyong Lina52f0292018-03-14 17:26:31 -07004278 std::vector<ColorMode> colorModes;
Marissa Wall35040c52016-12-15 12:41:06 -08004279
4280 ASSERT_NO_FATAL_FAILURE(test->getColorModes(display,
4281 &colorModes));
4282
4283 EXPECT_NE(std::count(colorModes.begin(), colorModes.end(),
Peiyong Lina52f0292018-03-14 17:26:31 -07004284 ColorMode::NATIVE), 0) << "all displays"
4285 " must support ColorMode::NATIVE";
Marissa Wall35040c52016-12-15 12:41:06 -08004286 }
4287 ));
4288}
4289
4290/* TESTCASE: Tests that the HWC2 cannot get color modes from a bad display. */
4291TEST_F(Hwc2Test, GET_COLOR_MODES_bad_display)
4292{
4293 hwc2_display_t display;
Peiyong Lina52f0292018-03-14 17:26:31 -07004294 std::vector<ColorMode> colorModes;
Marissa Wall35040c52016-12-15 12:41:06 -08004295 hwc2_error_t err = HWC2_ERROR_NONE;
4296
4297 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4298
4299 ASSERT_NO_FATAL_FAILURE(getColorModes(display, &colorModes, &err));
4300 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4301}
4302
4303/* TESTCASE: Tests that the HWC2 can set the required color mode on a display. */
4304TEST_F(Hwc2Test, SET_COLOR_MODES)
4305{
4306 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4307 [] (Hwc2Test* test, hwc2_display_t display) {
4308
Peiyong Lina52f0292018-03-14 17:26:31 -07004309 const ColorMode colorMode = ColorMode::NATIVE;
Marissa Wall35040c52016-12-15 12:41:06 -08004310
4311 EXPECT_NO_FATAL_FAILURE(test->setColorMode(display, colorMode));
4312 }
4313 ));
4314}
4315
4316/* TESTCASE: Tests that the HWC2 cannot set a color mode on a bad display. */
4317TEST_F(Hwc2Test, SET_COLOR_MODES_bad_display)
4318{
4319 hwc2_display_t display;
Peiyong Lina52f0292018-03-14 17:26:31 -07004320 const ColorMode colorMode = ColorMode::NATIVE;
Marissa Wall35040c52016-12-15 12:41:06 -08004321 hwc2_error_t err = HWC2_ERROR_NONE;
4322
4323 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4324
4325 ASSERT_NO_FATAL_FAILURE(setColorMode(display, colorMode, &err));
4326 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4327}
4328
4329/* TESTCASE: Tests that the HWC2 cannot set an invalid color mode. */
4330TEST_F(Hwc2Test, SET_COLOR_MODES_bad_parameter)
4331{
4332 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4333 [] (Hwc2Test* test, hwc2_display_t display) {
4334
Peiyong Lina52f0292018-03-14 17:26:31 -07004335 const ColorMode colorMode = static_cast<ColorMode>(-1);
Marissa Wall35040c52016-12-15 12:41:06 -08004336 hwc2_error_t err = HWC2_ERROR_NONE;
4337
4338 ASSERT_NO_FATAL_FAILURE(test->setColorMode(display, colorMode,
4339 &err));
4340 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
4341 << "returned wrong error code";
4342 }
4343 ));
4344}
4345
4346/* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
4347 * for all valid color modes. */
4348TEST_F(Hwc2Test, SET_COLOR_MODES_unsupported)
4349{
4350 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4351 [] (Hwc2Test* test, hwc2_display_t display) {
4352
4353 for (auto colorMode : androidColorModes) {
4354 hwc2_error_t err = HWC2_ERROR_NONE;
4355
4356 ASSERT_NO_FATAL_FAILURE(test->setColorMode(display,
4357 colorMode, &err));
4358
4359 EXPECT_TRUE(err == HWC2_ERROR_NONE
4360 || err == HWC2_ERROR_UNSUPPORTED)
4361 << "returned wrong error code";
4362 }
4363 }
4364 ));
4365}
4366
4367/* TESTCASE: Tests that the HWC2 gets the HDR capabilities for a display and
4368 * test if they are valid. */
4369TEST_F(Hwc2Test, GET_HDR_CAPABILITIES)
4370{
4371 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4372 [] (Hwc2Test* test, hwc2_display_t display) {
4373
4374 std::vector<android_hdr_t> hdrCapabilities;
4375 float maxLuminance, maxAverageLuminance, minLuminance;
4376
4377 EXPECT_NO_FATAL_FAILURE(test->getHdrCapabilities(display,
4378 &hdrCapabilities, &maxLuminance, &maxAverageLuminance,
4379 &minLuminance));
4380
4381 if (hdrCapabilities.empty())
4382 return;
4383
4384 EXPECT_GE(maxLuminance, maxAverageLuminance);
4385 EXPECT_GE(maxAverageLuminance, minLuminance);
4386 }
4387 ));
4388}
4389
4390/* TESTCASE: Tests that the HWC2 cannot get hdr capabilities from a bad display */
4391TEST_F(Hwc2Test, GET_HDR_CAPABILITIES_bad_display)
4392{
4393 hwc2_display_t display;
4394 std::vector<android_hdr_t> hdrCapabilities;
4395 float maxLuminance, maxAverageLuminance, minLuminance;
4396 hwc2_error_t err = HWC2_ERROR_NONE;
4397
4398 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4399
4400 ASSERT_NO_FATAL_FAILURE(getHdrCapabilities(display, &hdrCapabilities,
4401 &maxLuminance, &maxAverageLuminance, &minLuminance, &err));
4402 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4403}
4404
4405static const std::array<float, 16> identityMatrix = {{
4406 1.0, 0.0, 0.0, 0.0,
4407 0.0, 1.0, 0.0, 0.0,
4408 0.0, 0.0, 1.0, 0.0,
4409 0.0, 0.0, 0.0, 1.0,
4410}};
4411
4412/* Values for the color transform matrices were precomputed using the source code
4413 * in surfaceflinger/Effects/Daltonizer.cpp. */
4414
4415static const std::array<const std::array<float, 16>, 5> exampleMatrices = {{
4416 identityMatrix,
4417 /* Converts RGB color to the XYZ space */
4418 {{ 0.4124, 0.2126, 0.0193, 0,
4419 0.3576, 0.7152, 0.1192, 0,
4420 0.1805, 0.0722, 0.9505, 0,
4421 0 , 0 , 0 , 1 }},
4422 /* Protanomaly */
4423 {{ 0.068493, 0.931506, 0, 0,
4424 0.068493, 0.931507, 0, 0,
4425 0.013626, -0.013626, 1, 0,
4426 0, 0, 0, 1 }},
4427 /* Deuteranomaly */
4428 {{ 0.288299, 0.711701, 0, 0,
4429 0.052709, 0.947291, 0, 0,
4430 -0.257912, 0.257912, 1, 0,
4431 0, 0, 0, 1 }},
4432 /* Tritanomaly */
4433 {{ 1, -0.805712, 0.805712, 0,
4434 0, 0.378838, 0.621162, 0,
4435 0, 0.104823, 0.895177, 0,
4436 0, 0, 0, 1 }},
4437}};
4438
4439/* TESTCASE: Tests that the HWC2 can set the identity color transform */
4440TEST_F(Hwc2Test, SET_COLOR_TRANSFORM)
4441{
4442 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4443 [] (Hwc2Test* test, hwc2_display_t display) {
4444
4445 EXPECT_NO_FATAL_FAILURE(test->setColorTransform(display,
4446 identityMatrix, HAL_COLOR_TRANSFORM_IDENTITY));
4447 }
4448 ));
4449}
4450
4451/* TESTCASE: Tests that the HWC2 cannot set the color transform for a bad
4452 * display. */
4453TEST_F(Hwc2Test, SET_COLOR_TRANSFORM_bad_display)
4454{
4455 hwc2_display_t display;
4456 hwc2_error_t err = HWC2_ERROR_NONE;
4457
4458 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4459
4460 ASSERT_NO_FATAL_FAILURE(setColorTransform(display, identityMatrix,
4461 HAL_COLOR_TRANSFORM_IDENTITY, &err));
4462 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4463}
4464
4465/* TESTCASE: Tests that the HWC2 cannot set an invalid color transform. */
4466TEST_F(Hwc2Test, SET_COLOR_TRANSFORM_bad_parameter)
4467{
4468 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4469 [] (Hwc2Test* test, hwc2_display_t display) {
4470
4471 const android_color_transform_t hint =
4472 static_cast<android_color_transform_t>(-1);
4473 hwc2_error_t err = HWC2_ERROR_NONE;
4474
4475 ASSERT_NO_FATAL_FAILURE(test->setColorTransform(display,
4476 identityMatrix, hint, &err));
4477 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
4478 << "returned wrong error code";
4479 }
4480 ));
4481}
4482
4483/* TESTCASE: Tests that the HWC2 can set an arbitrary color matrix. */
4484TEST_F(Hwc2Test, SET_COLOR_TRANSFORM_arbitrary_matrix)
4485{
4486 ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
4487 [] (Hwc2Test* test, hwc2_display_t display) {
4488
4489 const android_color_transform_t hint =
4490 HAL_COLOR_TRANSFORM_ARBITRARY_MATRIX;
4491
4492 for (const std::array<float, 16>& matrix : exampleMatrices) {
4493 EXPECT_NO_FATAL_FAILURE(test->setColorTransform(display,
4494 matrix, hint));
4495 }
4496 }
4497 ));
4498}
Marissa Wallbad1bc72017-02-21 14:33:46 -08004499
4500/* TESTCASE: Tests that the HWC2 create an destory virtual displays. */
4501TEST_F(Hwc2Test, CREATE_DESTROY_VIRTUAL_DISPLAY)
4502{
4503 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Complete,
4504 [] (Hwc2Test* /*test*/, hwc2_display_t /*display*/,
4505 Hwc2TestVirtualDisplay* /*testVirtualDisplay*/) { }));
4506}
4507
4508/* TESTCASE: Tests that the HWC2 can create and destroy multiple virtual
4509 * displays. */
4510TEST_F(Hwc2Test, CREATE_DESTROY_VIRTUAL_DISPLAY_multiple)
4511{
4512 Hwc2TestVirtualDisplay testVirtualDisplay(Hwc2TestCoverage::Complete);
4513 std::vector<hwc2_display_t> displays;
4514
4515 do {
4516 const UnsignedArea& dimension =
4517 testVirtualDisplay.getDisplayDimension();
4518 android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
4519 hwc2_display_t display;
4520 hwc2_error_t err = HWC2_ERROR_NONE;
4521
4522 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(dimension.width,
4523 dimension.height, &desiredFormat, &display, &err));
4524
4525 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_NO_RESOURCES
4526 || err == HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
4527 EXPECT_GE(desiredFormat, 0) << "invalid format";
4528
4529 if (err == HWC2_ERROR_NONE)
4530 displays.push_back(display);
4531
4532 } while (testVirtualDisplay.advance());
4533
4534 for (hwc2_display_t display : displays) {
4535 EXPECT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
4536 }
4537}
4538
4539/* TESTCASE: Tests that the HWC2 cannot destroy a bad virtual displays. */
4540TEST_F(Hwc2Test, DESTROY_VIRTUAL_DISPLAY_bad_display)
4541{
4542 hwc2_display_t display;
4543 hwc2_error_t err = HWC2_ERROR_NONE;
4544
4545 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4546
4547 ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display, &err));
4548 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4549}
4550
4551/* TESTCASE: Tests that the HWC2 cannot destroy a physical display. */
4552TEST_F(Hwc2Test, DESTROY_VIRTUAL_DISPLAY_bad_parameter)
4553{
Marissa Wallbad1bc72017-02-21 14:33:46 -08004554 hwc2_error_t err = HWC2_ERROR_NONE;
Arun Kumar K.R0b8fd892017-06-16 15:20:01 +05304555 for (auto display : mDisplays) {
4556 ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display, &err));
4557 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
4558 }
Marissa Wallbad1bc72017-02-21 14:33:46 -08004559}
4560
4561/* TESTCASE: Tests that the HWC2 can get the max virtual display count. */
4562TEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT)
4563{
4564 uint32_t maxCnt;
4565
4566 ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt));
4567}
4568
4569/* TESTCASE: Tests that the HWC2 returns the same max virtual display count for
4570 * each call. */
4571TEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT_duplicate)
4572{
4573 uint32_t maxCnt1, maxCnt2;
4574
4575 ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt1));
4576 ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt2));
4577
4578 EXPECT_EQ(maxCnt1, maxCnt2) << "returned two different max virtual display"
4579 " counts";
4580}
4581
4582/* TESTCASE: Tests that the HWC2 can create the max number of virtual displays
4583 * that it reports. */
4584TEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT_create_max)
4585{
4586 std::vector<hwc2_display_t> displays;
4587 uint32_t maxCnt;
4588
4589 ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt));
4590
4591 while (displays.size() < maxCnt) {
4592 uint32_t width = 1920, height = 1080;
4593 android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
4594 hwc2_display_t display;
4595 hwc2_error_t err = HWC2_ERROR_NONE;
4596
4597 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(width, height,
4598 &desiredFormat, &display, &err));
4599
4600 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
4601 << "returned wrong error code";
4602 if (err != HWC2_ERROR_NONE)
4603 break;
4604
4605 displays.push_back(display);
4606 }
4607
4608 for (hwc2_display_t display : displays) {
4609 EXPECT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
4610 }
4611}
4612
4613/* TESTCASE: Tests that the HWC2 can set an output buffer for a virtual
4614 * display. */
4615TEST_F(Hwc2Test, SET_OUTPUT_BUFFER)
4616{
4617 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Complete,
4618 [] (Hwc2Test* test, hwc2_display_t display,
4619 Hwc2TestVirtualDisplay* testVirtualDisplay) {
4620
4621 buffer_handle_t handle;
4622 android::base::unique_fd acquireFence;
4623
David Hanna Jr3f056022017-07-27 19:19:15 -07004624 if (testVirtualDisplay->getOutputBuffer(&handle, &acquireFence) >= 0)
Marissa Wallbad1bc72017-02-21 14:33:46 -08004625 EXPECT_NO_FATAL_FAILURE(test->setOutputBuffer(display,
4626 handle, acquireFence));
4627 }));
4628}
4629
4630/* TESTCASE: Tests that the HWC2 cannot set an output buffer for a bad display */
4631TEST_F(Hwc2Test, SET_OUTPUT_BUFFER_bad_display)
4632{
4633 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Default,
4634 [] (Hwc2Test* test, hwc2_display_t /*display*/,
4635 Hwc2TestVirtualDisplay* testVirtualDisplay) {
4636
4637 hwc2_display_t badDisplay;
4638 buffer_handle_t handle;
4639 android::base::unique_fd acquireFence;
4640 hwc2_error_t err = HWC2_ERROR_NONE;
4641
4642 ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
4643
David Hanna Jr3f056022017-07-27 19:19:15 -07004644 if (testVirtualDisplay->getOutputBuffer(&handle, &acquireFence) < 0)
Marissa Wallbad1bc72017-02-21 14:33:46 -08004645 return;
4646
4647 ASSERT_NO_FATAL_FAILURE(test->setOutputBuffer(badDisplay,
4648 handle, acquireFence, &err));
4649 EXPECT_TRUE(err == HWC2_ERROR_BAD_DISPLAY)
4650 << "returned wrong error code";
4651 }));
4652}
4653
4654/* TESTCASE: Tests that the HWC2 cannot set an invalid output buffer. */
4655TEST_F(Hwc2Test, SET_OUTPUT_BUFFER_bad_parameter)
4656{
4657 ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Default,
4658 [] (Hwc2Test* test, hwc2_display_t display,
4659 Hwc2TestVirtualDisplay* /*testVirtualDisplay*/) {
4660
4661 const buffer_handle_t handle = nullptr;
4662 uint32_t releaseFence = -1;
4663 hwc2_error_t err = HWC2_ERROR_NONE;
4664
4665 ASSERT_NO_FATAL_FAILURE(test->setOutputBuffer(display, handle,
4666 releaseFence, &err));
4667 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
4668 << "returned wrong error code";
4669 }));
4670}
4671
4672/* TESTCASE: Tests that the HWC2 cannot set an output buffer for non virtual
4673 * display */
4674TEST_F(Hwc2Test, SET_OUTPUT_BUFFER_unsupported)
4675{
4676 for (auto display : mDisplays) {
4677 Hwc2TestVirtualDisplay testVirtualDisplay(Hwc2TestCoverage::Complete);
4678
4679 do {
4680 buffer_handle_t handle;
4681 android::base::unique_fd acquireFence;
4682 hwc2_error_t err = HWC2_ERROR_NONE;
4683
David Hanna Jr3f056022017-07-27 19:19:15 -07004684 if (testVirtualDisplay.getOutputBuffer(&handle, &acquireFence) < 0)
Marissa Wallbad1bc72017-02-21 14:33:46 -08004685 continue;
4686
4687 ASSERT_NO_FATAL_FAILURE(setOutputBuffer(display, handle,
4688 acquireFence, &err));
4689 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
4690
4691 } while (testVirtualDisplay.advance());
4692 }
4693}
Marissa Wallae7d3242016-12-15 12:42:07 -08004694
4695/* TESTCASE: Tests that the HWC2 can dump debug information. */
4696TEST_F(Hwc2Test, DUMP)
4697{
4698 std::string buffer;
4699
4700 ASSERT_NO_FATAL_FAILURE(dump(&buffer));
4701}
David Hanna Jr3f056022017-07-27 19:19:15 -07004702
4703/*
4704 * TODO(b/64724708): Hwc2TestPropertyName::BufferArea MUST be default for all
4705 * virtual display tests as we don't handle this case correctly.
4706 *
4707 * Only default dataspace is supported in our drawing code.
4708 */
4709const std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>
4710 virtualDisplayExceptions =
4711 {{Hwc2TestPropertyName::BufferArea, Hwc2TestCoverage::Default},
4712 {Hwc2TestPropertyName::Dataspace, Hwc2TestCoverage::Default}};
4713
4714/* TESTCASE: Tests that the HWC2 can present 1 layer with default coverage on a
4715 * virtual display. */
4716TEST_F(Hwc2Test, PRESENT_VIRTUAL_DISPLAY_default_1)
4717{
4718 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4719 const size_t layerCnt = 1;
4720 ASSERT_NO_FATAL_FAILURE(createAndPresentVirtualDisplay(layerCnt, coverage,
4721 virtualDisplayExceptions));
4722}
4723
4724/* TESTCASE: Tests that the HWC2 can present 1 layer with basic coverage on a
4725 * virtual display. */
4726TEST_F(Hwc2Test, PRESENT_VIRTUAL_DISPLAY_basic_1)
4727{
4728 Hwc2TestCoverage coverage = Hwc2TestCoverage::Basic;
4729 const size_t layerCnt = 1;
4730 ASSERT_NO_FATAL_FAILURE(createAndPresentVirtualDisplay(layerCnt, coverage,
4731 virtualDisplayExceptions));
4732}
4733
4734/* TESTCASE: Tests that the HWC2 can present 2 layers with default coverage on a
4735 * virtual display. */
4736TEST_F(Hwc2Test, PRESENT_VIRTUAL_DISPLAY_default_2)
4737{
4738 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4739 const size_t layerCnt = 2;
4740 ASSERT_NO_FATAL_FAILURE(createAndPresentVirtualDisplay(layerCnt, coverage,
4741 virtualDisplayExceptions));
4742}
4743
4744/* TESTCASE: Tests that the HWC2 can present 3 layers with default coverage on a
4745 * virtual display. */
4746TEST_F(Hwc2Test, PRESENT_VIRTUAL_DISPLAY_default_3)
4747{
4748 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4749 const size_t layerCnt = 3;
4750 ASSERT_NO_FATAL_FAILURE(createAndPresentVirtualDisplay(layerCnt, coverage,
4751 virtualDisplayExceptions));
4752}
4753
4754/* TESTCASE: Tests that the HWC2 can present 4 layers with default coverage on a
4755 * virtual display. */
4756TEST_F(Hwc2Test, PRESENT_VIRTUAL_DISPLAY_default_4)
4757{
4758 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4759 const size_t layerCnt = 4;
4760 ASSERT_NO_FATAL_FAILURE(createAndPresentVirtualDisplay(layerCnt, coverage,
4761 virtualDisplayExceptions));
4762}
4763
4764/* TESTCASE: Tests that the HWC2 can present 5 layers with default coverage on a
4765 * virtual display. */
4766TEST_F(Hwc2Test, PRESENT_VIRTUAL_DISPLAY_default_5)
4767{
4768 Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4769 const size_t layerCnt = 5;
4770 ASSERT_NO_FATAL_FAILURE(createAndPresentVirtualDisplay(layerCnt, coverage,
4771 virtualDisplayExceptions));
4772}