Home | History | Annotate | Download | only in hwc2
      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 
     37 void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
     38         hwc2_display_t display, int32_t connected);
     39 void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
     40         hwc2_display_t display, int64_t timestamp);
     41 
     42 class Hwc2Test : public testing::Test {
     43 public:
     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 dump(std::string* outBuffer)
   1026     {
   1027         auto pfn = reinterpret_cast<HWC2_PFN_DUMP>(
   1028                 getFunction(HWC2_FUNCTION_DUMP));
   1029         ASSERT_TRUE(pfn) << "failed to get function";
   1030 
   1031         uint32_t size = 0;
   1032 
   1033         pfn(mHwc2Device, &size, nullptr);
   1034 
   1035         std::vector<char> buffer(size);
   1036 
   1037         pfn(mHwc2Device, &size, buffer.data());
   1038 
   1039         outBuffer->assign(buffer.data());
   1040     }
   1041 
   1042     void getBadDisplay(hwc2_display_t* outDisplay)
   1043     {
   1044         for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
   1045             if (mDisplays.count(display) == 0) {
   1046                 *outDisplay = display;
   1047                 return;
   1048             }
   1049         }
   1050         ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
   1051                 " are registered. This should never happen.";
   1052     }
   1053 
   1054     void waitForVsync(hwc2_display_t* outDisplay = nullptr,
   1055             int64_t* outTimestamp = nullptr)
   1056     {
   1057         std::unique_lock<std::mutex> lock(mVsyncMutex);
   1058         ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
   1059                 std::cv_status::no_timeout) << "timed out attempting to get"
   1060                 " vsync callback";
   1061         if (outDisplay)
   1062             *outDisplay = mVsyncDisplay;
   1063         if (outTimestamp)
   1064             *outTimestamp = mVsyncTimestamp;
   1065     }
   1066 
   1067     void enableVsync(hwc2_display_t display)
   1068     {
   1069         ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
   1070                 reinterpret_cast<hwc2_function_pointer_t>(
   1071                 hwc2TestVsyncCallback)));
   1072         ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
   1073     }
   1074 
   1075     void disableVsync(hwc2_display_t display)
   1076     {
   1077         ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
   1078     }
   1079 
   1080 protected:
   1081     hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
   1082     {
   1083         return mHwc2Device->getFunction(mHwc2Device, descriptor);
   1084     }
   1085 
   1086     void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
   1087     {
   1088         uint32_t num = 0;
   1089 
   1090         mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
   1091 
   1092         outCapabilities->resize(num);
   1093 
   1094         mHwc2Device->getCapabilities(mHwc2Device, &num,
   1095                 reinterpret_cast<int32_t*>(outCapabilities->data()));
   1096     }
   1097 
   1098     /* Registers a hotplug callback and waits for hotplug callbacks. This
   1099      * function will have no effect if called more than once. */
   1100     void populateDisplays()
   1101     {
   1102         /* Sets the hotplug status to receiving */
   1103         {
   1104             std::lock_guard<std::mutex> lock(mHotplugMutex);
   1105 
   1106             if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
   1107                 return;
   1108             mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
   1109         }
   1110 
   1111         /* Registers the callback. This function call cannot be locked because
   1112          * a callback could happen on the same thread */
   1113         ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
   1114                 reinterpret_cast<hwc2_function_pointer_t>(
   1115                 hwc2TestHotplugCallback)));
   1116 
   1117         /* Waits for hotplug events. If a hotplug event has not come within 1
   1118          * second, stop waiting. */
   1119         std::unique_lock<std::mutex> lock(mHotplugMutex);
   1120 
   1121         while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
   1122                 std::cv_status::timeout) { }
   1123 
   1124         /* Sets the hotplug status to done. Future calls will have no effect */
   1125         mHotplugStatus = Hwc2TestHotplugStatus::Done;
   1126     }
   1127 
   1128     /* NOTE: will create min(newlayerCnt, max supported layers) layers */
   1129     void createLayers(hwc2_display_t display,
   1130             std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
   1131     {
   1132         std::vector<hwc2_layer_t> newLayers;
   1133         hwc2_layer_t layer;
   1134         hwc2_error_t err = HWC2_ERROR_NONE;
   1135 
   1136         for (size_t i = 0; i < newLayerCnt; i++) {
   1137 
   1138             EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
   1139             if (err == HWC2_ERROR_NO_RESOURCES)
   1140                 break;
   1141             if (err != HWC2_ERROR_NONE) {
   1142                 newLayers.clear();
   1143                 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
   1144             }
   1145             newLayers.push_back(layer);
   1146         }
   1147 
   1148         *outLayers = std::move(newLayers);
   1149     }
   1150 
   1151     void destroyLayers(hwc2_display_t display,
   1152             std::vector<hwc2_layer_t>&& layers)
   1153     {
   1154         for (hwc2_layer_t layer : layers) {
   1155             EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
   1156         }
   1157     }
   1158 
   1159     void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
   1160     {
   1161         std::vector<hwc2_config_t> configs;
   1162 
   1163         ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   1164 
   1165         hwc2_config_t CONFIG_MAX = UINT32_MAX;
   1166 
   1167         ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
   1168                 " (2^32 values) has been taken which shouldn't happen";
   1169 
   1170         hwc2_config_t config;
   1171         for (config = 0; config < CONFIG_MAX; config++) {
   1172             if (std::count(configs.begin(), configs.end(), config) == 0)
   1173                 break;
   1174         }
   1175 
   1176         *outConfig = config;
   1177     }
   1178 
   1179     /* Calls a set property function from Hwc2Test to set a property value from
   1180      * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
   1181     using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
   1182             hwc2_display_t display, hwc2_layer_t layer,
   1183             Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
   1184 
   1185     /* Calls a set property function from Hwc2Test to set property values from
   1186      * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
   1187     using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
   1188             hwc2_display_t display, hwc2_layer_t layer,
   1189             Hwc2TestLayers* testLayers);
   1190 
   1191     /* Calls a set property function from Hwc2Test to set a bad property value
   1192      * on hwc2_layer_t on hwc2_display_t */
   1193     using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
   1194             hwc2_display_t display, hwc2_layer_t layer,
   1195             Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
   1196 
   1197     /* Calls a set property function from Hwc2Test to set a bad property value
   1198      * on hwc2_layer_t on hwc2_display_t */
   1199     using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
   1200             hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
   1201 
   1202     /* Is called after a display is powered on and all layer properties have
   1203      * been set. It should be used to test functions such as validate, accepting
   1204      * changes, present, etc. */
   1205     using TestDisplayLayersFunction = void (*)(Hwc2Test* test,
   1206             hwc2_display_t display, const std::vector<hwc2_layer_t>& layers,
   1207             Hwc2TestLayers* testLayers);
   1208 
   1209     /* It is called on an non validated display */
   1210     using TestDisplayNonValidatedLayersFunction = void (*)(Hwc2Test* test,
   1211             hwc2_display_t display, std::vector<hwc2_layer_t>* layers);
   1212 
   1213     /* Tests client target support on a particular display and config */
   1214     using TestClientTargetSupportFunction = void (*)(Hwc2Test* test,
   1215             hwc2_display_t display,
   1216             const Hwc2TestClientTargetSupport& testClientTargetSupport);
   1217 
   1218     /* Tests a particular active display config */
   1219     using TestActiveDisplayConfigFunction = void (*)(Hwc2Test* test,
   1220             hwc2_display_t display);
   1221 
   1222     /* Tests a newly created virtual display */
   1223     using TestCreateVirtualDisplayFunction = void (*)(Hwc2Test* test,
   1224             hwc2_display_t display, Hwc2TestVirtualDisplay* testVirtualDisplay);
   1225 
   1226     /* Advances a property of Hwc2TestLayer */
   1227     using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
   1228 
   1229     /* Advances properties of Hwc2TestLayers */
   1230     using AdvanceProperties = bool (*)(Hwc2TestLayers* testLayer);
   1231 
   1232     /* Advances properties of Hwc2TestClientTargetSupport */
   1233     using AdvanceClientTargetSupport = bool (*)(
   1234             Hwc2TestClientTargetSupport* testClientTargetSupport);
   1235 
   1236     /* For each active display it cycles through each display config and tests
   1237      * each property value. It creates a layer, sets the property and then
   1238      * destroys the layer */
   1239     void setLayerProperty(Hwc2TestCoverage coverage,
   1240             TestLayerPropertyFunction function, AdvanceProperty advance)
   1241     {
   1242         for (auto display : mDisplays) {
   1243             std::vector<hwc2_config_t> configs;
   1244 
   1245             ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   1246 
   1247             for (auto config : configs) {
   1248                 hwc2_layer_t layer;
   1249                 Area displayArea;
   1250 
   1251                 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
   1252                 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
   1253                         &displayArea));
   1254                 Hwc2TestLayer testLayer(coverage, displayArea);
   1255 
   1256                 do {
   1257                     ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
   1258 
   1259                     ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
   1260                             &testLayer, nullptr));
   1261 
   1262                     ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
   1263                 } while (advance(&testLayer));
   1264             }
   1265         }
   1266     }
   1267 
   1268     /* For each active display it cycles through each display config and tests
   1269      * each property value. It creates a layer, cycles through each property
   1270      * value and updates the layer property value and then destroys the layer */
   1271     void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
   1272             TestLayerPropertyFunction function, AdvanceProperty advance)
   1273     {
   1274         for (auto display : mDisplays) {
   1275             std::vector<hwc2_config_t> configs;
   1276 
   1277             ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   1278 
   1279             for (auto config : configs) {
   1280                 hwc2_layer_t layer;
   1281                 Area displayArea;
   1282 
   1283                 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
   1284                 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
   1285                         &displayArea));
   1286                 Hwc2TestLayer testLayer(coverage, displayArea);
   1287 
   1288                 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
   1289 
   1290                 do {
   1291                     ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
   1292                             &testLayer, nullptr));
   1293                 } while (advance(&testLayer));
   1294 
   1295                 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
   1296             }
   1297         }
   1298     }
   1299 
   1300     /* For each active display it cycles through each display config and tests
   1301      * each property value. It creates multiple layers, calls the
   1302      * TestLayerPropertiesFunction to set property values and then
   1303      * destroys the layers */
   1304     void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
   1305             TestLayerPropertiesFunction function, AdvanceProperties advance)
   1306     {
   1307         for (auto display : mDisplays) {
   1308             std::vector<hwc2_config_t> configs;
   1309 
   1310             ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   1311 
   1312             for (auto config : configs) {
   1313                 std::vector<hwc2_layer_t> layers;
   1314                 Area displayArea;
   1315 
   1316                 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
   1317                 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
   1318                         &displayArea));
   1319 
   1320                 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
   1321                 Hwc2TestLayers testLayers(layers, coverage, displayArea);
   1322 
   1323                 do {
   1324                     for (auto layer : layers) {
   1325                         EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
   1326                                 &testLayers));
   1327                     }
   1328                 } while (advance(&testLayers));
   1329 
   1330                 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
   1331             }
   1332         }
   1333     }
   1334 
   1335     /* For each active display it cycles through each display config.
   1336      * 1) It attempts to set a valid property value to bad layer handle.
   1337      * 2) It creates a layer x and attempts to set a valid property value to
   1338      *    layer x + 1
   1339      * 3) It destroys the layer x and attempts to set a valid property value to
   1340      *    the destroyed layer x.
   1341      */
   1342     void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
   1343             TestLayerPropertyBadLayerFunction function)
   1344     {
   1345         for (auto display : mDisplays) {
   1346             std::vector<hwc2_config_t> configs;
   1347 
   1348             ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   1349 
   1350             for (auto config : configs) {
   1351                 hwc2_layer_t layer = 0;
   1352                 Area displayArea;
   1353                 hwc2_error_t err = HWC2_ERROR_NONE;
   1354 
   1355                 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
   1356                 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
   1357                         &displayArea));
   1358                 Hwc2TestLayer testLayer(coverage, displayArea);
   1359 
   1360                 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
   1361                         &testLayer, &err));
   1362                 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
   1363 
   1364                 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
   1365 
   1366                 ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
   1367                         &testLayer, &err));
   1368                 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
   1369 
   1370                 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
   1371 
   1372                 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
   1373                         &testLayer, &err));
   1374                 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
   1375             }
   1376         }
   1377     }
   1378 
   1379     /* For each active display it cycles through each display config and tests
   1380      * each property value. It creates a layer, sets a bad property value and
   1381      * then destroys the layer */
   1382     void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
   1383     {
   1384         for (auto display : mDisplays) {
   1385             std::vector<hwc2_config_t> configs;
   1386 
   1387             ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   1388 
   1389             for (auto config : configs) {
   1390                 hwc2_layer_t layer;
   1391                 hwc2_error_t err = HWC2_ERROR_NONE;
   1392 
   1393                 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
   1394 
   1395                 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
   1396 
   1397                 ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
   1398                 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
   1399                         " error code";
   1400 
   1401                 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
   1402             }
   1403         }
   1404     }
   1405 
   1406     /* For each active display it powers on the display, cycles through each
   1407      * config and creates a set of layers with a certain amount of coverage.
   1408      * For each active display, for each config and for each set of layers,
   1409      * it calls the TestDisplayLayersFunction */
   1410     void displayLayers(Hwc2TestCoverage coverage, size_t layerCnt,
   1411             TestDisplayLayersFunction function)
   1412     {
   1413         for (auto display : mDisplays) {
   1414             std::vector<hwc2_config_t> configs;
   1415 
   1416             ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
   1417 
   1418             ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   1419 
   1420             for (auto config : configs) {
   1421                 Area displayArea;
   1422                 std::vector<hwc2_layer_t> layers;
   1423 
   1424                 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
   1425                 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
   1426 
   1427                 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
   1428                 Hwc2TestLayers testLayers(layers, coverage, displayArea);
   1429 
   1430                 do {
   1431                     bool skip;
   1432 
   1433                     ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
   1434                             &testLayers, &skip));
   1435                     if (!skip)
   1436                         EXPECT_NO_FATAL_FAILURE(function(this, display, layers,
   1437                                 &testLayers));
   1438 
   1439                 } while (testLayers.advance());
   1440 
   1441                 ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
   1442                         std::move(layers)));
   1443             }
   1444 
   1445             ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
   1446         }
   1447     }
   1448 
   1449     /* For each active display, it calls the
   1450      * TestDisplayNonValidatedLayersFunction on a variety on non-validated
   1451      * layer combinations */
   1452     void displayNonValidatedLayers(size_t layerCnt,
   1453             TestDisplayNonValidatedLayersFunction function)
   1454     {
   1455         for (auto display : mDisplays) {
   1456             uint32_t numTypes, numRequests;
   1457             std::vector<hwc2_layer_t> layers;
   1458             bool hasChanges;
   1459 
   1460             ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
   1461 
   1462             EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
   1463 
   1464             ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
   1465 
   1466             EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
   1467 
   1468             for (auto layer : layers) {
   1469                 ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
   1470                         HWC2_COMPOSITION_CLIENT));
   1471             }
   1472 
   1473             EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
   1474 
   1475             ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
   1476                     &numRequests, &hasChanges));
   1477 
   1478             for (auto layer : layers) {
   1479                 ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
   1480                         HWC2_COMPOSITION_DEVICE));
   1481             }
   1482 
   1483             EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
   1484 
   1485             ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
   1486 
   1487             EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
   1488 
   1489             ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
   1490         }
   1491     }
   1492 
   1493     /* Test client target support on each config on each active display */
   1494     void setClientTargetSupport(Hwc2TestCoverage coverage,
   1495             TestClientTargetSupportFunction function,
   1496             AdvanceClientTargetSupport advance)
   1497     {
   1498         for (auto display : mDisplays) {
   1499             std::vector<hwc2_config_t> configs;
   1500 
   1501             ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   1502 
   1503             for (auto config : configs) {
   1504                 Area displayArea;
   1505 
   1506                 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
   1507                 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
   1508                         &displayArea));
   1509                 Hwc2TestClientTargetSupport testClientTargetSupport(coverage,
   1510                         displayArea);
   1511 
   1512                 do {
   1513                     EXPECT_NO_FATAL_FAILURE(function(this, display,
   1514                             testClientTargetSupport));
   1515 
   1516                 } while (advance(&testClientTargetSupport));
   1517             }
   1518         }
   1519     }
   1520 
   1521     /* Cycles through each config on each active display and calls
   1522      * a TestActiveDisplayConfigFunction */
   1523     void setActiveDisplayConfig(TestActiveDisplayConfigFunction function)
   1524     {
   1525         for (auto display : mDisplays) {
   1526             std::vector<hwc2_config_t> configs;
   1527 
   1528             ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   1529 
   1530             for (auto config : configs) {
   1531                 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
   1532 
   1533                 EXPECT_NO_FATAL_FAILURE(function(this, display));
   1534             }
   1535         }
   1536     }
   1537 
   1538     /* Creates a virtual display for testing */
   1539     void createVirtualDisplay(Hwc2TestCoverage coverage,
   1540             TestCreateVirtualDisplayFunction function)
   1541     {
   1542         Hwc2TestVirtualDisplay testVirtualDisplay(coverage);
   1543 
   1544         do {
   1545             hwc2_display_t display;
   1546             hwc2_error_t err = HWC2_ERROR_NONE;
   1547 
   1548             const UnsignedArea& dimension =
   1549                     testVirtualDisplay.getDisplayDimension();
   1550             android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
   1551 
   1552             ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(dimension.width,
   1553                     dimension.height, &desiredFormat, &display, &err));
   1554 
   1555             EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_NO_RESOURCES
   1556                     || err == HWC2_ERROR_UNSUPPORTED)
   1557                     << "returned wrong error code";
   1558             EXPECT_GE(desiredFormat, 0) << "invalid format";
   1559 
   1560             if (err != HWC2_ERROR_NONE)
   1561                 continue;
   1562 
   1563             EXPECT_NO_FATAL_FAILURE(function(this, display,
   1564                     &testVirtualDisplay));
   1565 
   1566             ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
   1567 
   1568         } while (testVirtualDisplay.advance());
   1569     }
   1570 
   1571 
   1572     void getActiveConfigAttribute(hwc2_display_t display,
   1573             hwc2_attribute_t attribute, int32_t* outValue)
   1574     {
   1575         hwc2_config_t config;
   1576         ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
   1577         ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
   1578                 attribute, outValue));
   1579         ASSERT_GE(*outValue, 0) << "failed to get valid "
   1580                 << getAttributeName(attribute);
   1581     }
   1582 
   1583     void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
   1584     {
   1585         ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
   1586                 HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
   1587         ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
   1588                 HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
   1589     }
   1590 
   1591     void closeFences(hwc2_display_t display, int32_t presentFence)
   1592     {
   1593         std::vector<hwc2_layer_t> layers;
   1594         std::vector<int32_t> fences;
   1595         const int msWait = 3000;
   1596 
   1597         if (presentFence >= 0) {
   1598             ASSERT_GE(sync_wait(presentFence, msWait), 0);
   1599             close(presentFence);
   1600         }
   1601 
   1602         ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences));
   1603         EXPECT_EQ(layers.size(), fences.size());
   1604 
   1605         for (int32_t fence : fences) {
   1606             EXPECT_GE(sync_wait(fence, msWait), 0);
   1607             if (fence >= 0)
   1608                 close(fence);
   1609         }
   1610     }
   1611 
   1612     void setLayerProperties(hwc2_display_t display, hwc2_layer_t layer,
   1613             Hwc2TestLayers* testLayers, bool* outSkip)
   1614     {
   1615         hwc2_composition_t composition;
   1616         buffer_handle_t handle = nullptr;
   1617         int32_t acquireFence;
   1618         hwc2_error_t err = HWC2_ERROR_NONE;
   1619         *outSkip = true;
   1620 
   1621         if (!testLayers->contains(layer))
   1622             return;
   1623 
   1624         composition = testLayers->getComposition(layer);
   1625 
   1626         /* If the device cannot support a buffer format, then do not continue */
   1627         if ((composition == HWC2_COMPOSITION_DEVICE
   1628                 || composition == HWC2_COMPOSITION_CURSOR)
   1629                 && testLayers->getBuffer(layer, &handle, &acquireFence) < 0)
   1630             return;
   1631 
   1632         EXPECT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
   1633                 composition, &err));
   1634         if (err == HWC2_ERROR_UNSUPPORTED)
   1635             EXPECT_TRUE(composition != HWC2_COMPOSITION_CLIENT
   1636                     && composition != HWC2_COMPOSITION_DEVICE);
   1637 
   1638         const hwc_rect_t cursor = testLayers->getCursorPosition(layer);
   1639 
   1640         EXPECT_NO_FATAL_FAILURE(setLayerBuffer(display, layer, handle,
   1641                 acquireFence));
   1642         EXPECT_NO_FATAL_FAILURE(setLayerBlendMode(display, layer,
   1643                 testLayers->getBlendMode(layer)));
   1644         EXPECT_NO_FATAL_FAILURE(setLayerColor(display, layer,
   1645                 testLayers->getColor(layer)));
   1646         EXPECT_NO_FATAL_FAILURE(setCursorPosition(display, layer, cursor.left,
   1647                 cursor.top));
   1648         EXPECT_NO_FATAL_FAILURE(setLayerDataspace(display, layer,
   1649                 testLayers->getDataspace(layer)));
   1650         EXPECT_NO_FATAL_FAILURE(setLayerDisplayFrame(display, layer,
   1651                 testLayers->getDisplayFrame(layer)));
   1652         EXPECT_NO_FATAL_FAILURE(setLayerPlaneAlpha(display, layer,
   1653                 testLayers->getPlaneAlpha(layer)));
   1654         EXPECT_NO_FATAL_FAILURE(setLayerSourceCrop(display, layer,
   1655                 testLayers->getSourceCrop(layer)));
   1656         EXPECT_NO_FATAL_FAILURE(setLayerSurfaceDamage(display, layer,
   1657                 testLayers->getSurfaceDamage(layer)));
   1658         EXPECT_NO_FATAL_FAILURE(setLayerTransform(display, layer,
   1659                 testLayers->getTransform(layer)));
   1660         EXPECT_NO_FATAL_FAILURE(setLayerVisibleRegion(display, layer,
   1661                 testLayers->getVisibleRegion(layer)));
   1662         EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer,
   1663                 testLayers->getZOrder(layer)));
   1664 
   1665         *outSkip = false;
   1666     }
   1667 
   1668     void setLayerProperties(hwc2_display_t display,
   1669             const std::vector<hwc2_layer_t>& layers,
   1670             Hwc2TestLayers* testLayers, bool* outSkip)
   1671     {
   1672         for (auto layer : layers) {
   1673             EXPECT_NO_FATAL_FAILURE(setLayerProperties(display, layer,
   1674                     testLayers, outSkip));
   1675             if (*outSkip)
   1676                 return;
   1677         }
   1678     }
   1679 
   1680     void setClientTarget(hwc2_display_t display,
   1681             Hwc2TestClientTarget* testClientTarget,
   1682             const Hwc2TestLayers& testLayers,
   1683             const std::set<hwc2_layer_t>& clientLayers,
   1684             const std::set<hwc2_layer_t>& clearLayers, bool flipClientTarget,
   1685             const Area& displayArea)
   1686     {
   1687         android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
   1688         hwc_region_t damage = { };
   1689         buffer_handle_t handle;
   1690         int32_t acquireFence;
   1691 
   1692         ASSERT_EQ(testClientTarget->getBuffer(testLayers, clientLayers,
   1693                 clearLayers, flipClientTarget, displayArea, &handle,
   1694                 &acquireFence), 0);
   1695         EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
   1696                 dataspace, damage));
   1697     }
   1698 
   1699     void presentDisplays(size_t layerCnt, Hwc2TestCoverage coverage,
   1700             const std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>&
   1701             coverageExceptions, bool optimize)
   1702     {
   1703         for (auto display : mDisplays) {
   1704             std::vector<hwc2_config_t> configs;
   1705 
   1706             ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
   1707             ASSERT_NO_FATAL_FAILURE(enableVsync(display));
   1708 
   1709             ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   1710 
   1711             for (auto config : configs) {
   1712                 Area displayArea;
   1713                 std::vector<hwc2_layer_t> layers;
   1714 
   1715                 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
   1716                 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
   1717                         &displayArea));
   1718 
   1719                 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
   1720                 Hwc2TestLayers testLayers(layers, coverage, displayArea,
   1721                         coverageExceptions);
   1722 
   1723                 if (optimize && !testLayers.optimizeLayouts())
   1724                     continue;
   1725 
   1726                 std::set<hwc2_layer_t> clientLayers;
   1727                 std::set<hwc2_layer_t> clearLayers;
   1728                 Hwc2TestClientTarget testClientTarget;
   1729 
   1730                 do {
   1731                     uint32_t numTypes, numRequests;
   1732                     bool hasChanges, skip;
   1733                     bool flipClientTarget;
   1734                     int32_t presentFence;
   1735 
   1736                     ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
   1737                             &testLayers, &skip));
   1738                     if (skip)
   1739                         continue;
   1740 
   1741                     ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
   1742                             &numRequests, &hasChanges));
   1743                     if (hasChanges)
   1744                         EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
   1745                                 << "wrong number of requests";
   1746 
   1747                     ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
   1748                             testLayers, layers, numTypes, &clientLayers));
   1749                     ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
   1750                             numRequests, &clearLayers, &flipClientTarget));
   1751                     ASSERT_NO_FATAL_FAILURE(setClientTarget(display,
   1752                             &testClientTarget, testLayers, clientLayers,
   1753                             clearLayers, flipClientTarget, displayArea));
   1754                     ASSERT_NO_FATAL_FAILURE(acceptDisplayChanges(display));
   1755 
   1756                     ASSERT_NO_FATAL_FAILURE(waitForVsync());
   1757 
   1758                     EXPECT_NO_FATAL_FAILURE(presentDisplay(display,
   1759                             &presentFence));
   1760 
   1761                     ASSERT_NO_FATAL_FAILURE(closeFences(display, presentFence));
   1762 
   1763                 } while (testLayers.advance());
   1764 
   1765                 ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
   1766                         std::move(layers)));
   1767             }
   1768 
   1769             ASSERT_NO_FATAL_FAILURE(disableVsync(display));
   1770             ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
   1771         }
   1772     }
   1773 
   1774     hwc2_device_t* mHwc2Device = nullptr;
   1775 
   1776     enum class Hwc2TestHotplugStatus {
   1777         Init = 1,
   1778         Receiving,
   1779         Done,
   1780     };
   1781 
   1782     std::mutex mHotplugMutex;
   1783     std::condition_variable mHotplugCv;
   1784     Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
   1785     std::unordered_set<hwc2_display_t> mDisplays;
   1786 
   1787     /* Store all created layers that have not been destroyed. If an ASSERT_*
   1788      * fails, then destroy the layers on exit */
   1789     std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
   1790 
   1791     /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
   1792      * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
   1793     std::set<hwc2_display_t> mActiveDisplays;
   1794 
   1795     /* Store all created virtual displays that have not been destroyed. If an
   1796      * ASSERT_* fails, then destroy the virtual displays on exit */
   1797     std::set<hwc2_display_t> mVirtualDisplays;
   1798 
   1799     std::mutex mVsyncMutex;
   1800     std::condition_variable mVsyncCv;
   1801     hwc2_display_t mVsyncDisplay;
   1802     int64_t mVsyncTimestamp = -1;
   1803 };
   1804 
   1805 void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
   1806         hwc2_display_t display, int32_t connection)
   1807 {
   1808     if (callbackData)
   1809         static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
   1810                 connection);
   1811 }
   1812 
   1813 void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
   1814         hwc2_display_t display, int64_t timestamp)
   1815 {
   1816     if (callbackData)
   1817         static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
   1818                 timestamp);
   1819 }
   1820 
   1821 void setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   1822         Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
   1823 {
   1824     EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
   1825             testLayer->getBlendMode(), outErr));
   1826 }
   1827 
   1828 void setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   1829         Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
   1830 {
   1831     buffer_handle_t handle;
   1832     android::base::unique_fd acquireFence;
   1833     hwc2_composition_t composition = testLayer->getComposition();
   1834 
   1835     if (composition == HWC2_COMPOSITION_CLIENT
   1836             || composition == HWC2_COMPOSITION_SOLID_COLOR
   1837             || composition == HWC2_COMPOSITION_SIDEBAND)
   1838         return;
   1839 
   1840     if (testLayer->getBuffer(&handle, &acquireFence) < 0)
   1841         return;
   1842 
   1843     ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
   1844             composition));
   1845     EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
   1846             handle, acquireFence, outErr));
   1847 }
   1848 
   1849 void setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   1850         Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
   1851 {
   1852     ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
   1853             layer, HWC2_COMPOSITION_SOLID_COLOR));
   1854     ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
   1855             layer, testLayer->getPlaneAlpha()));
   1856     ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
   1857             layer, testLayer->getBlendMode()));
   1858     EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
   1859             testLayer->getColor(), outErr));
   1860 }
   1861 
   1862 void setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   1863         Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
   1864 {
   1865     hwc2_composition_t composition = testLayer->getComposition();
   1866     hwc2_error_t err = HWC2_ERROR_NONE;
   1867 
   1868     ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
   1869             composition, &err));
   1870     if (outErr) {
   1871         *outErr = err;
   1872         return;
   1873     }
   1874 
   1875     if (composition != HWC2_COMPOSITION_SIDEBAND) {
   1876         EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
   1877     } else {
   1878         EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
   1879                  << "returned wrong error code";
   1880     }
   1881 }
   1882 
   1883 void setCursorPosition(Hwc2Test* test, hwc2_display_t display,
   1884         hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
   1885 {
   1886     ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
   1887             layer, HWC2_COMPOSITION_CURSOR));
   1888 
   1889     const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
   1890     EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
   1891             cursorPosition.left, cursorPosition.top, outErr));
   1892 }
   1893 
   1894 void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   1895         Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
   1896 {
   1897     EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
   1898             testLayer->getDataspace(), outErr));
   1899 }
   1900 
   1901 void setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   1902         Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
   1903 {
   1904     EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
   1905             testLayer->getDisplayFrame(), outErr));
   1906 }
   1907 
   1908 void setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   1909         Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
   1910 {
   1911     ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
   1912             testLayer->getBlendMode()));
   1913     EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
   1914             testLayer->getPlaneAlpha(), outErr));
   1915 }
   1916 
   1917 void setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   1918         Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
   1919 {
   1920     EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
   1921             testLayer->getSourceCrop(), outErr));
   1922 }
   1923 
   1924 void setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   1925         Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
   1926 {
   1927     EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
   1928             testLayer->getSurfaceDamage(), outErr));
   1929 }
   1930 
   1931 void setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   1932         Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
   1933 {
   1934     EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
   1935             testLayer->getTransform(), outErr));
   1936 }
   1937 
   1938 void setVisibleRegion(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   1939         Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
   1940 {
   1941     EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display, layer,
   1942             testLayer->getVisibleRegion(), outErr));
   1943 }
   1944 
   1945 void setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   1946         Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
   1947 {
   1948     EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
   1949             testLayer->getZOrder(), outErr));
   1950 }
   1951 
   1952 bool advanceBlendMode(Hwc2TestLayer* testLayer)
   1953 {
   1954     return testLayer->advanceBlendMode();
   1955 }
   1956 
   1957 bool advanceBuffer(Hwc2TestLayer* testLayer)
   1958 {
   1959     if (testLayer->advanceComposition())
   1960         return true;
   1961     return testLayer->advanceBufferArea();
   1962 }
   1963 
   1964 bool advanceColor(Hwc2TestLayer* testLayer)
   1965 {
   1966     /* Color depends on blend mode so advance blend mode last so color is not
   1967      * force to update as often */
   1968     if (testLayer->advancePlaneAlpha())
   1969         return true;
   1970     if (testLayer->advanceColor())
   1971         return true;
   1972     return testLayer->advanceBlendMode();
   1973 }
   1974 
   1975 bool advanceComposition(Hwc2TestLayer* testLayer)
   1976 {
   1977     return testLayer->advanceComposition();
   1978 }
   1979 
   1980 bool advanceCursorPosition(Hwc2TestLayer* testLayer)
   1981 {
   1982     return testLayer->advanceCursorPosition();
   1983 }
   1984 
   1985 bool advanceDataspace(Hwc2TestLayer* testLayer)
   1986 {
   1987     return testLayer->advanceDataspace();
   1988 }
   1989 
   1990 bool advanceDisplayFrame(Hwc2TestLayer* testLayer)
   1991 {
   1992     return testLayer->advanceDisplayFrame();
   1993 }
   1994 
   1995 bool advancePlaneAlpha(Hwc2TestLayer* testLayer)
   1996 {
   1997     return testLayer->advancePlaneAlpha();
   1998 }
   1999 
   2000 bool advanceSourceCrop(Hwc2TestLayer* testLayer)
   2001 {
   2002     if (testLayer->advanceSourceCrop())
   2003         return true;
   2004     return testLayer->advanceBufferArea();
   2005 }
   2006 
   2007 bool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
   2008 {
   2009     if (testLayer->advanceSurfaceDamage())
   2010         return true;
   2011     return testLayer->advanceBufferArea();
   2012 }
   2013 
   2014 bool advanceTransform(Hwc2TestLayer* testLayer)
   2015 {
   2016     return testLayer->advanceTransform();
   2017 }
   2018 
   2019 bool advanceVisibleRegions(Hwc2TestLayers* testLayers)
   2020 {
   2021     return testLayers->advanceVisibleRegions();
   2022 }
   2023 
   2024 bool advanceClientTargetSupport(
   2025         Hwc2TestClientTargetSupport* testClientTargetSupport)
   2026 {
   2027     return testClientTargetSupport->advance();
   2028 }
   2029 
   2030 static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
   2031     HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
   2032     HWC2_FUNCTION_CREATE_LAYER,
   2033     HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
   2034     HWC2_FUNCTION_DESTROY_LAYER,
   2035     HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
   2036     HWC2_FUNCTION_DUMP,
   2037     HWC2_FUNCTION_GET_ACTIVE_CONFIG,
   2038     HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
   2039     HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
   2040     HWC2_FUNCTION_GET_COLOR_MODES,
   2041     HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
   2042     HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
   2043     HWC2_FUNCTION_GET_DISPLAY_NAME,
   2044     HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
   2045     HWC2_FUNCTION_GET_DISPLAY_TYPE,
   2046     HWC2_FUNCTION_GET_DOZE_SUPPORT,
   2047     HWC2_FUNCTION_GET_HDR_CAPABILITIES,
   2048     HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
   2049     HWC2_FUNCTION_GET_RELEASE_FENCES,
   2050     HWC2_FUNCTION_PRESENT_DISPLAY,
   2051     HWC2_FUNCTION_REGISTER_CALLBACK,
   2052     HWC2_FUNCTION_SET_ACTIVE_CONFIG,
   2053     HWC2_FUNCTION_SET_CLIENT_TARGET,
   2054     HWC2_FUNCTION_SET_COLOR_MODE,
   2055     HWC2_FUNCTION_SET_COLOR_TRANSFORM,
   2056     HWC2_FUNCTION_SET_CURSOR_POSITION,
   2057     HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
   2058     HWC2_FUNCTION_SET_LAYER_BUFFER,
   2059     HWC2_FUNCTION_SET_LAYER_COLOR,
   2060     HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
   2061     HWC2_FUNCTION_SET_LAYER_DATASPACE,
   2062     HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
   2063     HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
   2064     HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
   2065     HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
   2066     HWC2_FUNCTION_SET_LAYER_TRANSFORM,
   2067     HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
   2068     HWC2_FUNCTION_SET_LAYER_Z_ORDER,
   2069     HWC2_FUNCTION_SET_OUTPUT_BUFFER,
   2070     HWC2_FUNCTION_SET_POWER_MODE,
   2071     HWC2_FUNCTION_SET_VSYNC_ENABLED,
   2072     HWC2_FUNCTION_VALIDATE_DISPLAY,
   2073 }};
   2074 
   2075 /* TESTCASE: Tests that the HWC2 supports all required functions. */
   2076 TEST_F(Hwc2Test, GET_FUNCTION)
   2077 {
   2078     for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
   2079         hwc2_function_pointer_t pfn = getFunction(descriptor);
   2080         EXPECT_TRUE(pfn) << "failed to get function "
   2081                 << getFunctionDescriptorName(descriptor);
   2082     }
   2083 }
   2084 
   2085 /* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
   2086 TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
   2087 {
   2088     hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
   2089     EXPECT_FALSE(pfn) << "failed to get invalid function";
   2090 }
   2091 
   2092 /* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
   2093 TEST_F(Hwc2Test, GET_CAPABILITIES)
   2094 {
   2095     std::vector<hwc2_capability_t> capabilities;
   2096 
   2097     getCapabilities(&capabilities);
   2098 
   2099     EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
   2100             HWC2_CAPABILITY_INVALID), 0);
   2101 }
   2102 
   2103 static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
   2104     HWC2_CALLBACK_HOTPLUG,
   2105     HWC2_CALLBACK_REFRESH,
   2106     HWC2_CALLBACK_VSYNC,
   2107 }};
   2108 
   2109 /* TESTCASE: Tests that the HWC2 can successfully register all required
   2110  * callback functions. */
   2111 TEST_F(Hwc2Test, REGISTER_CALLBACK)
   2112 {
   2113     hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
   2114             const_cast<char*>("data"));
   2115 
   2116     for (auto descriptor : callbackDescriptors) {
   2117         ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
   2118                 []() { return; }));
   2119     }
   2120 }
   2121 
   2122 /* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
   2123 TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
   2124 {
   2125     hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
   2126             const_cast<char*>("data"));
   2127     hwc2_error_t err = HWC2_ERROR_NONE;
   2128 
   2129     ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
   2130             []() { return; }, &err));
   2131     EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
   2132 }
   2133 
   2134 /* TESTCASE: Tests that the HWC2 can register a callback with null data. */
   2135 TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
   2136 {
   2137     hwc2_callback_data_t data = nullptr;
   2138 
   2139     for (auto descriptor : callbackDescriptors) {
   2140         ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
   2141                 []() { return; }));
   2142     }
   2143 }
   2144 
   2145 /* TESTCASE: Tests that the HWC2 returns the correct display type for each
   2146  * physical display. */
   2147 TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
   2148 {
   2149     for (auto display : mDisplays) {
   2150         hwc2_display_type_t type;
   2151 
   2152         ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
   2153         EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
   2154                 " correct display type";
   2155     }
   2156 }
   2157 
   2158 /* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
   2159  * display is requested. */
   2160 TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
   2161 {
   2162     hwc2_display_t display;
   2163     hwc2_display_type_t type;
   2164     hwc2_error_t err = HWC2_ERROR_NONE;
   2165 
   2166     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   2167 
   2168     ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
   2169     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   2170 }
   2171 
   2172 /* TESTCASE: Tests that the HWC2 can create and destroy layers. */
   2173 TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
   2174 {
   2175     for (auto display : mDisplays) {
   2176         hwc2_layer_t layer;
   2177 
   2178         ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
   2179 
   2180         ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
   2181     }
   2182 }
   2183 
   2184 /* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
   2185 TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
   2186 {
   2187     hwc2_display_t display;
   2188     hwc2_layer_t layer;
   2189     hwc2_error_t err = HWC2_ERROR_NONE;
   2190 
   2191     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   2192 
   2193     ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
   2194     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   2195 }
   2196 
   2197 /* TESTCASE: Tests that the HWC2 will either support a large number of resources
   2198  * or will return no resources. */
   2199 TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
   2200 {
   2201     const size_t layerCnt = 1000;
   2202 
   2203     for (auto display : mDisplays) {
   2204         std::vector<hwc2_layer_t> layers;
   2205 
   2206         ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
   2207 
   2208         ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
   2209     }
   2210 }
   2211 
   2212 /* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
   2213 TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
   2214 {
   2215     hwc2_display_t badDisplay;
   2216 
   2217     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
   2218 
   2219     for (auto display : mDisplays) {
   2220         hwc2_layer_t layer = 0;
   2221         hwc2_error_t err = HWC2_ERROR_NONE;
   2222 
   2223         ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
   2224         EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   2225 
   2226         ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
   2227 
   2228         ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
   2229         EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   2230 
   2231         ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
   2232     }
   2233 }
   2234 
   2235 /* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
   2236 TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
   2237 {
   2238     for (auto display : mDisplays) {
   2239         hwc2_layer_t layer;
   2240         hwc2_error_t err = HWC2_ERROR_NONE;
   2241 
   2242         ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
   2243         EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
   2244 
   2245         ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
   2246         EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
   2247 
   2248         ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
   2249         EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
   2250 
   2251         ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
   2252         EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
   2253 
   2254         ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
   2255         EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
   2256 
   2257         ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
   2258 
   2259         ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
   2260         EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
   2261 
   2262         ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
   2263 
   2264         ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
   2265         EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
   2266     }
   2267 }
   2268 
   2269 static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
   2270     HWC2_ATTRIBUTE_WIDTH,
   2271     HWC2_ATTRIBUTE_HEIGHT,
   2272 }};
   2273 
   2274 static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
   2275     HWC2_ATTRIBUTE_VSYNC_PERIOD,
   2276     HWC2_ATTRIBUTE_DPI_X,
   2277     HWC2_ATTRIBUTE_DPI_Y,
   2278 }};
   2279 
   2280 /* TESTCASE: Tests that the HWC2 can return display attributes for a valid
   2281  * config. */
   2282 TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
   2283 {
   2284     for (auto display : mDisplays) {
   2285         std::vector<hwc2_config_t> configs;
   2286 
   2287         ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   2288 
   2289         for (auto config : configs) {
   2290             int32_t value;
   2291 
   2292             for (auto attribute : requiredAttributes) {
   2293                 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
   2294                         attribute, &value));
   2295                 EXPECT_GE(value, 0) << "missing required attribute "
   2296                         << getAttributeName(attribute) << " for config "
   2297                         << config;
   2298             }
   2299             for (auto attribute : optionalAttributes) {
   2300                 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
   2301                         attribute, &value));
   2302             }
   2303         }
   2304     }
   2305 }
   2306 
   2307 /* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
   2308  * attribute */
   2309 TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
   2310 {
   2311     const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
   2312 
   2313     for (auto display : mDisplays) {
   2314         std::vector<hwc2_config_t> configs;
   2315 
   2316         ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   2317 
   2318         for (auto config : configs) {
   2319             int32_t value;
   2320             hwc2_error_t err = HWC2_ERROR_NONE;
   2321 
   2322             ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
   2323                     attribute, &value, &err));
   2324             EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
   2325                     " attribute for config " << config;
   2326         }
   2327     }
   2328 }
   2329 
   2330 /* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
   2331 TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
   2332 {
   2333     hwc2_display_t display;
   2334     const hwc2_config_t config = 0;
   2335     int32_t value;
   2336     hwc2_error_t err = HWC2_ERROR_NONE;
   2337 
   2338     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   2339 
   2340     for (auto attribute : requiredAttributes) {
   2341         ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
   2342                 &value, &err));
   2343         EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   2344     }
   2345 
   2346     for (auto attribute : optionalAttributes) {
   2347         ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
   2348                 &value, &err));
   2349         EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   2350     }
   2351 }
   2352 
   2353 /* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
   2354 TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
   2355 {
   2356     for (auto display : mDisplays) {
   2357         hwc2_config_t config;
   2358         int32_t value;
   2359         hwc2_error_t err = HWC2_ERROR_NONE;
   2360 
   2361         ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
   2362 
   2363         for (auto attribute : requiredAttributes) {
   2364             ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
   2365                     attribute, &value, &err));
   2366             EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
   2367         }
   2368 
   2369         for (auto attribute : optionalAttributes) {
   2370             ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
   2371                     attribute, &value, &err));
   2372             EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
   2373         }
   2374     }
   2375 }
   2376 
   2377 /* TESTCASE: Tests that the HWC2 will get display configs for active displays */
   2378 TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
   2379 {
   2380     for (auto display : mDisplays) {
   2381         std::vector<hwc2_config_t> configs;
   2382 
   2383         ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   2384     }
   2385 }
   2386 
   2387 /* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
   2388 TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
   2389 {
   2390     hwc2_display_t display;
   2391     std::vector<hwc2_config_t> configs;
   2392     hwc2_error_t err = HWC2_ERROR_NONE;
   2393 
   2394     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   2395 
   2396     ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
   2397 
   2398     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   2399     EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
   2400 }
   2401 
   2402 /* TESTCASE: Tests that the HWC2 will return the same config list multiple
   2403  * times in a row. */
   2404 TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
   2405 {
   2406     for (auto display : mDisplays) {
   2407         std::vector<hwc2_config_t> configs1, configs2;
   2408 
   2409         ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
   2410         ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
   2411 
   2412         EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
   2413                 configs2.begin())) << "returned two different config sets";
   2414     }
   2415 }
   2416 
   2417 /* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
   2418 TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
   2419 {
   2420     for (auto display : mDisplays) {
   2421         std::vector<hwc2_config_t> configs;
   2422 
   2423         ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   2424 
   2425         std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
   2426                 configs.end());
   2427         EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
   2428                 " configs";
   2429     }
   2430 }
   2431 
   2432 /* TESTCASE: Tests that the HWC2 returns the active config for a display */
   2433 TEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
   2434 {
   2435     for (auto display : mDisplays) {
   2436         std::vector<hwc2_config_t> configs;
   2437 
   2438         ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   2439 
   2440         for (auto config : configs) {
   2441             hwc2_config_t activeConfig;
   2442 
   2443             ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
   2444             ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
   2445 
   2446             EXPECT_EQ(activeConfig, config) << "failed to get active config";
   2447         }
   2448     }
   2449 }
   2450 
   2451 /* TESTCASE: Tests that the HWC2 does not return an active config for a bad
   2452  * display. */
   2453 TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
   2454 {
   2455     hwc2_display_t display;
   2456     hwc2_config_t activeConfig;
   2457     hwc2_error_t err = HWC2_ERROR_NONE;
   2458 
   2459     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   2460 
   2461     ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
   2462 
   2463     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   2464 }
   2465 
   2466 /* TESTCASE: Tests that the HWC2 either begins with a valid active config
   2467  * or returns an error when getActiveConfig is called. */
   2468 TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
   2469 {
   2470     for (auto display : mDisplays) {
   2471         std::vector<hwc2_config_t> configs;
   2472         hwc2_config_t activeConfig;
   2473         hwc2_error_t err = HWC2_ERROR_NONE;
   2474 
   2475         ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   2476 
   2477         if (configs.empty())
   2478             return;
   2479 
   2480         ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
   2481         if (err == HWC2_ERROR_NONE) {
   2482             EXPECT_NE(std::count(configs.begin(), configs.end(),
   2483                     activeConfig), 0) << "active config is not found in "
   2484                     " configs for display";
   2485         } else {
   2486             EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
   2487         }
   2488     }
   2489 }
   2490 
   2491 /* TESTCASE: Tests that the HWC2 can set every display config as an active
   2492  * config */
   2493 TEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
   2494 {
   2495     for (auto display : mDisplays) {
   2496         std::vector<hwc2_config_t> configs;
   2497 
   2498         ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   2499 
   2500         for (auto config : configs) {
   2501             EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
   2502         }
   2503     }
   2504 }
   2505 
   2506 /* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
   2507 TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
   2508 {
   2509     hwc2_display_t display;
   2510     const hwc2_config_t config = 0;
   2511     hwc2_error_t err = HWC2_ERROR_NONE;
   2512 
   2513     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   2514 
   2515     ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
   2516     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   2517 }
   2518 
   2519 /* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
   2520 TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
   2521 {
   2522     for (auto display : mDisplays) {
   2523         hwc2_config_t config;
   2524         hwc2_error_t err = HWC2_ERROR_NONE;
   2525 
   2526         ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
   2527 
   2528         ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
   2529         EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
   2530     }
   2531 }
   2532 
   2533 /* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
   2534 TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
   2535 {
   2536     for (auto display : mDisplays) {
   2537         int32_t support = -1;
   2538 
   2539         ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
   2540 
   2541         EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
   2542     }
   2543 }
   2544 
   2545 /* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
   2546 TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
   2547 {
   2548     hwc2_display_t display;
   2549     int32_t support = -1;
   2550     hwc2_error_t err = HWC2_ERROR_NONE;
   2551 
   2552     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   2553 
   2554     ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
   2555 
   2556     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   2557 }
   2558 
   2559 /* TESTCASE: Tests that the HWC2 can set all supported power modes */
   2560 TEST_F(Hwc2Test, SET_POWER_MODE)
   2561 {
   2562     for (auto display : mDisplays) {
   2563         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
   2564         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
   2565 
   2566         int32_t support = -1;
   2567         ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
   2568         if (support != 1)
   2569             return;
   2570 
   2571         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
   2572         ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
   2573                 HWC2_POWER_MODE_DOZE_SUSPEND));
   2574 
   2575         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
   2576     }
   2577 }
   2578 
   2579 /* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
   2580 TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
   2581 {
   2582     hwc2_display_t display;
   2583     hwc2_error_t err = HWC2_ERROR_NONE;
   2584 
   2585     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   2586 
   2587     ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
   2588     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   2589 
   2590     ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
   2591     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   2592 
   2593     int32_t support = -1;
   2594     ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
   2595     if (support != 1)
   2596         return;
   2597 
   2598     ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
   2599     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   2600 
   2601     ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
   2602             &err));
   2603     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   2604 }
   2605 
   2606 /* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
   2607 TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
   2608 {
   2609     for (auto display : mDisplays) {
   2610         hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
   2611                 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
   2612         hwc2_error_t err = HWC2_ERROR_NONE;
   2613 
   2614         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
   2615         EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
   2616                 << mode;
   2617     }
   2618 }
   2619 
   2620 /* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
   2621  * an optional power mode. */
   2622 TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
   2623 {
   2624     for (auto display : mDisplays) {
   2625         int32_t support = -1;
   2626         hwc2_error_t err = HWC2_ERROR_NONE;
   2627 
   2628         ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
   2629         if (support == 1)
   2630             return;
   2631 
   2632         ASSERT_EQ(support, 0) << "invalid doze support value";
   2633 
   2634         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
   2635                 &err));
   2636         EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
   2637 
   2638         ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
   2639                 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
   2640         EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) <<  "returned wrong error code";
   2641     }
   2642 }
   2643 
   2644 /* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
   2645 TEST_F(Hwc2Test, SET_POWER_MODE_stress)
   2646 {
   2647     for (auto display : mDisplays) {
   2648         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
   2649         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
   2650 
   2651         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
   2652         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
   2653 
   2654         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
   2655         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
   2656 
   2657         int32_t support = -1;
   2658         ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
   2659         if (support != 1)
   2660             return;
   2661 
   2662         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
   2663         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
   2664 
   2665         ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
   2666                 HWC2_POWER_MODE_DOZE_SUSPEND));
   2667         ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
   2668                 HWC2_POWER_MODE_DOZE_SUSPEND));
   2669 
   2670         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
   2671     }
   2672 }
   2673 
   2674 /* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
   2675  * displays */
   2676 TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
   2677 {
   2678     for (auto display : mDisplays) {
   2679         hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
   2680                 const_cast<char*>("data"));
   2681 
   2682         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
   2683 
   2684         ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
   2685                 []() { return; }));
   2686 
   2687         ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
   2688 
   2689         ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
   2690 
   2691         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
   2692     }
   2693 }
   2694 
   2695 /* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
   2696 TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
   2697 {
   2698     for (auto display : mDisplays) {
   2699         hwc2_display_t receivedDisplay;
   2700         int64_t receivedTimestamp;
   2701 
   2702         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
   2703 
   2704         ASSERT_NO_FATAL_FAILURE(enableVsync(display));
   2705 
   2706         ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
   2707                 &receivedTimestamp));
   2708 
   2709         EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
   2710         EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
   2711 
   2712         ASSERT_NO_FATAL_FAILURE(disableVsync(display));
   2713 
   2714         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
   2715     }
   2716 }
   2717 
   2718 /* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
   2719 TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
   2720 {
   2721     hwc2_display_t display;
   2722     hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
   2723             const_cast<char*>("data"));
   2724     hwc2_error_t err = HWC2_ERROR_NONE;
   2725 
   2726     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   2727 
   2728     ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
   2729             []() { return; }));
   2730 
   2731     ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
   2732     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   2733 
   2734     ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
   2735     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   2736 }
   2737 
   2738 /* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
   2739 TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
   2740 {
   2741     for (auto display : mDisplays) {
   2742         hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
   2743                 const_cast<char*>("data"));
   2744         hwc2_error_t err = HWC2_ERROR_NONE;
   2745 
   2746         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
   2747 
   2748         ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
   2749                 []() { return; }));
   2750 
   2751         ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
   2752                 &err));
   2753         EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
   2754 
   2755         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
   2756     }
   2757 }
   2758 
   2759 /* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
   2760  * times. */
   2761 TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
   2762 {
   2763     for (auto display : mDisplays) {
   2764         hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
   2765                 const_cast<char*>("data"));
   2766 
   2767         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
   2768 
   2769         ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
   2770                 []() { return; }));
   2771 
   2772         ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
   2773 
   2774         ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
   2775         ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
   2776 
   2777         ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
   2778         ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
   2779 
   2780         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
   2781     }
   2782 }
   2783 
   2784 /* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
   2785  * is off and no callback is registered. */
   2786 TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
   2787 {
   2788     const uint secs = 1;
   2789 
   2790     for (auto display : mDisplays) {
   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 }
   2798 
   2799 /* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
   2800  * is registered. */
   2801 TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
   2802 {
   2803     const uint secs = 1;
   2804 
   2805     for (auto display : mDisplays) {
   2806         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
   2807 
   2808         ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
   2809 
   2810         sleep(secs);
   2811 
   2812         ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
   2813 
   2814         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
   2815     }
   2816 }
   2817 
   2818 /* TESTCASE: Tests that the HWC2 returns a display name for each display */
   2819 TEST_F(Hwc2Test, GET_DISPLAY_NAME)
   2820 {
   2821     for (auto display : mDisplays) {
   2822         std::string name;
   2823 
   2824         ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
   2825     }
   2826 }
   2827 
   2828 /* TESTCASE: Tests that the HWC2 does not return a display name for a bad
   2829  * display */
   2830 TEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
   2831 {
   2832     hwc2_display_t display;
   2833     std::string name;
   2834     hwc2_error_t err = HWC2_ERROR_NONE;
   2835 
   2836     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   2837 
   2838     ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
   2839     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   2840 }
   2841 
   2842 /* TESTCASE: Tests that the HWC2 can set basic composition types. */
   2843 TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
   2844 {
   2845     ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
   2846             setComposition, advanceComposition));
   2847 }
   2848 
   2849 /* TESTCASE: Tests that the HWC2 can update a basic composition type on a
   2850  * layer. */
   2851 TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
   2852 {
   2853     ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
   2854             setComposition, advanceComposition));
   2855 }
   2856 
   2857 /* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
   2858 TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
   2859 {
   2860     ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
   2861             setComposition));
   2862 }
   2863 
   2864 /* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
   2865 TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
   2866 {
   2867     ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
   2868             [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   2869                     hwc2_error_t* outErr) {
   2870 
   2871                 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
   2872                         layer, HWC2_COMPOSITION_INVALID, outErr));
   2873             }
   2874     ));
   2875 }
   2876 
   2877 /* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
   2878 TEST_F(Hwc2Test, SET_CURSOR_POSITION)
   2879 {
   2880     ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
   2881             ::setCursorPosition, advanceCursorPosition));
   2882 }
   2883 
   2884 /* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
   2885 TEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
   2886 {
   2887     ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
   2888             ::setCursorPosition, advanceCursorPosition));
   2889 }
   2890 
   2891 /* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
   2892  * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
   2893 TEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
   2894 {
   2895     ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
   2896             [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   2897                     Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
   2898 
   2899                 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
   2900                 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
   2901                         cursorPosition.left, cursorPosition.top, outErr));
   2902             },
   2903 
   2904             advanceCursorPosition));
   2905 }
   2906 
   2907 /* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
   2908  * display. */
   2909 TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
   2910 {
   2911     hwc2_display_t display;
   2912     hwc2_layer_t layer = 0;
   2913     int32_t x = 0, y = 0;
   2914     hwc2_error_t err = HWC2_ERROR_NONE;
   2915 
   2916     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   2917 
   2918     ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
   2919     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   2920 }
   2921 
   2922 /* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
   2923 TEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
   2924 {
   2925     ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
   2926             [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
   2927                     Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
   2928 
   2929                 const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
   2930                 EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
   2931                         badLayer, cursorPosition.left, cursorPosition.top,
   2932                         outErr));
   2933             }
   2934    ));
   2935 }
   2936 
   2937 /* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
   2938 TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
   2939 {
   2940     ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
   2941             setBlendMode, advanceBlendMode));
   2942 }
   2943 
   2944 /* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
   2945 TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
   2946 {
   2947     ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
   2948             setBlendMode, advanceBlendMode));
   2949 }
   2950 
   2951 /* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
   2952 TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
   2953 {
   2954     ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
   2955             setBlendMode));
   2956 }
   2957 
   2958 /* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
   2959 TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
   2960 {
   2961     ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
   2962             [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   2963                     hwc2_error_t* outErr) {
   2964 
   2965                 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
   2966                         layer, HWC2_BLEND_MODE_INVALID, outErr));
   2967             }
   2968     ));
   2969 }
   2970 
   2971 /* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
   2972 TEST_F(Hwc2Test, SET_LAYER_BUFFER)
   2973 {
   2974     ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
   2975             setBuffer, advanceBuffer));
   2976 }
   2977 
   2978 /* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
   2979 TEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
   2980 {
   2981     ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
   2982             setBuffer, advanceBuffer));
   2983 }
   2984 
   2985 /* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
   2986 TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
   2987 {
   2988     ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
   2989             [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
   2990                     Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
   2991 
   2992                 buffer_handle_t handle = nullptr;
   2993                 android::base::unique_fd acquireFence;
   2994 
   2995                 /* If there is not available buffer for the given buffer
   2996                  * properties, it should not fail this test case */
   2997                 if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
   2998                     *outErr = HWC2_ERROR_BAD_LAYER;
   2999                     return;
   3000                 }
   3001 
   3002                 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
   3003                         handle, acquireFence, outErr));
   3004             }
   3005     ));
   3006 }
   3007 
   3008 /* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
   3009 TEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
   3010 {
   3011     ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
   3012             [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   3013                     hwc2_error_t* outErr) {
   3014 
   3015                 buffer_handle_t handle = nullptr;
   3016                 int32_t acquireFence = -1;
   3017 
   3018                 ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
   3019                         handle, acquireFence, outErr));
   3020             }
   3021     ));
   3022 }
   3023 
   3024 /* TESTCASE: Tests that the HWC2 can set the color of a layer. */
   3025 TEST_F(Hwc2Test, SET_LAYER_COLOR)
   3026 {
   3027     ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
   3028             setColor, advanceColor));
   3029 }
   3030 
   3031 /* TESTCASE: Tests that the HWC2 can update the color of a layer. */
   3032 TEST_F(Hwc2Test, SET_LAYER_COLOR_update)
   3033 {
   3034     ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
   3035             setColor, advanceColor));
   3036 }
   3037 
   3038 /* TESTCASE: Tests that the HWC2 can set the color of a layer when the
   3039  * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
   3040 TEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
   3041 {
   3042     ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
   3043             [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   3044                     Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
   3045 
   3046                 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
   3047                         testLayer->getColor(), outErr));
   3048             },
   3049 
   3050             advanceColor));
   3051 }
   3052 
   3053 /* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
   3054 TEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
   3055 {
   3056     ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
   3057             [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
   3058                     Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
   3059 
   3060                 EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
   3061                         testLayer->getColor(), outErr));
   3062             }
   3063     ));
   3064 }
   3065 
   3066 /* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
   3067 TEST_F(Hwc2Test, SET_LAYER_DATASPACE)
   3068 {
   3069     ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
   3070             setDataspace, advanceDataspace));
   3071 }
   3072 
   3073 /* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
   3074 TEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
   3075 {
   3076     ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
   3077             setDataspace, advanceDataspace));
   3078 }
   3079 
   3080 /* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
   3081 TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
   3082 {
   3083     ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
   3084             setDataspace));
   3085 }
   3086 
   3087 /* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
   3088 TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
   3089 {
   3090     ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
   3091             setDisplayFrame, advanceDisplayFrame));
   3092 }
   3093 
   3094 /* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
   3095 TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
   3096 {
   3097     ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
   3098             setDisplayFrame, advanceDisplayFrame));
   3099 }
   3100 
   3101 /* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
   3102 TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
   3103 {
   3104     ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
   3105             setDisplayFrame));
   3106 }
   3107 
   3108 /* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
   3109 TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
   3110 {
   3111     ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
   3112             setPlaneAlpha, advancePlaneAlpha));
   3113 }
   3114 
   3115 /* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
   3116 TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
   3117 {
   3118     ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
   3119             setPlaneAlpha, advancePlaneAlpha));
   3120 }
   3121 
   3122 /* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
   3123 TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
   3124 {
   3125     ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
   3126             [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
   3127                     Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
   3128 
   3129                     EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
   3130                             badLayer, testLayer->getPlaneAlpha(), outErr));
   3131             }
   3132     ));
   3133 }
   3134 
   3135 /* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
   3136 TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
   3137 {
   3138     ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
   3139             setSourceCrop, advanceSourceCrop));
   3140 }
   3141 
   3142 /* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
   3143 TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
   3144 {
   3145     ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
   3146             setSourceCrop, advanceSourceCrop));
   3147 }
   3148 
   3149 /* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
   3150 TEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
   3151 {
   3152     ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
   3153             setSourceCrop));
   3154 }
   3155 
   3156 /* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
   3157 TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
   3158 {
   3159     ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
   3160             setSurfaceDamage, advanceSurfaceDamage));
   3161 }
   3162 
   3163 /* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
   3164 TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
   3165 {
   3166     ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
   3167             setSurfaceDamage, advanceSurfaceDamage));
   3168 }
   3169 
   3170 /* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
   3171 TEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
   3172 {
   3173     ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
   3174             setSurfaceDamage));
   3175 }
   3176 
   3177 /* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
   3178 TEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
   3179 {
   3180     ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
   3181             setTransform, advanceTransform));
   3182 }
   3183 
   3184 /* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
   3185 TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
   3186 {
   3187     ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
   3188             setTransform, advanceTransform));
   3189 }
   3190 
   3191 /* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
   3192 TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
   3193 {
   3194     ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
   3195             setTransform));
   3196 }
   3197 
   3198 /* TESTCASE: Tests that the HWC2 can set the visible region of a layer. */
   3199 TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION)
   3200 {
   3201     ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Basic, 5,
   3202             [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   3203                     Hwc2TestLayers* testLayers) {
   3204 
   3205                 EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display,
   3206                         layer, testLayers->getVisibleRegion(layer)));
   3207             },
   3208 
   3209             advanceVisibleRegions));
   3210 }
   3211 
   3212 /* TESTCASE: Tests that the HWC2 cannot set the visible region of a bad layer. */
   3213 TEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION_bad_layer)
   3214 {
   3215     ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
   3216             setVisibleRegion));
   3217 }
   3218 
   3219 /* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
   3220 TEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
   3221 {
   3222     ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
   3223             [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
   3224                     Hwc2TestLayers* testLayers) {
   3225 
   3226                 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
   3227                         testLayers->getZOrder(layer)));
   3228             },
   3229 
   3230             /* TestLayer z orders are set during the construction of TestLayers
   3231              * and cannot be updated. There is no need (or ability) to cycle
   3232              * through additional z order configurations. */
   3233             [] (Hwc2TestLayers* /*testLayers*/) {
   3234                 return false;
   3235             }
   3236     ));
   3237 }
   3238 
   3239 /* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
   3240 TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
   3241 {
   3242     const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
   3243             static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
   3244             static_cast<uint32_t>(UINT32_MAX / 2),
   3245             static_cast<uint32_t>(UINT32_MAX) };
   3246 
   3247     for (auto display : mDisplays) {
   3248         std::vector<hwc2_config_t> configs;
   3249 
   3250         ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   3251 
   3252         for (auto config : configs) {
   3253             hwc2_layer_t layer;
   3254 
   3255             ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
   3256 
   3257             ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
   3258 
   3259             for (uint32_t zOrder : zOrders) {
   3260                 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
   3261             }
   3262 
   3263             ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
   3264         }
   3265     }
   3266 }
   3267 
   3268 /* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
   3269 TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
   3270 {
   3271     ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
   3272             setZOrder));
   3273 }
   3274 
   3275 /* TESTCASE: Tests that the HWC2 can display a layer with basic property
   3276  * coverage */
   3277 TEST_F(Hwc2Test, VALIDATE_DISPLAY_basic)
   3278 {
   3279     ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
   3280             [] (Hwc2Test* test, hwc2_display_t display,
   3281                     const std::vector<hwc2_layer_t>& layers,
   3282                     Hwc2TestLayers* /*testLayers*/) {
   3283 
   3284                 uint32_t numTypes, numRequests;
   3285                 bool hasChanges = false;
   3286 
   3287                 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
   3288                         &numRequests, &hasChanges));
   3289                 if (hasChanges)
   3290                     EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
   3291                             << "wrong number of requests";
   3292             }
   3293     ));
   3294 }
   3295 
   3296 /* TESTCASE: Tests that the HWC2 can display 5 layers with default coverage. */
   3297 TEST_F(Hwc2Test, VALIDATE_DISPLAY_default_5)
   3298 {
   3299     ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 5,
   3300             [] (Hwc2Test* test, hwc2_display_t display,
   3301                     const std::vector<hwc2_layer_t>& layers,
   3302                     Hwc2TestLayers* /*testLayers*/) {
   3303 
   3304                 uint32_t numTypes, numRequests;
   3305                 bool hasChanges = false;
   3306 
   3307                 EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
   3308                         &numRequests, &hasChanges));
   3309                 if (hasChanges)
   3310                     EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
   3311                             << "wrong number of requests";
   3312             }
   3313     ));
   3314 }
   3315 
   3316 /* TESTCASE: Tests that the HWC2 cannot validate a bad display */
   3317 TEST_F(Hwc2Test, VALIDATE_DISPLAY_bad_display)
   3318 {
   3319     hwc2_display_t display;
   3320     uint32_t numTypes, numRequests;
   3321     hwc2_error_t err = HWC2_ERROR_NONE;
   3322 
   3323     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   3324 
   3325     ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes, &numRequests,
   3326             &err));
   3327     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   3328 }
   3329 
   3330 /* TESTCASE: Tests that the HWC2 can get display requests after validating a
   3331  * basic layer. */
   3332 TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_basic)
   3333 {
   3334     ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
   3335             [] (Hwc2Test* test, hwc2_display_t display,
   3336                     const std::vector<hwc2_layer_t>& layers,
   3337                     Hwc2TestLayers* /*testLayers*/) {
   3338 
   3339                 uint32_t numTypes, numRequests;
   3340                 bool hasChanges = false;
   3341 
   3342                 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
   3343                         &numRequests, &hasChanges));
   3344                 if (hasChanges)
   3345                     EXPECT_LE(numTypes, layers.size())
   3346                             << "wrong number of requests";
   3347 
   3348                 EXPECT_NO_FATAL_FAILURE(test->handleRequests(display, layers,
   3349                         numRequests));
   3350             }
   3351     ));
   3352 }
   3353 
   3354 /* TESTCASE: Tests that the HWC2 cannot get display requests from a bad display */
   3355 TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_bad_display)
   3356 {
   3357     hwc2_display_t display;
   3358     hwc2_display_request_t displayRequests;
   3359     std::vector<hwc2_layer_t> layers;
   3360     std::vector<hwc2_layer_request_t> layerRequests;
   3361     hwc2_error_t err = HWC2_ERROR_NONE;
   3362 
   3363     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   3364 
   3365     EXPECT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequests,
   3366             &layers, &layerRequests, &err));
   3367     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   3368 }
   3369 
   3370 /* TESTCASE: Tests that the HWC2 cannot get display requests from an non
   3371  * validated display. */
   3372 TEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_not_validated)
   3373 {
   3374     ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
   3375             [] (Hwc2Test* test, hwc2_display_t display,
   3376                     std::vector<hwc2_layer_t>* layers) {
   3377 
   3378                 hwc2_display_request_t displayRequests;
   3379                 std::vector<hwc2_layer_request_t> layerRequests;
   3380                 hwc2_error_t err = HWC2_ERROR_NONE;
   3381 
   3382                 ASSERT_NO_FATAL_FAILURE(test->getDisplayRequests(display,
   3383                         &displayRequests, layers, &layerRequests, &err));
   3384                 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
   3385                         << "returned wrong error code";
   3386             }
   3387     ));
   3388 }
   3389 
   3390 /* TESTCASE: Tests that the HWC2 can get changed composition types after
   3391  * validating a basic layer. */
   3392 TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_basic)
   3393 {
   3394     ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
   3395             [] (Hwc2Test* test, hwc2_display_t display,
   3396                     const std::vector<hwc2_layer_t>& layers,
   3397                     Hwc2TestLayers* testLayers) {
   3398 
   3399                 uint32_t numTypes, numRequests;
   3400                 bool hasChanges = false;
   3401 
   3402                 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
   3403                         &numRequests, &hasChanges));
   3404                 if (hasChanges)
   3405                     EXPECT_LE(numTypes, layers.size())
   3406                             << "wrong number of requests";
   3407 
   3408                 EXPECT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
   3409                         *testLayers, layers, numTypes));
   3410             }
   3411     ));
   3412 }
   3413 
   3414 /* TESTCASE: Tests that the HWC2 cannot get changed composition types from a bad
   3415  * display */
   3416 TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_bad_display)
   3417 {
   3418     hwc2_display_t display;
   3419     std::vector<hwc2_layer_t> layers;
   3420     std::vector<hwc2_composition_t> types;
   3421     hwc2_error_t err = HWC2_ERROR_NONE;
   3422 
   3423     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   3424 
   3425     EXPECT_NO_FATAL_FAILURE(getChangedCompositionTypes(display, &layers,
   3426             &types, &err));
   3427     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   3428 }
   3429 
   3430 /* TESTCASE: Tests that the HWC2 cannot get changed composition types from an non
   3431  * validated display. */
   3432 TEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_not_validated)
   3433 {
   3434     ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
   3435             [] (Hwc2Test* test, hwc2_display_t display,
   3436                     std::vector<hwc2_layer_t>* layers) {
   3437 
   3438                 std::vector<hwc2_composition_t> types;
   3439                 hwc2_error_t err = HWC2_ERROR_NONE;
   3440 
   3441                 ASSERT_NO_FATAL_FAILURE(test->getChangedCompositionTypes(
   3442                         display, layers, &types, &err));
   3443                 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
   3444                         << "returned wrong error code";
   3445             }
   3446     ));
   3447 }
   3448 
   3449 /* TESTCASE: Tests that the HWC2 can accept display changes after validating a
   3450  * basic layer. */
   3451 TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_basic)
   3452 {
   3453     ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
   3454             [] (Hwc2Test* test, hwc2_display_t display,
   3455                     const std::vector<hwc2_layer_t>& layers,
   3456                     Hwc2TestLayers* testLayers) {
   3457 
   3458                 uint32_t numTypes, numRequests;
   3459                 bool hasChanges = false;
   3460 
   3461                 ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
   3462                         &numRequests, &hasChanges));
   3463                 if (hasChanges)
   3464                     EXPECT_LE(numTypes, layers.size())
   3465                             << "wrong number of requests";
   3466 
   3467                 ASSERT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
   3468                         *testLayers, layers, numTypes));
   3469 
   3470                 EXPECT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display));
   3471             }
   3472     ));
   3473 }
   3474 
   3475 /* TESTCASE: Tests that the HWC2 cannot accept display changes from a bad
   3476  * display */
   3477 TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_bad_display)
   3478 {
   3479     hwc2_display_t display;
   3480     hwc2_error_t err = HWC2_ERROR_NONE;
   3481 
   3482     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   3483 
   3484     EXPECT_NO_FATAL_FAILURE(acceptDisplayChanges(display, &err));
   3485     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   3486 }
   3487 
   3488 /* TESTCASE: Tests that the HWC2 cannot accept display changes from an non
   3489  * validated display. */
   3490 TEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_not_validated)
   3491 {
   3492     ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
   3493             [] (Hwc2Test* test, hwc2_display_t display,
   3494                     std::vector<hwc2_layer_t>* /*layers*/) {
   3495 
   3496                 hwc2_error_t err = HWC2_ERROR_NONE;
   3497 
   3498                 ASSERT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display, &err));
   3499                 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
   3500                         << "returned wrong error code";
   3501             }
   3502     ));
   3503 }
   3504 
   3505 /* TESTCASE: Tests that the HWC2 supports client target with required values */
   3506 TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT)
   3507 {
   3508     ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
   3509             [] (Hwc2Test* test, hwc2_display_t display,
   3510                     const Hwc2TestClientTargetSupport& testClientTargetSupport) {
   3511 
   3512                 const Area bufferArea = testClientTargetSupport.getBufferArea();
   3513                 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
   3514 
   3515                 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
   3516                         bufferArea.width, bufferArea.height, format,
   3517                         testClientTargetSupport.getDataspace()));
   3518             },
   3519 
   3520             advanceClientTargetSupport));
   3521 }
   3522 
   3523 /* TESTCASE: Tests that the HWC2 cannot get client target support for a bad
   3524  * display. */
   3525 TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_bad_display)
   3526 {
   3527     ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
   3528             [] (Hwc2Test* test, hwc2_display_t /*display*/,
   3529                     const Hwc2TestClientTargetSupport& testClientTargetSupport) {
   3530 
   3531                 const Area bufferArea = testClientTargetSupport.getBufferArea();
   3532                 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
   3533                 hwc2_display_t badDisplay;
   3534                 hwc2_error_t err = HWC2_ERROR_NONE;
   3535 
   3536                 ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
   3537 
   3538                 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(badDisplay,
   3539                         bufferArea.width, bufferArea.height, format,
   3540                         testClientTargetSupport.getDataspace(), &err));
   3541                 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   3542             },
   3543 
   3544             advanceClientTargetSupport));
   3545 }
   3546 
   3547 /* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
   3548  * for a variety of client target values. */
   3549 TEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_unsupported)
   3550 {
   3551     ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Complete,
   3552             [] (Hwc2Test* test, hwc2_display_t display,
   3553                     const Hwc2TestClientTargetSupport& testClientTargetSupport) {
   3554 
   3555                 const Area bufferArea = testClientTargetSupport.getBufferArea();
   3556                 const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
   3557                 hwc2_error_t err = HWC2_ERROR_NONE;
   3558 
   3559                 ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
   3560                         bufferArea.width, bufferArea.height, format,
   3561                         testClientTargetSupport.getDataspace(), &err));
   3562                 EXPECT_TRUE(err == HWC2_ERROR_NONE
   3563                         || err == HWC2_ERROR_UNSUPPORTED)
   3564                         << "returned wrong error code";
   3565             },
   3566 
   3567             advanceClientTargetSupport));
   3568 }
   3569 
   3570 /* TESTCASE: Tests that the HWC2 can set a client target buffer for a basic
   3571  * layer. */
   3572 TEST_F(Hwc2Test, SET_CLIENT_TARGET_basic)
   3573 {
   3574     const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
   3575     const hwc_region_t damage = { };
   3576     const size_t layerCnt = 1;
   3577 
   3578     for (auto display : mDisplays) {
   3579         std::vector<hwc2_config_t> configs;
   3580 
   3581         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
   3582 
   3583         ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
   3584 
   3585         for (auto config : configs) {
   3586             Area displayArea;
   3587             std::vector<hwc2_layer_t> layers;
   3588 
   3589             ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
   3590             ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
   3591 
   3592             ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
   3593             Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Basic,
   3594                     displayArea);
   3595 
   3596             if (!testLayers.optimizeLayouts())
   3597                 continue;
   3598 
   3599             Hwc2TestClientTarget testClientTarget;
   3600 
   3601             do {
   3602                 std::set<hwc2_layer_t> clientLayers;
   3603                 std::set<hwc2_layer_t> clearLayers;
   3604                 uint32_t numTypes, numRequests;
   3605                 bool hasChanges, skip;
   3606                 bool flipClientTarget;
   3607                 buffer_handle_t handle;
   3608                 int32_t acquireFence;
   3609 
   3610                 ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
   3611                         &testLayers, &skip));
   3612                 if (skip)
   3613                     continue;
   3614 
   3615                 ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
   3616                         &numRequests, &hasChanges));
   3617                 if (hasChanges)
   3618                     EXPECT_LE(numTypes, layers.size())
   3619                             << "wrong number of requests";
   3620 
   3621                 ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
   3622                         testLayers, layers, numTypes, &clientLayers));
   3623                 ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
   3624                         numRequests, &clearLayers, &flipClientTarget));
   3625                 ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
   3626                         clearLayers, flipClientTarget, displayArea, &handle,
   3627                         &acquireFence), 0);
   3628                 EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle,
   3629                         acquireFence, dataspace, damage));
   3630 
   3631                 if (acquireFence >= 0)
   3632                     close(acquireFence);
   3633 
   3634             } while (testLayers.advance());
   3635 
   3636             ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
   3637         }
   3638 
   3639         ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
   3640     }
   3641 }
   3642 
   3643 /* TESTCASE: Tests that the HWC2 cannot set a client target for a bad display. */
   3644 TEST_F(Hwc2Test, SET_CLIENT_TARGET_bad_display)
   3645 {
   3646     hwc2_display_t display;
   3647     std::vector<hwc2_layer_t> layers;
   3648     const Area displayArea = {0, 0};
   3649     Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Default, displayArea);
   3650     std::set<hwc2_layer_t> clientLayers;
   3651     std::set<hwc2_layer_t> flipClientTargetLayers;
   3652     bool flipClientTarget = true;
   3653     const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
   3654     const hwc_region_t damage = { };
   3655     buffer_handle_t handle;
   3656     int32_t acquireFence;
   3657     hwc2_error_t err = HWC2_ERROR_NONE;
   3658 
   3659     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   3660 
   3661     Hwc2TestClientTarget testClientTarget;
   3662 
   3663     ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
   3664             flipClientTargetLayers, flipClientTarget, displayArea, &handle,
   3665             &acquireFence), 0);
   3666 
   3667     EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
   3668             dataspace, damage, &err));
   3669 
   3670     if (acquireFence >= 0)
   3671         close(acquireFence);
   3672 
   3673     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   3674 }
   3675 
   3676 /* TESTCASE: Tests that the HWC2 can present 1 default layer. */
   3677 TEST_F(Hwc2Test, PRESENT_DISPLAY_default_1)
   3678 {
   3679     const size_t layerCnt = 1;
   3680     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3681     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
   3682     bool optimize = false;
   3683 
   3684     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3685             optimize));
   3686 }
   3687 
   3688 /* TESTCASE: Tests that the HWC2 can present 2 default layers. */
   3689 TEST_F(Hwc2Test, PRESENT_DISPLAY_default_2)
   3690 {
   3691     const size_t layerCnt = 2;
   3692     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3693     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
   3694     bool optimize = false;
   3695 
   3696     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3697             optimize));
   3698 }
   3699 
   3700 /* TESTCASE: Tests that the HWC2 can present 3 default layers. */
   3701 TEST_F(Hwc2Test, PRESENT_DISPLAY_default_3)
   3702 {
   3703     const size_t layerCnt = 3;
   3704     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3705     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
   3706     bool optimize = false;
   3707 
   3708     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3709             optimize));
   3710 }
   3711 
   3712 /* TESTCASE: Tests that the HWC2 can present 4 default layers. */
   3713 TEST_F(Hwc2Test, PRESENT_DISPLAY_default_4)
   3714 {
   3715     const size_t layerCnt = 4;
   3716     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3717     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
   3718     bool optimize = false;
   3719 
   3720     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3721             optimize));
   3722 }
   3723 
   3724 /* TESTCASE: Tests that the HWC2 can present 5 default layers. */
   3725 TEST_F(Hwc2Test, PRESENT_DISPLAY_default_5)
   3726 {
   3727     const size_t layerCnt = 5;
   3728     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3729     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
   3730     bool optimize = false;
   3731 
   3732     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3733             optimize));
   3734 }
   3735 
   3736 /* TESTCASE: Tests that the HWC2 can present 6 default layers. */
   3737 TEST_F(Hwc2Test, PRESENT_DISPLAY_default_6)
   3738 {
   3739     const size_t layerCnt = 6;
   3740     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3741     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
   3742     bool optimize = false;
   3743 
   3744     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3745             optimize));
   3746 }
   3747 
   3748 /* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
   3749  * blend mode. */
   3750 TEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_1)
   3751 {
   3752     const size_t layerCnt = 1;
   3753     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3754     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   3755             {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
   3756             {Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Basic},
   3757             {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
   3758     bool optimize = false;
   3759 
   3760     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3761             optimize));
   3762 }
   3763 
   3764 /* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
   3765  * blend mode. */
   3766 TEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_2)
   3767 {
   3768     const size_t layerCnt = 2;
   3769     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3770     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   3771             {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
   3772             {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
   3773     bool optimize = false;
   3774 
   3775     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3776             optimize));
   3777 }
   3778 
   3779 /* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
   3780  * buffer. */
   3781 TEST_F(Hwc2Test, PRESENT_DISPLAY_buffer_1)
   3782 {
   3783     const size_t layerCnt = 1;
   3784     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3785     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   3786             {{Hwc2TestPropertyName::BufferArea, Hwc2TestCoverage::Complete}};
   3787     bool optimize = true;
   3788 
   3789     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3790             optimize));
   3791 }
   3792 
   3793 /* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
   3794  * color. */
   3795 TEST_F(Hwc2Test, PRESENT_DISPLAY_color_1)
   3796 {
   3797     const size_t layerCnt = 1;
   3798     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3799     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   3800             {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
   3801             {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Complete}};
   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 2 layers with complete coverage of
   3809  * color. */
   3810 TEST_F(Hwc2Test, PRESENT_DISPLAY_color_2)
   3811 {
   3812     const size_t layerCnt = 2;
   3813     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3814     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   3815             {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
   3816             {Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
   3817             {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic},
   3818             {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Basic}};
   3819     bool optimize = true;
   3820 
   3821     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3822             optimize));
   3823 }
   3824 
   3825 /* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
   3826  * composition. */
   3827 TEST_F(Hwc2Test, PRESENT_DISPLAY_composition_1)
   3828 {
   3829     const size_t layerCnt = 1;
   3830     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3831     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   3832             {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete}};
   3833     bool optimize = true;
   3834 
   3835     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3836             optimize));
   3837 }
   3838 
   3839 /* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
   3840  * cursor. */
   3841 TEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_1)
   3842 {
   3843     const size_t layerCnt = 1;
   3844     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3845     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   3846             {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
   3847             {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete}};
   3848     bool optimize = true;
   3849 
   3850     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3851             optimize));
   3852 }
   3853 
   3854 /* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
   3855  * cursor. */
   3856 TEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_2)
   3857 {
   3858     const size_t layerCnt = 2;
   3859     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3860     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   3861             {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
   3862             {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete},
   3863             {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
   3864     bool optimize = true;
   3865 
   3866     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3867             optimize));
   3868 }
   3869 
   3870 /* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
   3871  * dataspace. */
   3872 TEST_F(Hwc2Test, PRESENT_DISPLAY_dataspace_1)
   3873 {
   3874     const size_t layerCnt = 1;
   3875     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3876     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   3877             {{Hwc2TestPropertyName::Dataspace, Hwc2TestCoverage::Complete}};
   3878     bool optimize = true;
   3879 
   3880     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3881             optimize));
   3882 }
   3883 
   3884 /* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
   3885  * display frame. */
   3886 TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_1)
   3887 {
   3888     const size_t layerCnt = 1;
   3889     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3890     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   3891             {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
   3892     bool optimize = true;
   3893 
   3894     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3895             optimize));
   3896 }
   3897 
   3898 /* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
   3899  * display frame. */
   3900 TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_2)
   3901 {
   3902     const size_t layerCnt = 2;
   3903     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3904     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   3905             {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
   3906     bool optimize = true;
   3907 
   3908     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3909             optimize));
   3910 }
   3911 
   3912 /* TESTCASE: Tests that the HWC2 can present 3 layers with complete coverage of
   3913  * display frame. */
   3914 TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_3)
   3915 {
   3916     const size_t layerCnt = 3;
   3917     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3918     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   3919             {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
   3920     bool optimize = true;
   3921 
   3922     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3923             optimize));
   3924 }
   3925 
   3926 /* TESTCASE: Tests that the HWC2 can present 4 layers with complete coverage of
   3927  * display frame. */
   3928 TEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_4)
   3929 {
   3930     const size_t layerCnt = 4;
   3931     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3932     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   3933             {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
   3934     bool optimize = true;
   3935 
   3936     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3937             optimize));
   3938 }
   3939 
   3940 /* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
   3941  * plane alpha. */
   3942 TEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_1)
   3943 {
   3944     const size_t layerCnt = 1;
   3945     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3946     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   3947             {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
   3948             {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
   3949     bool optimize = false;
   3950 
   3951     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3952             optimize));
   3953 }
   3954 
   3955 /* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
   3956  * plane alpha. */
   3957 TEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_2)
   3958 {
   3959     const size_t layerCnt = 2;
   3960     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3961     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   3962             {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
   3963             {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
   3964     bool optimize = false;
   3965 
   3966     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3967             optimize));
   3968 }
   3969 
   3970 /* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
   3971  * source crop. */
   3972 TEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_1)
   3973 {
   3974     const size_t layerCnt = 1;
   3975     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3976     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   3977             {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
   3978             {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
   3979     bool optimize = true;
   3980 
   3981     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3982             optimize));
   3983 }
   3984 
   3985 /* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
   3986  * source crop. */
   3987 TEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_2)
   3988 {
   3989     const size_t layerCnt = 2;
   3990     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   3991     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   3992             {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
   3993             {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
   3994     bool optimize = true;
   3995 
   3996     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   3997             optimize));
   3998 }
   3999 
   4000 
   4001 /* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
   4002  * surface damage. */
   4003 TEST_F(Hwc2Test, PRESENT_DISPLAY_surface_damage_1)
   4004 {
   4005     const size_t layerCnt = 1;
   4006     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   4007     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   4008             {{Hwc2TestPropertyName::SurfaceDamage, Hwc2TestCoverage::Complete}};
   4009     bool optimize = true;
   4010 
   4011     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   4012             optimize));
   4013 }
   4014 
   4015 /* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
   4016  * transform. */
   4017 TEST_F(Hwc2Test, PRESENT_DISPLAY_transform_1)
   4018 {
   4019     const size_t layerCnt = 1;
   4020     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   4021     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   4022             {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete}};
   4023     bool optimize = true;
   4024 
   4025     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   4026             optimize));
   4027 }
   4028 
   4029 /* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
   4030  * transform. */
   4031 TEST_F(Hwc2Test, PRESENT_DISPLAY_transform_2)
   4032 {
   4033     const size_t layerCnt = 2;
   4034     Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
   4035     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
   4036             {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete},
   4037             {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
   4038     bool optimize = true;
   4039 
   4040     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   4041             optimize));
   4042 }
   4043 
   4044 /* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
   4045  * basic. */
   4046 TEST_F(Hwc2Test, PRESENT_DISPLAY_basic_1)
   4047 {
   4048     const size_t layerCnt = 1;
   4049     Hwc2TestCoverage coverage = Hwc2TestCoverage::Basic;
   4050     std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
   4051     bool optimize = true;
   4052 
   4053     ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
   4054             optimize));
   4055 }
   4056 
   4057 /* TESTCASE: Tests that the HWC2 cannot present a bad display.  */
   4058 TEST_F(Hwc2Test, PRESENT_DISPLAY_bad_display)
   4059 {
   4060     hwc2_display_t display;
   4061     int32_t presentFence;
   4062     hwc2_error_t err = HWC2_ERROR_NONE;
   4063 
   4064     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   4065 
   4066     ASSERT_NO_FATAL_FAILURE(presentDisplay(display, &presentFence, &err));
   4067     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   4068 }
   4069 
   4070 /* TESTCASE: Tests that the HWC2 cannot present an unvalidated display. */
   4071 TEST_F(Hwc2Test, PRESENT_DISPLAY_not_validated)
   4072 {
   4073     ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 1,
   4074             [] (Hwc2Test* test, hwc2_display_t display,
   4075                     const std::vector<hwc2_layer_t>& /*layers*/,
   4076                     Hwc2TestLayers* /*testLayers*/) {
   4077 
   4078                 int32_t presentFence;
   4079                 hwc2_error_t err = HWC2_ERROR_NONE;
   4080 
   4081                 ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
   4082                         HWC2_POWER_MODE_ON));
   4083                 ASSERT_NO_FATAL_FAILURE(test->enableVsync(display));
   4084 
   4085                 ASSERT_NO_FATAL_FAILURE(test->waitForVsync());
   4086 
   4087                 ASSERT_NO_FATAL_FAILURE(test->presentDisplay(display,
   4088                         &presentFence, &err));
   4089                 EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
   4090                         << "returned wrong error code";
   4091 
   4092                 ASSERT_NO_FATAL_FAILURE(test->disableVsync(display));
   4093                 ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
   4094                         HWC2_POWER_MODE_OFF));
   4095             }
   4096     ));
   4097 }
   4098 
   4099 /* TESTCASE: Tests that the HWC2 cannot get release fences from a bad display. */
   4100 TEST_F(Hwc2Test, GET_RELEASE_FENCES_bad_display)
   4101 {
   4102     hwc2_display_t display;
   4103     std::vector<hwc2_layer_t> layers;
   4104     std::vector<int32_t> fences;
   4105     hwc2_error_t err = HWC2_ERROR_NONE;
   4106 
   4107     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   4108 
   4109     ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences, &err));
   4110     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   4111 }
   4112 
   4113 static const std::array<android_color_mode, 9> androidColorModes = {{
   4114     HAL_COLOR_MODE_NATIVE,
   4115     HAL_COLOR_MODE_STANDARD_BT601_625,
   4116     HAL_COLOR_MODE_STANDARD_BT601_625_UNADJUSTED,
   4117     HAL_COLOR_MODE_STANDARD_BT601_525,
   4118     HAL_COLOR_MODE_STANDARD_BT601_525_UNADJUSTED,
   4119     HAL_COLOR_MODE_STANDARD_BT709,
   4120     HAL_COLOR_MODE_DCI_P3,
   4121     HAL_COLOR_MODE_SRGB,
   4122     HAL_COLOR_MODE_ADOBE_RGB,
   4123 }};
   4124 
   4125 /* TESTCASE: Tests that the HWC2 can get the color modes for a display. The
   4126  * display must support HAL_COLOR_MODE_NATIVE */
   4127 TEST_F(Hwc2Test, GET_COLOR_MODES)
   4128 {
   4129     ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
   4130             [] (Hwc2Test* test, hwc2_display_t display) {
   4131 
   4132                 std::vector<android_color_mode_t> colorModes;
   4133 
   4134                 ASSERT_NO_FATAL_FAILURE(test->getColorModes(display,
   4135                         &colorModes));
   4136 
   4137                 EXPECT_NE(std::count(colorModes.begin(), colorModes.end(),
   4138                         HAL_COLOR_MODE_NATIVE), 0) << "all displays"
   4139                         " must support HAL_COLOR_MODE_NATIVE";
   4140             }
   4141     ));
   4142 }
   4143 
   4144 /* TESTCASE: Tests that the HWC2 cannot get color modes from a bad display. */
   4145 TEST_F(Hwc2Test, GET_COLOR_MODES_bad_display)
   4146 {
   4147     hwc2_display_t display;
   4148     std::vector<android_color_mode_t> colorModes;
   4149     hwc2_error_t err = HWC2_ERROR_NONE;
   4150 
   4151     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   4152 
   4153     ASSERT_NO_FATAL_FAILURE(getColorModes(display, &colorModes, &err));
   4154     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   4155 }
   4156 
   4157 /* TESTCASE: Tests that the HWC2 can set the required color mode on a display. */
   4158 TEST_F(Hwc2Test, SET_COLOR_MODES)
   4159 {
   4160     ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
   4161             [] (Hwc2Test* test, hwc2_display_t display) {
   4162 
   4163                 const android_color_mode_t colorMode = HAL_COLOR_MODE_NATIVE;
   4164 
   4165                 EXPECT_NO_FATAL_FAILURE(test->setColorMode(display, colorMode));
   4166             }
   4167     ));
   4168 }
   4169 
   4170 /* TESTCASE: Tests that the HWC2 cannot set a color mode on a bad display. */
   4171 TEST_F(Hwc2Test, SET_COLOR_MODES_bad_display)
   4172 {
   4173     hwc2_display_t display;
   4174     const android_color_mode_t colorMode = HAL_COLOR_MODE_NATIVE;
   4175     hwc2_error_t err = HWC2_ERROR_NONE;
   4176 
   4177     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   4178 
   4179     ASSERT_NO_FATAL_FAILURE(setColorMode(display, colorMode, &err));
   4180     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   4181 }
   4182 
   4183 /* TESTCASE: Tests that the HWC2 cannot set an invalid color mode. */
   4184 TEST_F(Hwc2Test, SET_COLOR_MODES_bad_parameter)
   4185 {
   4186     ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
   4187             [] (Hwc2Test* test, hwc2_display_t display) {
   4188 
   4189                 const android_color_mode_t colorMode =
   4190                         static_cast<android_color_mode_t>(-1);
   4191                 hwc2_error_t err = HWC2_ERROR_NONE;
   4192 
   4193                 ASSERT_NO_FATAL_FAILURE(test->setColorMode(display, colorMode,
   4194                         &err));
   4195                 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
   4196                         << "returned wrong error code";
   4197             }
   4198     ));
   4199 }
   4200 
   4201 /* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
   4202  * for all valid color modes. */
   4203 TEST_F(Hwc2Test, SET_COLOR_MODES_unsupported)
   4204 {
   4205     ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
   4206             [] (Hwc2Test* test, hwc2_display_t display) {
   4207 
   4208                 for (auto colorMode : androidColorModes) {
   4209                     hwc2_error_t err = HWC2_ERROR_NONE;
   4210 
   4211                     ASSERT_NO_FATAL_FAILURE(test->setColorMode(display,
   4212                             colorMode, &err));
   4213 
   4214                     EXPECT_TRUE(err == HWC2_ERROR_NONE
   4215                             || err == HWC2_ERROR_UNSUPPORTED)
   4216                             << "returned wrong error code";
   4217                 }
   4218             }
   4219     ));
   4220 }
   4221 
   4222 /* TESTCASE: Tests that the HWC2 gets the HDR capabilities for a display and
   4223  * test if they are valid. */
   4224 TEST_F(Hwc2Test, GET_HDR_CAPABILITIES)
   4225 {
   4226     ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
   4227             [] (Hwc2Test* test, hwc2_display_t display) {
   4228 
   4229                 std::vector<android_hdr_t> hdrCapabilities;
   4230                 float maxLuminance, maxAverageLuminance, minLuminance;
   4231 
   4232                 EXPECT_NO_FATAL_FAILURE(test->getHdrCapabilities(display,
   4233                         &hdrCapabilities, &maxLuminance, &maxAverageLuminance,
   4234                         &minLuminance));
   4235 
   4236                 if (hdrCapabilities.empty())
   4237                     return;
   4238 
   4239                 EXPECT_GE(maxLuminance, maxAverageLuminance);
   4240                 EXPECT_GE(maxAverageLuminance, minLuminance);
   4241             }
   4242     ));
   4243 }
   4244 
   4245 /* TESTCASE: Tests that the HWC2 cannot get hdr capabilities from a bad display */
   4246 TEST_F(Hwc2Test, GET_HDR_CAPABILITIES_bad_display)
   4247 {
   4248     hwc2_display_t display;
   4249     std::vector<android_hdr_t> hdrCapabilities;
   4250     float maxLuminance, maxAverageLuminance, minLuminance;
   4251     hwc2_error_t err = HWC2_ERROR_NONE;
   4252 
   4253     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   4254 
   4255     ASSERT_NO_FATAL_FAILURE(getHdrCapabilities(display, &hdrCapabilities,
   4256             &maxLuminance, &maxAverageLuminance, &minLuminance, &err));
   4257     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   4258 }
   4259 
   4260 static const std::array<float, 16> identityMatrix = {{
   4261     1.0,  0.0,  0.0,  0.0,
   4262     0.0,  1.0,  0.0,  0.0,
   4263     0.0,  0.0,  1.0,  0.0,
   4264     0.0,  0.0,  0.0,  1.0,
   4265 }};
   4266 
   4267 /* Values for the color transform matrices were precomputed using the source code
   4268  * in surfaceflinger/Effects/Daltonizer.cpp. */
   4269 
   4270 static const std::array<const std::array<float, 16>, 5> exampleMatrices = {{
   4271     identityMatrix,
   4272     /* Converts RGB color to the XYZ space */
   4273     {{ 0.4124, 0.2126, 0.0193, 0,
   4274        0.3576, 0.7152, 0.1192, 0,
   4275        0.1805, 0.0722, 0.9505, 0,
   4276        0     , 0     , 0     , 1 }},
   4277     /* Protanomaly */
   4278     {{ 0.068493,  0.931506,  0,  0,
   4279        0.068493,  0.931507,  0,  0,
   4280        0.013626, -0.013626,  1,  0,
   4281        0,         0,         0,  1 }},
   4282     /* Deuteranomaly */
   4283     {{ 0.288299, 0.711701,  0,  0,
   4284        0.052709, 0.947291,  0,  0,
   4285       -0.257912, 0.257912,  1,  0,
   4286        0,        0,         0,  1 }},
   4287     /* Tritanomaly */
   4288     {{ 1, -0.805712, 0.805712,  0,
   4289        0,  0.378838, 0.621162,  0,
   4290        0,  0.104823, 0.895177,  0,
   4291        0,  0,        0,         1 }},
   4292 }};
   4293 
   4294 /* TESTCASE: Tests that the HWC2 can set the identity color transform */
   4295 TEST_F(Hwc2Test, SET_COLOR_TRANSFORM)
   4296 {
   4297     ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
   4298             [] (Hwc2Test* test, hwc2_display_t display) {
   4299 
   4300                 EXPECT_NO_FATAL_FAILURE(test->setColorTransform(display,
   4301                         identityMatrix, HAL_COLOR_TRANSFORM_IDENTITY));
   4302             }
   4303     ));
   4304 }
   4305 
   4306 /* TESTCASE: Tests that the HWC2 cannot set the color transform for a bad
   4307  * display. */
   4308 TEST_F(Hwc2Test, SET_COLOR_TRANSFORM_bad_display)
   4309 {
   4310     hwc2_display_t display;
   4311     hwc2_error_t err = HWC2_ERROR_NONE;
   4312 
   4313     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   4314 
   4315     ASSERT_NO_FATAL_FAILURE(setColorTransform(display, identityMatrix,
   4316             HAL_COLOR_TRANSFORM_IDENTITY, &err));
   4317     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   4318 }
   4319 
   4320 /* TESTCASE: Tests that the HWC2 cannot set an invalid color transform. */
   4321 TEST_F(Hwc2Test, SET_COLOR_TRANSFORM_bad_parameter)
   4322 {
   4323     ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
   4324             [] (Hwc2Test* test, hwc2_display_t display) {
   4325 
   4326                 const android_color_transform_t hint =
   4327                         static_cast<android_color_transform_t>(-1);
   4328                 hwc2_error_t err = HWC2_ERROR_NONE;
   4329 
   4330                 ASSERT_NO_FATAL_FAILURE(test->setColorTransform(display,
   4331                         identityMatrix, hint, &err));
   4332                 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
   4333                         << "returned wrong error code";
   4334             }
   4335     ));
   4336 }
   4337 
   4338 /* TESTCASE: Tests that the HWC2 can set an arbitrary color matrix. */
   4339 TEST_F(Hwc2Test, SET_COLOR_TRANSFORM_arbitrary_matrix)
   4340 {
   4341     ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
   4342             [] (Hwc2Test* test, hwc2_display_t display) {
   4343 
   4344                 const android_color_transform_t hint =
   4345                         HAL_COLOR_TRANSFORM_ARBITRARY_MATRIX;
   4346 
   4347                 for (const std::array<float, 16>& matrix : exampleMatrices) {
   4348                     EXPECT_NO_FATAL_FAILURE(test->setColorTransform(display,
   4349                             matrix, hint));
   4350                 }
   4351             }
   4352     ));
   4353 }
   4354 
   4355 /* TESTCASE: Tests that the HWC2 create an destory virtual displays. */
   4356 TEST_F(Hwc2Test, CREATE_DESTROY_VIRTUAL_DISPLAY)
   4357 {
   4358     ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Complete,
   4359             [] (Hwc2Test* /*test*/, hwc2_display_t /*display*/,
   4360                     Hwc2TestVirtualDisplay* /*testVirtualDisplay*/) { }));
   4361 }
   4362 
   4363 /* TESTCASE: Tests that the HWC2 can create and destroy multiple virtual
   4364  * displays. */
   4365 TEST_F(Hwc2Test, CREATE_DESTROY_VIRTUAL_DISPLAY_multiple)
   4366 {
   4367     Hwc2TestVirtualDisplay testVirtualDisplay(Hwc2TestCoverage::Complete);
   4368     std::vector<hwc2_display_t> displays;
   4369 
   4370     do {
   4371         const UnsignedArea& dimension =
   4372                 testVirtualDisplay.getDisplayDimension();
   4373         android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
   4374         hwc2_display_t display;
   4375         hwc2_error_t err = HWC2_ERROR_NONE;
   4376 
   4377         ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(dimension.width,
   4378                 dimension.height, &desiredFormat, &display, &err));
   4379 
   4380         EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_NO_RESOURCES
   4381                 || err == HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
   4382         EXPECT_GE(desiredFormat, 0) << "invalid format";
   4383 
   4384         if (err == HWC2_ERROR_NONE)
   4385             displays.push_back(display);
   4386 
   4387     } while (testVirtualDisplay.advance());
   4388 
   4389     for (hwc2_display_t display : displays) {
   4390         EXPECT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
   4391     }
   4392 }
   4393 
   4394 /* TESTCASE: Tests that the HWC2 cannot destroy a bad virtual displays.  */
   4395 TEST_F(Hwc2Test, DESTROY_VIRTUAL_DISPLAY_bad_display)
   4396 {
   4397     hwc2_display_t display;
   4398     hwc2_error_t err = HWC2_ERROR_NONE;
   4399 
   4400     ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
   4401 
   4402     ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display, &err));
   4403     EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
   4404 }
   4405 
   4406 /* TESTCASE: Tests that the HWC2 cannot destroy a physical display. */
   4407 TEST_F(Hwc2Test, DESTROY_VIRTUAL_DISPLAY_bad_parameter)
   4408 {
   4409     hwc2_display_t display = HWC_DISPLAY_PRIMARY;
   4410     hwc2_error_t err = HWC2_ERROR_NONE;
   4411 
   4412     ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display, &err));
   4413     EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
   4414 }
   4415 
   4416 /* TESTCASE: Tests that the HWC2 can get the max virtual display count. */
   4417 TEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT)
   4418 {
   4419     uint32_t maxCnt;
   4420 
   4421     ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt));
   4422 }
   4423 
   4424 /* TESTCASE: Tests that the HWC2 returns the same max virtual display count for
   4425  * each call. */
   4426 TEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT_duplicate)
   4427 {
   4428     uint32_t maxCnt1, maxCnt2;
   4429 
   4430     ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt1));
   4431     ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt2));
   4432 
   4433     EXPECT_EQ(maxCnt1, maxCnt2) << "returned two different max virtual display"
   4434             " counts";
   4435 }
   4436 
   4437 /* TESTCASE: Tests that the HWC2 can create the max number of virtual displays
   4438  * that it reports. */
   4439 TEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT_create_max)
   4440 {
   4441     std::vector<hwc2_display_t> displays;
   4442     uint32_t maxCnt;
   4443 
   4444     ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt));
   4445 
   4446     while (displays.size() < maxCnt) {
   4447         uint32_t width = 1920, height = 1080;
   4448         android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
   4449         hwc2_display_t display;
   4450         hwc2_error_t err = HWC2_ERROR_NONE;
   4451 
   4452         ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(width, height,
   4453                     &desiredFormat, &display, &err));
   4454 
   4455         EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
   4456                 << "returned wrong error code";
   4457         if (err != HWC2_ERROR_NONE)
   4458             break;
   4459 
   4460         displays.push_back(display);
   4461     }
   4462 
   4463     for (hwc2_display_t display : displays) {
   4464         EXPECT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
   4465     }
   4466 }
   4467 
   4468 /* TESTCASE: Tests that the HWC2 can set an output buffer for a virtual
   4469  * display. */
   4470 TEST_F(Hwc2Test, SET_OUTPUT_BUFFER)
   4471 {
   4472     ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Complete,
   4473             [] (Hwc2Test* test, hwc2_display_t display,
   4474                     Hwc2TestVirtualDisplay* testVirtualDisplay) {
   4475 
   4476                 buffer_handle_t handle;
   4477                 android::base::unique_fd acquireFence;
   4478 
   4479                 if (testVirtualDisplay->getBuffer(&handle, &acquireFence) >= 0)
   4480                     EXPECT_NO_FATAL_FAILURE(test->setOutputBuffer(display,
   4481                             handle, acquireFence));
   4482             }));
   4483 }
   4484 
   4485 /* TESTCASE: Tests that the HWC2 cannot set an output buffer for a bad display */
   4486 TEST_F(Hwc2Test, SET_OUTPUT_BUFFER_bad_display)
   4487 {
   4488     ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Default,
   4489             [] (Hwc2Test* test, hwc2_display_t /*display*/,
   4490                     Hwc2TestVirtualDisplay* testVirtualDisplay) {
   4491 
   4492                 hwc2_display_t badDisplay;
   4493                 buffer_handle_t handle;
   4494                 android::base::unique_fd acquireFence;
   4495                 hwc2_error_t err = HWC2_ERROR_NONE;
   4496 
   4497                 ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
   4498 
   4499                 if (testVirtualDisplay->getBuffer(&handle, &acquireFence) < 0)
   4500                     return;
   4501 
   4502                 ASSERT_NO_FATAL_FAILURE(test->setOutputBuffer(badDisplay,
   4503                         handle, acquireFence, &err));
   4504                 EXPECT_TRUE(err == HWC2_ERROR_BAD_DISPLAY)
   4505                         << "returned wrong error code";
   4506             }));
   4507 }
   4508 
   4509 /* TESTCASE: Tests that the HWC2 cannot set an invalid output buffer. */
   4510 TEST_F(Hwc2Test, SET_OUTPUT_BUFFER_bad_parameter)
   4511 {
   4512     ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Default,
   4513             [] (Hwc2Test* test, hwc2_display_t display,
   4514                     Hwc2TestVirtualDisplay* /*testVirtualDisplay*/) {
   4515 
   4516                 const buffer_handle_t handle = nullptr;
   4517                 uint32_t releaseFence = -1;
   4518                 hwc2_error_t err = HWC2_ERROR_NONE;
   4519 
   4520                 ASSERT_NO_FATAL_FAILURE(test->setOutputBuffer(display, handle,
   4521                         releaseFence, &err));
   4522                 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
   4523                         << "returned wrong error code";
   4524             }));
   4525 }
   4526 
   4527 /* TESTCASE: Tests that the HWC2 cannot set an output buffer for non virtual
   4528  * display */
   4529 TEST_F(Hwc2Test, SET_OUTPUT_BUFFER_unsupported)
   4530 {
   4531     for (auto display : mDisplays) {
   4532         Hwc2TestVirtualDisplay testVirtualDisplay(Hwc2TestCoverage::Complete);
   4533 
   4534         do {
   4535             buffer_handle_t handle;
   4536             android::base::unique_fd acquireFence;
   4537             hwc2_error_t err = HWC2_ERROR_NONE;
   4538 
   4539             if (testVirtualDisplay.getBuffer(&handle, &acquireFence) < 0)
   4540                 continue;
   4541 
   4542             ASSERT_NO_FATAL_FAILURE(setOutputBuffer(display, handle,
   4543                     acquireFence, &err));
   4544             EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
   4545 
   4546         } while (testVirtualDisplay.advance());
   4547     }
   4548 }
   4549 
   4550 /* TESTCASE: Tests that the HWC2 can dump debug information. */
   4551 TEST_F(Hwc2Test, DUMP)
   4552 {
   4553     std::string buffer;
   4554 
   4555     ASSERT_NO_FATAL_FAILURE(dump(&buffer));
   4556 }
   4557