Hwc2Test.cpp revision cf935cbfa66ec65a71485e91e63a5929dc2922a1
14d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/*
24d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * Copyright (C) 2016 The Android Open Source Project
34d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *
44d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * Licensed under the Apache License, Version 2.0 (the "License");
54d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * you may not use this file except in compliance with the License.
64d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * You may obtain a copy of the License at
74d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *
84d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *      http://www.apache.org/licenses/LICENSE-2.0
94d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *
104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * Unless required by applicable law or agreed to in writing, software
114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * distributed under the License is distributed on an "AS IS" BASIS,
124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * See the License for the specific language governing permissions and
144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * limitations under the License.
154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall */
164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <array>
18cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall#include <unordered_set>
194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <gtest/gtest.h>
204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <dlfcn.h>
214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <hardware/hardware.h>
224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#define HWC2_INCLUDE_STRINGIFICATION
244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#define HWC2_USE_CPP11
254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <hardware/hwcomposer2.h>
264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#undef HWC2_INCLUDE_STRINGIFICATION
274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#undef HWC2_USE_CPP11
284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
29cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
30cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connected);
31cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
324d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallclass Hwc2Test : public testing::Test {
334d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallpublic:
344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void SetUp()
364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hw_module_t const* hwc2Module;
384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        /* The following method will fail if you have not run
444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall         * "adb shell stop" */
454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        err = hwc2_open(hwc2Module, &mHwc2Device);
464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
48cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
49cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        populateDisplays();
504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void TearDown()
534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (auto itr = mLayers.begin(); itr != mLayers.end();) {
561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_display_t display = itr->first;
571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_layer_t layer = itr->second;
581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            itr++;
591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            /* Destroys and removes the layer from mLayers */
601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            destroyLayer(display, layer);
611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        if (mHwc2Device)
644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            hwc2_close(mHwc2Device);
654d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
664d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
67a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    void registerCallback(hwc2_callback_descriptor_t descriptor,
68a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
69a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_error_t* outErr = nullptr)
70a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    {
71a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
72a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
73a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
74a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
75a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
76a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                callbackData, pointer));
77a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        if (outErr) {
78a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            *outErr = err;
79a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        } else {
80a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
81a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        }
82a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
83a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
84cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
85cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            hwc2_error_t* outErr = nullptr)
86cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
87cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
88cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
89cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
90cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
91cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
92cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                    reinterpret_cast<int32_t*>(outType)));
93cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (outErr) {
94cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            *outErr = err;
95cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        } else {
96cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
97cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
98cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
99cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
100cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* If the populateDisplays function is still receiving displays and the
101cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * display is connected, the display handle is stored in mDisplays. */
102cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void hotplugCallback(hwc2_display_t display, int32_t connected)
103cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
104cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::lock_guard<std::mutex> lock(mHotplugMutex);
105cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
106cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
107cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            return;
108cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
109cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (connected == HWC2_CONNECTION_CONNECTED)
110cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mDisplays.insert(display);
111cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
112cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugCv.notify_all();
113cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
114cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
1161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
1191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_CREATE_LAYER));
1201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
1231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                outLayer));
1241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.insert(std::make_pair(display, *outLayer));
1271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
1321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
1361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
1391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_DESTROY_LAYER));
1401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
1431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.erase(std::make_pair(display, layer));
1461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
1511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                    << layer;
1521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
155cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
156cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue,
157cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
158cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
159cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
160cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
161cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
162cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
163cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
164cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                attribute, outValue));
165cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
166cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
167cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
168cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
169cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
170cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    << getAttributeName(attribute) << " for config " << config;
171cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
172cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
173cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
174cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayConfigs(hwc2_display_t display,
175cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            std::vector<hwc2_config_t>* outConfigs,
176cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
177cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
178cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
179cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
180cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
181cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
182cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        uint32_t numConfigs = 0;
183cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
184cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
185cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &numConfigs, nullptr));
186cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
187cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (err == HWC2_ERROR_NONE) {
188cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            outConfigs->resize(numConfigs);
189cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
190cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
191cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    &numConfigs, outConfigs->data()));
192cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
193cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
194cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
195cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
196cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
197cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
198cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " display " << display;
199cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
200cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
201cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2024d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallprotected:
2034d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
2044d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
2054d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        return mHwc2Device->getFunction(mHwc2Device, descriptor);
2064d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
2074d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
2084d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
2094d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
2104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        uint32_t num = 0;
2114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
2124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
2134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
2144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        outCapabilities->resize(num);
2154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
2164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num,
2174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                reinterpret_cast<int32_t*>(outCapabilities->data()));
2184d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
2194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
220cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* Registers a hotplug callback and waits for hotplug callbacks. This
221cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * function will have no effect if called more than once. */
222cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void populateDisplays()
223cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
224cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to receiving */
225cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        {
226cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            std::lock_guard<std::mutex> lock(mHotplugMutex);
227cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
228cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
229cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
230cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
231cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
232cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
233cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Registers the callback. This function call cannot be locked because
234cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * a callback could happen on the same thread */
235cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
236cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
237cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                hwc2TestHotplugCallback)));
238cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
239cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Waits for hotplug events. If a hotplug event has not come within 1
240cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * second, stop waiting. */
241cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::unique_lock<std::mutex> lock(mHotplugMutex);
242cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
243cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
244cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                std::cv_status::timeout) { }
245cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
246cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to done. Future calls will have no effect */
247cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugStatus = Hwc2TestHotplugStatus::Done;
248cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
249cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
250cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getBadDisplay(hwc2_display_t* outDisplay)
251cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
252cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
253cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mDisplays.count(display) == 0) {
254cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                *outDisplay = display;
255cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
256cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            }
257cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
258cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
259cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " are registered. This should never happen.";
260cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
261cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
2621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* NOTE: will create min(newlayerCnt, max supported layers) layers */
2631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayers(hwc2_display_t display,
2641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
2651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
2661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> newLayers;
2671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
2681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
2691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
2701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (size_t i = 0; i < newLayerCnt; i++) {
2711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
2721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
2731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err == HWC2_ERROR_NO_RESOURCES)
2741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                break;
2751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err != HWC2_ERROR_NONE) {
2761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                newLayers.clear();
2771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
2781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            }
2791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            newLayers.push_back(layer);
2801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
2811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
2821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        *outLayers = std::move(newLayers);
2831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
2841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
2851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayers(hwc2_display_t display,
2861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>&& layers)
2871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
2881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (hwc2_layer_t layer : layers) {
2891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
2911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
2921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
293cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
294cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
295cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
296cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
297cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
298cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
299cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t CONFIG_MAX = UINT32_MAX;
300cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
301cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
302cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " (2^32 values) has been taken which shouldn't happen";
303cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
304cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
305cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (config = 0; config < CONFIG_MAX; config++) {
306cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            if (std::count(configs.begin(), configs.end(), config) == 0)
307cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                break;
308cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
309cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
310cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        *outConfig = config;
311cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
312cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
3134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_device_t* mHwc2Device = nullptr;
314cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
315cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    enum class Hwc2TestHotplugStatus {
316cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Init = 1,
317cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Receiving,
318cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Done,
319cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    };
320cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
321cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::mutex mHotplugMutex;
322cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::condition_variable mHotplugCv;
323cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
324cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::unordered_set<hwc2_display_t> mDisplays;
3251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
3261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* Store all created layers that have not been destroyed. If an ASSERT_*
3271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall     * fails, then destroy the layers on exit */
3281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
3294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall};
3304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
331cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
332cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connection)
333cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
334cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    if (callbackData)
335cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
336cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                connection);
337cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
338cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
3394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
3404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallstatic const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
3414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
3424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_LAYER,
3434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
3444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_LAYER,
3454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
3464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DUMP,
3474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_ACTIVE_CONFIG,
3484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
3494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
3504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_COLOR_MODES,
3514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
3524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
3534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_NAME,
3544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
3554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_TYPE,
3564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DOZE_SUPPORT,
3574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_HDR_CAPABILITIES,
3584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
3594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_RELEASE_FENCES,
3604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_PRESENT_DISPLAY,
3614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_REGISTER_CALLBACK,
3624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_ACTIVE_CONFIG,
3634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CLIENT_TARGET,
3644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_MODE,
3654d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_TRANSFORM,
3664d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CURSOR_POSITION,
3674d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
3684d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BUFFER,
3694d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COLOR,
3704d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
3714d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DATASPACE,
3724d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
3734d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
3744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
3754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
3764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_TRANSFORM,
3774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
3784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_Z_ORDER,
3794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_OUTPUT_BUFFER,
3804d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_POWER_MODE,
3814d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_VSYNC_ENABLED,
3824d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_VALIDATE_DISPLAY,
3834d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}};
3844d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
3854d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 supports all required functions. */
3864d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION)
3874d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
3884d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
3894d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hwc2_function_pointer_t pfn = getFunction(descriptor);
3904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        EXPECT_TRUE(pfn) << "failed to get function "
3914d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << getFunctionDescriptorName(descriptor);
3924d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
3934d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
3944d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
3954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
3964d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
3974d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
3984d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
3994d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_FALSE(pfn) << "failed to get invalid function";
4004d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
4014d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
4024d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
4034d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_CAPABILITIES)
4044d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
4054d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    std::vector<hwc2_capability_t> capabilities;
4064d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
4074d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    getCapabilities(&capabilities);
4084d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
4094d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
4104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            HWC2_CAPABILITY_INVALID), 0);
4114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
412a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
413a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wallstatic const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
414a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_HOTPLUG,
415a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_REFRESH,
416a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_VSYNC,
417a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}};
418a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
419a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can successfully register all required
420a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall * callback functions. */
421a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK)
422a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
423a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
424a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
425a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
426a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
427a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
428a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
429a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
430a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
431a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
432a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
433a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
434a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
435a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
436a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
437a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
438a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
439a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
440a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            []() { return; }, &err));
441a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
442a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
443a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
444a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
445a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
446a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
447a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = nullptr;
448a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
449a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
450a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
451a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
452a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
453a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
454cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
455cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns the correct display type for each
456cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * physical display. */
457cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE)
458cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
459cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    for (auto display : mDisplays) {
460cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_type_t type;
461cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
462cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
463cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
464cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " correct display type";
465cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
466cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
467cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
468cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
469cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is requested. */
470cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
471cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
472cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_t display;
473cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_type_t type;
474cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
475cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
476cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
477cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
478cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
479cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
480cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
4811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
4821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
4831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
4841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
4851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
4861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
4871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
4881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
4891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
4901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
4911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
4921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
4931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
4941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
4951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_bad_display)
4961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
4971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t display;
4981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_layer_t layer;
4991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
5001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
5021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
5041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
5051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
5061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 will either support a large number of resources
5081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * or will return no resources. */
5091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_no_resources)
5101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
5111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    const size_t layerCnt = 1000;
5121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
5141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> layers;
5151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
5171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
5191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
5201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
5211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
5231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
5241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
5251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t badDisplay;
5261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
5281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
5301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer = 0;
5311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
5321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
5341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
5351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
5371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
5391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
5401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
5421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
5431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
5441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
5461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
5471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
5481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
5491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
5501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
5511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
5531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
5541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
5561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
5571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
5591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
5601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
5621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
5631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
5651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
5661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
5681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
5701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
5711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
5731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
5751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
5761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
5771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
578cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
579cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
580cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_WIDTH,
581cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_HEIGHT,
582cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
583cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
584cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
585cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_VSYNC_PERIOD,
586cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_X,
587cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_Y,
588cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
589cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
590cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
591cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * config. */
592cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
593cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
594cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
595cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
596cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
597cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
598cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
599cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
600cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
601cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
602cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : requiredAttributes) {
603cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
604cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
605cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                EXPECT_GE(value, 0) << "missing required attribute "
606cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << getAttributeName(attribute) << " for config "
607cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << config;
608cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
609cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : optionalAttributes) {
610cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
611cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
612cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
613cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
614cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
615cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
616cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
617cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
618cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * attribute */
619cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
620cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
621cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
622cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
623cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
624cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
625cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
626cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
627cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
628cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
629cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
630cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t err = HWC2_ERROR_NONE;
631cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
632cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
633cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
634cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
635cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " attribute for config " << config;
636cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
637cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
638cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
639cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
640cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
641cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
642cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
643cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
644cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_config_t config = 0;
645cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    int32_t value;
646cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
647cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
648cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
649cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
650cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : requiredAttributes) {
651cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
652cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
653cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
654cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
655cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
656cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : optionalAttributes) {
657cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
658cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
659cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
660cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
661cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
662cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
663cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
664cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
665cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
666cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
667cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
668cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        int32_t value;
669cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
670cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
671cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
672cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
673cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : requiredAttributes) {
674cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
675cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
676cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
677cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
678cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
679cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : optionalAttributes) {
680cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
681cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
682cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
683cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
684cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
685cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
686cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
687cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
688cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
689cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
690cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
691cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
692cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
693cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
694cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
695cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
696cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
697cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
698cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
699cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
700cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
701cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    std::vector<hwc2_config_t> configs;
702cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
703cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
704cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
705cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
706cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
707cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
708cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
709cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
710cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
711cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
712cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return the same config list multiple
713cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * times in a row. */
714cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
715cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
716cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
717cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs1, configs2;
718cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
719cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
720cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
721cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
722cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
723cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs2.begin())) << "returned two different config sets";
724cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
725cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
726cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
727cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
728cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
729cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
730cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
731cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
732cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
733cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
734cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
735cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
736cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs.end());
737cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
738cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " configs";
739cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
740cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
741