Hwc2Test.cpp revision 93dc04fda8de625d780bcd9b3cef15ad7a4932a8
14d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/*
24d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * Copyright (C) 2016 The Android Open Source Project
34d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *
44d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * Licensed under the Apache License, Version 2.0 (the "License");
54d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * you may not use this file except in compliance with the License.
64d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * You may obtain a copy of the License at
74d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *
84d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *      http://www.apache.org/licenses/LICENSE-2.0
94d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *
104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * Unless required by applicable law or agreed to in writing, software
114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * distributed under the License is distributed on an "AS IS" BASIS,
124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * See the License for the specific language governing permissions and
144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * limitations under the License.
154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall */
164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <array>
18cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall#include <unordered_set>
194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <gtest/gtest.h>
204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <dlfcn.h>
214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <hardware/hardware.h>
224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#define HWC2_INCLUDE_STRINGIFICATION
244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#define HWC2_USE_CPP11
254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <hardware/hwcomposer2.h>
264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#undef HWC2_INCLUDE_STRINGIFICATION
274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#undef HWC2_USE_CPP11
284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
29cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
30cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connected);
31cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
324d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallclass Hwc2Test : public testing::Test {
334d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallpublic:
344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void SetUp()
364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hw_module_t const* hwc2Module;
384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        /* The following method will fail if you have not run
444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall         * "adb shell stop" */
454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        err = hwc2_open(hwc2Module, &mHwc2Device);
464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
48cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
49cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        populateDisplays();
504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void TearDown()
534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (auto itr = mLayers.begin(); itr != mLayers.end();) {
561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_display_t display = itr->first;
571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_layer_t layer = itr->second;
581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            itr++;
591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            /* Destroys and removes the layer from mLayers */
601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            destroyLayer(display, layer);
611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        if (mHwc2Device)
644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            hwc2_close(mHwc2Device);
654d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
664d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
67a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    void registerCallback(hwc2_callback_descriptor_t descriptor,
68a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
69a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_error_t* outErr = nullptr)
70a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    {
71a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
72a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
73a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
74a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
75a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
76a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                callbackData, pointer));
77a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        if (outErr) {
78a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            *outErr = err;
79a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        } else {
80a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
81a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        }
82a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
83a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
84cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
85cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            hwc2_error_t* outErr = nullptr)
86cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
87cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
88cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
89cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
90cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
91cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
92cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                    reinterpret_cast<int32_t*>(outType)));
93cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (outErr) {
94cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            *outErr = err;
95cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        } else {
96cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
97cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
98cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
99cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
100cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* If the populateDisplays function is still receiving displays and the
101cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * display is connected, the display handle is stored in mDisplays. */
102cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void hotplugCallback(hwc2_display_t display, int32_t connected)
103cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
104cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::lock_guard<std::mutex> lock(mHotplugMutex);
105cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
106cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
107cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            return;
108cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
109cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (connected == HWC2_CONNECTION_CONNECTED)
110cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mDisplays.insert(display);
111cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
112cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugCv.notify_all();
113cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
114cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
1161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
1191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_CREATE_LAYER));
1201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
1231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                outLayer));
1241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.insert(std::make_pair(display, *outLayer));
1271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
1321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
1361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
1391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_DESTROY_LAYER));
1401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
1431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.erase(std::make_pair(display, layer));
1461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
1511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                    << layer;
1521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
155cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
156cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue,
157cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
158cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
159cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
160cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
161cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
162cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
163cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
164cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                attribute, outValue));
165cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
166cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
167cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
168cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
169cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
170cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    << getAttributeName(attribute) << " for config " << config;
171cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
172cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
173cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
174cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayConfigs(hwc2_display_t display,
175cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            std::vector<hwc2_config_t>* outConfigs,
176cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
177cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
178cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
179cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
180cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
181cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
182cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        uint32_t numConfigs = 0;
183cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
184cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
185cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &numConfigs, nullptr));
186cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
187cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (err == HWC2_ERROR_NONE) {
188cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            outConfigs->resize(numConfigs);
189cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
190cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
191cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    &numConfigs, outConfigs->data()));
192cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
193cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
194cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
195cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
196cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
197cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
198cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " display " << display;
199cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
200cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
201cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
20293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
20393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
20493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
20593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
20693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
20793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
20893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
20993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
21093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                outConfig));
21193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
21293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
21393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
21493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
21593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " display " << display;
21693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
21793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
21893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
21993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
22093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
22193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
22293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
22393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
22493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
22593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
22693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
22793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
22893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
22993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
23093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
23193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    << config;
23293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
23393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
23493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
2354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallprotected:
2364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
2374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
2384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        return mHwc2Device->getFunction(mHwc2Device, descriptor);
2394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
2404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
2414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
2424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
2434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        uint32_t num = 0;
2444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
2454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
2464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
2474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        outCapabilities->resize(num);
2484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
2494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num,
2504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                reinterpret_cast<int32_t*>(outCapabilities->data()));
2514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
2524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
253cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* Registers a hotplug callback and waits for hotplug callbacks. This
254cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * function will have no effect if called more than once. */
255cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void populateDisplays()
256cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
257cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to receiving */
258cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        {
259cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            std::lock_guard<std::mutex> lock(mHotplugMutex);
260cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
261cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
262cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
263cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
264cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
265cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
266cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Registers the callback. This function call cannot be locked because
267cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * a callback could happen on the same thread */
268cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
269cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
270cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                hwc2TestHotplugCallback)));
271cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
272cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Waits for hotplug events. If a hotplug event has not come within 1
273cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * second, stop waiting. */
274cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::unique_lock<std::mutex> lock(mHotplugMutex);
275cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
276cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
277cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                std::cv_status::timeout) { }
278cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
279cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to done. Future calls will have no effect */
280cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugStatus = Hwc2TestHotplugStatus::Done;
281cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
282cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
283cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getBadDisplay(hwc2_display_t* outDisplay)
284cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
285cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
286cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mDisplays.count(display) == 0) {
287cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                *outDisplay = display;
288cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
289cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            }
290cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
291cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
292cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " are registered. This should never happen.";
293cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
294cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
2951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* NOTE: will create min(newlayerCnt, max supported layers) layers */
2961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayers(hwc2_display_t display,
2971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
2981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
2991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> newLayers;
3001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
3011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
3021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
3031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (size_t i = 0; i < newLayerCnt; i++) {
3041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
3051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
3061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err == HWC2_ERROR_NO_RESOURCES)
3071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                break;
3081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err != HWC2_ERROR_NONE) {
3091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                newLayers.clear();
3101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
3111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            }
3121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            newLayers.push_back(layer);
3131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
3141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
3151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        *outLayers = std::move(newLayers);
3161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
3171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
3181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayers(hwc2_display_t display,
3191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>&& layers)
3201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
3211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (hwc2_layer_t layer : layers) {
3221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
3231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
3241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
3251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
326cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
327cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
328cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
329cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
330cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
331cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
332cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t CONFIG_MAX = UINT32_MAX;
333cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
334cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
335cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " (2^32 values) has been taken which shouldn't happen";
336cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
337cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
338cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (config = 0; config < CONFIG_MAX; config++) {
339cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            if (std::count(configs.begin(), configs.end(), config) == 0)
340cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                break;
341cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
342cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
343cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        *outConfig = config;
344cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
345cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
3464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_device_t* mHwc2Device = nullptr;
347cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
348cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    enum class Hwc2TestHotplugStatus {
349cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Init = 1,
350cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Receiving,
351cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Done,
352cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    };
353cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
354cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::mutex mHotplugMutex;
355cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::condition_variable mHotplugCv;
356cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
357cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::unordered_set<hwc2_display_t> mDisplays;
3581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
3591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* Store all created layers that have not been destroyed. If an ASSERT_*
3601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall     * fails, then destroy the layers on exit */
3611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
3624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall};
3634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
364cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
365cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connection)
366cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
367cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    if (callbackData)
368cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
369cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                connection);
370cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
371cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
3724d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
3734d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallstatic const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
3744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
3754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_LAYER,
3764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
3774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_LAYER,
3784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
3794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DUMP,
3804d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_ACTIVE_CONFIG,
3814d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
3824d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
3834d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_COLOR_MODES,
3844d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
3854d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
3864d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_NAME,
3874d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
3884d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_TYPE,
3894d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DOZE_SUPPORT,
3904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_HDR_CAPABILITIES,
3914d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
3924d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_RELEASE_FENCES,
3934d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_PRESENT_DISPLAY,
3944d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_REGISTER_CALLBACK,
3954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_ACTIVE_CONFIG,
3964d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CLIENT_TARGET,
3974d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_MODE,
3984d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_TRANSFORM,
3994d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CURSOR_POSITION,
4004d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
4014d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BUFFER,
4024d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COLOR,
4034d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
4044d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DATASPACE,
4054d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
4064d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
4074d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
4084d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
4094d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_TRANSFORM,
4104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
4114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_Z_ORDER,
4124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_OUTPUT_BUFFER,
4134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_POWER_MODE,
4144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_VSYNC_ENABLED,
4154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_VALIDATE_DISPLAY,
4164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}};
4174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
4184d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 supports all required functions. */
4194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION)
4204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
4214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
4224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hwc2_function_pointer_t pfn = getFunction(descriptor);
4234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        EXPECT_TRUE(pfn) << "failed to get function "
4244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << getFunctionDescriptorName(descriptor);
4254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
4264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
4274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
4284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
4294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
4304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
4314d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
4324d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_FALSE(pfn) << "failed to get invalid function";
4334d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
4344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
4354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
4364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_CAPABILITIES)
4374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
4384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    std::vector<hwc2_capability_t> capabilities;
4394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
4404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    getCapabilities(&capabilities);
4414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
4424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
4434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            HWC2_CAPABILITY_INVALID), 0);
4444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
445a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
446a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wallstatic const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
447a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_HOTPLUG,
448a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_REFRESH,
449a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_VSYNC,
450a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}};
451a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
452a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can successfully register all required
453a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall * callback functions. */
454a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK)
455a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
456a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
457a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
458a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
459a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
460a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
461a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
462a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
463a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
464a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
465a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
466a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
467a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
468a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
469a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
470a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
471a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
472a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
473a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            []() { return; }, &err));
474a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
475a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
476a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
477a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
478a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
479a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
480a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = nullptr;
481a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
482a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
483a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
484a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
485a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
486a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
487cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
488cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns the correct display type for each
489cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * physical display. */
490cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE)
491cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
492cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    for (auto display : mDisplays) {
493cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_type_t type;
494cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
495cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
496cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
497cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " correct display type";
498cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
499cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
500cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
501cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
502cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is requested. */
503cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
504cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
505cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_t display;
506cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_type_t type;
507cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
508cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
509cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
510cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
511cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
512cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
513cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
5141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
5161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
5171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
5181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
5191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
5201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
5221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
5241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
5251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
5261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
5281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_bad_display)
5291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
5301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t display;
5311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_layer_t layer;
5321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
5331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
5351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
5371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
5381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
5391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 will either support a large number of resources
5411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * or will return no resources. */
5421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_no_resources)
5431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
5441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    const size_t layerCnt = 1000;
5451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
5471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> layers;
5481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
5501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
5521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
5531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
5541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
5561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
5571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
5581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t badDisplay;
5591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
5611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
5631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer = 0;
5641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
5651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
5671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
5681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
5701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
5721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
5731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
5751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
5761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
5771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
5791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
5801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
5811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
5821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
5831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
5841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
5861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
5871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
5891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
5901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
5921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
5931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
5951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
5961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
5981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
5991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
6011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
6031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
6041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
6061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
6081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
6091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
6101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
611cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
612cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
613cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_WIDTH,
614cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_HEIGHT,
615cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
616cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
617cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
618cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_VSYNC_PERIOD,
619cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_X,
620cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_Y,
621cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
622cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
623cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
624cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * config. */
625cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
626cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
627cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
628cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
629cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
630cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
631cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
632cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
633cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
634cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
635cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : requiredAttributes) {
636cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
637cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
638cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                EXPECT_GE(value, 0) << "missing required attribute "
639cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << getAttributeName(attribute) << " for config "
640cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << config;
641cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
642cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : optionalAttributes) {
643cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
644cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
645cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
646cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
647cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
648cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
649cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
650cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
651cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * attribute */
652cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
653cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
654cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
655cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
656cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
657cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
658cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
659cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
660cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
661cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
662cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
663cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t err = HWC2_ERROR_NONE;
664cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
665cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
666cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
667cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
668cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " attribute for config " << config;
669cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
670cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
671cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
672cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
673cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
674cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
675cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
676cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
677cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_config_t config = 0;
678cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    int32_t value;
679cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
680cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
681cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
682cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
683cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : requiredAttributes) {
684cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
685cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
686cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
687cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
688cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
689cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : optionalAttributes) {
690cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
691cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
692cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
693cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
694cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
695cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
696cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
697cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
698cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
699cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
700cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
701cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        int32_t value;
702cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
703cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
704cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
705cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
706cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : requiredAttributes) {
707cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
708cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
709cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
710cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
711cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
712cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : optionalAttributes) {
713cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
714cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
715cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
716cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
717cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
718cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
719cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
720cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
721cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
722cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
723cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
724cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
725cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
726cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
727cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
728cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
729cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
730cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
731cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
732cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
733cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
734cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    std::vector<hwc2_config_t> configs;
735cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
736cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
737cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
738cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
739cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
740cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
741cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
742cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
743cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
744cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
745cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return the same config list multiple
746cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * times in a row. */
747cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
748cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
749cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
750cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs1, configs2;
751cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
752cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
753cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
754cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
755cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
756cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs2.begin())) << "returned two different config sets";
757cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
758cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
759cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
760cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
761cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
762cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
763cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
764cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
765cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
766cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
767cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
768cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
769cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs.end());
770cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
771cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " configs";
772cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
773cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
77493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
77593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 returns the active config for a display */
77693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
77793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
77893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
77993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
78093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
78193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
78293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
78393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
78493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_config_t activeConfig;
78593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
78693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
78793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
78893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
78993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(activeConfig, config) << "failed to get active config";
79093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
79193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
79293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
79393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
79493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
79593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * display. */
79693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
79793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
79893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
79993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_config_t activeConfig;
80093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
80193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
80293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
80393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
80493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
80593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
80693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
80793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
80893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
80993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 either begins with a valid active config
81093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * or returns an error when getActiveConfig is called. */
81193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
81293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
81393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
81493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
81593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t activeConfig;
81693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
81793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
81893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
81993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
82093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (configs.empty())
82193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            return;
82293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
82393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
82493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (err == HWC2_ERROR_NONE) {
82593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NE(std::count(configs.begin(), configs.end(),
82693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    activeConfig), 0) << "active config is not found in "
82793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " configs for display";
82893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
82993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
83093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
83193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
83293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
83393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
83493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 can set every display config as an active
83593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * config */
83693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
83793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
83893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
83993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
84093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
84193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
84293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
84393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
84493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
84593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
84693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
84793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
84893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
84993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
85093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
85193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
85293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
85393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    const hwc2_config_t config = 0;
85493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
85593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
85693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
85793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
85893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
85993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
86093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
86193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
86293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
86393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
86493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
86593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
86693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t config;
86793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
86893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
86993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
87093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
87193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
87293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
87393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
87493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
875