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