Hwc2Test.cpp revision 572a1eedae1d15a8544c95f0284e5b1216a187d2
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);
31572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
32572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp);
33cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallclass Hwc2Test : public testing::Test {
354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallpublic:
364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void SetUp()
384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hw_module_t const* hwc2Module;
404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        /* The following method will fail if you have not run
464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall         * "adb shell stop" */
474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        err = hwc2_open(hwc2Module, &mHwc2Device);
484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
50cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
51cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        populateDisplays();
524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void TearDown()
554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (auto itr = mLayers.begin(); itr != mLayers.end();) {
581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_display_t display = itr->first;
591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_layer_t layer = itr->second;
601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            itr++;
611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            /* Destroys and removes the layer from mLayers */
621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            destroyLayer(display, layer);
631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
6603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_display_t display = *itr;
6703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            itr++;
6803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            /* Sets power mode to off and removes the display from
6903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall             * mActiveDisplays */
7003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            setPowerMode(display, HWC2_POWER_MODE_OFF);
7103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
7203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
734d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        if (mHwc2Device)
744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            hwc2_close(mHwc2Device);
754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
77a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    void registerCallback(hwc2_callback_descriptor_t descriptor,
78a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
79a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_error_t* outErr = nullptr)
80a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    {
81a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
82a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
83a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
84a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
85a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
86a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                callbackData, pointer));
87a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        if (outErr) {
88a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            *outErr = err;
89a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        } else {
90a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
91a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        }
92a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
93a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
94cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
95cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            hwc2_error_t* outErr = nullptr)
96cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
97cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
98cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
99cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
100cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
101cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
102cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                    reinterpret_cast<int32_t*>(outType)));
103cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (outErr) {
104cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            *outErr = err;
105cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        } else {
106cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
107cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
108cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
109cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
110cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* If the populateDisplays function is still receiving displays and the
111cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * display is connected, the display handle is stored in mDisplays. */
112cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void hotplugCallback(hwc2_display_t display, int32_t connected)
113cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
114cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::lock_guard<std::mutex> lock(mHotplugMutex);
115cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
116cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
117cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            return;
118cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
119cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (connected == HWC2_CONNECTION_CONNECTED)
120cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mDisplays.insert(display);
121cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
122cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugCv.notify_all();
123cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
124cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
1261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
1291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_CREATE_LAYER));
1301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
1331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                outLayer));
1341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.insert(std::make_pair(display, *outLayer));
1371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
1421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
1461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
1491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_DESTROY_LAYER));
1501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
1531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.erase(std::make_pair(display, layer));
1561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
1611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                    << layer;
1621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
165cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
166cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue,
167cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
168cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
169cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
170cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
171cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
172cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
173cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
174cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                attribute, outValue));
175cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
176cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
177cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
178cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
179cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
180cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    << getAttributeName(attribute) << " for config " << config;
181cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
182cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
183cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
184cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayConfigs(hwc2_display_t display,
185cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            std::vector<hwc2_config_t>* outConfigs,
186cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
187cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
188cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
189cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
190cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
191cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
192cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        uint32_t numConfigs = 0;
193cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
194cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
195cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &numConfigs, nullptr));
196cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
197cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (err == HWC2_ERROR_NONE) {
198cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            outConfigs->resize(numConfigs);
199cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
200cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
201cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    &numConfigs, outConfigs->data()));
202cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
203cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
204cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
205cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
206cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
207cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
208cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " display " << display;
209cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
210cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
211cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
21293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
21393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
21493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
21593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
21693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
21793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
21893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
21993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
22093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                outConfig));
22193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
22293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
22393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
22493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
22593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " display " << display;
22693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
22793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
22893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
22993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
23093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
23193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
23293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
23393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
23493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
23593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
23693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
23793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
23893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
23993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
24093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
24193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    << config;
24293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
24393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
24493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
24503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
24603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_error_t* outErr = nullptr)
24703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    {
24803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
24903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
25003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
25103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
25203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
25303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                outSupport));
25403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (outErr) {
25503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            *outErr = err;
25603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
25703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
25803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                    " display " << display;
25903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
26003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
26103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
26203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
26303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_error_t* outErr = nullptr)
26403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    {
26503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
26603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                getFunction(HWC2_FUNCTION_SET_POWER_MODE));
26703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
26803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
26903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
27003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                mode));
27103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (outErr) {
27203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            *outErr = err;
27303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            if (err != HWC2_ERROR_NONE)
27403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                return;
27503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
27603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
27703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                    << getPowerModeName(mode) << " on display " << display;
27803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
27903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
28003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (mode == HWC2_POWER_MODE_OFF) {
28103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            mActiveDisplays.erase(display);
28203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
28303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            mActiveDisplays.insert(display);
28403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
28503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
28603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
287572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
288572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            hwc2_error_t* outErr = nullptr)
289572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
290572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
291572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
292572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
293572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
294572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
295572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                enabled));
296572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outErr) {
297572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outErr = err;
298572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        } else {
299572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
300572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                    << getVsyncName(enabled);
301572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        }
302572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
303572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
304572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void vsyncCallback(hwc2_display_t display, int64_t timestamp)
305572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
306572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        std::lock_guard<std::mutex> lock(mVsyncMutex);
307572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncDisplay = display;
308572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncTimestamp = timestamp;
309572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncCv.notify_all();
310572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
311572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
3124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallprotected:
3134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
3144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
3154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        return mHwc2Device->getFunction(mHwc2Device, descriptor);
3164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
3174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
3184d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
3194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
3204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        uint32_t num = 0;
3214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
3224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
3234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
3244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        outCapabilities->resize(num);
3254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
3264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num,
3274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                reinterpret_cast<int32_t*>(outCapabilities->data()));
3284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
3294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
330cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* Registers a hotplug callback and waits for hotplug callbacks. This
331cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * function will have no effect if called more than once. */
332cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void populateDisplays()
333cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
334cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to receiving */
335cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        {
336cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            std::lock_guard<std::mutex> lock(mHotplugMutex);
337cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
338cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
339cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
340cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
341cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
342cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
343cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Registers the callback. This function call cannot be locked because
344cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * a callback could happen on the same thread */
345cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
346cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
347cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                hwc2TestHotplugCallback)));
348cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
349cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Waits for hotplug events. If a hotplug event has not come within 1
350cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * second, stop waiting. */
351cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::unique_lock<std::mutex> lock(mHotplugMutex);
352cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
353cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
354cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                std::cv_status::timeout) { }
355cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
356cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to done. Future calls will have no effect */
357cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugStatus = Hwc2TestHotplugStatus::Done;
358cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
359cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
360cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getBadDisplay(hwc2_display_t* outDisplay)
361cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
362cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
363cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mDisplays.count(display) == 0) {
364cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                *outDisplay = display;
365cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
366cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            }
367cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
368cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
369cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " are registered. This should never happen.";
370cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
371cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
3721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* NOTE: will create min(newlayerCnt, max supported layers) layers */
3731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayers(hwc2_display_t display,
3741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
3751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
3761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> newLayers;
3771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
3781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
3791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
3801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (size_t i = 0; i < newLayerCnt; i++) {
3811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
3821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
3831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err == HWC2_ERROR_NO_RESOURCES)
3841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                break;
3851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err != HWC2_ERROR_NONE) {
3861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                newLayers.clear();
3871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
3881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            }
3891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            newLayers.push_back(layer);
3901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
3911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
3921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        *outLayers = std::move(newLayers);
3931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
3941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
3951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayers(hwc2_display_t display,
3961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>&& layers)
3971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
3981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (hwc2_layer_t layer : layers) {
3991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
4001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
4011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
4021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
403cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
404cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
405cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
406cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
407cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
408cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
409cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t CONFIG_MAX = UINT32_MAX;
410cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
411cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
412cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " (2^32 values) has been taken which shouldn't happen";
413cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
414cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
415cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (config = 0; config < CONFIG_MAX; config++) {
416cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            if (std::count(configs.begin(), configs.end(), config) == 0)
417cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                break;
418cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
419cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
420cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        *outConfig = config;
421cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
422cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
423572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void enableVsync(hwc2_display_t display)
424572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
425572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
426572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
427572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                hwc2TestVsyncCallback)));
428572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
429572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
430572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
431572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void disableVsync(hwc2_display_t display)
432572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
433572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
434572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
435572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
436572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void waitForVsync(hwc2_display_t* outDisplay = nullptr,
437572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            int64_t* outTimestamp = nullptr)
438572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
439572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        std::unique_lock<std::mutex> lock(mVsyncMutex);
440572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
441572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                std::cv_status::no_timeout) << "timed out attempting to get"
442572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                " vsync callback";
443572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outDisplay)
444572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outDisplay = mVsyncDisplay;
445572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outTimestamp)
446572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outTimestamp = mVsyncTimestamp;
447572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
448572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
4494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_device_t* mHwc2Device = nullptr;
450cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
451cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    enum class Hwc2TestHotplugStatus {
452cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Init = 1,
453cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Receiving,
454cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Done,
455cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    };
456cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
457cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::mutex mHotplugMutex;
458cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::condition_variable mHotplugCv;
459cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
460cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::unordered_set<hwc2_display_t> mDisplays;
4611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
4621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* Store all created layers that have not been destroyed. If an ASSERT_*
4631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall     * fails, then destroy the layers on exit */
4641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
46503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
46603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
46703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall     * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
46803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    std::set<hwc2_display_t> mActiveDisplays;
469572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
470572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::mutex mVsyncMutex;
471572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::condition_variable mVsyncCv;
472572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t mVsyncDisplay;
473572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    int64_t mVsyncTimestamp = -1;
4744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall};
4754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
476cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
477cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connection)
478cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
479cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    if (callbackData)
480cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
481cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                connection);
482cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
483cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
484572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
485572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp)
486572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
487572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    if (callbackData)
488572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
489572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                timestamp);
490572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
491572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
4924d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
4934d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallstatic const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
4944d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
4954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_LAYER,
4964d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
4974d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_LAYER,
4984d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
4994d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DUMP,
5004d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_ACTIVE_CONFIG,
5014d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
5024d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
5034d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_COLOR_MODES,
5044d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
5054d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
5064d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_NAME,
5074d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
5084d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_TYPE,
5094d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DOZE_SUPPORT,
5104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_HDR_CAPABILITIES,
5114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
5124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_RELEASE_FENCES,
5134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_PRESENT_DISPLAY,
5144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_REGISTER_CALLBACK,
5154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_ACTIVE_CONFIG,
5164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CLIENT_TARGET,
5174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_MODE,
5184d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_TRANSFORM,
5194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CURSOR_POSITION,
5204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
5214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BUFFER,
5224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COLOR,
5234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
5244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DATASPACE,
5254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
5264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
5274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
5284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
5294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_TRANSFORM,
5304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
5314d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_Z_ORDER,
5324d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_OUTPUT_BUFFER,
5334d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_POWER_MODE,
5344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_VSYNC_ENABLED,
5354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_VALIDATE_DISPLAY,
5364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}};
5374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 supports all required functions. */
5394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION)
5404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
5414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
5424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hwc2_function_pointer_t pfn = getFunction(descriptor);
5434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        EXPECT_TRUE(pfn) << "failed to get function "
5444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << getFunctionDescriptorName(descriptor);
5454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
5464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
5474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
5494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
5504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
5514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
5524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_FALSE(pfn) << "failed to get invalid function";
5534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
5544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
5564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_CAPABILITIES)
5574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
5584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    std::vector<hwc2_capability_t> capabilities;
5594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    getCapabilities(&capabilities);
5614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
5634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            HWC2_CAPABILITY_INVALID), 0);
5644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
565a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
566a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wallstatic const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
567a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_HOTPLUG,
568a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_REFRESH,
569a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_VSYNC,
570a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}};
571a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
572a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can successfully register all required
573a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall * callback functions. */
574a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK)
575a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
576a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
577a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
578a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
579a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
580a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
581a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
582a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
583a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
584a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
585a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
586a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
587a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
588a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
589a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
590a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
591a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
592a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
593a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            []() { return; }, &err));
594a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
595a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
596a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
597a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
598a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
599a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
600a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = nullptr;
601a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
602a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
603a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
604a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
605a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
606a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
607cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
608cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns the correct display type for each
609cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * physical display. */
610cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE)
611cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
612cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    for (auto display : mDisplays) {
613cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_type_t type;
614cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
615cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
616cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
617cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " correct display type";
618cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
619cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
620cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
621cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
622cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is requested. */
623cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
624cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
625cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_t display;
626cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_type_t type;
627cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
628cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
629cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
630cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
631cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
632cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
633cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
6341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
6361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
6371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
6381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
6391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
6401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
6421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
6441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
6451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
6461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
6481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_bad_display)
6491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
6501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t display;
6511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_layer_t layer;
6521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
6531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
6551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
6571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
6581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
6591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 will either support a large number of resources
6611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * or will return no resources. */
6621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_no_resources)
6631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
6641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    const size_t layerCnt = 1000;
6651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
6671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> layers;
6681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
6701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
6721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
6731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
6741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
6761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
6771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
6781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t badDisplay;
6791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
6811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
6831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer = 0;
6841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
6851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
6871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
6881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
6901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
6921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
6931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
6951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
6961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
6971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
6991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
7001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
7011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
7021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
7031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
7041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
7051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
7061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
7071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
7081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
7091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
7101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
7111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
7121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
7131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
7141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
7151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
7161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
7171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
7181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
7191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
7201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
7211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
7221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
7231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
7241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
7251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
7261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
7271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
7281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
7291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
7301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
731cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
732cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
733cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_WIDTH,
734cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_HEIGHT,
735cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
736cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
737cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
738cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_VSYNC_PERIOD,
739cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_X,
740cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_Y,
741cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
742cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
743cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
744cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * config. */
745cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
746cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
747cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
748cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
749cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
750cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
751cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
752cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
753cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
754cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
755cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : requiredAttributes) {
756cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
757cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
758cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                EXPECT_GE(value, 0) << "missing required attribute "
759cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << getAttributeName(attribute) << " for config "
760cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << config;
761cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
762cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : optionalAttributes) {
763cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
764cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
765cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
766cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
767cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
768cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
769cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
770cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
771cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * attribute */
772cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
773cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
774cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
775cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
776cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
777cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
778cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
779cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
780cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
781cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
782cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
783cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t err = HWC2_ERROR_NONE;
784cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
785cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
786cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
787cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
788cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " attribute for config " << config;
789cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
790cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
791cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
792cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
793cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
794cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
795cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
796cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
797cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_config_t config = 0;
798cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    int32_t value;
799cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
800cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
801cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
802cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
803cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : requiredAttributes) {
804cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
805cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
806cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
807cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
808cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
809cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : optionalAttributes) {
810cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
811cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
812cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
813cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
814cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
815cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
816cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
817cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
818cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
819cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
820cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
821cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        int32_t value;
822cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
823cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
824cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
825cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
826cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : requiredAttributes) {
827cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
828cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
829cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
830cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
831cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
832cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : optionalAttributes) {
833cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
834cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
835cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
836cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
837cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
838cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
839cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
840cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
841cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
842cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
843cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
844cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
845cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
846cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
847cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
848cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
849cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
850cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
851cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
852cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
853cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
854cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    std::vector<hwc2_config_t> configs;
855cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
856cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
857cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
858cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
859cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
860cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
861cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
862cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
863cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
864cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
865cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return the same config list multiple
866cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * times in a row. */
867cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
868cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
869cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
870cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs1, configs2;
871cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
872cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
873cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
874cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
875cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
876cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs2.begin())) << "returned two different config sets";
877cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
878cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
879cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
880cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
881cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
882cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
883cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
884cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
885cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
886cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
887cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
888cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
889cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs.end());
890cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
891cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " configs";
892cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
893cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
89493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
89593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 returns the active config for a display */
89693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
89793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
89893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
89993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
90093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
90193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
90293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
90393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
90493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_config_t activeConfig;
90593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
90693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
90793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
90893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
90993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(activeConfig, config) << "failed to get active config";
91093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
91193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
91293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
91393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
91493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
91593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * display. */
91693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
91793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
91893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
91993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_config_t activeConfig;
92093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
92193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
92293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
92393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
92493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
92593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
92693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
92793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
92893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
92993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 either begins with a valid active config
93093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * or returns an error when getActiveConfig is called. */
93193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
93293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
93393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
93493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
93593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t activeConfig;
93693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
93793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
93893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
93993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
94093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (configs.empty())
94193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            return;
94293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
94393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
94493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (err == HWC2_ERROR_NONE) {
94593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NE(std::count(configs.begin(), configs.end(),
94693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    activeConfig), 0) << "active config is not found in "
94793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " configs for display";
94893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
94993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
95093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
95193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
95293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
95393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
95493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 can set every display config as an active
95593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * config */
95693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
95793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
95893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
95993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
96093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
96193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
96293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
96393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
96493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
96593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
96693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
96793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
96893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
96993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
97093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
97193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
97293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
97393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    const hwc2_config_t config = 0;
97493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
97593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
97693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
97793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
97893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
97993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
98093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
98193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
98293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
98393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
98493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
98593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
98693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t config;
98793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
98893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
98993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
99093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
99193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
99293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
99393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
99493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
99503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
99603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
99703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT)
99803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
99903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
100003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
100103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
100203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
100303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
100403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
100503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
100603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
100703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
100803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
100903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
101003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
101103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
101203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
101303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
101403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
101503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
101603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
101703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
101803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
101903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
102003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
102103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
102203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set all supported power modes */
102303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE)
102403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
102503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
102603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
102703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
102803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
102903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
103003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
103103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
103203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
103303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
103403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
103503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
103603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
103703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
103803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
103903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
104003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
104103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
104203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
104303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
104403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
104503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
104603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
104703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
104803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
104903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
105003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
105103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
105203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
105303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
105403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
105503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
105603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
105703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
105803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    if (support != 1)
105903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        return;
106003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
106103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
106203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
106303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
106403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
106503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            &err));
106603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
106703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
106803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
106903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
107003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
107103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
107203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
107303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
107403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND + 1);
107503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
107603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
107703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
107803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
107903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                << mode;
108003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
108103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
108203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
108303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
108403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall * an optional power mode. */
108503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
108603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
108703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
108803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
108903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
109003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
109103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
109203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support == 1)
109303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
109403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
109503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_EQ(support, 0) << "invalid doze support value";
109603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
109703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
109803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                &err));
109903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
110003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
110103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
110203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND, &err));
110303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) <<  "returned wrong error code";
110403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
110503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
110603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
110703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
110803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_stress)
110903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
111003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
111103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
111203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
111303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
111403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
111503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
111603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
111703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
111803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
111903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
112003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
112103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
112203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
112303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
112403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
112503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
112603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
112703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
112803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
112903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
113003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
113103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
113203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
113303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
113403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
113503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
1136572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1137572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
1138572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * displays */
1139572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED)
1140572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1141572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1142572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1143572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1144572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1145572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1146572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1147572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1148572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1149572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1150572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1151572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1152572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1153572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1154572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1155572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1156572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1157572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1158572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
1159572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
1160572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1161572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1162572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t receivedDisplay;
1163572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        int64_t receivedTimestamp;
1164572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1165572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1166572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1167572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1168572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1169572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
1170572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &receivedTimestamp));
1171572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1172572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
1173572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
1174572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1175572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1176572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1177572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1178572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1179572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1180572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1181572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
1182572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
1183572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1184572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t display;
1185572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1186572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            const_cast<char*>("data"));
1187572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1188572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1189572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1190572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1191572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1192572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            []() { return; }));
1193572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1194572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
1195572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1196572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1197572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
1198572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1199572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1200572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1201572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
1202572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
1203572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1204572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1205572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1206572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1207572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
1208572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1209572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1210572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1211572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1212572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1213572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1214572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
1215572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &err));
1216572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1217572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1218572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1219572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1220572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1221572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1222572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
1223572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * times. */
1224572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
1225572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1226572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1227572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1228572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1229572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1230572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1231572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1232572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1233572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1234572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1235572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1236572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1237572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1238572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1239572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1240572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1241572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1242572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1243572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1244572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1245572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1246572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1247572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
1248572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is off and no callback is registered. */
1249572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
1250572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1251572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
1252572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1253572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1254572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1255572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1256572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
1257572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1258572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1259572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1260572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1261572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1262572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
1263572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is registered. */
1264572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
1265572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1266572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
1267572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1268572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1269572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1270572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1271572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1272572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1273572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
1274572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1275572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1276572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1277572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1278572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1279572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1280