Hwc2Test.cpp revision 5a240aaf0e3a1dd52be6a8d0811ec727369a210d
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>
215a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall#include <android-base/unique_fd.h>
224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <hardware/hardware.h>
234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#define HWC2_INCLUDE_STRINGIFICATION
254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#define HWC2_USE_CPP11
264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <hardware/hwcomposer2.h>
274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#undef HWC2_INCLUDE_STRINGIFICATION
284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#undef HWC2_USE_CPP11
294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall#include "Hwc2TestLayer.h"
31273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall#include "Hwc2TestLayers.h"
326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
33cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
34cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connected);
35572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
36572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp);
37cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallclass Hwc2Test : public testing::Test {
394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallpublic:
404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void SetUp()
424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hw_module_t const* hwc2Module;
444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        /* The following method will fail if you have not run
504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall         * "adb shell stop" */
514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        err = hwc2_open(hwc2Module, &mHwc2Device);
524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
54cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
55cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        populateDisplays();
564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void TearDown()
594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (auto itr = mLayers.begin(); itr != mLayers.end();) {
621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_display_t display = itr->first;
631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_layer_t layer = itr->second;
641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            itr++;
651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            /* Destroys and removes the layer from mLayers */
661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            destroyLayer(display, layer);
671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
7003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_display_t display = *itr;
7103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            itr++;
7203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            /* Sets power mode to off and removes the display from
7303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall             * mActiveDisplays */
7403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            setPowerMode(display, HWC2_POWER_MODE_OFF);
7503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
7603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        if (mHwc2Device)
784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            hwc2_close(mHwc2Device);
794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
804d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
81a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    void registerCallback(hwc2_callback_descriptor_t descriptor,
82a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
83a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_error_t* outErr = nullptr)
84a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    {
85a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
86a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
87a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
88a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
89a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
90a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                callbackData, pointer));
91a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        if (outErr) {
92a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            *outErr = err;
93a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        } else {
94a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
95a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        }
96a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
97a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
98cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
99cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            hwc2_error_t* outErr = nullptr)
100cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
101cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
102cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
103cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
104cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
105cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
106cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                    reinterpret_cast<int32_t*>(outType)));
107cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (outErr) {
108cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            *outErr = err;
109cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        } else {
110cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
111cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
112cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
113cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
114cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* If the populateDisplays function is still receiving displays and the
115cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * display is connected, the display handle is stored in mDisplays. */
116cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void hotplugCallback(hwc2_display_t display, int32_t connected)
117cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
118cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::lock_guard<std::mutex> lock(mHotplugMutex);
119cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
120cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
121cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            return;
122cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
123cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (connected == HWC2_CONNECTION_CONNECTED)
124cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mDisplays.insert(display);
125cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
126cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugCv.notify_all();
127cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
128cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
1301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
1331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_CREATE_LAYER));
1341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
1371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                outLayer));
1381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.insert(std::make_pair(display, *outLayer));
1411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
1461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
1501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
1531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_DESTROY_LAYER));
1541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
1571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.erase(std::make_pair(display, layer));
1601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
1651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                    << layer;
1661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
169cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
170cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue,
171cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
172cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
173cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
174cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
175cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
176cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
177cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
178cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                attribute, outValue));
179cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
180cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
181cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
182cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
183cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
184cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    << getAttributeName(attribute) << " for config " << config;
185cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
186cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
187cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
188cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayConfigs(hwc2_display_t display,
189cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            std::vector<hwc2_config_t>* outConfigs,
190cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
191cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
192cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
193cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
194cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
195cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
196cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        uint32_t numConfigs = 0;
197cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
198cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
199cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &numConfigs, nullptr));
200cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
201cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (err == HWC2_ERROR_NONE) {
202cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            outConfigs->resize(numConfigs);
203cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
204cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
205cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    &numConfigs, outConfigs->data()));
206cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
207cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
208cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
209cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
210cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
211cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
212cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " display " << display;
213cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
214cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
215cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
21693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
21793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
21893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
21993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
22093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
22193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
22293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
22393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
22493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                outConfig));
22593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
22693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
22793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
22893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
22993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " display " << display;
23093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
23193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
23293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
23393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
23493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
23593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
23693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
23793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
23893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
23993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
24093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
24193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
24293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
24393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
24493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
24593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    << config;
24693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
24793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
24893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
24903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
25003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_error_t* outErr = nullptr)
25103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    {
25203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
25303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
25403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
25503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
25603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
25703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                outSupport));
25803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (outErr) {
25903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            *outErr = err;
26003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
26103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
26203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                    " display " << display;
26303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
26403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
26503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
26603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
26703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_error_t* outErr = nullptr)
26803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    {
26903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
27003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                getFunction(HWC2_FUNCTION_SET_POWER_MODE));
27103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
27203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
27303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
27403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                mode));
27503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (outErr) {
27603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            *outErr = err;
27703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            if (err != HWC2_ERROR_NONE)
27803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                return;
27903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
28003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
28103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                    << getPowerModeName(mode) << " on display " << display;
28203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
28303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
28403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (mode == HWC2_POWER_MODE_OFF) {
28503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            mActiveDisplays.erase(display);
28603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
28703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            mActiveDisplays.insert(display);
28803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
28903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
29003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
291572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
292572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            hwc2_error_t* outErr = nullptr)
293572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
294572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
295572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
296572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
297572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
298572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
299572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                enabled));
300572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outErr) {
301572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outErr = err;
302572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        } else {
303572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
304572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                    << getVsyncName(enabled);
305572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        }
306572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
307572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
308572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void vsyncCallback(hwc2_display_t display, int64_t timestamp)
309572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
310572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        std::lock_guard<std::mutex> lock(mVsyncMutex);
311572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncDisplay = display;
312572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncTimestamp = timestamp;
313572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncCv.notify_all();
314572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
315572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
316dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    void getDisplayName(hwc2_display_t display, std::string* outName,
317dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                hwc2_error_t* outErr = nullptr)
318dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    {
319dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
320dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
321dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
322dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
323dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        uint32_t size = 0;
324dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
325dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
326dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                nullptr));
327dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
328dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        if (err == HWC2_ERROR_NONE) {
329dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            std::vector<char> name(size);
330dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
331dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
332dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                    name.data()));
333dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
334dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            outName->assign(name.data());
335dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        }
336dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
337dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        if (outErr) {
338dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            *outErr = err;
339dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        } else {
340dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
341dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                    << display;
342dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        }
343dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
344dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
3456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
3466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
3476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
3486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
3496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
3506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
3516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
3526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
3536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                composition));
3546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        if (outErr) {
3556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            *outErr = err;
3566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        } else {
3576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
3586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    " type " << getCompositionName(composition);
3596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
3606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
3616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
3622a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    void setCursorPosition(hwc2_display_t display, hwc2_layer_t layer,
3632a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            int32_t x, int32_t y, hwc2_error_t* outErr = nullptr)
3642a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    {
3652a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_CURSOR_POSITION>(
3662a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                getFunction(HWC2_FUNCTION_SET_CURSOR_POSITION));
3672a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
3682a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
3692a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, x,
3702a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                y));
3712a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        if (outErr) {
3722a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            *outErr = err;
3732a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        } else {
3742a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set cursor position";
3752a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        }
3762a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    }
3772a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
378ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
379ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
380ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    {
381ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
382ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
383ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
384ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
385ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
386ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                mode));
387ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        if (outErr) {
388ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            *outErr = err;
389ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        } else {
390ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
391ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    << getBlendModeName(mode);
392ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        }
393ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    }
394ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
3955a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    void setLayerBuffer(hwc2_display_t display, hwc2_layer_t layer,
3965a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            buffer_handle_t buffer, int32_t acquireFence,
3975a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            hwc2_error_t* outErr = nullptr)
3985a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    {
3995a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BUFFER>(
4005a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_BUFFER));
4015a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
4025a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
4035a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
4045a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer, acquireFence));
4055a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        if (outErr) {
4065a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            *outErr = err;
4075a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        } else {
4085a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer buffer";
4095a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        }
4105a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    }
4115a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
412ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    void setLayerColor(hwc2_display_t display, hwc2_layer_t layer,
413ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            hwc_color_t color, hwc2_error_t* outErr = nullptr)
414ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {
415ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COLOR>(
416ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_COLOR));
417ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
418ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
419ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
420ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                color));
421ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        if (outErr) {
422ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            *outErr = err;
423ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        } else {
424ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer color";
425ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        }
426ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    }
427ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
428b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
429b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
430b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    {
431b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
432b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
433b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
434b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
435b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
436b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall                layer, dataspace));
437b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        if (outErr) {
438b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            *outErr = err;
439b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        } else {
440b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
441b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        }
442b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    }
443b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
444600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
445600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
446600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
447600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
448600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
449600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
450600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
451600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
452600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                displayFrame));
453600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        if (outErr) {
454600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            *outErr = err;
455600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        } else {
456600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
457600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                    " frame";
458600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        }
459600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
460600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
4612b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
4622b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            float alpha, hwc2_error_t* outErr = nullptr)
4632b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    {
4642b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
4652b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
4662b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
4672b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
4682b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
4692b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                alpha));
4702b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        if (outErr) {
4712b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            *outErr = err;
4722b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        } else {
4732b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
4742b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    << alpha;
4752b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        }
4762b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    }
4772b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
478c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    void setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer,
479c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            const hwc_frect_t& sourceCrop, hwc2_error_t* outErr = nullptr)
480c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    {
481c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
482c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP));
483c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
484c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
485c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
486c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                sourceCrop));
487c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        if (outErr) {
488c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            *outErr = err;
489c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        } else {
490c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer source crop";
491c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        }
492c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    }
493c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
494ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    void setLayerSurfaceDamage(hwc2_display_t display, hwc2_layer_t layer,
495ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            const hwc_region_t& surfaceDamage, hwc2_error_t* outErr = nullptr)
496ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    {
497ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
498ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE));
499ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
500ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
501ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
502ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                surfaceDamage));
503ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        if (outErr) {
504ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            *outErr = err;
505ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        } else {
506ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer surface"
507ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                    " damage";
508ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        }
509ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    }
510ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
511ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
512ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
513ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    {
514ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
515ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
516ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
517ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
518ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
519ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                transform));
520ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        if (outErr) {
521ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            *outErr = err;
522ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        } else {
523ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
524ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                    << getTransformName(transform);
525ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        }
526ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    }
527ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
528273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
529273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            uint32_t zOrder, hwc2_error_t* outErr = nullptr)
530273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
531273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
532273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
533273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
534273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
535273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
536273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                zOrder));
537273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        if (outErr) {
538273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            *outErr = err;
539273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        } else {
540273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
541273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                    << zOrder;
542273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
543273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
544273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
5454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallprotected:
5464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
5474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
5484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        return mHwc2Device->getFunction(mHwc2Device, descriptor);
5494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
5504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
5524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
5534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        uint32_t num = 0;
5544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
5564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        outCapabilities->resize(num);
5584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num,
5604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                reinterpret_cast<int32_t*>(outCapabilities->data()));
5614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
5624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
563cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* Registers a hotplug callback and waits for hotplug callbacks. This
564cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * function will have no effect if called more than once. */
565cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void populateDisplays()
566cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
567cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to receiving */
568cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        {
569cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            std::lock_guard<std::mutex> lock(mHotplugMutex);
570cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
571cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
572cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
573cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
574cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
575cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
576cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Registers the callback. This function call cannot be locked because
577cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * a callback could happen on the same thread */
578cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
579cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
580cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                hwc2TestHotplugCallback)));
581cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
582cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Waits for hotplug events. If a hotplug event has not come within 1
583cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * second, stop waiting. */
584cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::unique_lock<std::mutex> lock(mHotplugMutex);
585cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
586cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
587cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                std::cv_status::timeout) { }
588cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
589cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to done. Future calls will have no effect */
590cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugStatus = Hwc2TestHotplugStatus::Done;
591cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
592cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
593cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getBadDisplay(hwc2_display_t* outDisplay)
594cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
595cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
596cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mDisplays.count(display) == 0) {
597cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                *outDisplay = display;
598cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
599cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            }
600cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
601cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
602cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " are registered. This should never happen.";
603cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
604cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
6051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* NOTE: will create min(newlayerCnt, max supported layers) layers */
6061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayers(hwc2_display_t display,
6071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
6081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
6091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> newLayers;
6101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
6111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
6121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (size_t i = 0; i < newLayerCnt; i++) {
6141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
6161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err == HWC2_ERROR_NO_RESOURCES)
6171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                break;
6181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err != HWC2_ERROR_NONE) {
6191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                newLayers.clear();
6201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
6211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            }
6221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            newLayers.push_back(layer);
6231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
6241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        *outLayers = std::move(newLayers);
6261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
6271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayers(hwc2_display_t display,
6291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>&& layers)
6301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
6311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (hwc2_layer_t layer : layers) {
6321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
6331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
6341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
6351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
636cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
637cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
638cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
639cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
640cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
641cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
642cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t CONFIG_MAX = UINT32_MAX;
643cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
644cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
645cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " (2^32 values) has been taken which shouldn't happen";
646cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
647cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
648cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (config = 0; config < CONFIG_MAX; config++) {
649cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            if (std::count(configs.begin(), configs.end(), config) == 0)
650cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                break;
651cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
652cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
653cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        *outConfig = config;
654cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
655cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
656572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void enableVsync(hwc2_display_t display)
657572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
658572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
659572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
660572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                hwc2TestVsyncCallback)));
661572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
662572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
663572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
664572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void disableVsync(hwc2_display_t display)
665572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
666572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
667572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
668572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
669572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void waitForVsync(hwc2_display_t* outDisplay = nullptr,
670572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            int64_t* outTimestamp = nullptr)
671572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
672572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        std::unique_lock<std::mutex> lock(mVsyncMutex);
673572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
674572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                std::cv_status::no_timeout) << "timed out attempting to get"
675572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                " vsync callback";
676572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outDisplay)
677572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outDisplay = mVsyncDisplay;
678572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outTimestamp)
679572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outTimestamp = mVsyncTimestamp;
680572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
681572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
6826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a property value from
6836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
6846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
6856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
6865a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
6876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
688273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* Calls a set property function from Hwc2Test to set property values from
689273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
690273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
691273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
6925a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayers* testLayers);
693273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
6946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
6956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
6966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
6976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
6985a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
6996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
7016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
7026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
7036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
7046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Advances a property of Hwc2TestLayer */
7066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
7076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
7096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets the property and then
7106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * destroys the layer */
7116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerProperty(Hwc2TestCoverage coverage,
7126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
7136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
7146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
7156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
7166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
7186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
7206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
721600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
7226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
724600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
725600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
726600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
7276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
7296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
7306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
7325a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            &testLayer, nullptr));
7336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
7356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
7366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
7376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
7386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
7396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
7416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, cycles through each property
7426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * value and updates the layer property value and then destroys the layer */
7436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
7446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
7456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
7466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
7476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
7486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
7506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
7526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
753600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
7546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
756600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
757600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
758600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
7596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
7616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
7636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
7645a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            &testLayer, nullptr));
7656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
7666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
7686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
7696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
7706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
7716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
772273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* For each active display it cycles through each display config and tests
773273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * each property value. It creates multiple layers, calls the
774273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * TestLayerPropertiesFunction to set property values and then
775273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * destroys the layers */
776273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
777273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            TestLayerPropertiesFunction function)
778273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
779273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto display : mDisplays) {
780273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            std::vector<hwc2_config_t> configs;
781273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
782273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
783273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
784273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (auto config : configs) {
785273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                std::vector<hwc2_layer_t> layers;
786600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
787273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
788273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
789600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
790600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
791273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
792273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
793600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayers testLayers(layers, coverage, displayArea);
794273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
795273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                for (auto layer : layers) {
796273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                    EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
7975a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            &testLayers));
798273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                }
799273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
800273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
801273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
802273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
803273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
804273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
8056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config.
8066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 1) It attempts to set a valid property value to bad layer handle.
8076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 2) It creates a layer x and attempts to set a valid property value to
8086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    layer x + 1
8096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 3) It destroys the layer x and attempts to set a valid property value to
8106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    the destroyed layer x.
8116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     */
8126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
8136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyBadLayerFunction function)
8146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
8156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
8166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
8176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
8196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
8216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer = 0;
822600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
8236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
8246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
826600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
827600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
828600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
8296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
8315a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
8326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
8336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
8356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
8375a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
8386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
8396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
8416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
8435a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
8446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
8456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
8466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
8476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
8486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
8506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets a bad property value and
8516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * then destroys the layer */
8526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
8536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
8546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
8556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
8566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
8586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
8606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
8616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
8626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
8646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
8666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
8686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
8696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        " error code";
8706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
8726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
8736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
8746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
8756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
876600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveConfigAttribute(hwc2_display_t display,
877600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue)
878600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
879600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        hwc2_config_t config;
880600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
881600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
882600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                attribute, outValue));
883600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_GE(*outValue, 0) << "failed to get valid "
884600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                << getAttributeName(attribute);
885600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
886600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
887600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
888600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
889600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
890600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
891600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
892600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
893600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
894600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
8954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_device_t* mHwc2Device = nullptr;
896cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
897cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    enum class Hwc2TestHotplugStatus {
898cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Init = 1,
899cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Receiving,
900cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Done,
901cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    };
902cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
903cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::mutex mHotplugMutex;
904cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::condition_variable mHotplugCv;
905cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
906cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::unordered_set<hwc2_display_t> mDisplays;
9071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
9081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* Store all created layers that have not been destroyed. If an ASSERT_*
9091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall     * fails, then destroy the layers on exit */
9101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
91103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
91203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
91303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall     * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
91403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    std::set<hwc2_display_t> mActiveDisplays;
915572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
916572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::mutex mVsyncMutex;
917572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::condition_variable mVsyncCv;
918572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t mVsyncDisplay;
919572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    int64_t mVsyncTimestamp = -1;
9204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall};
9214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
922cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
923cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connection)
924cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
925cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    if (callbackData)
926cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
927cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                connection);
928cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
929cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
930572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
931572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp)
932572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
933572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    if (callbackData)
934572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
935572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                timestamp);
936572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
937572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
938ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallvoid setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
9395a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
940ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
941ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
9425a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getBlendMode(), outErr));
9435a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
9445a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
9455a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wallvoid setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
9465a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
9475a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
9485a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    buffer_handle_t handle;
9495a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    android::base::unique_fd acquireFence;
9505a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    hwc2_composition_t composition = testLayer->getComposition();
9515a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
9525a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (composition == HWC2_COMPOSITION_CLIENT
9535a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            || composition == HWC2_COMPOSITION_SOLID_COLOR
9545a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            || composition == HWC2_COMPOSITION_SIDEBAND)
9555a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return;
9565a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
9575a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (testLayer->getBuffer(&handle, &acquireFence) < 0)
9585a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return;
9595a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
9605a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
9615a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            composition));
9625a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
9635a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            handle, acquireFence, outErr));
964ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
965ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
966ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallvoid setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
9675a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
968ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
969ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
970ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            layer, HWC2_COMPOSITION_SOLID_COLOR));
971ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
9725a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            layer, testLayer->getPlaneAlpha()));
973ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
9745a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            layer, testLayer->getBlendMode()));
975ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
9765a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getColor(), outErr));
977ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
978ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
9796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallvoid setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
9805a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
9816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
9825a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    hwc2_composition_t composition = testLayer->getComposition();
9836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
9846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
9856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
9866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            composition, &err));
9876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (outErr) {
9886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        *outErr = err;
9896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        return;
9906bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
9916bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
9926bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (composition != HWC2_COMPOSITION_SIDEBAND) {
9936bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
9946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    } else {
9956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
9966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                 << "returned wrong error code";
9976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
9986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
9996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10002a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wallvoid setCursorPosition(Hwc2Test* test, hwc2_display_t display,
10015a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
10022a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
10032a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
10042a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            layer, HWC2_COMPOSITION_CURSOR));
10052a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
10065a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
10072a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
10082a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            cursorPosition.left, cursorPosition.top, outErr));
10092a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
10102a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
1011b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallvoid setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
10125a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1013b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1014b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
10155a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getDataspace(), outErr));
1016b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1017b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1018600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallvoid setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
10195a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1020600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1021600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
10225a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getDisplayFrame(), outErr));
1023600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1024600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
10252b1f53060ea8587a428f826cf7890354ff124722Marissa Wallvoid setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
10265a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
10272b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
10282b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
10295a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getBlendMode()));
10302b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
10315a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getPlaneAlpha(), outErr));
10322b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
10332b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
1034c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallvoid setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
10355a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1036c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
1037c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
10385a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getSourceCrop(), outErr));
1039c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
1040c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
1041ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallvoid setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
10425a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1043ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
1044ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
10455a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getSurfaceDamage(), outErr));
1046ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
1047ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
1048ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallvoid setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
10495a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1050ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1051ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
10525a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getTransform(), outErr));
1053ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1054ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
1055273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wallvoid setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
10565a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1057273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
1058273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
10595a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getZOrder(), outErr));
1060273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
1061273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1062ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallbool advanceBlendMode(Hwc2TestLayer* testLayer)
1063ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1064ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    return testLayer->advanceBlendMode();
1065ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1066ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
10675a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wallbool advanceBuffer(Hwc2TestLayer* testLayer)
10685a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
10695a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (testLayer->advanceComposition())
10705a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return true;
10715a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    return testLayer->advanceBufferArea();
10725a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
10735a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
1074ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallbool advanceColor(Hwc2TestLayer* testLayer)
1075ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
1076ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    /* Color depends on blend mode so advance blend mode last so color is not
1077ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall     * force to update as often */
1078ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (testLayer->advancePlaneAlpha())
1079ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return true;
1080ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (testLayer->advanceColor())
1081ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return true;
1082ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    return testLayer->advanceBlendMode();
1083ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
1084ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
10856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallbool advanceComposition(Hwc2TestLayer* testLayer)
10866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
10876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    return testLayer->advanceComposition();
10886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
10896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10902a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wallbool advanceCursorPosition(Hwc2TestLayer* testLayer)
10912a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
10922a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    return testLayer->advanceCursorPosition();
10932a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
10942a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
1095b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallbool advanceDataspace(Hwc2TestLayer* testLayer)
1096b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1097b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    return testLayer->advanceDataspace();
1098b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1099b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1100600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallbool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1101600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1102600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    return testLayer->advanceDisplayFrame();
1103600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1104600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
11052b1f53060ea8587a428f826cf7890354ff124722Marissa Wallbool advancePlaneAlpha(Hwc2TestLayer* testLayer)
11062b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
11072b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    return testLayer->advancePlaneAlpha();
11082b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
11092b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
1110c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallbool advanceSourceCrop(Hwc2TestLayer* testLayer)
1111c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
1112c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    if (testLayer->advanceSourceCrop())
1113c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        return true;
1114c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    return testLayer->advanceBufferArea();
1115c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
1116c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
1117ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallbool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
1118ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
1119ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    if (testLayer->advanceSurfaceDamage())
1120ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        return true;
1121ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    return testLayer->advanceBufferArea();
1122ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
1123ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
1124ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallbool advanceTransform(Hwc2TestLayer* testLayer)
1125ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1126ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    return testLayer->advanceTransform();
1127ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1128ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
11294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
11304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallstatic const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
11314d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
11324d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_LAYER,
11334d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
11344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_LAYER,
11354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
11364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DUMP,
11374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_ACTIVE_CONFIG,
11384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
11394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
11404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_COLOR_MODES,
11414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
11424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
11434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_NAME,
11444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
11454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_TYPE,
11464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DOZE_SUPPORT,
11474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_HDR_CAPABILITIES,
11484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
11494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_RELEASE_FENCES,
11504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_PRESENT_DISPLAY,
11514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_REGISTER_CALLBACK,
11524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_ACTIVE_CONFIG,
11534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CLIENT_TARGET,
11544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_MODE,
11554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_TRANSFORM,
11564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CURSOR_POSITION,
11574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
11584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BUFFER,
11594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COLOR,
11604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
11614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DATASPACE,
11624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
11634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
11644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
11654d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
11664d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_TRANSFORM,
11674d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
11684d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_Z_ORDER,
11694d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_OUTPUT_BUFFER,
11704d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_POWER_MODE,
11714d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_VSYNC_ENABLED,
11724d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_VALIDATE_DISPLAY,
11734d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}};
11744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
11754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 supports all required functions. */
11764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION)
11774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
11784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
11794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hwc2_function_pointer_t pfn = getFunction(descriptor);
11804d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        EXPECT_TRUE(pfn) << "failed to get function "
11814d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << getFunctionDescriptorName(descriptor);
11824d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
11834d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
11844d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
11854d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
11864d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
11874d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
11884d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
11894d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_FALSE(pfn) << "failed to get invalid function";
11904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
11914d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
11924d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
11934d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_CAPABILITIES)
11944d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
11954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    std::vector<hwc2_capability_t> capabilities;
11964d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
11974d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    getCapabilities(&capabilities);
11984d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
11994d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
12004d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            HWC2_CAPABILITY_INVALID), 0);
12014d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
1202a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1203a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wallstatic const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1204a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_HOTPLUG,
1205a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_REFRESH,
1206a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_VSYNC,
1207a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}};
1208a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1209a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can successfully register all required
1210a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall * callback functions. */
1211a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK)
1212a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1213a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1214a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
1215a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1216a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
1217a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1218a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
1219a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
1220a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1221a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1222a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1223a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1224a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1225a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1226a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
1227a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1228a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1229a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1230a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            []() { return; }, &err));
1231a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1232a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1233a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1234a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
1235a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
1236a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1237a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = nullptr;
1238a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1239a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
1240a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1241a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
1242a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
1243a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1244cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1245cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1246cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * physical display. */
1247cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1248cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1249cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    for (auto display : mDisplays) {
1250cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_type_t type;
1251cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1252cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1253cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1254cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " correct display type";
1255cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
1256cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
1257cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1258cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1259cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is requested. */
1260cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1261cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1262cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_t display;
1263cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_type_t type;
1264cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1265cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1266cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1267cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1268cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1269cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1270cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
12711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
12731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
12741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
12751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
12761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
12771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
12791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
12811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
12821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
12831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
12851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_bad_display)
12861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
12871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t display;
12881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_layer_t layer;
12891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
12901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
12921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
12941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
12951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
12961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 will either support a large number of resources
12981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * or will return no resources. */
12991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_no_resources)
13001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
13011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    const size_t layerCnt = 1000;
13021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
13041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> layers;
13051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
13071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
13091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
13101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
13111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
13131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
13141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
13151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t badDisplay;
13161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
13181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
13201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer = 0;
13211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
13221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
13241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
13251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
13271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
13291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
13301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
13321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
13331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
13341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
13361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
13371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
13381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
13391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
13401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
13411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
13431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
13461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
13491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
13521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
13551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
13581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
13601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
13631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
13651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
13671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
1368cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1369cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1370cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_WIDTH,
1371cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_HEIGHT,
1372cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
1373cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1374cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1375cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_VSYNC_PERIOD,
1376cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_X,
1377cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_Y,
1378cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
1379cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1380cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1381cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * config. */
1382cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1383cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1384cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1385cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1386cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1387cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1388cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1389cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
1390cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
1391cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1392cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : requiredAttributes) {
1393cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1394cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
1395cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                EXPECT_GE(value, 0) << "missing required attribute "
1396cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << getAttributeName(attribute) << " for config "
1397cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << config;
1398cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
1399cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : optionalAttributes) {
1400cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1401cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
1402cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
1403cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1404cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1405cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1406cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1407cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1408cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * attribute */
1409cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1410cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1411cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1412cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1413cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1414cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1415cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1416cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1417cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1418cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
1419cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
1420cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t err = HWC2_ERROR_NONE;
1421cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1422cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1423cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1424cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1425cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " attribute for config " << config;
1426cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1427cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1428cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1429cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1430cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1431cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1432cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1433cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
1434cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_config_t config = 0;
1435cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    int32_t value;
1436cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1437cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1438cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1439cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1440cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : requiredAttributes) {
1441cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1442cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
1443cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1444cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1445cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1446cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : optionalAttributes) {
1447cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1448cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
1449cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1450cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1451cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1452cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1453cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1454cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1455cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1456cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1457cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
1458cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        int32_t value;
1459cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
1460cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1461cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1462cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1463cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : requiredAttributes) {
1464cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1465cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1466cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1467cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1468cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1469cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : optionalAttributes) {
1470cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1471cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1472cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1473cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1474cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1475cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1476cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1477cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1478cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1479cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1480cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1481cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1482cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1483cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1484cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1485cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1486cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1487cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1488cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1489cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1490cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
1491cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    std::vector<hwc2_config_t> configs;
1492cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1493cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1494cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1495cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1496cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1497cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1498cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1499cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1500cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1501cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1502cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1503cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * times in a row. */
1504cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1505cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1506cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1507cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs1, configs2;
1508cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1509cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
1510cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
1511cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1512cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
1513cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs2.begin())) << "returned two different config sets";
1514cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1515cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1516cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1517cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
1518cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
1519cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1520cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1521cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1522cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1523cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1524cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1525cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
1526cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs.end());
1527cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
1528cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " configs";
1529cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1530cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
153193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
153293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 returns the active config for a display */
153393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
153493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
153593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
153693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
153793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
153893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
153993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
154093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
154193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_config_t activeConfig;
154293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
154393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
154493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
154593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
154693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(activeConfig, config) << "failed to get active config";
154793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
154893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
154993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
155093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
155193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
155293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * display. */
155393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
155493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
155593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
155693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_config_t activeConfig;
155793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
155893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
155993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
156093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
156193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
156293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
156393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
156493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
156593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
156693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 either begins with a valid active config
156793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * or returns an error when getActiveConfig is called. */
156893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
156993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
157093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
157193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
157293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t activeConfig;
157393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
157493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
157593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
157693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
157793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (configs.empty())
157893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            return;
157993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
158093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
158193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (err == HWC2_ERROR_NONE) {
158293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NE(std::count(configs.begin(), configs.end(),
158393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    activeConfig), 0) << "active config is not found in "
158493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " configs for display";
158593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
158693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
158793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
158893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
158993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
159093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
159193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 can set every display config as an active
159293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * config */
159393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
159493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
159593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
159693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
159793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
159893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
159993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
160093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
160193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
160293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
160393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
160493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
160593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
160693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
160793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
160893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
160993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
161093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    const hwc2_config_t config = 0;
161193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
161293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
161393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
161493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
161593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
161693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
161793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
161893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
161993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
162093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
162193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
162293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
162393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t config;
162493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
162593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
162693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
162793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
162893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
162993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
163093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
163193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
163203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
163303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
163403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT)
163503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
163603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
163703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
163803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
163903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
164003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
164103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
164203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
164303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
164403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
164503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
164603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
164703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
164803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
164903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
165003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
165103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
165203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
165303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
165403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
165503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
165603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
165703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
165803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
165903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set all supported power modes */
166003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE)
166103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
166203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
166303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
166403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
166503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
166603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
166703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
166803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
166903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
167003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
167103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
167203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
167303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
167403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
167503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
167603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
167703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
167803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
167903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
168003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
168103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
168203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
168303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
168403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
168503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
168603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
168703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
168803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
168903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
169003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
169103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
169203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
169303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
169403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
169503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    if (support != 1)
169603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        return;
169703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
169803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
169903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
170003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
170103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
170203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            &err));
170303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
170403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
170503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
170603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
170703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
170803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
170903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
171003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
171103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND + 1);
171203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
171303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
171403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
171503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
171603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                << mode;
171703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
171803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
171903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
172003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
172103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall * an optional power mode. */
172203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
172303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
172403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
172503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
172603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
172703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
172803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
172903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support == 1)
173003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
173103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
173203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_EQ(support, 0) << "invalid doze support value";
173303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
173403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
173503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                &err));
173603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
173703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
173803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
173903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND, &err));
174003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) <<  "returned wrong error code";
174103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
174203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
174303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
174403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
174503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_stress)
174603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
174703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
174803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
174903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
175003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
175103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
175203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
175303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
175403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
175503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
175603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
175703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
175803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
175903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
176003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
176103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
176203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
176303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
176403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
176503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
176603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
176703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
176803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
176903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
177003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
177103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
177203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
1773572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1774572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
1775572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * displays */
1776572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED)
1777572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1778572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1779572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1780572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1781572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1782572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1783572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1784572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1785572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1786572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1787572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1788572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1789572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1790572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1791572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1792572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1793572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1794572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1795572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
1796572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
1797572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1798572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1799572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t receivedDisplay;
1800572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        int64_t receivedTimestamp;
1801572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1802572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1803572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1804572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1805572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1806572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
1807572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &receivedTimestamp));
1808572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1809572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
1810572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
1811572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1812572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1813572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1814572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1815572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1816572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1817572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1818572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
1819572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
1820572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1821572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t display;
1822572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1823572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            const_cast<char*>("data"));
1824572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1825572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1826572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1827572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1828572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1829572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            []() { return; }));
1830572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1831572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
1832572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1833572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1834572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
1835572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1836572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1837572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1838572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
1839572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
1840572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1841572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1842572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1843572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1844572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
1845572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1846572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1847572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1848572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1849572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1850572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1851572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
1852572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &err));
1853572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1854572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1855572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1856572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1857572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1858572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1859572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
1860572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * times. */
1861572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
1862572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1863572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1864572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1865572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1866572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1867572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1868572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1869572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1870572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1871572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1872572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1873572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1874572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1875572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1876572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1877572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1878572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1879572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1880572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1881572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1882572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1883572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1884572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
1885572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is off and no callback is registered. */
1886572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
1887572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1888572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
1889572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1890572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1891572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1892572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1893572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
1894572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1895572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1896572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1897572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1898572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1899572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
1900572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is registered. */
1901572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
1902572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1903572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
1904572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1905572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1906572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1907572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1908572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1909572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1910572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
1911572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1912572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1913572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1914572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1915572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1916572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1917dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1918dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 returns a display name for each display */
1919dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME)
1920dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
1921dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    for (auto display : mDisplays) {
1922dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        std::string name;
1923dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1924dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
1925dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
1926dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
1927dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1928dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
1929dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall * display */
1930dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
1931dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
1932dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_display_t display;
1933dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    std::string name;
1934dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1935dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1936dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1937dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1938dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
1939dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1940dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
19416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
19426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can set basic composition types. */
19436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
19446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
19456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
19466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
19476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
19486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
19496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
19506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * layer. */
19516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
19526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
19536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
19546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
19556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
19566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
19576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
19586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
19596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
19606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
19616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition));
19626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
19636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
19646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
19656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
19666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
19676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
19686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
19696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    hwc2_error_t* outErr) {
19706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
19716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
19726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        layer, HWC2_COMPOSITION_INVALID, outErr));
19736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
19746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ));
19756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
1976ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
19772a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
19782a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION)
19792a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
19802a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
19812a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ::setCursorPosition, advanceCursorPosition));
19822a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
19832a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
19842a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
19852a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
19862a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
19872a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
19882a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ::setCursorPosition, advanceCursorPosition));
19892a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
19902a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
19912a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
19922a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
19932a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
19942a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
19952a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
19962a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
19975a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
19982a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
19995a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
20002a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
20012a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        cursorPosition.left, cursorPosition.top, outErr));
20022a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            },
20032a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
20042a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            advanceCursorPosition));
20052a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
20062a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
20072a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
20082a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall * display. */
20092a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
20102a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
20112a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_display_t display;
20122a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_layer_t layer = 0;
20132a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    int32_t x = 0, y = 0;
20142a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
20152a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
20162a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
20172a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
20182a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
20192a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
20202a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
20212a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
20222a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
20232a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
20242a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
20252a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
20262a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
20275a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
20282a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
20295a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
20302a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
20312a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        badLayer, cursorPosition.left, cursorPosition.top,
20322a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        outErr));
20332a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            }
20342a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall   ));
20352a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
20362a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
2037ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
2038ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
2039ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2040ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2041ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
2042ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2043ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2044ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
2045ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
2046ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2047ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2048ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
2049ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2050ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2051ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
2052ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
2053ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2054ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2055ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode));
2056ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2057ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2058ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
2059ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
2060ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2061ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2062ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2063ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    hwc2_error_t* outErr) {
2064ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2065ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
2066ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                        layer, HWC2_BLEND_MODE_INVALID, outErr));
2067ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            }
2068ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ));
2069ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2070b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
20715a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
20725a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER)
20735a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
20745a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
20755a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            setBuffer, advanceBuffer));
20765a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
20775a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
20785a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
20795a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
20805a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
20815a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
20825a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            setBuffer, advanceBuffer));
20835a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
20845a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
20855a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
20865a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
20875a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
20885a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
20895a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
20905a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
20915a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
20925a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer_handle_t handle = nullptr;
20935a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                android::base::unique_fd acquireFence;
20945a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
20955a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                /* If there is not available buffer for the given buffer
20965a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                 * properties, it should not fail this test case */
20975a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
20985a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    *outErr = HWC2_ERROR_BAD_LAYER;
20995a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    return;
21005a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                }
21015a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
21025a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
21035a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        handle, acquireFence, outErr));
21045a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            }
21055a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ));
21065a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
21075a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
21085a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
21095a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
21105a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
21115a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
21125a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
21135a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    hwc2_error_t* outErr) {
21145a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
21155a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer_handle_t handle = nullptr;
21165a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                int32_t acquireFence = -1;
21175a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
21185a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
21195a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        handle, acquireFence, outErr));
21205a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            }
21215a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ));
21225a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
21235a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
2124ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
2125ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR)
2126ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2127ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2128ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            setColor, advanceColor));
2129ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2130ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2131ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
2132ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_update)
2133ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2134ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2135ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            setColor, advanceColor));
2136ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2137ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2138ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
2139ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
2140ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
2141ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2142ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
2143ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
21445a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2145ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2146ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
21475a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayer->getColor(), outErr));
2148ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            },
2149ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2150ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            advanceColor));
2151ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2152ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2153ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
2154ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
2155ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2156ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2157ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
21585a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2159ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2160ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
21615a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayer->getColor(), outErr));
2162ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            }
2163ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ));
2164ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2165ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2166b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
2167b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE)
2168b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
2169b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2170b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
2171b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
2172b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
2173b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
2174b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
2175b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
2176b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2177b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
2178b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
2179b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
2180b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
2181b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
2182b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
2183b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2184b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace));
2185b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
21862b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
2187600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
2188600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
2189600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
2190600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2191600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
2192600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
2193600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
2194600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
2195600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
2196600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
2197600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2198600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
2199600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
2200600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
2201600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
2202600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
2203600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
2204600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2205600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame));
2206600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
2207600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
22082b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
22092b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
22102b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
22112b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
22122b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
22132b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
22142b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
22152b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
22162b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
22172b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
22182b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
22192b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
22202b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
22212b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
22222b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
22232b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
22242b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
22252b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
22262b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
22275a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
22282b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
22292b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
22305a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            badLayer, testLayer->getPlaneAlpha(), outErr));
22312b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            }
22322b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ));
22332b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
2234ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2235c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
2236c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
2237c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2238c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2239c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop, advanceSourceCrop));
2240c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2241c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2242c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
2243c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
2244c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2245c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2246c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop, advanceSourceCrop));
2247c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2248c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2249c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
2250c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
2251c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2252c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2253c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop));
2254c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2255c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2256ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
2257ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
2258ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
2259ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2260ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage, advanceSurfaceDamage));
2261ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
2262ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
2263ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
2264ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
2265ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
2266ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2267ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage, advanceSurfaceDamage));
2268ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
2269ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
2270ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
2271ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
2272ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
2273ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2274ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage));
2275ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
2276ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
2277ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
2278ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
2279ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2280ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2281ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
2282ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2283ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2284ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
2285ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
2286ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2287ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2288ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
2289ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2290ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2291ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
2292ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
2293ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2294ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2295ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform));
2296ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2297273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2298273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
2299273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
2300273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2301273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
2302273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
23035a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayers* testLayers) {
2304273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2305273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
23065a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayers->getZOrder(layer)));
2307273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
2308273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ));
2309273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
2310273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2311273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
2312273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
2313273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2314273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
2315273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
2316273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX / 2),
2317273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX) };
2318273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2319273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    for (auto display : mDisplays) {
2320273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        std::vector<hwc2_config_t> configs;
2321273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2322273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2323273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2324273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto config : configs) {
2325273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_layer_t layer;
2326273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2327273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2328273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2329273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2330273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2331273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (uint32_t zOrder : zOrders) {
2332273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
2333273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
2334273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2335273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2336273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
2337273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
2338273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
2339273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2340273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
2341273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
2342273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2343273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2344273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            setZOrder));
2345273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
2346