Hwc2Test.cpp revision 2a0aaf9f5a3daeb0525249eda40242bb63f56468
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
3612a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    void setCursorPosition(hwc2_display_t display, hwc2_layer_t layer,
3622a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            int32_t x, int32_t y, hwc2_error_t* outErr = nullptr)
3632a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    {
3642a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_CURSOR_POSITION>(
3652a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                getFunction(HWC2_FUNCTION_SET_CURSOR_POSITION));
3662a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
3672a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
3682a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, x,
3692a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                y));
3702a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        if (outErr) {
3712a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            *outErr = err;
3722a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        } else {
3732a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set cursor position";
3742a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        }
3752a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    }
3762a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
377ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
378ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
379ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    {
380ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
381ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
382ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
383ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
384ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
385ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                mode));
386ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        if (outErr) {
387ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            *outErr = err;
388ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        } else {
389ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
390ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    << getBlendModeName(mode);
391ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        }
392ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    }
393ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
394ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    void setLayerColor(hwc2_display_t display, hwc2_layer_t layer,
395ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            hwc_color_t color, hwc2_error_t* outErr = nullptr)
396ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {
397ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COLOR>(
398ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_COLOR));
399ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
400ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
401ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
402ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                color));
403ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        if (outErr) {
404ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            *outErr = err;
405ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        } else {
406ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer color";
407ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        }
408ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    }
409ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
410b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
411b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
412b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    {
413b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
414b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
415b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
416b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
417b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
418b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall                layer, dataspace));
419b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        if (outErr) {
420b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            *outErr = err;
421b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        } else {
422b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
423b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        }
424b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    }
425b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
426600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
427600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
428600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
429600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
430600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
431600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
432600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
433600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
434600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                displayFrame));
435600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        if (outErr) {
436600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            *outErr = err;
437600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        } else {
438600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
439600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                    " frame";
440600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        }
441600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
442600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
4432b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
4442b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            float alpha, hwc2_error_t* outErr = nullptr)
4452b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    {
4462b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
4472b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
4482b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
4492b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
4502b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
4512b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                alpha));
4522b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        if (outErr) {
4532b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            *outErr = err;
4542b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        } else {
4552b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
4562b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    << alpha;
4572b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        }
4582b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    }
4592b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
460c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    void setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer,
461c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            const hwc_frect_t& sourceCrop, hwc2_error_t* outErr = nullptr)
462c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    {
463c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
464c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP));
465c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
466c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
467c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
468c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                sourceCrop));
469c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        if (outErr) {
470c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            *outErr = err;
471c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        } else {
472c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer source crop";
473c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        }
474c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    }
475c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
476ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
477ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
478ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    {
479ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
480ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
481ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
482ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
483ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
484ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                transform));
485ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        if (outErr) {
486ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            *outErr = err;
487ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        } else {
488ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
489ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                    << getTransformName(transform);
490ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        }
491ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    }
492ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
493273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
494273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            uint32_t zOrder, hwc2_error_t* outErr = nullptr)
495273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
496273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
497273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
498273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
499273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
500273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
501273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                zOrder));
502273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        if (outErr) {
503273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            *outErr = err;
504273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        } else {
505273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
506273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                    << zOrder;
507273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
508273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
509273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
5104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallprotected:
5114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
5124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
5134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        return mHwc2Device->getFunction(mHwc2Device, descriptor);
5144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
5154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
5174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
5184d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        uint32_t num = 0;
5194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
5214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        outCapabilities->resize(num);
5234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num,
5254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                reinterpret_cast<int32_t*>(outCapabilities->data()));
5264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
5274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
528cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* Registers a hotplug callback and waits for hotplug callbacks. This
529cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * function will have no effect if called more than once. */
530cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void populateDisplays()
531cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
532cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to receiving */
533cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        {
534cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            std::lock_guard<std::mutex> lock(mHotplugMutex);
535cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
536cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
537cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
538cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
539cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
540cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
541cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Registers the callback. This function call cannot be locked because
542cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * a callback could happen on the same thread */
543cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
544cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
545cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                hwc2TestHotplugCallback)));
546cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
547cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Waits for hotplug events. If a hotplug event has not come within 1
548cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * second, stop waiting. */
549cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::unique_lock<std::mutex> lock(mHotplugMutex);
550cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
551cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
552cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                std::cv_status::timeout) { }
553cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
554cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to done. Future calls will have no effect */
555cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugStatus = Hwc2TestHotplugStatus::Done;
556cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
557cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
558cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getBadDisplay(hwc2_display_t* outDisplay)
559cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
560cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
561cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mDisplays.count(display) == 0) {
562cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                *outDisplay = display;
563cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
564cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            }
565cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
566cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
567cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " are registered. This should never happen.";
568cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
569cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
5701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* NOTE: will create min(newlayerCnt, max supported layers) layers */
5711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayers(hwc2_display_t display,
5721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
5731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
5741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> newLayers;
5751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
5761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
5771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (size_t i = 0; i < newLayerCnt; i++) {
5791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
5811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err == HWC2_ERROR_NO_RESOURCES)
5821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                break;
5831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err != HWC2_ERROR_NONE) {
5841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                newLayers.clear();
5851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
5861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            }
5871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            newLayers.push_back(layer);
5881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
5891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        *outLayers = std::move(newLayers);
5911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
5921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayers(hwc2_display_t display,
5941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>&& layers)
5951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
5961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (hwc2_layer_t layer : layers) {
5971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
5981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
5991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
6001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
601cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
602cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
603cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
604cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
605cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
606cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
607cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t CONFIG_MAX = UINT32_MAX;
608cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
609cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
610cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " (2^32 values) has been taken which shouldn't happen";
611cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
612cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
613cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (config = 0; config < CONFIG_MAX; config++) {
614cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            if (std::count(configs.begin(), configs.end(), config) == 0)
615cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                break;
616cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
617cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
618cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        *outConfig = config;
619cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
620cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
621572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void enableVsync(hwc2_display_t display)
622572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
623572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
624572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
625572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                hwc2TestVsyncCallback)));
626572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
627572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
628572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
629572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void disableVsync(hwc2_display_t display)
630572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
631572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
632572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
633572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
634572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void waitForVsync(hwc2_display_t* outDisplay = nullptr,
635572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            int64_t* outTimestamp = nullptr)
636572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
637572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        std::unique_lock<std::mutex> lock(mVsyncMutex);
638572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
639572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                std::cv_status::no_timeout) << "timed out attempting to get"
640572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                " vsync callback";
641572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outDisplay)
642572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outDisplay = mVsyncDisplay;
643572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outTimestamp)
644572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outTimestamp = mVsyncTimestamp;
645572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
646572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
6476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a property value from
6486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
6496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
6506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
6516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
6526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
653273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* Calls a set property function from Hwc2Test to set property values from
654273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
655273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
656273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
657273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            const Hwc2TestLayers& testLayers);
658273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
6596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
6606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
6616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
6626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
6636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
6646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
6666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
6676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
6686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
6696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Advances a property of Hwc2TestLayer */
6716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
6726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
6746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets the property and then
6756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * destroys the layer */
6766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerProperty(Hwc2TestCoverage coverage,
6776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
6786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
6796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
6806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
6816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
6836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
6856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
686600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
6876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
689600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
690600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
691600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
6926bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6936bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
6946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
6956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
6976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                            testLayer, nullptr));
6986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
7006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
7016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
7026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
7036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
7046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
7066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, cycles through each property
7076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * value and updates the layer property value and then destroys the layer */
7086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
7096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
7106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
7116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
7126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
7136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
7156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
7176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
718600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
7196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
721600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
722600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
723600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
7246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
7266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
7286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
7296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                            testLayer, nullptr));
7306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
7316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
7336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
7346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
7356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
7366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
737273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* For each active display it cycles through each display config and tests
738273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * each property value. It creates multiple layers, calls the
739273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * TestLayerPropertiesFunction to set property values and then
740273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * destroys the layers */
741273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
742273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            TestLayerPropertiesFunction function)
743273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
744273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto display : mDisplays) {
745273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            std::vector<hwc2_config_t> configs;
746273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
747273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
748273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
749273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (auto config : configs) {
750273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                std::vector<hwc2_layer_t> layers;
751600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
752273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
753273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
754600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
755600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
756273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
757273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
758600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayers testLayers(layers, coverage, displayArea);
759273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
760273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                for (auto layer : layers) {
761273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                    EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
762273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                            testLayers));
763273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                }
764273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
765273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
766273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
767273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
768273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
769273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
7706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config.
7716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 1) It attempts to set a valid property value to bad layer handle.
7726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 2) It creates a layer x and attempts to set a valid property value to
7736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    layer x + 1
7746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 3) It destroys the layer x and attempts to set a valid property value to
7756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    the destroyed layer x.
7766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     */
7776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
7786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyBadLayerFunction function)
7796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
7806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
7816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
7826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
7846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
7866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer = 0;
787600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
7886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
7896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7906bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
791600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
792600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
793600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
7946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
7966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        testLayer, &err));
7976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
7986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
8006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
8026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        testLayer, &err));
8036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
8046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
8066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
8086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        testLayer, &err));
8096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
8106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
8116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
8126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
8136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
8156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets a bad property value and
8166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * then destroys the layer */
8176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
8186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
8196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
8206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
8216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
8236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
8256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
8266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
8276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
8296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
8316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
8336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
8346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        " error code";
8356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
8376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
8386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
8396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
8406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
841600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveConfigAttribute(hwc2_display_t display,
842600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue)
843600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
844600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        hwc2_config_t config;
845600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
846600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
847600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                attribute, outValue));
848600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_GE(*outValue, 0) << "failed to get valid "
849600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                << getAttributeName(attribute);
850600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
851600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
852600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
853600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
854600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
855600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
856600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
857600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
858600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
859600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
8604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_device_t* mHwc2Device = nullptr;
861cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
862cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    enum class Hwc2TestHotplugStatus {
863cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Init = 1,
864cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Receiving,
865cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Done,
866cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    };
867cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
868cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::mutex mHotplugMutex;
869cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::condition_variable mHotplugCv;
870cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
871cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::unordered_set<hwc2_display_t> mDisplays;
8721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
8731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* Store all created layers that have not been destroyed. If an ASSERT_*
8741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall     * fails, then destroy the layers on exit */
8751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
87603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
87703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
87803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall     * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
87903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    std::set<hwc2_display_t> mActiveDisplays;
880572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
881572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::mutex mVsyncMutex;
882572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::condition_variable mVsyncCv;
883572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t mVsyncDisplay;
884572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    int64_t mVsyncTimestamp = -1;
8854d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall};
8864d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
887cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
888cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connection)
889cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
890cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    if (callbackData)
891cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
892cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                connection);
893cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
894cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
895572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
896572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp)
897572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
898572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    if (callbackData)
899572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
900572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                timestamp);
901572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
902572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
903ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallvoid setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
904ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
905ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
906ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
907ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            testLayer.getBlendMode(), outErr));
908ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
909ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
910ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallvoid setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
911ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
912ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
913ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
914ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            layer, HWC2_COMPOSITION_SOLID_COLOR));
915ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
916ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            layer, testLayer.getPlaneAlpha()));
917ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
918ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            layer, testLayer.getBlendMode()));
919ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
920ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            testLayer.getColor(), outErr));
921ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
922ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
9236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallvoid setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
9246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
9256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
9266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    hwc2_composition_t composition = testLayer.getComposition();
9276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
9286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
9296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
9306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            composition, &err));
9316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (outErr) {
9326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        *outErr = err;
9336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        return;
9346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
9356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
9366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (composition != HWC2_COMPOSITION_SIDEBAND) {
9376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
9386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    } else {
9396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
9406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                 << "returned wrong error code";
9416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
9426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
9436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
9442a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wallvoid setCursorPosition(Hwc2Test* test, hwc2_display_t display,
9452a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        hwc2_layer_t layer, const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
9462a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
9472a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
9482a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            layer, HWC2_COMPOSITION_CURSOR));
9492a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
9502a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    const hwc_rect_t cursorPosition = testLayer.getCursorPosition();
9512a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
9522a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            cursorPosition.left, cursorPosition.top, outErr));
9532a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
9542a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
955b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallvoid setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
956b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
957b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
958b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
959b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            testLayer.getDataspace(), outErr));
960b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
961b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
962600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallvoid setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
963600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
964600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
965600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
966600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            testLayer.getDisplayFrame(), outErr));
967600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
968600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
9692b1f53060ea8587a428f826cf7890354ff124722Marissa Wallvoid setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
9702b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t *outErr)
9712b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
9722b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
9732b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            testLayer.getBlendMode()));
9742b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
9752b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            testLayer.getPlaneAlpha(), outErr));
9762b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
9772b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
978c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallvoid setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
979c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
980c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
981c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
982c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            testLayer.getSourceCrop(), outErr));
983c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
984c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
985ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallvoid setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
986ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
987ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
988ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
989ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            testLayer.getTransform(), outErr));
990ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
991ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
992273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wallvoid setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
993273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
994273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
995273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
996273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            testLayer.getZOrder(), outErr));
997273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
998273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
999ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallbool advanceBlendMode(Hwc2TestLayer* testLayer)
1000ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1001ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    return testLayer->advanceBlendMode();
1002ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1003ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1004ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallbool advanceColor(Hwc2TestLayer* testLayer)
1005ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
1006ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    /* Color depends on blend mode so advance blend mode last so color is not
1007ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall     * force to update as often */
1008ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (testLayer->advancePlaneAlpha())
1009ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return true;
1010ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (testLayer->advanceColor())
1011ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return true;
1012ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    return testLayer->advanceBlendMode();
1013ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
1014ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
10156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallbool advanceComposition(Hwc2TestLayer* testLayer)
10166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
10176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    return testLayer->advanceComposition();
10186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
10196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10202a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wallbool advanceCursorPosition(Hwc2TestLayer* testLayer)
10212a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
10222a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    return testLayer->advanceCursorPosition();
10232a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
10242a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
1025b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallbool advanceDataspace(Hwc2TestLayer* testLayer)
1026b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1027b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    return testLayer->advanceDataspace();
1028b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1029b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1030600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallbool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1031600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1032600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    return testLayer->advanceDisplayFrame();
1033600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1034600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
10352b1f53060ea8587a428f826cf7890354ff124722Marissa Wallbool advancePlaneAlpha(Hwc2TestLayer* testLayer)
10362b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
10372b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    return testLayer->advancePlaneAlpha();
10382b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
10392b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
1040c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallbool advanceSourceCrop(Hwc2TestLayer* testLayer)
1041c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
1042c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    if (testLayer->advanceSourceCrop())
1043c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        return true;
1044c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    return testLayer->advanceBufferArea();
1045c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
1046c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
1047ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallbool advanceTransform(Hwc2TestLayer* testLayer)
1048ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1049ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    return testLayer->advanceTransform();
1050ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1051ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
10524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallstatic const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
10544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
10554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_LAYER,
10564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
10574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_LAYER,
10584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
10594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DUMP,
10604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_ACTIVE_CONFIG,
10614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
10624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
10634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_COLOR_MODES,
10644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
10654d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
10664d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_NAME,
10674d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
10684d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_TYPE,
10694d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DOZE_SUPPORT,
10704d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_HDR_CAPABILITIES,
10714d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
10724d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_RELEASE_FENCES,
10734d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_PRESENT_DISPLAY,
10744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_REGISTER_CALLBACK,
10754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_ACTIVE_CONFIG,
10764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CLIENT_TARGET,
10774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_MODE,
10784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_TRANSFORM,
10794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CURSOR_POSITION,
10804d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
10814d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BUFFER,
10824d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COLOR,
10834d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
10844d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DATASPACE,
10854d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
10864d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
10874d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
10884d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
10894d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_TRANSFORM,
10904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
10914d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_Z_ORDER,
10924d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_OUTPUT_BUFFER,
10934d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_POWER_MODE,
10944d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_VSYNC_ENABLED,
10954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_VALIDATE_DISPLAY,
10964d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}};
10974d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10984d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 supports all required functions. */
10994d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION)
11004d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
11014d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
11024d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hwc2_function_pointer_t pfn = getFunction(descriptor);
11034d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        EXPECT_TRUE(pfn) << "failed to get function "
11044d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << getFunctionDescriptorName(descriptor);
11054d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
11064d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
11074d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
11084d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
11094d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
11104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
11114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
11124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_FALSE(pfn) << "failed to get invalid function";
11134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
11144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
11154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
11164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_CAPABILITIES)
11174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
11184d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    std::vector<hwc2_capability_t> capabilities;
11194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
11204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    getCapabilities(&capabilities);
11214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
11224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
11234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            HWC2_CAPABILITY_INVALID), 0);
11244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
1125a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1126a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wallstatic const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1127a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_HOTPLUG,
1128a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_REFRESH,
1129a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_VSYNC,
1130a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}};
1131a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1132a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can successfully register all required
1133a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall * callback functions. */
1134a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK)
1135a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1136a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1137a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
1138a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1139a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
1140a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1141a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
1142a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
1143a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1144a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1145a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1146a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1147a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1148a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1149a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
1150a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1151a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1152a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1153a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            []() { return; }, &err));
1154a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1155a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1156a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1157a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
1158a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
1159a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1160a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = nullptr;
1161a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1162a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
1163a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1164a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
1165a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
1166a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1167cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1168cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1169cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * physical display. */
1170cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1171cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1172cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    for (auto display : mDisplays) {
1173cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_type_t type;
1174cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1175cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1176cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1177cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " correct display type";
1178cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
1179cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
1180cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1181cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1182cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is requested. */
1183cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1184cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1185cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_t display;
1186cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_type_t type;
1187cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1188cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1189cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1190cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1191cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1192cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1193cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
11941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
11961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
11971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
11981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
11991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
12001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
12021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
12041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
12051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
12061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
12081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_bad_display)
12091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
12101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t display;
12111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_layer_t layer;
12121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
12131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
12151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
12171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
12181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
12191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 will either support a large number of resources
12211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * or will return no resources. */
12221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_no_resources)
12231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
12241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    const size_t layerCnt = 1000;
12251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
12271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> layers;
12281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
12301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
12321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
12331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
12341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
12361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
12371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
12381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t badDisplay;
12391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
12411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
12431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer = 0;
12441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
12451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
12471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
12481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
12501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
12521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
12531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
12551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
12561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
12571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
12591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
12601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
12611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
12621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
12631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
12641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
12661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
12671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
12691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
12701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
12721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
12731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
12751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
12761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
12781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
12791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
12811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
12831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
12841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
12861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
12881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
12891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
12901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
1291cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1292cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1293cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_WIDTH,
1294cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_HEIGHT,
1295cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
1296cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1297cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1298cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_VSYNC_PERIOD,
1299cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_X,
1300cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_Y,
1301cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
1302cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1303cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1304cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * config. */
1305cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1306cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1307cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1308cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1309cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1310cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1311cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1312cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
1313cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
1314cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1315cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : requiredAttributes) {
1316cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1317cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
1318cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                EXPECT_GE(value, 0) << "missing required attribute "
1319cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << getAttributeName(attribute) << " for config "
1320cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << config;
1321cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
1322cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : optionalAttributes) {
1323cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1324cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
1325cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
1326cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1327cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1328cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1329cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1330cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1331cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * attribute */
1332cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1333cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1334cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1335cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1336cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1337cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1338cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1339cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1340cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1341cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
1342cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
1343cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t err = HWC2_ERROR_NONE;
1344cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1345cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1346cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1347cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1348cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " attribute for config " << config;
1349cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1350cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1351cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1352cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1353cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1354cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1355cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1356cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
1357cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_config_t config = 0;
1358cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    int32_t value;
1359cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1360cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1361cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1362cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1363cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : requiredAttributes) {
1364cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1365cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
1366cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1367cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1368cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1369cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : optionalAttributes) {
1370cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1371cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
1372cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1373cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1374cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1375cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1376cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1377cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1378cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1379cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1380cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
1381cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        int32_t value;
1382cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
1383cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1384cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1385cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1386cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : requiredAttributes) {
1387cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1388cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1389cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1390cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1391cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1392cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : optionalAttributes) {
1393cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1394cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1395cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1396cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1397cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1398cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1399cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1400cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1401cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1402cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1403cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1404cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1405cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1406cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1407cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1408cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1409cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1410cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1411cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1412cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1413cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
1414cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    std::vector<hwc2_config_t> configs;
1415cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1416cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1417cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1418cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1419cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1420cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1421cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1422cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1423cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1424cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1425cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1426cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * times in a row. */
1427cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1428cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1429cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1430cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs1, configs2;
1431cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1432cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
1433cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
1434cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1435cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
1436cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs2.begin())) << "returned two different config sets";
1437cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1438cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1439cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1440cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
1441cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
1442cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1443cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1444cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1445cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1446cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1447cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1448cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
1449cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs.end());
1450cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
1451cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " configs";
1452cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1453cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
145493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
145593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 returns the active config for a display */
145693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
145793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
145893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
145993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
146093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
146193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
146293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
146393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
146493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_config_t activeConfig;
146593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
146693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
146793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
146893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
146993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(activeConfig, config) << "failed to get active config";
147093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
147193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
147293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
147393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
147493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
147593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * display. */
147693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
147793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
147893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
147993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_config_t activeConfig;
148093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
148193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
148293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
148393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
148493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
148593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
148693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
148793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
148893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
148993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 either begins with a valid active config
149093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * or returns an error when getActiveConfig is called. */
149193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
149293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
149393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
149493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
149593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t activeConfig;
149693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
149793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
149893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
149993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
150093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (configs.empty())
150193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            return;
150293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
150393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
150493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (err == HWC2_ERROR_NONE) {
150593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NE(std::count(configs.begin(), configs.end(),
150693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    activeConfig), 0) << "active config is not found in "
150793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " configs for display";
150893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
150993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
151093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
151193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
151293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
151393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
151493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 can set every display config as an active
151593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * config */
151693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
151793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
151893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
151993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
152093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
152193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
152293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
152393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
152493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
152593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
152693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
152793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
152893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
152993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
153093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
153193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
153293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
153393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    const hwc2_config_t config = 0;
153493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
153593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
153693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
153793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
153893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
153993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
154093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
154193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
154293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
154393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
154493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
154593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
154693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t config;
154793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
154893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
154993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
155093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
155193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
155293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
155393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
155493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
155503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
155603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
155703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT)
155803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
155903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
156003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
156103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
156203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
156303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
156403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
156503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
156603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
156703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
156803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
156903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
157003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
157103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
157203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
157303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
157403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
157503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
157603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
157703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
157803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
157903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
158003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
158103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
158203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set all supported power modes */
158303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE)
158403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
158503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
158603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
158703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
158803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
158903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
159003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
159103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
159203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
159303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
159403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
159503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
159603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
159703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
159803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
159903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
160003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
160103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
160203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
160303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
160403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
160503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
160603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
160703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
160803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
160903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
161003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
161103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
161203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
161303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
161403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
161503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
161603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
161703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
161803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    if (support != 1)
161903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        return;
162003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
162103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
162203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
162303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
162403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
162503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            &err));
162603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
162703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
162803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
162903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
163003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
163103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
163203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
163303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
163403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND + 1);
163503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
163603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
163703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
163803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
163903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                << mode;
164003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
164103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
164203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
164303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
164403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall * an optional power mode. */
164503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
164603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
164703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
164803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
164903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
165003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
165103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
165203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support == 1)
165303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
165403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
165503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_EQ(support, 0) << "invalid doze support value";
165603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
165703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
165803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                &err));
165903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
166003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
166103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
166203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND, &err));
166303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) <<  "returned wrong error code";
166403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
166503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
166603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
166703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
166803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_stress)
166903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
167003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
167103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
167203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
167303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
167403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
167503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
167603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
167703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
167803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
167903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
168003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
168103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
168203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
168303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
168403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
168503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
168603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
168703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
168803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
168903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
169003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
169103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
169203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
169303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
169403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
169503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
1696572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1697572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
1698572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * displays */
1699572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED)
1700572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1701572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1702572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1703572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1704572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1705572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1706572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1707572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1708572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1709572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1710572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1711572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1712572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1713572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1714572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1715572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1716572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1717572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1718572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
1719572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
1720572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1721572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1722572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t receivedDisplay;
1723572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        int64_t receivedTimestamp;
1724572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1725572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1726572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1727572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1728572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1729572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
1730572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &receivedTimestamp));
1731572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1732572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
1733572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
1734572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1735572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1736572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1737572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1738572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1739572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1740572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1741572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
1742572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
1743572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1744572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t display;
1745572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1746572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            const_cast<char*>("data"));
1747572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1748572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1749572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1750572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1751572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1752572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            []() { return; }));
1753572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1754572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
1755572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1756572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1757572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
1758572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1759572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1760572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1761572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
1762572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
1763572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1764572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1765572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1766572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1767572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
1768572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1769572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1770572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1771572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1772572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1773572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1774572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
1775572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &err));
1776572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1777572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1778572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1779572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1780572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1781572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1782572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
1783572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * times. */
1784572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
1785572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1786572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1787572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1788572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1789572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1790572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1791572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1792572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1793572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1794572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1795572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1796572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1797572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1798572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1799572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1800572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1801572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1802572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1803572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1804572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1805572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1806572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1807572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
1808572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is off and no callback is registered. */
1809572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
1810572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1811572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
1812572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1813572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1814572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1815572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1816572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
1817572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1818572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1819572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1820572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1821572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1822572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
1823572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is registered. */
1824572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
1825572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1826572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
1827572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1828572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1829572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1830572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1831572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1832572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1833572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
1834572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1835572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1836572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1837572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1838572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1839572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1840dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1841dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 returns a display name for each display */
1842dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME)
1843dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
1844dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    for (auto display : mDisplays) {
1845dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        std::string name;
1846dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1847dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
1848dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
1849dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
1850dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1851dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
1852dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall * display */
1853dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
1854dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
1855dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_display_t display;
1856dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    std::string name;
1857dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1858dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1859dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1860dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1861dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
1862dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1863dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
18646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
18656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can set basic composition types. */
18666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
18676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
18686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
18696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
18706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
18716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
18726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
18736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * layer. */
18746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
18756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
18766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
18776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
18786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
18796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
18806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
18816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
18826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
18836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
18846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition));
18856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
18866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
18876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
18886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
18896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
18906bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
18916bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
18926bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    hwc2_error_t* outErr) {
18936bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
18946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
18956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        layer, HWC2_COMPOSITION_INVALID, outErr));
18966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
18976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ));
18986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
1899ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
19002a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
19012a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION)
19022a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
19032a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
19042a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ::setCursorPosition, advanceCursorPosition));
19052a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
19062a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
19072a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
19082a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
19092a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
19102a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
19112a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ::setCursorPosition, advanceCursorPosition));
19122a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
19132a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
19142a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
19152a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
19162a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
19172a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
19182a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
19192a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
19202a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                    const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) {
19212a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
19222a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                const hwc_rect_t cursorPosition = testLayer.getCursorPosition();
19232a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
19242a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        cursorPosition.left, cursorPosition.top, outErr));
19252a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            },
19262a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
19272a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            advanceCursorPosition));
19282a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
19292a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
19302a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
19312a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall * display. */
19322a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
19332a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
19342a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_display_t display;
19352a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_layer_t layer = 0;
19362a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    int32_t x = 0, y = 0;
19372a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
19382a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
19392a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
19402a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
19412a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
19422a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
19432a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
19442a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
19452a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
19462a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
19472a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
19482a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
19492a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
19502a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                    const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) {
19512a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
19522a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                const hwc_rect_t cursorPosition = testLayer.getCursorPosition();
19532a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
19542a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        badLayer, cursorPosition.left, cursorPosition.top,
19552a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        outErr));
19562a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            }
19572a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall   ));
19582a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
19592a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
1960ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
1961ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
1962ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1963ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1964ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
1965ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1966ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1967ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
1968ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
1969ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1970ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1971ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
1972ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1973ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1974ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
1975ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
1976ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1977ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1978ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode));
1979ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1980ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1981ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
1982ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
1983ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1984ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
1985ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1986ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    hwc2_error_t* outErr) {
1987ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1988ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
1989ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                        layer, HWC2_BLEND_MODE_INVALID, outErr));
1990ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            }
1991ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ));
1992ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1993b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1994ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
1995ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR)
1996ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
1997ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1998ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            setColor, advanceColor));
1999ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2000ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2001ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
2002ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_update)
2003ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2004ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2005ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            setColor, advanceColor));
2006ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2007ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2008ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
2009ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
2010ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
2011ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2012ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
2013ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2014ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                    const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) {
2015ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2016ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
2017ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                        testLayer.getColor(), outErr));
2018ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            },
2019ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2020ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            advanceColor));
2021ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2022ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2023ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
2024ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
2025ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2026ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2027ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
2028ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                    const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) {
2029ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2030ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
2031ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                        testLayer.getColor(), outErr));
2032ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            }
2033ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ));
2034ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2035ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2036b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
2037b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE)
2038b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
2039b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2040b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
2041b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
2042b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
2043b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
2044b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
2045b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
2046b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2047b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
2048b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
2049b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
2050b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
2051b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
2052b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
2053b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2054b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace));
2055b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
20562b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
2057600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
2058600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
2059600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
2060600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2061600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
2062600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
2063600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
2064600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
2065600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
2066600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
2067600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2068600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
2069600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
2070600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
2071600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
2072600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
2073600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
2074600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2075600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame));
2076600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
2077600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
20782b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
20792b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
20802b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
20812b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
20822b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
20832b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
20842b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
20852b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
20862b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
20872b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
20882b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
20892b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
20902b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
20912b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
20922b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
20932b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
20942b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
20952b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
20962b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
20972b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    const Hwc2TestLayer& testLayer, hwc2_error_t *outErr) {
20982b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
20992b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
21002b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                            badLayer, testLayer.getPlaneAlpha(), outErr));
21012b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            }
21022b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ));
21032b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
2104ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2105c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
2106c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
2107c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2108c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2109c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop, advanceSourceCrop));
2110c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2111c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2112c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
2113c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
2114c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2115c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2116c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop, advanceSourceCrop));
2117c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2118c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2119c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
2120c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
2121c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2122c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2123c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop));
2124c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2125c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2126ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
2127ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
2128ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2129ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2130ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
2131ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2132ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2133ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
2134ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
2135ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2136ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2137ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
2138ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2139ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2140ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
2141ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
2142ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2143ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2144ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform));
2145ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2146273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2147273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
2148273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
2149273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2150273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
2151273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2152273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                    const Hwc2TestLayers& testLayers) {
2153273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2154273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
2155273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                        testLayers.getZOrder(layer)));
2156273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
2157273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ));
2158273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
2159273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2160273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
2161273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
2162273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2163273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
2164273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
2165273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX / 2),
2166273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX) };
2167273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2168273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    for (auto display : mDisplays) {
2169273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        std::vector<hwc2_config_t> configs;
2170273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2171273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2172273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2173273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto config : configs) {
2174273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_layer_t layer;
2175273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2176273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2177273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2178273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2179273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2180273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (uint32_t zOrder : zOrders) {
2181273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
2182273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
2183273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2184273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2185273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
2186273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
2187273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
2188273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2189273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
2190273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
2191273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2192273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2193273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            setZOrder));
2194273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
2195