Hwc2Test.cpp revision f7618ed1b4d806e06c872c0fccce57163cf93b6a
14d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/*
24d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * Copyright (C) 2016 The Android Open Source Project
34d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *
44d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * Licensed under the Apache License, Version 2.0 (the "License");
54d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * you may not use this file except in compliance with the License.
64d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * You may obtain a copy of the License at
74d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *
84d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *      http://www.apache.org/licenses/LICENSE-2.0
94d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *
104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * Unless required by applicable law or agreed to in writing, software
114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * distributed under the License is distributed on an "AS IS" BASIS,
124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * See the License for the specific language governing permissions and
144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * limitations under the License.
154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall */
164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <array>
18cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall#include <unordered_set>
194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <gtest/gtest.h>
204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <dlfcn.h>
215a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall#include <android-base/unique_fd.h>
224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <hardware/hardware.h>
234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#define HWC2_INCLUDE_STRINGIFICATION
254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#define HWC2_USE_CPP11
264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <hardware/hwcomposer2.h>
274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#undef HWC2_INCLUDE_STRINGIFICATION
284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#undef HWC2_USE_CPP11
294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall#include "Hwc2TestLayer.h"
31273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall#include "Hwc2TestLayers.h"
326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
33cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
34cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connected);
35572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
36572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp);
37cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallclass Hwc2Test : public testing::Test {
394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallpublic:
404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void SetUp()
424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hw_module_t const* hwc2Module;
444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        /* The following method will fail if you have not run
504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall         * "adb shell stop" */
514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        err = hwc2_open(hwc2Module, &mHwc2Device);
524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
54cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
55cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        populateDisplays();
564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void TearDown()
594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (auto itr = mLayers.begin(); itr != mLayers.end();) {
621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_display_t display = itr->first;
631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_layer_t layer = itr->second;
641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            itr++;
651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            /* Destroys and removes the layer from mLayers */
661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            destroyLayer(display, layer);
671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
7003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_display_t display = *itr;
7103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            itr++;
7203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            /* Sets power mode to off and removes the display from
7303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall             * mActiveDisplays */
7403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            setPowerMode(display, HWC2_POWER_MODE_OFF);
7503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
7603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        if (mHwc2Device)
784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            hwc2_close(mHwc2Device);
794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
804d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
81a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    void registerCallback(hwc2_callback_descriptor_t descriptor,
82a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
83a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_error_t* outErr = nullptr)
84a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    {
85a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
86a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
87a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
88a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
89a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
90a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                callbackData, pointer));
91a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        if (outErr) {
92a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            *outErr = err;
93a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        } else {
94a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
95a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        }
96a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
97a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
98cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
99cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            hwc2_error_t* outErr = nullptr)
100cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
101cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
102cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
103cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
104cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
105cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
106cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                    reinterpret_cast<int32_t*>(outType)));
107cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (outErr) {
108cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            *outErr = err;
109cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        } else {
110cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
111cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
112cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
113cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
114cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* If the populateDisplays function is still receiving displays and the
115cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * display is connected, the display handle is stored in mDisplays. */
116cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void hotplugCallback(hwc2_display_t display, int32_t connected)
117cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
118cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::lock_guard<std::mutex> lock(mHotplugMutex);
119cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
120cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
121cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            return;
122cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
123cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (connected == HWC2_CONNECTION_CONNECTED)
124cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mDisplays.insert(display);
125cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
126cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugCv.notify_all();
127cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
128cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
1301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
1331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_CREATE_LAYER));
1341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
1371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                outLayer));
1381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.insert(std::make_pair(display, *outLayer));
1411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
1461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
1501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
1531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_DESTROY_LAYER));
1541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
1571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.erase(std::make_pair(display, layer));
1601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
1651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                    << layer;
1661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
169cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
170cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue,
171cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
172cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
173cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
174cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
175cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
176cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
177cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
178cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                attribute, outValue));
179cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
180cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
181cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
182cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
183cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
184cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    << getAttributeName(attribute) << " for config " << config;
185cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
186cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
187cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
188cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayConfigs(hwc2_display_t display,
189cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            std::vector<hwc2_config_t>* outConfigs,
190cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
191cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
192cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
193cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
194cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
195cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
196cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        uint32_t numConfigs = 0;
197cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
198cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
199cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &numConfigs, nullptr));
200cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
201cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (err == HWC2_ERROR_NONE) {
202cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            outConfigs->resize(numConfigs);
203cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
204cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
205cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    &numConfigs, outConfigs->data()));
206cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
207cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
208cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
209cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
210cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
211cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
212cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " display " << display;
213cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
214cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
215cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
21693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
21793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
21893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
21993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
22093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
22193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
22293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
22393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
22493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                outConfig));
22593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
22693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
22793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
22893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
22993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " display " << display;
23093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
23193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
23293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
23393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
23493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
23593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
23693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
23793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
23893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
23993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
24093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
24193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
24293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
24393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
24493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
24593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    << config;
24693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
24793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
24893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
24903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
25003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_error_t* outErr = nullptr)
25103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    {
25203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
25303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
25403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
25503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
25603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
25703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                outSupport));
25803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (outErr) {
25903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            *outErr = err;
26003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
26103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
26203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                    " display " << display;
26303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
26403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
26503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
26603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
26703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_error_t* outErr = nullptr)
26803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    {
26903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
27003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                getFunction(HWC2_FUNCTION_SET_POWER_MODE));
27103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
27203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
27303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
27403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                mode));
27503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (outErr) {
27603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            *outErr = err;
27703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            if (err != HWC2_ERROR_NONE)
27803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                return;
27903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
28003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
28103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                    << getPowerModeName(mode) << " on display " << display;
28203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
28303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
28403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (mode == HWC2_POWER_MODE_OFF) {
28503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            mActiveDisplays.erase(display);
28603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
28703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            mActiveDisplays.insert(display);
28803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
28903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
29003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
291572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
292572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            hwc2_error_t* outErr = nullptr)
293572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
294572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
295572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
296572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
297572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
298572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
299572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                enabled));
300572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outErr) {
301572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outErr = err;
302572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        } else {
303572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
304572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                    << getVsyncName(enabled);
305572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        }
306572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
307572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
308572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void vsyncCallback(hwc2_display_t display, int64_t timestamp)
309572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
310572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        std::lock_guard<std::mutex> lock(mVsyncMutex);
311572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncDisplay = display;
312572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncTimestamp = timestamp;
313572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncCv.notify_all();
314572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
315572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
316dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    void getDisplayName(hwc2_display_t display, std::string* outName,
317dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                hwc2_error_t* outErr = nullptr)
318dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    {
319dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
320dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
321dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
322dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
323dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        uint32_t size = 0;
324dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
325dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
326dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                nullptr));
327dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
328dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        if (err == HWC2_ERROR_NONE) {
329dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            std::vector<char> name(size);
330dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
331dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
332dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                    name.data()));
333dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
334dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            outName->assign(name.data());
335dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        }
336dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
337dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        if (outErr) {
338dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            *outErr = err;
339dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        } else {
340dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
341dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                    << display;
342dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        }
343dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
344dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
3456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
3466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
3476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
3486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
3496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
3506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
3516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
3526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
3536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                composition));
3546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        if (outErr) {
3556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            *outErr = err;
3566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        } else {
3576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
3586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    " type " << getCompositionName(composition);
3596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
3606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
3616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
3622a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    void setCursorPosition(hwc2_display_t display, hwc2_layer_t layer,
3632a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            int32_t x, int32_t y, hwc2_error_t* outErr = nullptr)
3642a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    {
3652a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_CURSOR_POSITION>(
3662a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                getFunction(HWC2_FUNCTION_SET_CURSOR_POSITION));
3672a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
3682a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
3692a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, x,
3702a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                y));
3712a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        if (outErr) {
3722a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            *outErr = err;
3732a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        } else {
3742a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set cursor position";
3752a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        }
3762a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    }
3772a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
378ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
379ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
380ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    {
381ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
382ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
383ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
384ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
385ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
386ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                mode));
387ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        if (outErr) {
388ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            *outErr = err;
389ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        } else {
390ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
391ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    << getBlendModeName(mode);
392ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        }
393ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    }
394ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
3955a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    void setLayerBuffer(hwc2_display_t display, hwc2_layer_t layer,
3965a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            buffer_handle_t buffer, int32_t acquireFence,
3975a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            hwc2_error_t* outErr = nullptr)
3985a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    {
3995a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BUFFER>(
4005a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_BUFFER));
4015a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
4025a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
4035a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
4045a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer, acquireFence));
4055a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        if (outErr) {
4065a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            *outErr = err;
4075a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        } else {
4085a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer buffer";
4095a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        }
4105a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    }
4115a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
412ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    void setLayerColor(hwc2_display_t display, hwc2_layer_t layer,
413ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            hwc_color_t color, hwc2_error_t* outErr = nullptr)
414ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {
415ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COLOR>(
416ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_COLOR));
417ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
418ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
419ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
420ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                color));
421ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        if (outErr) {
422ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            *outErr = err;
423ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        } else {
424ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer color";
425ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        }
426ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    }
427ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
428b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
429b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
430b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    {
431b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
432b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
433b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
434b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
435b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
436b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall                layer, dataspace));
437b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        if (outErr) {
438b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            *outErr = err;
439b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        } else {
440b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
441b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        }
442b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    }
443b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
444600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
445600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
446600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
447600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
448600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
449600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
450600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
451600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
452600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                displayFrame));
453600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        if (outErr) {
454600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            *outErr = err;
455600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        } else {
456600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
457600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                    " frame";
458600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        }
459600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
460600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
4612b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
4622b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            float alpha, hwc2_error_t* outErr = nullptr)
4632b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    {
4642b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
4652b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
4662b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
4672b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
4682b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
4692b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                alpha));
4702b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        if (outErr) {
4712b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            *outErr = err;
4722b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        } else {
4732b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
4742b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    << alpha;
4752b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        }
4762b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    }
4772b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
478c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    void setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer,
479c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            const hwc_frect_t& sourceCrop, hwc2_error_t* outErr = nullptr)
480c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    {
481c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
482c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP));
483c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
484c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
485c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
486c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                sourceCrop));
487c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        if (outErr) {
488c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            *outErr = err;
489c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        } else {
490c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer source crop";
491c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        }
492c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    }
493c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
494ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    void setLayerSurfaceDamage(hwc2_display_t display, hwc2_layer_t layer,
495ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            const hwc_region_t& surfaceDamage, hwc2_error_t* outErr = nullptr)
496ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    {
497ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
498ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE));
499ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
500ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
501ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
502ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                surfaceDamage));
503ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        if (outErr) {
504ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            *outErr = err;
505ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        } else {
506ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer surface"
507ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                    " damage";
508ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        }
509ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    }
510ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
511ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
512ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
513ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    {
514ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
515ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
516ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
517ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
518ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
519ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                transform));
520ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        if (outErr) {
521ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            *outErr = err;
522ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        } else {
523ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
524ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                    << getTransformName(transform);
525ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        }
526ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    }
527ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
528f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    void setLayerVisibleRegion(hwc2_display_t display, hwc2_layer_t layer,
529f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            const hwc_region_t& visibleRegion, hwc2_error_t* outErr = nullptr)
530f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    {
531f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_VISIBLE_REGION>(
532f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION));
533f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
534f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
535f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
536f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                visibleRegion));
537f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        if (outErr) {
538f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            *outErr = err;
539f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        } else {
540f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer visible"
541f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    " region";
542f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        }
543f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    }
544f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
545273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
546273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            uint32_t zOrder, hwc2_error_t* outErr = nullptr)
547273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
548273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
549273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
550273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
551273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
552273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
553273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                zOrder));
554273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        if (outErr) {
555273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            *outErr = err;
556273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        } else {
557273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
558273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                    << zOrder;
559273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
560273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
561273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
5624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallprotected:
5634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
5644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
5654d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        return mHwc2Device->getFunction(mHwc2Device, descriptor);
5664d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
5674d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5684d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
5694d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
5704d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        uint32_t num = 0;
5714d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5724d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
5734d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        outCapabilities->resize(num);
5754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num,
5774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                reinterpret_cast<int32_t*>(outCapabilities->data()));
5784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
5794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
580cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* Registers a hotplug callback and waits for hotplug callbacks. This
581cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * function will have no effect if called more than once. */
582cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void populateDisplays()
583cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
584cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to receiving */
585cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        {
586cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            std::lock_guard<std::mutex> lock(mHotplugMutex);
587cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
588cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
589cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
590cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
591cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
592cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
593cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Registers the callback. This function call cannot be locked because
594cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * a callback could happen on the same thread */
595cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
596cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
597cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                hwc2TestHotplugCallback)));
598cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
599cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Waits for hotplug events. If a hotplug event has not come within 1
600cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * second, stop waiting. */
601cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::unique_lock<std::mutex> lock(mHotplugMutex);
602cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
603cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
604cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                std::cv_status::timeout) { }
605cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
606cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to done. Future calls will have no effect */
607cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugStatus = Hwc2TestHotplugStatus::Done;
608cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
609cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
610cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getBadDisplay(hwc2_display_t* outDisplay)
611cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
612cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
613cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mDisplays.count(display) == 0) {
614cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                *outDisplay = display;
615cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
616cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            }
617cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
618cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
619cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " are registered. This should never happen.";
620cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
621cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
6221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* NOTE: will create min(newlayerCnt, max supported layers) layers */
6231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayers(hwc2_display_t display,
6241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
6251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
6261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> newLayers;
6271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
6281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
6291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (size_t i = 0; i < newLayerCnt; i++) {
6311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
6331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err == HWC2_ERROR_NO_RESOURCES)
6341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                break;
6351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err != HWC2_ERROR_NONE) {
6361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                newLayers.clear();
6371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
6381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            }
6391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            newLayers.push_back(layer);
6401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
6411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        *outLayers = std::move(newLayers);
6431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
6441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayers(hwc2_display_t display,
6461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>&& layers)
6471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
6481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (hwc2_layer_t layer : layers) {
6491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
6501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
6511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
6521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
653cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
654cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
655cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
656cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
657cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
658cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
659cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t CONFIG_MAX = UINT32_MAX;
660cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
661cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
662cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " (2^32 values) has been taken which shouldn't happen";
663cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
664cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
665cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (config = 0; config < CONFIG_MAX; config++) {
666cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            if (std::count(configs.begin(), configs.end(), config) == 0)
667cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                break;
668cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
669cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
670cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        *outConfig = config;
671cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
672cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
673572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void enableVsync(hwc2_display_t display)
674572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
675572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
676572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
677572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                hwc2TestVsyncCallback)));
678572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
679572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
680572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
681572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void disableVsync(hwc2_display_t display)
682572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
683572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
684572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
685572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
686572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void waitForVsync(hwc2_display_t* outDisplay = nullptr,
687572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            int64_t* outTimestamp = nullptr)
688572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
689572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        std::unique_lock<std::mutex> lock(mVsyncMutex);
690572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
691572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                std::cv_status::no_timeout) << "timed out attempting to get"
692572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                " vsync callback";
693572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outDisplay)
694572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outDisplay = mVsyncDisplay;
695572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outTimestamp)
696572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outTimestamp = mVsyncTimestamp;
697572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
698572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
6996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a property value from
7006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
7016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
7026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
7035a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
7046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
705273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* Calls a set property function from Hwc2Test to set property values from
706273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
707273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
708273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
7095a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayers* testLayers);
710273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
7116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
7126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
7136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
7146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
7155a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
7166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
7186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
7196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
7206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
7216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Advances a property of Hwc2TestLayer */
7236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
7246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
725f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    /* Advances properties of Hwc2TestLayers */
726f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    using AdvanceProperties = bool (*)(Hwc2TestLayers* testLayer);
727f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
7286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
7296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets the property and then
7306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * destroys the layer */
7316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerProperty(Hwc2TestCoverage coverage,
7326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
7336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
7346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
7356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
7366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
7386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
7406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
741600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
7426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
744600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
745600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
746600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
7476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
7496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
7506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
7525a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            &testLayer, nullptr));
7536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
7556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
7566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
7576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
7586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
7596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
7616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, cycles through each property
7626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * value and updates the layer property value and then destroys the layer */
7636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
7646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
7656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
7666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
7676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
7686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
7706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
7726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
773600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
7746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
776600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
777600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
778600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
7796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
7816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
7836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
7845a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            &testLayer, nullptr));
7856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
7866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
7886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
7896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
7906bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
7916bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
792273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* For each active display it cycles through each display config and tests
793273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * each property value. It creates multiple layers, calls the
794273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * TestLayerPropertiesFunction to set property values and then
795273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * destroys the layers */
796273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
797f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            TestLayerPropertiesFunction function, AdvanceProperties advance)
798273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
799273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto display : mDisplays) {
800273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            std::vector<hwc2_config_t> configs;
801273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
802273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
803273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
804273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (auto config : configs) {
805273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                std::vector<hwc2_layer_t> layers;
806600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
807273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
808273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
809600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
810600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
811273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
812273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
813600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayers testLayers(layers, coverage, displayArea);
814273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
815f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                do {
816f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    for (auto layer : layers) {
817f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                        EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
818f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                                &testLayers));
819f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    }
820f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                } while (advance(&testLayers));
821273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
822273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
823273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
824273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
825273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
826273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
8276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config.
8286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 1) It attempts to set a valid property value to bad layer handle.
8296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 2) It creates a layer x and attempts to set a valid property value to
8306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    layer x + 1
8316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 3) It destroys the layer x and attempts to set a valid property value to
8326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    the destroyed layer x.
8336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     */
8346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
8356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyBadLayerFunction function)
8366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
8376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
8386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
8396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
8416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
8436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer = 0;
844600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
8456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
8466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
848600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
849600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
850600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
8516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
8535a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
8546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
8556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
8576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
8595a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
8606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
8616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
8636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
8655a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
8666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
8676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
8686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
8696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
8706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
8726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets a bad property value and
8736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * then destroys the layer */
8746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
8756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
8766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
8776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
8786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
8806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
8826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
8836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
8846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
8866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
8886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
8906bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
8916bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        " error code";
8926bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8936bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
8946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
8956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
8966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
8976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
898600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveConfigAttribute(hwc2_display_t display,
899600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue)
900600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
901600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        hwc2_config_t config;
902600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
903600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
904600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                attribute, outValue));
905600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_GE(*outValue, 0) << "failed to get valid "
906600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                << getAttributeName(attribute);
907600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
908600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
909600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
910600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
911600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
912600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
913600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
914600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
915600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
916600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
9174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_device_t* mHwc2Device = nullptr;
918cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
919cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    enum class Hwc2TestHotplugStatus {
920cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Init = 1,
921cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Receiving,
922cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Done,
923cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    };
924cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
925cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::mutex mHotplugMutex;
926cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::condition_variable mHotplugCv;
927cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
928cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::unordered_set<hwc2_display_t> mDisplays;
9291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
9301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* Store all created layers that have not been destroyed. If an ASSERT_*
9311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall     * fails, then destroy the layers on exit */
9321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
93303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
93403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
93503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall     * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
93603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    std::set<hwc2_display_t> mActiveDisplays;
937572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
938572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::mutex mVsyncMutex;
939572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::condition_variable mVsyncCv;
940572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t mVsyncDisplay;
941572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    int64_t mVsyncTimestamp = -1;
9424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall};
9434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
944cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
945cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connection)
946cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
947cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    if (callbackData)
948cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
949cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                connection);
950cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
951cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
952572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
953572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp)
954572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
955572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    if (callbackData)
956572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
957572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                timestamp);
958572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
959572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
960ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallvoid setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
9615a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
962ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
963ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
9645a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getBlendMode(), outErr));
9655a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
9665a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
9675a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wallvoid setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
9685a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
9695a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
9705a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    buffer_handle_t handle;
9715a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    android::base::unique_fd acquireFence;
9725a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    hwc2_composition_t composition = testLayer->getComposition();
9735a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
9745a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (composition == HWC2_COMPOSITION_CLIENT
9755a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            || composition == HWC2_COMPOSITION_SOLID_COLOR
9765a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            || composition == HWC2_COMPOSITION_SIDEBAND)
9775a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return;
9785a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
9795a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (testLayer->getBuffer(&handle, &acquireFence) < 0)
9805a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return;
9815a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
9825a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
9835a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            composition));
9845a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
9855a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            handle, acquireFence, outErr));
986ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
987ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
988ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallvoid setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
9895a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
990ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
991ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
992ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            layer, HWC2_COMPOSITION_SOLID_COLOR));
993ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
9945a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            layer, testLayer->getPlaneAlpha()));
995ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
9965a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            layer, testLayer->getBlendMode()));
997ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
9985a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getColor(), outErr));
999ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
1000ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
10016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallvoid setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
10025a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
10036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
10045a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    hwc2_composition_t composition = testLayer->getComposition();
10056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
10066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
10086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            composition, &err));
10096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (outErr) {
10106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        *outErr = err;
10116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        return;
10126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
10136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (composition != HWC2_COMPOSITION_SIDEBAND) {
10156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
10166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    } else {
10176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
10186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                 << "returned wrong error code";
10196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
10206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
10216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10222a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wallvoid setCursorPosition(Hwc2Test* test, hwc2_display_t display,
10235a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
10242a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
10252a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
10262a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            layer, HWC2_COMPOSITION_CURSOR));
10272a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
10285a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
10292a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
10302a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            cursorPosition.left, cursorPosition.top, outErr));
10312a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
10322a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
1033b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallvoid setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
10345a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1035b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1036b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
10375a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getDataspace(), outErr));
1038b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1039b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1040600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallvoid setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
10415a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1042600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1043600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
10445a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getDisplayFrame(), outErr));
1045600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1046600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
10472b1f53060ea8587a428f826cf7890354ff124722Marissa Wallvoid setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
10485a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
10492b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
10502b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
10515a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getBlendMode()));
10522b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
10535a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getPlaneAlpha(), outErr));
10542b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
10552b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
1056c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallvoid setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
10575a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1058c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
1059c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
10605a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getSourceCrop(), outErr));
1061c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
1062c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
1063ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallvoid setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
10645a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1065ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
1066ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
10675a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getSurfaceDamage(), outErr));
1068ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
1069ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
1070ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallvoid setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
10715a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1072ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1073ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
10745a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getTransform(), outErr));
1075ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1076ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
1077f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wallvoid setVisibleRegion(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1078f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1079f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
1080f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display, layer,
1081f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            testLayer->getVisibleRegion(), outErr));
1082f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
1083f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
1084273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wallvoid setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
10855a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1086273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
1087273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
10885a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getZOrder(), outErr));
1089273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
1090273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1091ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallbool advanceBlendMode(Hwc2TestLayer* testLayer)
1092ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1093ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    return testLayer->advanceBlendMode();
1094ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1095ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
10965a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wallbool advanceBuffer(Hwc2TestLayer* testLayer)
10975a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
10985a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (testLayer->advanceComposition())
10995a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return true;
11005a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    return testLayer->advanceBufferArea();
11015a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
11025a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
1103ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallbool advanceColor(Hwc2TestLayer* testLayer)
1104ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
1105ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    /* Color depends on blend mode so advance blend mode last so color is not
1106ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall     * force to update as often */
1107ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (testLayer->advancePlaneAlpha())
1108ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return true;
1109ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (testLayer->advanceColor())
1110ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return true;
1111ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    return testLayer->advanceBlendMode();
1112ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
1113ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
11146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallbool advanceComposition(Hwc2TestLayer* testLayer)
11156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
11166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    return testLayer->advanceComposition();
11176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
11186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11192a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wallbool advanceCursorPosition(Hwc2TestLayer* testLayer)
11202a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
11212a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    return testLayer->advanceCursorPosition();
11222a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
11232a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
1124b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallbool advanceDataspace(Hwc2TestLayer* testLayer)
1125b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1126b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    return testLayer->advanceDataspace();
1127b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1128b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1129600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallbool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1130600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1131600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    return testLayer->advanceDisplayFrame();
1132600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1133600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
11342b1f53060ea8587a428f826cf7890354ff124722Marissa Wallbool advancePlaneAlpha(Hwc2TestLayer* testLayer)
11352b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
11362b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    return testLayer->advancePlaneAlpha();
11372b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
11382b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
1139c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallbool advanceSourceCrop(Hwc2TestLayer* testLayer)
1140c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
1141c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    if (testLayer->advanceSourceCrop())
1142c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        return true;
1143c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    return testLayer->advanceBufferArea();
1144c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
1145c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
1146ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallbool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
1147ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
1148ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    if (testLayer->advanceSurfaceDamage())
1149ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        return true;
1150ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    return testLayer->advanceBufferArea();
1151ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
1152ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
1153ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallbool advanceTransform(Hwc2TestLayer* testLayer)
1154ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1155ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    return testLayer->advanceTransform();
1156ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1157ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
1158f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wallbool advanceVisibleRegions(Hwc2TestLayers* testLayers)
1159f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
1160f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    return testLayers->advanceVisibleRegions();
1161f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
1162f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
11634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
11644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallstatic const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
11654d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
11664d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_LAYER,
11674d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
11684d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_LAYER,
11694d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
11704d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DUMP,
11714d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_ACTIVE_CONFIG,
11724d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
11734d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
11744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_COLOR_MODES,
11754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
11764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
11774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_NAME,
11784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
11794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_TYPE,
11804d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DOZE_SUPPORT,
11814d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_HDR_CAPABILITIES,
11824d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
11834d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_RELEASE_FENCES,
11844d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_PRESENT_DISPLAY,
11854d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_REGISTER_CALLBACK,
11864d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_ACTIVE_CONFIG,
11874d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CLIENT_TARGET,
11884d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_MODE,
11894d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_TRANSFORM,
11904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CURSOR_POSITION,
11914d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
11924d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BUFFER,
11934d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COLOR,
11944d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
11954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DATASPACE,
11964d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
11974d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
11984d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
11994d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
12004d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_TRANSFORM,
12014d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
12024d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_Z_ORDER,
12034d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_OUTPUT_BUFFER,
12044d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_POWER_MODE,
12054d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_VSYNC_ENABLED,
12064d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_VALIDATE_DISPLAY,
12074d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}};
12084d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
12094d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 supports all required functions. */
12104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION)
12114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
12124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
12134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hwc2_function_pointer_t pfn = getFunction(descriptor);
12144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        EXPECT_TRUE(pfn) << "failed to get function "
12154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << getFunctionDescriptorName(descriptor);
12164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
12174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
12184d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
12194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
12204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
12214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
12224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
12234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_FALSE(pfn) << "failed to get invalid function";
12244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
12254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
12264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
12274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_CAPABILITIES)
12284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
12294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    std::vector<hwc2_capability_t> capabilities;
12304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
12314d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    getCapabilities(&capabilities);
12324d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
12334d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
12344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            HWC2_CAPABILITY_INVALID), 0);
12354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
1236a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1237a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wallstatic const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1238a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_HOTPLUG,
1239a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_REFRESH,
1240a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_VSYNC,
1241a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}};
1242a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1243a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can successfully register all required
1244a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall * callback functions. */
1245a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK)
1246a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1247a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1248a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
1249a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1250a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
1251a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1252a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
1253a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
1254a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1255a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1256a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1257a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1258a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1259a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1260a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
1261a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1262a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1263a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1264a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            []() { return; }, &err));
1265a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1266a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1267a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1268a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
1269a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
1270a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1271a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = nullptr;
1272a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1273a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
1274a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1275a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
1276a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
1277a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1278cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1279cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1280cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * physical display. */
1281cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1282cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1283cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    for (auto display : mDisplays) {
1284cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_type_t type;
1285cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1286cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1287cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1288cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " correct display type";
1289cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
1290cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
1291cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1292cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1293cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is requested. */
1294cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1295cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1296cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_t display;
1297cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_type_t type;
1298cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1299cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1300cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1301cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1302cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1303cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1304cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
13051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
13071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
13081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
13091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
13101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
13111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
13131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
13151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
13161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
13171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
13191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_bad_display)
13201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
13211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t display;
13221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_layer_t layer;
13231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
13241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
13261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
13281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
13291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
13301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 will either support a large number of resources
13321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * or will return no resources. */
13331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_no_resources)
13341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
13351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    const size_t layerCnt = 1000;
13361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
13381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> layers;
13391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
13411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
13431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
13441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
13451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
13471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
13481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
13491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t badDisplay;
13501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
13521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
13541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer = 0;
13551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
13561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
13581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
13591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
13611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
13631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
13641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
13661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
13671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
13681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
13701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
13711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
13721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
13731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
13741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
13751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
13771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
13801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
13831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
13861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
13891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
13921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
13941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
13971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
13991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
14001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
14011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
1402cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1403cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1404cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_WIDTH,
1405cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_HEIGHT,
1406cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
1407cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1408cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1409cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_VSYNC_PERIOD,
1410cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_X,
1411cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_Y,
1412cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
1413cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1414cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1415cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * config. */
1416cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1417cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1418cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1419cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1420cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1421cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1422cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1423cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
1424cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
1425cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1426cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : requiredAttributes) {
1427cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1428cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
1429cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                EXPECT_GE(value, 0) << "missing required attribute "
1430cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << getAttributeName(attribute) << " for config "
1431cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << config;
1432cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
1433cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : optionalAttributes) {
1434cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1435cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
1436cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
1437cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1438cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1439cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1440cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1441cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1442cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * attribute */
1443cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1444cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1445cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1446cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1447cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1448cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1449cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1450cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1451cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1452cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
1453cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
1454cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t err = HWC2_ERROR_NONE;
1455cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1456cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1457cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1458cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1459cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " attribute for config " << config;
1460cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1461cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1462cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1463cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1464cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1465cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1466cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1467cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
1468cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_config_t config = 0;
1469cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    int32_t value;
1470cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1471cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1472cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1473cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1474cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : requiredAttributes) {
1475cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1476cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
1477cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1478cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1479cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1480cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : optionalAttributes) {
1481cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1482cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
1483cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1484cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1485cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1486cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1487cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1488cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1489cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1490cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1491cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
1492cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        int32_t value;
1493cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
1494cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1495cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1496cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1497cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : requiredAttributes) {
1498cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1499cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1500cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1501cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1502cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1503cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : optionalAttributes) {
1504cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1505cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1506cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1507cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1508cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1509cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1510cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1511cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1512cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1513cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1514cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1515cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1516cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1517cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1518cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1519cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1520cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1521cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1522cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1523cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1524cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
1525cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    std::vector<hwc2_config_t> configs;
1526cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1527cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1528cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1529cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1530cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1531cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1532cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1533cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1534cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1535cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1536cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1537cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * times in a row. */
1538cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1539cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1540cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1541cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs1, configs2;
1542cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1543cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
1544cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
1545cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1546cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
1547cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs2.begin())) << "returned two different config sets";
1548cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1549cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1550cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1551cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
1552cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
1553cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1554cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1555cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1556cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1557cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1558cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1559cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
1560cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs.end());
1561cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
1562cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " configs";
1563cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1564cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
156593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
156693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 returns the active config for a display */
156793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
156893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
156993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
157093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
157193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
157293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
157393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
157493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
157593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_config_t activeConfig;
157693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
157793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
157893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
157993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
158093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(activeConfig, config) << "failed to get active config";
158193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
158293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
158393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
158493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
158593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
158693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * display. */
158793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
158893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
158993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
159093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_config_t activeConfig;
159193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
159293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
159393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
159493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
159593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
159693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
159793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
159893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
159993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
160093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 either begins with a valid active config
160193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * or returns an error when getActiveConfig is called. */
160293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
160393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
160493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
160593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
160693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t activeConfig;
160793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
160893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
160993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
161093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
161193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (configs.empty())
161293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            return;
161393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
161493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
161593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (err == HWC2_ERROR_NONE) {
161693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NE(std::count(configs.begin(), configs.end(),
161793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    activeConfig), 0) << "active config is not found in "
161893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " configs for display";
161993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
162093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
162193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
162293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
162393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
162493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
162593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 can set every display config as an active
162693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * config */
162793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
162893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
162993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
163093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
163193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
163293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
163393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
163493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
163593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
163693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
163793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
163893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
163993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
164093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
164193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
164293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
164393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
164493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    const hwc2_config_t config = 0;
164593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
164693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
164793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
164893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
164993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
165093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
165193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
165293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
165393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
165493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
165593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
165693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
165793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t config;
165893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
165993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
166093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
166193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
166293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
166393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
166493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
166593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
166603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
166703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
166803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT)
166903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
167003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
167103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
167203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
167303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
167403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
167503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
167603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
167703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
167803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
167903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
168003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
168103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
168203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
168303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
168403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
168503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
168603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
168703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
168803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
168903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
169003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
169103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
169203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
169303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set all supported power modes */
169403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE)
169503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
169603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
169703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
169803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
169903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
170003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
170103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
170203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
170303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
170403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
170503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
170603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
170703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
170803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
170903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
171003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
171103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
171203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
171303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
171403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
171503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
171603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
171703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
171803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
171903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
172003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
172103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
172203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
172303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
172403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
172503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
172603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
172703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
172803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
172903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    if (support != 1)
173003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        return;
173103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
173203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
173303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
173403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
173503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
173603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            &err));
173703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
173803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
173903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
174003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
174103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
174203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
174303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
174403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
174503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND + 1);
174603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
174703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
174803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
174903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
175003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                << mode;
175103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
175203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
175303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
175403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
175503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall * an optional power mode. */
175603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
175703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
175803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
175903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
176003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
176103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
176203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
176303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support == 1)
176403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
176503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
176603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_EQ(support, 0) << "invalid doze support value";
176703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
176803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
176903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                &err));
177003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
177103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
177203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
177303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND, &err));
177403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) <<  "returned wrong error code";
177503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
177603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
177703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
177803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
177903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_stress)
178003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
178103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
178203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
178303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
178403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
178503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
178603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
178703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
178803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
178903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
179003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
179103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
179203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
179303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
179403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
179503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
179603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
179703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
179803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
179903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
180003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
180103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
180203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
180303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
180403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
180503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
180603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
1807572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1808572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
1809572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * displays */
1810572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED)
1811572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1812572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1813572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1814572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1815572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1816572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1817572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1818572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1819572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1820572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1821572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1822572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1823572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1824572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1825572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1826572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1827572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1828572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1829572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
1830572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
1831572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1832572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1833572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t receivedDisplay;
1834572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        int64_t receivedTimestamp;
1835572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1836572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1837572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1838572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1839572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1840572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
1841572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &receivedTimestamp));
1842572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1843572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
1844572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
1845572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1846572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1847572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1848572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1849572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1850572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1851572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1852572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
1853572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
1854572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1855572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t display;
1856572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1857572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            const_cast<char*>("data"));
1858572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1859572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1860572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1861572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1862572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1863572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            []() { return; }));
1864572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1865572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
1866572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1867572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1868572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
1869572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1870572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1871572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1872572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
1873572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
1874572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1875572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1876572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1877572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1878572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
1879572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1880572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1881572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1882572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1883572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1884572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1885572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
1886572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &err));
1887572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1888572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1889572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1890572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1891572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1892572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1893572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
1894572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * times. */
1895572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
1896572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1897572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1898572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1899572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1900572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1901572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1902572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1903572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1904572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1905572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1906572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1907572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1908572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1909572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1910572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1911572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1912572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1913572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1914572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1915572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1916572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1917572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1918572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
1919572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is off and no callback is registered. */
1920572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
1921572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1922572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
1923572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1924572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1925572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1926572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1927572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
1928572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1929572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1930572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1931572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1932572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1933572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
1934572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is registered. */
1935572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
1936572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1937572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
1938572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1939572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1940572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1941572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1942572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1943572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1944572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
1945572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1946572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1947572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1948572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1949572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1950572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1951dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1952dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 returns a display name for each display */
1953dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME)
1954dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
1955dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    for (auto display : mDisplays) {
1956dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        std::string name;
1957dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1958dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
1959dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
1960dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
1961dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1962dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
1963dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall * display */
1964dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
1965dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
1966dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_display_t display;
1967dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    std::string name;
1968dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1969dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1970dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1971dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1972dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
1973dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1974dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
19756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
19766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can set basic composition types. */
19776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
19786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
19796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
19806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
19816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
19826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
19836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
19846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * layer. */
19856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
19866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
19876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
19886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
19896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
19906bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
19916bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
19926bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
19936bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
19946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
19956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition));
19966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
19976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
19986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
19996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
20006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
20016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
20026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
20036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    hwc2_error_t* outErr) {
20046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
20056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
20066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        layer, HWC2_COMPOSITION_INVALID, outErr));
20076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
20086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ));
20096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
2010ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
20112a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
20122a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION)
20132a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
20142a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
20152a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ::setCursorPosition, advanceCursorPosition));
20162a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
20172a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
20182a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
20192a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
20202a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
20212a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
20222a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ::setCursorPosition, advanceCursorPosition));
20232a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
20242a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
20252a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
20262a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
20272a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
20282a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
20292a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
20302a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
20315a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
20322a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
20335a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
20342a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
20352a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        cursorPosition.left, cursorPosition.top, outErr));
20362a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            },
20372a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
20382a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            advanceCursorPosition));
20392a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
20402a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
20412a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
20422a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall * display. */
20432a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
20442a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
20452a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_display_t display;
20462a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_layer_t layer = 0;
20472a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    int32_t x = 0, y = 0;
20482a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
20492a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
20502a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
20512a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
20522a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
20532a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
20542a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
20552a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
20562a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
20572a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
20582a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
20592a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
20602a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
20615a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
20622a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
20635a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
20642a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
20652a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        badLayer, cursorPosition.left, cursorPosition.top,
20662a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        outErr));
20672a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            }
20682a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall   ));
20692a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
20702a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
2071ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
2072ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
2073ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2074ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2075ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
2076ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2077ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2078ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
2079ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
2080ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2081ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2082ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
2083ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2084ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2085ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
2086ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
2087ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2088ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2089ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode));
2090ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2091ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2092ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
2093ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
2094ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2095ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2096ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2097ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    hwc2_error_t* outErr) {
2098ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2099ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
2100ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                        layer, HWC2_BLEND_MODE_INVALID, outErr));
2101ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            }
2102ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ));
2103ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2104b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
21055a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
21065a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER)
21075a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
21085a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
21095a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            setBuffer, advanceBuffer));
21105a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
21115a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
21125a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
21135a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
21145a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
21155a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
21165a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            setBuffer, advanceBuffer));
21175a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
21185a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
21195a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
21205a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
21215a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
21225a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
21235a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
21245a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
21255a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
21265a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer_handle_t handle = nullptr;
21275a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                android::base::unique_fd acquireFence;
21285a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
21295a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                /* If there is not available buffer for the given buffer
21305a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                 * properties, it should not fail this test case */
21315a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
21325a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    *outErr = HWC2_ERROR_BAD_LAYER;
21335a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    return;
21345a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                }
21355a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
21365a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
21375a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        handle, acquireFence, outErr));
21385a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            }
21395a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ));
21405a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
21415a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
21425a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
21435a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
21445a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
21455a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
21465a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
21475a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    hwc2_error_t* outErr) {
21485a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
21495a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer_handle_t handle = nullptr;
21505a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                int32_t acquireFence = -1;
21515a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
21525a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
21535a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        handle, acquireFence, outErr));
21545a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            }
21555a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ));
21565a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
21575a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
2158ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
2159ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR)
2160ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2161ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2162ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            setColor, advanceColor));
2163ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2164ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2165ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
2166ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_update)
2167ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2168ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2169ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            setColor, advanceColor));
2170ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2171ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2172ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
2173ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
2174ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
2175ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2176ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
2177ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
21785a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2179ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2180ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
21815a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayer->getColor(), outErr));
2182ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            },
2183ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2184ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            advanceColor));
2185ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2186ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2187ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
2188ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
2189ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2190ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2191ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
21925a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2193ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2194ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
21955a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayer->getColor(), outErr));
2196ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            }
2197ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ));
2198ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2199ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2200b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
2201b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE)
2202b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
2203b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2204b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
2205b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
2206b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
2207b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
2208b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
2209b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
2210b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2211b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
2212b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
2213b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
2214b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
2215b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
2216b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
2217b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2218b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace));
2219b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
22202b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
2221600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
2222600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
2223600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
2224600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2225600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
2226600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
2227600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
2228600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
2229600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
2230600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
2231600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2232600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
2233600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
2234600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
2235600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
2236600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
2237600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
2238600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2239600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame));
2240600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
2241600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
22422b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
22432b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
22442b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
22452b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
22462b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
22472b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
22482b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
22492b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
22502b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
22512b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
22522b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
22532b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
22542b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
22552b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
22562b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
22572b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
22582b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
22592b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
22602b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
22615a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
22622b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
22632b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
22645a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            badLayer, testLayer->getPlaneAlpha(), outErr));
22652b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            }
22662b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ));
22672b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
2268ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2269c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
2270c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
2271c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2272c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2273c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop, advanceSourceCrop));
2274c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2275c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2276c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
2277c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
2278c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2279c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2280c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop, advanceSourceCrop));
2281c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2282c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2283c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
2284c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
2285c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2286c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2287c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop));
2288c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2289c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2290ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
2291ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
2292ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
2293ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2294ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage, advanceSurfaceDamage));
2295ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
2296ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
2297ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
2298ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
2299ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
2300ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2301ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage, advanceSurfaceDamage));
2302ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
2303ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
2304ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
2305ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
2306ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
2307ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2308ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage));
2309ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
2310ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
2311ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
2312ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
2313ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2314ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2315ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
2316ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2317ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2318ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
2319ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
2320ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2321ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2322ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
2323ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2324ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2325ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
2326ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
2327ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2328ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2329ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform));
2330ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2331273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2332f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall/* TESTCASE: Tests that the HWC2 can set the visible region of a layer. */
2333f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa WallTEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION)
2334f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
2335f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Basic, 5,
2336f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2337f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    Hwc2TestLayers* testLayers) {
2338f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2339f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display,
2340f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                        layer, testLayers->getVisibleRegion(layer)));
2341f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            },
2342f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2343f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            advanceVisibleRegions));
2344f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
2345f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2346f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the visible region of a bad layer. */
2347f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa WallTEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION_bad_layer)
2348f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
2349f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2350f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            setVisibleRegion));
2351f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
2352f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2353273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
2354273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
2355273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2356273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
2357273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
23585a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayers* testLayers) {
2359273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2360273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
23615a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayers->getZOrder(layer)));
2362f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            },
2363f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2364f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            /* TestLayer z orders are set during the construction of TestLayers
2365f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall             * and cannot be updated. There is no need (or ability) to cycle
2366f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall             * through additional z order configurations. */
2367f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            [] (Hwc2TestLayers* /*testLayers*/) {
2368f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                return false;
2369273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
2370273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ));
2371273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
2372273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2373273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
2374273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
2375273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2376273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
2377273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
2378273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX / 2),
2379273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX) };
2380273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2381273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    for (auto display : mDisplays) {
2382273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        std::vector<hwc2_config_t> configs;
2383273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2384273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2385273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2386273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto config : configs) {
2387273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_layer_t layer;
2388273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2389273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2390273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2391273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2392273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2393273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (uint32_t zOrder : zOrders) {
2394273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
2395273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
2396273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2397273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2398273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
2399273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
2400273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
2401273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2402273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
2403273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
2404273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2405273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2406273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            setZOrder));
2407273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
2408