Hwc2Test.cpp revision 600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7
14d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/*
24d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * Copyright (C) 2016 The Android Open Source Project
34d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *
44d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * Licensed under the Apache License, Version 2.0 (the "License");
54d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * you may not use this file except in compliance with the License.
64d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * You may obtain a copy of the License at
74d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *
84d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *      http://www.apache.org/licenses/LICENSE-2.0
94d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *
104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * Unless required by applicable law or agreed to in writing, software
114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * distributed under the License is distributed on an "AS IS" BASIS,
124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * See the License for the specific language governing permissions and
144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * limitations under the License.
154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall */
164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <array>
18cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall#include <unordered_set>
194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <gtest/gtest.h>
204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <dlfcn.h>
214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <hardware/hardware.h>
224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#define HWC2_INCLUDE_STRINGIFICATION
244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#define HWC2_USE_CPP11
254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <hardware/hwcomposer2.h>
264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#undef HWC2_INCLUDE_STRINGIFICATION
274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#undef HWC2_USE_CPP11
284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall#include "Hwc2TestLayer.h"
30273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall#include "Hwc2TestLayers.h"
316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
32cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
33cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connected);
34572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
35572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp);
36cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallclass Hwc2Test : public testing::Test {
384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallpublic:
394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void SetUp()
414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hw_module_t const* hwc2Module;
434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        /* The following method will fail if you have not run
494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall         * "adb shell stop" */
504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        err = hwc2_open(hwc2Module, &mHwc2Device);
514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
53cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
54cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        populateDisplays();
554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void TearDown()
584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (auto itr = mLayers.begin(); itr != mLayers.end();) {
611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_display_t display = itr->first;
621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_layer_t layer = itr->second;
631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            itr++;
641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            /* Destroys and removes the layer from mLayers */
651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            destroyLayer(display, layer);
661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
6903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_display_t display = *itr;
7003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            itr++;
7103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            /* Sets power mode to off and removes the display from
7203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall             * mActiveDisplays */
7303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            setPowerMode(display, HWC2_POWER_MODE_OFF);
7403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
7503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        if (mHwc2Device)
774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            hwc2_close(mHwc2Device);
784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
80a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    void registerCallback(hwc2_callback_descriptor_t descriptor,
81a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
82a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_error_t* outErr = nullptr)
83a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    {
84a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
85a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
86a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
87a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
88a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
89a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                callbackData, pointer));
90a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        if (outErr) {
91a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            *outErr = err;
92a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        } else {
93a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
94a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        }
95a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
96a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
97cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
98cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            hwc2_error_t* outErr = nullptr)
99cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
100cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
101cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
102cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
103cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
104cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
105cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                    reinterpret_cast<int32_t*>(outType)));
106cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (outErr) {
107cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            *outErr = err;
108cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        } else {
109cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
110cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
111cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
112cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
113cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* If the populateDisplays function is still receiving displays and the
114cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * display is connected, the display handle is stored in mDisplays. */
115cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void hotplugCallback(hwc2_display_t display, int32_t connected)
116cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
117cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::lock_guard<std::mutex> lock(mHotplugMutex);
118cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
119cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
120cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            return;
121cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
122cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (connected == HWC2_CONNECTION_CONNECTED)
123cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mDisplays.insert(display);
124cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
125cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugCv.notify_all();
126cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
127cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
1291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
1321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_CREATE_LAYER));
1331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
1361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                outLayer));
1371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.insert(std::make_pair(display, *outLayer));
1401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
1451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
1491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
1521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_DESTROY_LAYER));
1531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
1561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.erase(std::make_pair(display, layer));
1591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
1641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                    << layer;
1651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
168cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
169cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue,
170cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
171cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
172cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
173cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
174cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
175cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
176cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
177cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                attribute, outValue));
178cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
179cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
180cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
181cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
182cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
183cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    << getAttributeName(attribute) << " for config " << config;
184cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
185cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
186cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
187cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayConfigs(hwc2_display_t display,
188cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            std::vector<hwc2_config_t>* outConfigs,
189cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
190cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
191cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
192cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
193cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
194cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
195cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        uint32_t numConfigs = 0;
196cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
197cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
198cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &numConfigs, nullptr));
199cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
200cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (err == HWC2_ERROR_NONE) {
201cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            outConfigs->resize(numConfigs);
202cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
203cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
204cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    &numConfigs, outConfigs->data()));
205cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
206cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
207cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
208cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
209cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
210cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
211cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " display " << display;
212cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
213cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
214cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
21593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
21693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
21793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
21893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
21993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
22093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
22193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
22293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
22393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                outConfig));
22493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
22593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
22693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
22793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
22893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " display " << display;
22993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
23093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
23193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
23293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
23393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
23493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
23593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
23693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
23793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
23893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
23993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
24093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
24193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
24293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
24393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
24493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    << config;
24593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
24693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
24793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
24803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
24903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_error_t* outErr = nullptr)
25003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    {
25103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
25203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
25303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
25403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
25503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
25603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                outSupport));
25703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (outErr) {
25803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            *outErr = err;
25903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
26003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
26103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                    " display " << display;
26203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
26303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
26403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
26503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
26603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_error_t* outErr = nullptr)
26703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    {
26803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
26903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                getFunction(HWC2_FUNCTION_SET_POWER_MODE));
27003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
27103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
27203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
27303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                mode));
27403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (outErr) {
27503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            *outErr = err;
27603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            if (err != HWC2_ERROR_NONE)
27703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                return;
27803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
27903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
28003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                    << getPowerModeName(mode) << " on display " << display;
28103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
28203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
28303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (mode == HWC2_POWER_MODE_OFF) {
28403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            mActiveDisplays.erase(display);
28503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
28603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            mActiveDisplays.insert(display);
28703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
28803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
28903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
290572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
291572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            hwc2_error_t* outErr = nullptr)
292572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
293572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
294572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
295572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
296572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
297572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
298572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                enabled));
299572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outErr) {
300572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outErr = err;
301572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        } else {
302572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
303572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                    << getVsyncName(enabled);
304572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        }
305572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
306572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
307572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void vsyncCallback(hwc2_display_t display, int64_t timestamp)
308572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
309572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        std::lock_guard<std::mutex> lock(mVsyncMutex);
310572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncDisplay = display;
311572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncTimestamp = timestamp;
312572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncCv.notify_all();
313572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
314572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
315dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    void getDisplayName(hwc2_display_t display, std::string* outName,
316dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                hwc2_error_t* outErr = nullptr)
317dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    {
318dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
319dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
320dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
321dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
322dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        uint32_t size = 0;
323dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
324dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
325dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                nullptr));
326dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
327dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        if (err == HWC2_ERROR_NONE) {
328dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            std::vector<char> name(size);
329dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
330dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
331dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                    name.data()));
332dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
333dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            outName->assign(name.data());
334dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        }
335dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
336dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        if (outErr) {
337dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            *outErr = err;
338dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        } else {
339dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
340dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                    << display;
341dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        }
342dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
343dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
3446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
3456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
3466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
3476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
3486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
3496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
3506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
3516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
3526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                composition));
3536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        if (outErr) {
3546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            *outErr = err;
3556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        } else {
3566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
3576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    " type " << getCompositionName(composition);
3586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
3596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
3606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
361ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
362ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
363ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    {
364ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
365ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
366ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
367ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
368ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
369ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                mode));
370ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        if (outErr) {
371ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            *outErr = err;
372ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        } else {
373ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
374ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    << getBlendModeName(mode);
375ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        }
376ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    }
377ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
378b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
379b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
380b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    {
381b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
382b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
383b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
384b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
385b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
386b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall                layer, dataspace));
387b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        if (outErr) {
388b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            *outErr = err;
389b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        } else {
390b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
391b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        }
392b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    }
393b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
394600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
395600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
396600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
397600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
398600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
399600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
400600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
401600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
402600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                displayFrame));
403600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        if (outErr) {
404600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            *outErr = err;
405600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        } else {
406600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
407600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                    " frame";
408600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        }
409600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
410600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
4112b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
4122b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            float alpha, hwc2_error_t* outErr = nullptr)
4132b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    {
4142b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
4152b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
4162b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
4172b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
4182b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
4192b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                alpha));
4202b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        if (outErr) {
4212b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            *outErr = err;
4222b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        } else {
4232b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
4242b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    << alpha;
4252b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        }
4262b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    }
4272b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
428ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
429ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
430ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    {
431ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
432ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
433ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
434ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
435ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
436ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                transform));
437ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        if (outErr) {
438ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            *outErr = err;
439ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        } else {
440ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
441ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                    << getTransformName(transform);
442ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        }
443ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    }
444ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
445273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
446273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            uint32_t zOrder, hwc2_error_t* outErr = nullptr)
447273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
448273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
449273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
450273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
451273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
452273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
453273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                zOrder));
454273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        if (outErr) {
455273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            *outErr = err;
456273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        } else {
457273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
458273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                    << zOrder;
459273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
460273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
461273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
4624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallprotected:
4634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
4644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
4654d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        return mHwc2Device->getFunction(mHwc2Device, descriptor);
4664d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
4674d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
4684d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
4694d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
4704d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        uint32_t num = 0;
4714d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
4724d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
4734d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
4744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        outCapabilities->resize(num);
4754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
4764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num,
4774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                reinterpret_cast<int32_t*>(outCapabilities->data()));
4784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
4794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
480cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* Registers a hotplug callback and waits for hotplug callbacks. This
481cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * function will have no effect if called more than once. */
482cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void populateDisplays()
483cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
484cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to receiving */
485cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        {
486cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            std::lock_guard<std::mutex> lock(mHotplugMutex);
487cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
488cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
489cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
490cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
491cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
492cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
493cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Registers the callback. This function call cannot be locked because
494cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * a callback could happen on the same thread */
495cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
496cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
497cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                hwc2TestHotplugCallback)));
498cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
499cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Waits for hotplug events. If a hotplug event has not come within 1
500cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * second, stop waiting. */
501cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::unique_lock<std::mutex> lock(mHotplugMutex);
502cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
503cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
504cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                std::cv_status::timeout) { }
505cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
506cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to done. Future calls will have no effect */
507cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugStatus = Hwc2TestHotplugStatus::Done;
508cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
509cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
510cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getBadDisplay(hwc2_display_t* outDisplay)
511cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
512cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
513cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mDisplays.count(display) == 0) {
514cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                *outDisplay = display;
515cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
516cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            }
517cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
518cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
519cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " are registered. This should never happen.";
520cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
521cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
5221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* NOTE: will create min(newlayerCnt, max supported layers) layers */
5231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayers(hwc2_display_t display,
5241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
5251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
5261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> newLayers;
5271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
5281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
5291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (size_t i = 0; i < newLayerCnt; i++) {
5311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
5331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err == HWC2_ERROR_NO_RESOURCES)
5341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                break;
5351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err != HWC2_ERROR_NONE) {
5361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                newLayers.clear();
5371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
5381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            }
5391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            newLayers.push_back(layer);
5401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
5411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        *outLayers = std::move(newLayers);
5431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
5441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayers(hwc2_display_t display,
5461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>&& layers)
5471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
5481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (hwc2_layer_t layer : layers) {
5491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
5501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
5511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
5521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
553cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
554cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
555cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
556cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
557cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
558cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
559cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t CONFIG_MAX = UINT32_MAX;
560cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
561cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
562cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " (2^32 values) has been taken which shouldn't happen";
563cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
564cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
565cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (config = 0; config < CONFIG_MAX; config++) {
566cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            if (std::count(configs.begin(), configs.end(), config) == 0)
567cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                break;
568cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
569cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
570cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        *outConfig = config;
571cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
572cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
573572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void enableVsync(hwc2_display_t display)
574572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
575572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
576572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
577572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                hwc2TestVsyncCallback)));
578572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
579572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
580572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
581572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void disableVsync(hwc2_display_t display)
582572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
583572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
584572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
585572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
586572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void waitForVsync(hwc2_display_t* outDisplay = nullptr,
587572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            int64_t* outTimestamp = nullptr)
588572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
589572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        std::unique_lock<std::mutex> lock(mVsyncMutex);
590572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
591572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                std::cv_status::no_timeout) << "timed out attempting to get"
592572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                " vsync callback";
593572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outDisplay)
594572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outDisplay = mVsyncDisplay;
595572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outTimestamp)
596572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outTimestamp = mVsyncTimestamp;
597572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
598572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
5996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a property value from
6006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
6016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
6026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
6036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
6046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
605273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* Calls a set property function from Hwc2Test to set property values from
606273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
607273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
608273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
609273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            const Hwc2TestLayers& testLayers);
610273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
6116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
6126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
6136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
6146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
6156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
6166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
6186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
6196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
6206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
6216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Advances a property of Hwc2TestLayer */
6236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
6246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
6266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets the property and then
6276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * destroys the layer */
6286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerProperty(Hwc2TestCoverage coverage,
6296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
6306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
6316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
6326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
6336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
6356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
6376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
638600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
6396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
641600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
642600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
643600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
6446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
6466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
6476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
6496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                            testLayer, nullptr));
6506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
6526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
6536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
6546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
6556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
6566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
6586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, cycles through each property
6596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * value and updates the layer property value and then destroys the layer */
6606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
6616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
6626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
6636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
6646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
6656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
6676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
6696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
670600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
6716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
673600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
674600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
675600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
6766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
6786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
6806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
6816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                            testLayer, nullptr));
6826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
6836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
6856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
6866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
6876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
6886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
689273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* For each active display it cycles through each display config and tests
690273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * each property value. It creates multiple layers, calls the
691273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * TestLayerPropertiesFunction to set property values and then
692273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * destroys the layers */
693273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
694273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            TestLayerPropertiesFunction function)
695273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
696273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto display : mDisplays) {
697273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            std::vector<hwc2_config_t> configs;
698273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
699273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
700273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
701273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (auto config : configs) {
702273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                std::vector<hwc2_layer_t> layers;
703600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
704273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
705273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
706600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
707600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
708273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
709273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
710600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayers testLayers(layers, coverage, displayArea);
711273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
712273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                for (auto layer : layers) {
713273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                    EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
714273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                            testLayers));
715273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                }
716273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
717273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
718273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
719273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
720273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
721273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
7226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config.
7236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 1) It attempts to set a valid property value to bad layer handle.
7246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 2) It creates a layer x and attempts to set a valid property value to
7256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    layer x + 1
7266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 3) It destroys the layer x and attempts to set a valid property value to
7276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    the destroyed layer x.
7286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     */
7296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
7306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyBadLayerFunction function)
7316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
7326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
7336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
7346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
7366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
7386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer = 0;
739600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
7406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
7416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
743600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
744600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
745600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
7466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
7486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        testLayer, &err));
7496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
7506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
7526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
7546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        testLayer, &err));
7556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
7566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
7586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
7606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        testLayer, &err));
7616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
7626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
7636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
7646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
7656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
7676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets a bad property value and
7686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * then destroys the layer */
7696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
7706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
7716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
7726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
7736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
7756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
7776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
7786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
7796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
7816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
7836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
7856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
7866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        " error code";
7876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
7896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
7906bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
7916bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
7926bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
793600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveConfigAttribute(hwc2_display_t display,
794600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue)
795600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
796600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        hwc2_config_t config;
797600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
798600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
799600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                attribute, outValue));
800600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_GE(*outValue, 0) << "failed to get valid "
801600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                << getAttributeName(attribute);
802600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
803600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
804600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
805600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
806600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
807600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
808600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
809600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
810600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
811600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
8124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_device_t* mHwc2Device = nullptr;
813cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
814cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    enum class Hwc2TestHotplugStatus {
815cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Init = 1,
816cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Receiving,
817cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Done,
818cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    };
819cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
820cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::mutex mHotplugMutex;
821cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::condition_variable mHotplugCv;
822cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
823cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::unordered_set<hwc2_display_t> mDisplays;
8241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
8251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* Store all created layers that have not been destroyed. If an ASSERT_*
8261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall     * fails, then destroy the layers on exit */
8271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
82803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
82903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
83003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall     * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
83103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    std::set<hwc2_display_t> mActiveDisplays;
832572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
833572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::mutex mVsyncMutex;
834572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::condition_variable mVsyncCv;
835572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t mVsyncDisplay;
836572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    int64_t mVsyncTimestamp = -1;
8374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall};
8384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
839cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
840cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connection)
841cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
842cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    if (callbackData)
843cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
844cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                connection);
845cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
846cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
847572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
848572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp)
849572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
850572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    if (callbackData)
851572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
852572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                timestamp);
853572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
854572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
855ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallvoid setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
856ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
857ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
858ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
859ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            testLayer.getBlendMode(), outErr));
860ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
861ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
8626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallvoid setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
8636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
8646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
8656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    hwc2_composition_t composition = testLayer.getComposition();
8666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
8676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
8696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            composition, &err));
8706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (outErr) {
8716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        *outErr = err;
8726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        return;
8736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
8746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (composition != HWC2_COMPOSITION_SIDEBAND) {
8766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
8776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    } else {
8786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
8796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                 << "returned wrong error code";
8806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
8816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
8826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
883b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallvoid setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
884b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
885b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
886b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
887b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            testLayer.getDataspace(), outErr));
888b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
889b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
890600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallvoid setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
891600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
892600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
893600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
894600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            testLayer.getDisplayFrame(), outErr));
895600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
896600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
8972b1f53060ea8587a428f826cf7890354ff124722Marissa Wallvoid setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
8982b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t *outErr)
8992b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
9002b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
9012b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            testLayer.getBlendMode()));
9022b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
9032b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            testLayer.getPlaneAlpha(), outErr));
9042b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
9052b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
906ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallvoid setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
907ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
908ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
909ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
910ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            testLayer.getTransform(), outErr));
911ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
912ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
913273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wallvoid setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
914273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
915273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
916273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
917273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            testLayer.getZOrder(), outErr));
918273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
919273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
920ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallbool advanceBlendMode(Hwc2TestLayer* testLayer)
921ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
922ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    return testLayer->advanceBlendMode();
923ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
924ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
9256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallbool advanceComposition(Hwc2TestLayer* testLayer)
9266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
9276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    return testLayer->advanceComposition();
9286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
9296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
930b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallbool advanceDataspace(Hwc2TestLayer* testLayer)
931b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
932b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    return testLayer->advanceDataspace();
933b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
934b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
935600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallbool advanceDisplayFrame(Hwc2TestLayer* testLayer)
936600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
937600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    return testLayer->advanceDisplayFrame();
938600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
939600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
9402b1f53060ea8587a428f826cf7890354ff124722Marissa Wallbool advancePlaneAlpha(Hwc2TestLayer* testLayer)
9412b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
9422b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    return testLayer->advancePlaneAlpha();
9432b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
9442b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
945ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallbool advanceTransform(Hwc2TestLayer* testLayer)
946ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
947ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    return testLayer->advanceTransform();
948ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
949ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
9504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
9514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallstatic const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
9524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
9534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_LAYER,
9544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
9554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_LAYER,
9564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
9574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DUMP,
9584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_ACTIVE_CONFIG,
9594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
9604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
9614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_COLOR_MODES,
9624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
9634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
9644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_NAME,
9654d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
9664d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_TYPE,
9674d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DOZE_SUPPORT,
9684d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_HDR_CAPABILITIES,
9694d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
9704d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_RELEASE_FENCES,
9714d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_PRESENT_DISPLAY,
9724d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_REGISTER_CALLBACK,
9734d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_ACTIVE_CONFIG,
9744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CLIENT_TARGET,
9754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_MODE,
9764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_TRANSFORM,
9774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CURSOR_POSITION,
9784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
9794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BUFFER,
9804d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COLOR,
9814d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
9824d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DATASPACE,
9834d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
9844d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
9854d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
9864d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
9874d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_TRANSFORM,
9884d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
9894d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_Z_ORDER,
9904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_OUTPUT_BUFFER,
9914d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_POWER_MODE,
9924d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_VSYNC_ENABLED,
9934d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_VALIDATE_DISPLAY,
9944d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}};
9954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
9964d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 supports all required functions. */
9974d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION)
9984d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
9994d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
10004d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hwc2_function_pointer_t pfn = getFunction(descriptor);
10014d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        EXPECT_TRUE(pfn) << "failed to get function "
10024d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << getFunctionDescriptorName(descriptor);
10034d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
10044d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
10054d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10064d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
10074d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
10084d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
10094d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
10104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_FALSE(pfn) << "failed to get invalid function";
10114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
10124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
10144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_CAPABILITIES)
10154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
10164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    std::vector<hwc2_capability_t> capabilities;
10174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10184d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    getCapabilities(&capabilities);
10194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
10214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            HWC2_CAPABILITY_INVALID), 0);
10224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
1023a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1024a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wallstatic const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1025a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_HOTPLUG,
1026a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_REFRESH,
1027a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_VSYNC,
1028a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}};
1029a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1030a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can successfully register all required
1031a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall * callback functions. */
1032a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK)
1033a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1034a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1035a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
1036a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1037a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
1038a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1039a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
1040a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
1041a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1042a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1043a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1044a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1045a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1046a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1047a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
1048a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1049a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1050a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1051a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            []() { return; }, &err));
1052a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1053a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1054a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1055a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
1056a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
1057a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1058a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = nullptr;
1059a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1060a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
1061a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1062a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
1063a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
1064a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1065cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1066cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1067cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * physical display. */
1068cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1069cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1070cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    for (auto display : mDisplays) {
1071cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_type_t type;
1072cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1073cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1074cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1075cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " correct display type";
1076cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
1077cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
1078cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1079cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1080cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is requested. */
1081cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1082cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1083cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_t display;
1084cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_type_t type;
1085cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1086cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1087cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1088cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1089cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1090cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1091cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
10921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
10941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
10951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
10961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
10971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
10981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
11001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
11021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
11031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
11041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
11061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_bad_display)
11071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
11081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t display;
11091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_layer_t layer;
11101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
11111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
11131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
11151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
11161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
11171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 will either support a large number of resources
11191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * or will return no resources. */
11201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_no_resources)
11211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
11221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    const size_t layerCnt = 1000;
11231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
11251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> layers;
11261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
11281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
11301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
11311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
11321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
11341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
11351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
11361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t badDisplay;
11371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
11391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
11411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer = 0;
11421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
11431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
11451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
11461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
11481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
11501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
11511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
11531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
11541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
11551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
11571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
11581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
11591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
11601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
11611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
11621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
11641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
11671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
11701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
11731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
11761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
11791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
11811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
11841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
11861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
11881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
1189cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1190cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1191cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_WIDTH,
1192cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_HEIGHT,
1193cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
1194cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1195cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1196cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_VSYNC_PERIOD,
1197cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_X,
1198cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_Y,
1199cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
1200cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1201cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1202cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * config. */
1203cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1204cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1205cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1206cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1207cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1208cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1209cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1210cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
1211cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
1212cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1213cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : requiredAttributes) {
1214cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1215cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
1216cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                EXPECT_GE(value, 0) << "missing required attribute "
1217cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << getAttributeName(attribute) << " for config "
1218cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << config;
1219cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
1220cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : optionalAttributes) {
1221cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1222cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
1223cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
1224cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1225cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1226cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1227cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1228cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1229cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * attribute */
1230cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1231cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1232cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1233cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1234cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1235cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1236cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1237cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1238cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1239cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
1240cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
1241cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t err = HWC2_ERROR_NONE;
1242cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1243cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1244cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1245cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1246cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " attribute for config " << config;
1247cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1248cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1249cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1250cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1251cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1252cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1253cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1254cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
1255cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_config_t config = 0;
1256cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    int32_t value;
1257cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1258cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1259cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1260cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1261cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : requiredAttributes) {
1262cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1263cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
1264cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1265cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1266cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1267cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : optionalAttributes) {
1268cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1269cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
1270cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1271cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1272cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1273cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1274cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1275cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1276cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1277cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1278cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
1279cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        int32_t value;
1280cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
1281cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1282cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1283cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1284cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : requiredAttributes) {
1285cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1286cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1287cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1288cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1289cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1290cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : optionalAttributes) {
1291cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1292cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1293cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1294cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1295cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1296cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1297cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1298cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1299cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1300cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1301cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1302cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1303cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1304cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1305cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1306cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1307cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1308cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1309cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1310cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1311cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
1312cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    std::vector<hwc2_config_t> configs;
1313cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1314cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1315cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1316cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1317cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1318cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1319cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1320cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1321cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1322cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1323cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1324cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * times in a row. */
1325cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1326cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1327cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1328cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs1, configs2;
1329cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1330cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
1331cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
1332cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1333cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
1334cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs2.begin())) << "returned two different config sets";
1335cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1336cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1337cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1338cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
1339cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
1340cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1341cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1342cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1343cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1344cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1345cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1346cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
1347cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs.end());
1348cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
1349cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " configs";
1350cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1351cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
135293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
135393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 returns the active config for a display */
135493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
135593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
135693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
135793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
135893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
135993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
136093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
136193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
136293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_config_t activeConfig;
136393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
136493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
136593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
136693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
136793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(activeConfig, config) << "failed to get active config";
136893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
136993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
137093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
137193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
137293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
137393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * display. */
137493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
137593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
137693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
137793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_config_t activeConfig;
137893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
137993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
138093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
138193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
138293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
138393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
138493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
138593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
138693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
138793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 either begins with a valid active config
138893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * or returns an error when getActiveConfig is called. */
138993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
139093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
139193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
139293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
139393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t activeConfig;
139493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
139593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
139693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
139793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
139893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (configs.empty())
139993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            return;
140093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
140193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
140293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (err == HWC2_ERROR_NONE) {
140393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NE(std::count(configs.begin(), configs.end(),
140493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    activeConfig), 0) << "active config is not found in "
140593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " configs for display";
140693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
140793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
140893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
140993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
141093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
141193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
141293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 can set every display config as an active
141393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * config */
141493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
141593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
141693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
141793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
141893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
141993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
142093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
142193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
142293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
142393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
142493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
142593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
142693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
142793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
142893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
142993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
143093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
143193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    const hwc2_config_t config = 0;
143293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
143393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
143493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
143593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
143693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
143793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
143893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
143993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
144093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
144193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
144293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
144393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
144493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t config;
144593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
144693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
144793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
144893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
144993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
145093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
145193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
145293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
145303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
145403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
145503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT)
145603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
145703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
145803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
145903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
146003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
146103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
146203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
146303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
146403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
146503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
146603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
146703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
146803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
146903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
147003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
147103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
147203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
147303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
147403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
147503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
147603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
147703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
147803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
147903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
148003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set all supported power modes */
148103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE)
148203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
148303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
148403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
148503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
148603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
148703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
148803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
148903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
149003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
149103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
149203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
149303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
149403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
149503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
149603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
149703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
149803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
149903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
150003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
150103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
150203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
150303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
150403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
150503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
150603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
150703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
150803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
150903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
151003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
151103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
151203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
151303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
151403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
151503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
151603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    if (support != 1)
151703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        return;
151803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
151903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
152003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
152103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
152203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
152303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            &err));
152403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
152503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
152603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
152703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
152803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
152903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
153003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
153103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
153203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND + 1);
153303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
153403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
153503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
153603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
153703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                << mode;
153803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
153903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
154003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
154103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
154203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall * an optional power mode. */
154303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
154403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
154503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
154603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
154703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
154803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
154903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
155003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support == 1)
155103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
155203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
155303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_EQ(support, 0) << "invalid doze support value";
155403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
155503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
155603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                &err));
155703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
155803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
155903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
156003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND, &err));
156103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) <<  "returned wrong error code";
156203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
156303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
156403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
156503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
156603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_stress)
156703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
156803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
156903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
157003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
157103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
157203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
157303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
157403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
157503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
157603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
157703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
157803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
157903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
158003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
158103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
158203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
158303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
158403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
158503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
158603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
158703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
158803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
158903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
159003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
159103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
159203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
159303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
1594572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1595572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
1596572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * displays */
1597572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED)
1598572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1599572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1600572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1601572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1602572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1603572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1604572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1605572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1606572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1607572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1608572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1609572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1610572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1611572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1612572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1613572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1614572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1615572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1616572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
1617572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
1618572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1619572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1620572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t receivedDisplay;
1621572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        int64_t receivedTimestamp;
1622572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1623572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1624572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1625572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1626572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1627572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
1628572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &receivedTimestamp));
1629572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1630572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
1631572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
1632572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1633572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1634572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1635572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1636572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1637572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1638572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1639572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
1640572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
1641572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1642572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t display;
1643572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1644572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            const_cast<char*>("data"));
1645572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1646572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1647572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1648572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1649572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1650572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            []() { return; }));
1651572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1652572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
1653572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1654572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1655572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
1656572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1657572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1658572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1659572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
1660572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
1661572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1662572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1663572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1664572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1665572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
1666572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1667572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1668572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1669572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1670572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1671572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1672572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
1673572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &err));
1674572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1675572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1676572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1677572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1678572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1679572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1680572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
1681572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * times. */
1682572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
1683572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1684572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1685572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1686572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1687572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1688572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1689572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1690572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1691572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1692572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1693572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1694572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1695572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1696572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1697572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1698572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1699572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1700572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1701572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1702572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1703572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1704572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1705572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
1706572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is off and no callback is registered. */
1707572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
1708572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1709572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
1710572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1711572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1712572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1713572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1714572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
1715572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1716572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1717572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1718572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1719572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1720572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
1721572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is registered. */
1722572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
1723572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1724572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
1725572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1726572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1727572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1728572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1729572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1730572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1731572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
1732572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1733572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1734572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1735572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1736572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1737572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1738dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1739dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 returns a display name for each display */
1740dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME)
1741dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
1742dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    for (auto display : mDisplays) {
1743dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        std::string name;
1744dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1745dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
1746dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
1747dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
1748dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1749dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
1750dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall * display */
1751dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
1752dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
1753dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_display_t display;
1754dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    std::string name;
1755dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1756dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1757dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1758dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1759dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
1760dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1761dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
17626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
17636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can set basic composition types. */
17646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
17656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
17666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
17676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
17686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
17696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
17706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
17716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * layer. */
17726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
17736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
17746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
17756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
17766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
17776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
17786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
17796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
17806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
17816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
17826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition));
17836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
17846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
17856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
17866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
17876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
17886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
17896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
17906bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    hwc2_error_t* outErr) {
17916bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
17926bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
17936bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        layer, HWC2_COMPOSITION_INVALID, outErr));
17946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
17956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ));
17966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
1797ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1798ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
1799ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
1800ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1801ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1802ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
1803ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1804ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1805ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
1806ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
1807ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1808ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1809ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
1810ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1811ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1812ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
1813ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
1814ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1815ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1816ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode));
1817ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1818ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1819ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
1820ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
1821ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1822ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
1823ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1824ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    hwc2_error_t* outErr) {
1825ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1826ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
1827ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                        layer, HWC2_BLEND_MODE_INVALID, outErr));
1828ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            }
1829ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ));
1830ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1831b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1832b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
1833b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE)
1834b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1835b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1836b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
1837b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1838b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1839b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
1840b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
1841b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1842b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1843b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
1844b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1845b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1846b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
1847b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
1848b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1849b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1850b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace));
1851b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
18522b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
1853600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
1854600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
1855600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1856600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1857600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
1858600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1859600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
1860600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
1861600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
1862600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1863600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1864600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
1865600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1866600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
1867600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
1868600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
1869600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1870600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1871600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame));
1872600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1873600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
18742b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
18752b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
18762b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
18772b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
18782b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
18792b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
18802b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
18812b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
18822b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
18832b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
18842b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
18852b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
18862b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
18872b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
18882b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
18892b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
18902b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
18912b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
18922b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
18932b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    const Hwc2TestLayer& testLayer, hwc2_error_t *outErr) {
18942b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
18952b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
18962b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                            badLayer, testLayer.getPlaneAlpha(), outErr));
18972b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            }
18982b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ));
18992b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
1900ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
1901ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
1902ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
1903ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1904ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1905ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
1906ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1907ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
1908ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
1909ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
1910ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1911ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1912ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
1913ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1914ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
1915ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
1916ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
1917ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1918ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1919ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform));
1920ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1921273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1922273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
1923273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
1924273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
1925273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
1926273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1927273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                    const Hwc2TestLayers& testLayers) {
1928273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1929273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
1930273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                        testLayers.getZOrder(layer)));
1931273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
1932273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ));
1933273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
1934273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1935273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
1936273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
1937273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
1938273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
1939273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
1940273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX / 2),
1941273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX) };
1942273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1943273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    for (auto display : mDisplays) {
1944273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        std::vector<hwc2_config_t> configs;
1945273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1946273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1947273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1948273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto config : configs) {
1949273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_layer_t layer;
1950273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1951273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1952273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1953273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1954273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1955273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (uint32_t zOrder : zOrders) {
1956273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
1957273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
1958273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1959273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1960273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
1961273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
1962273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
1963273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1964273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
1965273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
1966273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
1967273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1968273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            setZOrder));
1969273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
1970