Hwc2Test.cpp revision 273b1dfa05287a0016ae1fc230cd3a5b1b7433fa
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
296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall#include "Hwc2TestLayer.h"
30273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall#include "Hwc2TestLayers.h"
316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
32cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
33cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connected);
34572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
35572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp);
36cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallclass Hwc2Test : public testing::Test {
384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallpublic:
394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void SetUp()
414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hw_module_t const* hwc2Module;
434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        /* The following method will fail if you have not run
494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall         * "adb shell stop" */
504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        err = hwc2_open(hwc2Module, &mHwc2Device);
514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
53cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
54cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        populateDisplays();
554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void TearDown()
584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (auto itr = mLayers.begin(); itr != mLayers.end();) {
611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_display_t display = itr->first;
621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_layer_t layer = itr->second;
631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            itr++;
641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            /* Destroys and removes the layer from mLayers */
651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            destroyLayer(display, layer);
661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
6903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_display_t display = *itr;
7003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            itr++;
7103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            /* Sets power mode to off and removes the display from
7203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall             * mActiveDisplays */
7303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            setPowerMode(display, HWC2_POWER_MODE_OFF);
7403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
7503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        if (mHwc2Device)
774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            hwc2_close(mHwc2Device);
784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
80a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    void registerCallback(hwc2_callback_descriptor_t descriptor,
81a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
82a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_error_t* outErr = nullptr)
83a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    {
84a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
85a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
86a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
87a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
88a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
89a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                callbackData, pointer));
90a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        if (outErr) {
91a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            *outErr = err;
92a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        } else {
93a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
94a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        }
95a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
96a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
97cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
98cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            hwc2_error_t* outErr = nullptr)
99cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
100cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
101cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
102cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
103cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
104cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
105cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                    reinterpret_cast<int32_t*>(outType)));
106cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (outErr) {
107cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            *outErr = err;
108cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        } else {
109cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
110cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
111cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
112cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
113cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* If the populateDisplays function is still receiving displays and the
114cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * display is connected, the display handle is stored in mDisplays. */
115cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void hotplugCallback(hwc2_display_t display, int32_t connected)
116cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
117cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::lock_guard<std::mutex> lock(mHotplugMutex);
118cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
119cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
120cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            return;
121cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
122cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (connected == HWC2_CONNECTION_CONNECTED)
123cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mDisplays.insert(display);
124cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
125cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugCv.notify_all();
126cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
127cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
1291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
1321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_CREATE_LAYER));
1331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
1361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                outLayer));
1371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.insert(std::make_pair(display, *outLayer));
1401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
1451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
1491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
1521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_DESTROY_LAYER));
1531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
1561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.erase(std::make_pair(display, layer));
1591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
1641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                    << layer;
1651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
168cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
169cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue,
170cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
171cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
172cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
173cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
174cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
175cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
176cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
177cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                attribute, outValue));
178cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
179cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
180cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
181cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
182cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
183cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    << getAttributeName(attribute) << " for config " << config;
184cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
185cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
186cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
187cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayConfigs(hwc2_display_t display,
188cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            std::vector<hwc2_config_t>* outConfigs,
189cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
190cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
191cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
192cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
193cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
194cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
195cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        uint32_t numConfigs = 0;
196cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
197cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
198cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &numConfigs, nullptr));
199cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
200cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (err == HWC2_ERROR_NONE) {
201cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            outConfigs->resize(numConfigs);
202cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
203cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
204cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    &numConfigs, outConfigs->data()));
205cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
206cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
207cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
208cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
209cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
210cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
211cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " display " << display;
212cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
213cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
214cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
21593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
21693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
21793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
21893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
21993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
22093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
22193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
22293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
22393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                outConfig));
22493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
22593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
22693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
22793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
22893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " display " << display;
22993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
23093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
23193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
23293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
23393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
23493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
23593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
23693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
23793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
23893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
23993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
24093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
24193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
24293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
24393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
24493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    << config;
24593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
24693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
24793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
24803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
24903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_error_t* outErr = nullptr)
25003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    {
25103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
25203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
25303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
25403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
25503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
25603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                outSupport));
25703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (outErr) {
25803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            *outErr = err;
25903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
26003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
26103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                    " display " << display;
26203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
26303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
26403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
26503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
26603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_error_t* outErr = nullptr)
26703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    {
26803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
26903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                getFunction(HWC2_FUNCTION_SET_POWER_MODE));
27003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
27103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
27203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
27303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                mode));
27403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (outErr) {
27503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            *outErr = err;
27603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            if (err != HWC2_ERROR_NONE)
27703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                return;
27803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
27903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
28003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                    << getPowerModeName(mode) << " on display " << display;
28103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
28203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
28303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (mode == HWC2_POWER_MODE_OFF) {
28403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            mActiveDisplays.erase(display);
28503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
28603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            mActiveDisplays.insert(display);
28703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
28803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
28903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
290572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
291572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            hwc2_error_t* outErr = nullptr)
292572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
293572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
294572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
295572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
296572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
297572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
298572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                enabled));
299572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outErr) {
300572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outErr = err;
301572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        } else {
302572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
303572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                    << getVsyncName(enabled);
304572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        }
305572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
306572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
307572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void vsyncCallback(hwc2_display_t display, int64_t timestamp)
308572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
309572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        std::lock_guard<std::mutex> lock(mVsyncMutex);
310572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncDisplay = display;
311572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncTimestamp = timestamp;
312572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncCv.notify_all();
313572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
314572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
315dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    void getDisplayName(hwc2_display_t display, std::string* outName,
316dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                hwc2_error_t* outErr = nullptr)
317dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    {
318dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
319dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
320dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
321dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
322dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        uint32_t size = 0;
323dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
324dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
325dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                nullptr));
326dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
327dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        if (err == HWC2_ERROR_NONE) {
328dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            std::vector<char> name(size);
329dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
330dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
331dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                    name.data()));
332dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
333dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            outName->assign(name.data());
334dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        }
335dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
336dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        if (outErr) {
337dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            *outErr = err;
338dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        } else {
339dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
340dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                    << display;
341dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        }
342dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
343dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
3446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
3456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
3466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
3476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
3486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
3496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
3506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
3516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
3526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                composition));
3536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        if (outErr) {
3546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            *outErr = err;
3556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        } else {
3566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
3576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    " type " << getCompositionName(composition);
3586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
3596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
3606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
361ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
362ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
363ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    {
364ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
365ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
366ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
367ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
368ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
369ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                mode));
370ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        if (outErr) {
371ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            *outErr = err;
372ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        } else {
373ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
374ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    << getBlendModeName(mode);
375ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        }
376ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    }
377ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
378b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
379b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
380b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    {
381b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
382b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
383b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
384b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
385b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
386b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall                layer, dataspace));
387b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        if (outErr) {
388b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            *outErr = err;
389b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        } else {
390b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
391b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        }
392b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    }
393b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
3942b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
3952b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            float alpha, hwc2_error_t* outErr = nullptr)
3962b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    {
3972b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
3982b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
3992b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
4002b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
4012b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
4022b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                alpha));
4032b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        if (outErr) {
4042b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            *outErr = err;
4052b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        } else {
4062b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
4072b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    << alpha;
4082b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        }
4092b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    }
4102b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
411ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
412ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
413ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    {
414ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
415ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
416ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
417ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
418ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
419ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                transform));
420ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        if (outErr) {
421ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            *outErr = err;
422ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        } else {
423ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
424ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                    << getTransformName(transform);
425ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        }
426ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    }
427ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
428273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
429273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            uint32_t zOrder, hwc2_error_t* outErr = nullptr)
430273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
431273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
432273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
433273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
434273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
435273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
436273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                zOrder));
437273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        if (outErr) {
438273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            *outErr = err;
439273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        } else {
440273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
441273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                    << zOrder;
442273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
443273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
444273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
4454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallprotected:
4464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
4474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
4484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        return mHwc2Device->getFunction(mHwc2Device, descriptor);
4494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
4504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
4514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
4524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
4534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        uint32_t num = 0;
4544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
4554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
4564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
4574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        outCapabilities->resize(num);
4584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
4594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num,
4604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                reinterpret_cast<int32_t*>(outCapabilities->data()));
4614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
4624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
463cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* Registers a hotplug callback and waits for hotplug callbacks. This
464cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * function will have no effect if called more than once. */
465cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void populateDisplays()
466cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
467cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to receiving */
468cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        {
469cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            std::lock_guard<std::mutex> lock(mHotplugMutex);
470cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
471cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
472cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
473cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
474cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
475cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
476cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Registers the callback. This function call cannot be locked because
477cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * a callback could happen on the same thread */
478cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
479cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
480cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                hwc2TestHotplugCallback)));
481cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
482cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Waits for hotplug events. If a hotplug event has not come within 1
483cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * second, stop waiting. */
484cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::unique_lock<std::mutex> lock(mHotplugMutex);
485cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
486cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
487cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                std::cv_status::timeout) { }
488cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
489cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to done. Future calls will have no effect */
490cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugStatus = Hwc2TestHotplugStatus::Done;
491cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
492cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
493cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getBadDisplay(hwc2_display_t* outDisplay)
494cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
495cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
496cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mDisplays.count(display) == 0) {
497cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                *outDisplay = display;
498cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
499cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            }
500cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
501cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
502cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " are registered. This should never happen.";
503cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
504cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
5051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* NOTE: will create min(newlayerCnt, max supported layers) layers */
5061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayers(hwc2_display_t display,
5071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
5081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
5091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> newLayers;
5101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
5111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
5121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (size_t i = 0; i < newLayerCnt; i++) {
5141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
5161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err == HWC2_ERROR_NO_RESOURCES)
5171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                break;
5181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err != HWC2_ERROR_NONE) {
5191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                newLayers.clear();
5201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
5211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            }
5221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            newLayers.push_back(layer);
5231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
5241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        *outLayers = std::move(newLayers);
5261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
5271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayers(hwc2_display_t display,
5291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>&& layers)
5301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
5311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (hwc2_layer_t layer : layers) {
5321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
5331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
5341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
5351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
536cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
537cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
538cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
539cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
540cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
541cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
542cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t CONFIG_MAX = UINT32_MAX;
543cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
544cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
545cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " (2^32 values) has been taken which shouldn't happen";
546cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
547cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
548cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (config = 0; config < CONFIG_MAX; config++) {
549cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            if (std::count(configs.begin(), configs.end(), config) == 0)
550cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                break;
551cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
552cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
553cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        *outConfig = config;
554cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
555cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
556572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void enableVsync(hwc2_display_t display)
557572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
558572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
559572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
560572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                hwc2TestVsyncCallback)));
561572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
562572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
563572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
564572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void disableVsync(hwc2_display_t display)
565572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
566572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
567572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
568572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
569572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void waitForVsync(hwc2_display_t* outDisplay = nullptr,
570572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            int64_t* outTimestamp = nullptr)
571572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
572572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        std::unique_lock<std::mutex> lock(mVsyncMutex);
573572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
574572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                std::cv_status::no_timeout) << "timed out attempting to get"
575572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                " vsync callback";
576572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outDisplay)
577572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outDisplay = mVsyncDisplay;
578572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outTimestamp)
579572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outTimestamp = mVsyncTimestamp;
580572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
581572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
5826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a property value from
5836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
5846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
5856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
5866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
5876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
588273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* Calls a set property function from Hwc2Test to set property values from
589273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
590273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
591273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
592273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            const Hwc2TestLayers& testLayers);
593273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
5946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
5956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
5966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
5976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
5986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
5996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
6016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
6026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
6036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
6046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Advances a property of Hwc2TestLayer */
6066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
6076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
6096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets the property and then
6106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * destroys the layer */
6116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerProperty(Hwc2TestCoverage coverage,
6126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
6136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
6146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
6156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
6166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
6186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
6206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
6216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
6236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                Hwc2TestLayer testLayer(coverage);
6246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
6266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
6276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
6296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                            testLayer, nullptr));
6306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
6326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
6336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
6346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
6356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
6366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
6386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, cycles through each property
6396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * value and updates the layer property value and then destroys the layer */
6406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
6416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
6426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
6436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
6446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
6456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
6476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
6496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
6506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
6526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                Hwc2TestLayer testLayer(coverage);
6536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
6556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
6576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
6586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                            testLayer, nullptr));
6596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
6606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
6626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
6636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
6646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
6656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
666273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* For each active display it cycles through each display config and tests
667273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * each property value. It creates multiple layers, calls the
668273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * TestLayerPropertiesFunction to set property values and then
669273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * destroys the layers */
670273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
671273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            TestLayerPropertiesFunction function)
672273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
673273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto display : mDisplays) {
674273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            std::vector<hwc2_config_t> configs;
675273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
676273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
677273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
678273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (auto config : configs) {
679273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                std::vector<hwc2_layer_t> layers;
680273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
681273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
682273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
683273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
684273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                Hwc2TestLayers testLayers(layers, coverage);
685273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
686273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                for (auto layer : layers) {
687273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                    EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
688273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                            testLayers));
689273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                }
690273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
691273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
692273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
693273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
694273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
695273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
6966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config.
6976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 1) It attempts to set a valid property value to bad layer handle.
6986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 2) It creates a layer x and attempts to set a valid property value to
6996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    layer x + 1
7006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 3) It destroys the layer x and attempts to set a valid property value to
7016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    the destroyed layer x.
7026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     */
7036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
7046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyBadLayerFunction function)
7056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
7066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
7076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
7086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
7106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
7126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer = 0;
7136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
7146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
7166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                Hwc2TestLayer testLayer(coverage);
7176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
7196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        testLayer, &err));
7206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
7216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
7236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
7256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        testLayer, &err));
7266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
7276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
7296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
7316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        testLayer, &err));
7326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
7336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
7346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
7356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
7366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
7386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets a bad property value and
7396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * then destroys the layer */
7406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
7416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
7426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
7436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
7446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
7466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
7486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
7496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
7506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
7526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
7546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
7566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
7576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        " error code";
7586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
7606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
7616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
7626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
7636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_device_t* mHwc2Device = nullptr;
765cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
766cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    enum class Hwc2TestHotplugStatus {
767cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Init = 1,
768cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Receiving,
769cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Done,
770cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    };
771cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
772cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::mutex mHotplugMutex;
773cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::condition_variable mHotplugCv;
774cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
775cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::unordered_set<hwc2_display_t> mDisplays;
7761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
7771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* Store all created layers that have not been destroyed. If an ASSERT_*
7781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall     * fails, then destroy the layers on exit */
7791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
78003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
78103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
78203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall     * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
78303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    std::set<hwc2_display_t> mActiveDisplays;
784572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
785572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::mutex mVsyncMutex;
786572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::condition_variable mVsyncCv;
787572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t mVsyncDisplay;
788572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    int64_t mVsyncTimestamp = -1;
7894d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall};
7904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
791cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
792cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connection)
793cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
794cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    if (callbackData)
795cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
796cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                connection);
797cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
798cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
799572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
800572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp)
801572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
802572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    if (callbackData)
803572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
804572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                timestamp);
805572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
806572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
807ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallvoid setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
808ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
809ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
810ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
811ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            testLayer.getBlendMode(), outErr));
812ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
813ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
8146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallvoid setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
8156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
8166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
8176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    hwc2_composition_t composition = testLayer.getComposition();
8186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
8196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
8216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            composition, &err));
8226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (outErr) {
8236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        *outErr = err;
8246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        return;
8256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
8266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (composition != HWC2_COMPOSITION_SIDEBAND) {
8286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
8296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    } else {
8306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
8316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                 << "returned wrong error code";
8326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
8336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
8346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
835b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallvoid setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
836b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
837b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
838b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
839b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            testLayer.getDataspace(), outErr));
840b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
841b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
8422b1f53060ea8587a428f826cf7890354ff124722Marissa Wallvoid setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
8432b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t *outErr)
8442b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
8452b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
8462b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            testLayer.getBlendMode()));
8472b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
8482b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            testLayer.getPlaneAlpha(), outErr));
8492b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
8502b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
851ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallvoid setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
852ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
853ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
854ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
855ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            testLayer.getTransform(), outErr));
856ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
857ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
858273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wallvoid setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
859273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
860273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
861273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
862273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            testLayer.getZOrder(), outErr));
863273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
864273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
865ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallbool advanceBlendMode(Hwc2TestLayer* testLayer)
866ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
867ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    return testLayer->advanceBlendMode();
868ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
869ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
8706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallbool advanceComposition(Hwc2TestLayer* testLayer)
8716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
8726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    return testLayer->advanceComposition();
8736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
8746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
875b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallbool advanceDataspace(Hwc2TestLayer* testLayer)
876b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
877b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    return testLayer->advanceDataspace();
878b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
879b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
8802b1f53060ea8587a428f826cf7890354ff124722Marissa Wallbool advancePlaneAlpha(Hwc2TestLayer* testLayer)
8812b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
8822b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    return testLayer->advancePlaneAlpha();
8832b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
8842b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
885ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallbool advanceTransform(Hwc2TestLayer* testLayer)
886ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
887ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    return testLayer->advanceTransform();
888ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
889ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
8904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
8914d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallstatic const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
8924d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
8934d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_LAYER,
8944d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
8954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_LAYER,
8964d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
8974d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DUMP,
8984d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_ACTIVE_CONFIG,
8994d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
9004d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
9014d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_COLOR_MODES,
9024d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
9034d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
9044d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_NAME,
9054d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
9064d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_TYPE,
9074d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DOZE_SUPPORT,
9084d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_HDR_CAPABILITIES,
9094d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
9104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_RELEASE_FENCES,
9114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_PRESENT_DISPLAY,
9124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_REGISTER_CALLBACK,
9134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_ACTIVE_CONFIG,
9144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CLIENT_TARGET,
9154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_MODE,
9164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_TRANSFORM,
9174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CURSOR_POSITION,
9184d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
9194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BUFFER,
9204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COLOR,
9214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
9224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DATASPACE,
9234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
9244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
9254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
9264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
9274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_TRANSFORM,
9284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
9294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_Z_ORDER,
9304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_OUTPUT_BUFFER,
9314d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_POWER_MODE,
9324d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_VSYNC_ENABLED,
9334d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_VALIDATE_DISPLAY,
9344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}};
9354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
9364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 supports all required functions. */
9374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION)
9384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
9394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
9404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hwc2_function_pointer_t pfn = getFunction(descriptor);
9414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        EXPECT_TRUE(pfn) << "failed to get function "
9424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << getFunctionDescriptorName(descriptor);
9434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
9444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
9454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
9464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
9474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
9484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
9494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
9504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_FALSE(pfn) << "failed to get invalid function";
9514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
9524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
9534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
9544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_CAPABILITIES)
9554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
9564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    std::vector<hwc2_capability_t> capabilities;
9574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
9584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    getCapabilities(&capabilities);
9594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
9604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
9614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            HWC2_CAPABILITY_INVALID), 0);
9624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
963a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
964a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wallstatic const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
965a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_HOTPLUG,
966a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_REFRESH,
967a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_VSYNC,
968a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}};
969a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
970a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can successfully register all required
971a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall * callback functions. */
972a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK)
973a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
974a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
975a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
976a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
977a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
978a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
979a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
980a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
981a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
982a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
983a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
984a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
985a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
986a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
987a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
988a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
989a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
990a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
991a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            []() { return; }, &err));
992a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
993a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
994a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
995a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
996a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
997a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
998a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = nullptr;
999a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1000a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
1001a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1002a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
1003a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
1004a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1005cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1006cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1007cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * physical display. */
1008cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1009cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1010cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    for (auto display : mDisplays) {
1011cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_type_t type;
1012cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1013cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1014cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1015cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " correct display type";
1016cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
1017cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
1018cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1019cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1020cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is requested. */
1021cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1022cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1023cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_t display;
1024cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_type_t type;
1025cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1026cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1027cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1028cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1029cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1030cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1031cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
10321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
10341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
10351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
10361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
10371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
10381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
10401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
10421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
10431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
10441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
10461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_bad_display)
10471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
10481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t display;
10491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_layer_t layer;
10501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
10511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
10531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
10551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
10561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
10571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 will either support a large number of resources
10591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * or will return no resources. */
10601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_no_resources)
10611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
10621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    const size_t layerCnt = 1000;
10631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
10651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> layers;
10661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
10681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
10701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
10711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
10721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
10741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
10751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
10761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t badDisplay;
10771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
10791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
10811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer = 0;
10821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
10831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
10851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
10861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
10881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
10901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
10911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
10931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
10941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
10951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
10971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
10981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
10991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
11001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
11011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
11021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
11041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
11071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
11101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
11131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
11161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
11191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
11211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
11241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
11261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
11281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
1129cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1130cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1131cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_WIDTH,
1132cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_HEIGHT,
1133cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
1134cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1135cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1136cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_VSYNC_PERIOD,
1137cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_X,
1138cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_Y,
1139cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
1140cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1141cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1142cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * config. */
1143cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1144cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1145cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1146cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1147cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1148cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1149cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1150cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
1151cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
1152cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1153cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : requiredAttributes) {
1154cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1155cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
1156cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                EXPECT_GE(value, 0) << "missing required attribute "
1157cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << getAttributeName(attribute) << " for config "
1158cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << config;
1159cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
1160cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : optionalAttributes) {
1161cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1162cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
1163cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
1164cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1165cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1166cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1167cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1168cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1169cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * attribute */
1170cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1171cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1172cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1173cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1174cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1175cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1176cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1177cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1178cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1179cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
1180cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
1181cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t err = HWC2_ERROR_NONE;
1182cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1183cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1184cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1185cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1186cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " attribute for config " << config;
1187cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1188cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1189cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1190cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1191cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1192cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1193cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1194cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
1195cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_config_t config = 0;
1196cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    int32_t value;
1197cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1198cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1199cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1200cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1201cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : requiredAttributes) {
1202cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1203cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
1204cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1205cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1206cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1207cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : optionalAttributes) {
1208cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1209cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
1210cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1211cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1212cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1213cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1214cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1215cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1216cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1217cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1218cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
1219cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        int32_t value;
1220cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
1221cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1222cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1223cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1224cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : requiredAttributes) {
1225cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1226cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1227cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1228cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1229cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1230cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : optionalAttributes) {
1231cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1232cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1233cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1234cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1235cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1236cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1237cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1238cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1239cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1240cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1241cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1242cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1243cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1244cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1245cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1246cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1247cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1248cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1249cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1250cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1251cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
1252cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    std::vector<hwc2_config_t> configs;
1253cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1254cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1255cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1256cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1257cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1258cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1259cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1260cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1261cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1262cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1263cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1264cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * times in a row. */
1265cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1266cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1267cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1268cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs1, configs2;
1269cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1270cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
1271cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
1272cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1273cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
1274cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs2.begin())) << "returned two different config sets";
1275cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1276cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1277cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1278cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
1279cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
1280cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1281cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1282cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1283cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1284cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1285cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1286cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
1287cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs.end());
1288cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
1289cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " configs";
1290cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1291cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
129293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
129393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 returns the active config for a display */
129493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
129593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
129693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
129793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
129893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
129993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
130093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
130193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
130293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_config_t activeConfig;
130393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
130493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
130593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
130693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
130793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(activeConfig, config) << "failed to get active config";
130893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
130993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
131093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
131193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
131293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
131393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * display. */
131493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
131593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
131693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
131793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_config_t activeConfig;
131893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
131993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
132093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
132193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
132293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
132393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
132493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
132593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
132693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
132793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 either begins with a valid active config
132893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * or returns an error when getActiveConfig is called. */
132993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
133093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
133193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
133293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
133393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t activeConfig;
133493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
133593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
133693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
133793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
133893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (configs.empty())
133993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            return;
134093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
134193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
134293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (err == HWC2_ERROR_NONE) {
134393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NE(std::count(configs.begin(), configs.end(),
134493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    activeConfig), 0) << "active config is not found in "
134593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " configs for display";
134693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
134793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
134893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
134993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
135093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
135193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
135293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 can set every display config as an active
135393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * config */
135493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
135593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
135693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
135793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
135893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
135993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
136093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
136193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
136293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
136393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
136493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
136593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
136693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
136793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
136893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
136993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
137093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
137193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    const hwc2_config_t config = 0;
137293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
137393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
137493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
137593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
137693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
137793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
137893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
137993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
138093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
138193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
138293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
138393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
138493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t config;
138593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
138693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
138793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
138893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
138993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
139093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
139193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
139293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
139303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
139403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
139503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT)
139603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
139703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
139803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
139903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
140003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
140103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
140203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
140303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
140403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
140503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
140603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
140703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
140803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
140903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
141003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
141103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
141203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
141303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
141403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
141503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
141603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
141703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
141803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
141903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
142003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set all supported power modes */
142103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE)
142203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
142303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
142403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
142503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
142603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
142703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
142803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
142903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
143003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
143103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
143203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
143303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
143403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
143503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
143603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
143703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
143803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
143903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
144003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
144103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
144203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
144303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
144403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
144503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
144603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
144703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
144803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
144903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
145003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
145103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
145203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
145303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
145403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
145503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
145603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    if (support != 1)
145703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        return;
145803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
145903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
146003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
146103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
146203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
146303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            &err));
146403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
146503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
146603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
146703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
146803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
146903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
147003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
147103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
147203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND + 1);
147303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
147403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
147503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
147603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
147703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                << mode;
147803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
147903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
148003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
148103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
148203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall * an optional power mode. */
148303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
148403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
148503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
148603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
148703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
148803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
148903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
149003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support == 1)
149103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
149203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
149303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_EQ(support, 0) << "invalid doze support value";
149403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
149503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
149603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                &err));
149703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
149803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
149903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
150003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND, &err));
150103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) <<  "returned wrong error code";
150203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
150303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
150403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
150503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
150603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_stress)
150703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
150803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
150903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
151003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
151103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
151203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
151303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
151403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
151503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
151603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
151703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
151803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
151903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
152003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
152103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
152203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
152303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
152403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
152503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
152603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
152703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
152803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
152903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
153003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
153103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
153203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
153303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
1534572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1535572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
1536572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * displays */
1537572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED)
1538572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1539572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1540572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1541572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1542572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1543572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1544572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1545572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1546572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1547572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1548572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1549572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1550572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1551572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1552572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1553572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1554572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1555572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1556572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
1557572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
1558572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1559572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1560572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t receivedDisplay;
1561572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        int64_t receivedTimestamp;
1562572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1563572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1564572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1565572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1566572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1567572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
1568572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &receivedTimestamp));
1569572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1570572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
1571572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
1572572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1573572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1574572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1575572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1576572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1577572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1578572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1579572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
1580572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
1581572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1582572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t display;
1583572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1584572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            const_cast<char*>("data"));
1585572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1586572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1587572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1588572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1589572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1590572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            []() { return; }));
1591572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1592572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
1593572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1594572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1595572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
1596572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1597572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1598572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1599572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
1600572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
1601572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1602572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1603572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1604572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1605572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
1606572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1607572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1608572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1609572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1610572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1611572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1612572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
1613572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &err));
1614572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1615572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1616572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1617572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1618572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1619572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1620572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
1621572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * times. */
1622572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
1623572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1624572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1625572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1626572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1627572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1628572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1629572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1630572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1631572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1632572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1633572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1634572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1635572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1636572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1637572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1638572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1639572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1640572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1641572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1642572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1643572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1644572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1645572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
1646572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is off and no callback is registered. */
1647572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
1648572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1649572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
1650572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1651572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1652572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1653572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1654572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
1655572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1656572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1657572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1658572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1659572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1660572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
1661572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is registered. */
1662572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
1663572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1664572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
1665572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1666572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1667572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1668572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1669572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1670572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1671572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
1672572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1673572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1674572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1675572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1676572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1677572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1678dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1679dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 returns a display name for each display */
1680dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME)
1681dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
1682dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    for (auto display : mDisplays) {
1683dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        std::string name;
1684dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1685dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
1686dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
1687dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
1688dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1689dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
1690dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall * display */
1691dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
1692dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
1693dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_display_t display;
1694dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    std::string name;
1695dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1696dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1697dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1698dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1699dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
1700dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1701dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
17026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
17036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can set basic composition types. */
17046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
17056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
17066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
17076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
17086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
17096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
17106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
17116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * layer. */
17126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
17136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
17146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
17156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
17166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
17176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
17186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
17196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
17206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
17216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
17226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition));
17236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
17246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
17256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
17266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
17276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
17286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
17296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
17306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    hwc2_error_t* outErr) {
17316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
17326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
17336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        layer, HWC2_COMPOSITION_INVALID, outErr));
17346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
17356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ));
17366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
1737ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1738ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
1739ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
1740ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1741ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1742ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
1743ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1744ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1745ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
1746ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
1747ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1748ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1749ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
1750ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1751ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1752ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
1753ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
1754ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1755ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1756ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode));
1757ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1758ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1759ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
1760ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
1761ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1762ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
1763ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1764ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    hwc2_error_t* outErr) {
1765ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1766ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
1767ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                        layer, HWC2_BLEND_MODE_INVALID, outErr));
1768ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            }
1769ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ));
1770ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1771b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1772b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
1773b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE)
1774b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1775b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1776b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
1777b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1778b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1779b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
1780b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
1781b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1782b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1783b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
1784b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1785b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1786b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
1787b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
1788b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1789b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1790b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace));
1791b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
17922b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
17932b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
17942b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
17952b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
17962b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
17972b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
17982b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
17992b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
18002b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
18012b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
18022b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
18032b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
18042b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
18052b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
18062b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
18072b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
18082b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
18092b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
18102b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
18112b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
18122b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    const Hwc2TestLayer& testLayer, hwc2_error_t *outErr) {
18132b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
18142b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
18152b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                            badLayer, testLayer.getPlaneAlpha(), outErr));
18162b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            }
18172b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ));
18182b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
1819ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
1820ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
1821ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
1822ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1823ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1824ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
1825ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1826ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
1827ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
1828ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
1829ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1830ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1831ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
1832ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1833ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
1834ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
1835ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
1836ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1837ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1838ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform));
1839ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1840273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1841273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
1842273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
1843273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
1844273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
1845273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1846273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                    const Hwc2TestLayers& testLayers) {
1847273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1848273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
1849273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                        testLayers.getZOrder(layer)));
1850273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
1851273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ));
1852273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
1853273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1854273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
1855273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
1856273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
1857273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
1858273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
1859273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX / 2),
1860273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX) };
1861273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1862273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    for (auto display : mDisplays) {
1863273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        std::vector<hwc2_config_t> configs;
1864273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1865273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1866273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1867273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto config : configs) {
1868273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_layer_t layer;
1869273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1870273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1871273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1872273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1873273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1874273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (uint32_t zOrder : zOrders) {
1875273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
1876273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
1877273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1878273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1879273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
1880273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
1881273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
1882273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1883273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
1884273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
1885273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
1886273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1887273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            setZOrder));
1888273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
1889