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