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